mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-11-13 08:38:43 +03:00
cleaner tree
This commit is contained in:
parent
80b1245789
commit
dcdba18903
@ -1,69 +0,0 @@
|
||||
/* */
|
||||
/*-- bau --*/
|
||||
/* */
|
||||
|
||||
@font-face
|
||||
font-family "bau"
|
||||
src url("//storage.googleapis.com/urbit-extra/bau.woff")
|
||||
font-weight 400
|
||||
font-style normal
|
||||
@font-face
|
||||
font-family "bau"
|
||||
src url("//storage.googleapis.com/urbit-extra/bau-italic.woff")
|
||||
font-weight 400
|
||||
font-style italic
|
||||
@font-face
|
||||
font-family "bau"
|
||||
src url("//storage.googleapis.com/urbit-extra/bau-medium.woff")
|
||||
font-weight 500
|
||||
font-style normal
|
||||
@font-face
|
||||
font-family "bau"
|
||||
src url("//storage.googleapis.com/urbit-extra/bau-mediumitalic.woff")
|
||||
font-weight 500
|
||||
font-style italic
|
||||
@font-face
|
||||
font-family "bau"
|
||||
src url("//storage.googleapis.com/urbit-extra/bau-bold.woff")
|
||||
font-weight 600
|
||||
font-style normal
|
||||
@font-face
|
||||
font-family "bau"
|
||||
src url("//storage.googleapis.com/urbit-extra/bau-bolditalic.woff")
|
||||
font-weight 600
|
||||
font-style italic
|
||||
@font-face
|
||||
font-family "bau"
|
||||
src url("//storage.googleapis.com/urbit-extra/bau-super.woff")
|
||||
font-weight 600
|
||||
font-style normal
|
||||
@font-face
|
||||
font-family "bau"
|
||||
src url("//storage.googleapis.com/urbit-extra/bau-superitalic.woff")
|
||||
font-weight 600
|
||||
font-style italic
|
||||
|
||||
/* */
|
||||
/*-- scp --*/
|
||||
/* */
|
||||
|
||||
@font-face
|
||||
font-family "scp"
|
||||
src url("//storage.googleapis.com/urbit-extra/scp-extralight.woff")
|
||||
font-weight 200
|
||||
font-style normal
|
||||
@font-face
|
||||
font-family "scp"
|
||||
src url("//storage.googleapis.com/urbit-extra/scp-light.woff")
|
||||
font-weight 300
|
||||
font-style normal
|
||||
@font-face
|
||||
font-family "scp"
|
||||
src url("//storage.googleapis.com/urbit-extra/scp-regular.woff")
|
||||
font-weight 400
|
||||
font-style normal
|
||||
@font-face
|
||||
font-family "scp"
|
||||
src url("//storage.googleapis.com/urbit-extra/scp-medium.woff")
|
||||
font-weight 500
|
||||
font-style normal
|
@ -1,175 +0,0 @@
|
||||
.bar
|
||||
margin-top 2rem
|
||||
margin-bottom 2rem
|
||||
& > div
|
||||
display inline-block
|
||||
a.logo
|
||||
display inline-block
|
||||
height 2rem
|
||||
vertical-align middle
|
||||
border none
|
||||
img.logo
|
||||
margin-right 18px
|
||||
margin-top 0
|
||||
ul
|
||||
margin 0
|
||||
line-height 2rem
|
||||
display inline-block
|
||||
li::before
|
||||
content ''
|
||||
padding-right none
|
||||
li
|
||||
display inline-block
|
||||
margin-bottom 0
|
||||
margin-right 1rem
|
||||
vertical-align middle
|
||||
li a
|
||||
border-bottom none
|
||||
text-decoration underline
|
||||
li a h1
|
||||
margin 0
|
||||
line-height inherit
|
||||
text-transform capitalize
|
||||
font-size 1.2rem
|
||||
h1
|
||||
text-transform capitalize
|
||||
font-size 1rem
|
||||
font-weight 400
|
||||
letter-spacing .03rem
|
||||
|
||||
.lead
|
||||
#body
|
||||
margin-top 3rem
|
||||
margin-top 0
|
||||
|
||||
h1
|
||||
margin-top 1rem
|
||||
vertical-align middle
|
||||
line-height 4rem
|
||||
&.fold
|
||||
margin-top 6rem
|
||||
|
||||
.list li h1
|
||||
line-height 2rem
|
||||
|
||||
&
|
||||
font-size 1.6rem
|
||||
line-height 2.6rem
|
||||
|
||||
a
|
||||
line-height 1rem
|
||||
|
||||
p
|
||||
font-size 1.6rem
|
||||
line-height 3rem
|
||||
|
||||
.mono
|
||||
font-size 1.3rem
|
||||
|
||||
.footer
|
||||
margin 4rem 0 4rem 0
|
||||
p
|
||||
margin 0
|
||||
font-size .7rem
|
||||
code
|
||||
line-height 1rem
|
||||
font-size .7rem
|
||||
|
||||
input.email
|
||||
border-radius 0
|
||||
font inherit
|
||||
font-family 'scp'
|
||||
font-weight 300
|
||||
line-height 2rem
|
||||
min-width 2rem
|
||||
border 0
|
||||
outline 0
|
||||
background-color transparent
|
||||
border-bottom 3px dotted #000
|
||||
margin-right 1rem
|
||||
display inline-block
|
||||
&.valid
|
||||
color #99F27C
|
||||
&.error
|
||||
color #F74040
|
||||
|
||||
.email:empty:not(:focus):before
|
||||
content attr(data-ph)
|
||||
|
||||
::-webkit-input-placeholder
|
||||
color #e6e7e8
|
||||
|
||||
:-moz-placeholder
|
||||
color #e6e7e8
|
||||
|
||||
::-moz-placeholder
|
||||
color #e6e7e8
|
||||
|
||||
:-ms-input-placeholder
|
||||
color #e6e7e8
|
||||
|
||||
button.submit
|
||||
font inherit
|
||||
border 0
|
||||
background-color #fff
|
||||
border-bottom 3px solid #000
|
||||
font-size 1.6rem
|
||||
line-height 1.6rem
|
||||
display inline-block
|
||||
text-align left
|
||||
margin-top 1rem
|
||||
height 2rem
|
||||
padding 0 .6rem
|
||||
|
||||
.date
|
||||
font-weight 400
|
||||
|
||||
@media only screen and (max-width: 1170px)
|
||||
#cont.lead
|
||||
top 0rem
|
||||
|
||||
@media only screen and (min-width: 320px) and (max-width: 1024px)
|
||||
#cont.lead
|
||||
top 0rem
|
||||
font-size 1rem
|
||||
line-height 1.6rem
|
||||
|
||||
.post h1
|
||||
font-size 2rem
|
||||
line-height 3rem
|
||||
|
||||
.bar
|
||||
margin-top 1rem
|
||||
margin-bottom 1rem
|
||||
|
||||
.list li h1,
|
||||
font-size 1rem
|
||||
line-height 1.6rem
|
||||
|
||||
img.logo
|
||||
display block
|
||||
margin-bottom 1rem
|
||||
|
||||
h1.leader,
|
||||
h1.fold
|
||||
font-size 1.6rem
|
||||
line-height 3rem
|
||||
margin-left 0
|
||||
|
||||
.list li,
|
||||
.list li a,
|
||||
.list li h1,
|
||||
font-size 1rem
|
||||
line-height 1.6rem
|
||||
|
||||
input.email
|
||||
font-size 1.2rem
|
||||
width 100%
|
||||
|
||||
button.submit
|
||||
font-size 1rem
|
||||
|
||||
.date,
|
||||
div.footer
|
||||
font-size .6rem
|
||||
|
@ -1,447 +0,0 @@
|
||||
@import 'fonts'
|
||||
|
||||
body
|
||||
html
|
||||
font-family "bau","Helvetica Neue",helvetica,arial,sans-serif
|
||||
|
||||
code
|
||||
pre
|
||||
li:before
|
||||
.spin
|
||||
#bred a
|
||||
.mono
|
||||
h3.time
|
||||
font-family "scp","Courier New",courier,monospace
|
||||
|
||||
body
|
||||
html
|
||||
font-size 18px
|
||||
font-weight 400
|
||||
line-height 1.6rem
|
||||
-webkit-text-size-adjust none
|
||||
|
||||
p
|
||||
font-size 1.2rem
|
||||
line-height 2rem
|
||||
|
||||
a
|
||||
color #000
|
||||
border-bottom 1px solid #000
|
||||
text-decoration none
|
||||
display inline-block
|
||||
line-height .8rem
|
||||
|
||||
a:visited
|
||||
opacity .5
|
||||
|
||||
a code
|
||||
line-height inherit
|
||||
|
||||
hr
|
||||
display inline-block
|
||||
width 6rem
|
||||
border 0
|
||||
border-top 2px solid #f4f4f4
|
||||
|
||||
h1
|
||||
margin-top 4rem
|
||||
line-height 2.6rem
|
||||
|
||||
#body > div > h1:first-of-type
|
||||
#body div.short > h1:first-of-type
|
||||
margin-top 1rem
|
||||
|
||||
h2
|
||||
h3
|
||||
margin 0
|
||||
margin-top 2rem
|
||||
|
||||
h1
|
||||
h2
|
||||
h3
|
||||
h4
|
||||
strong
|
||||
font-weight 500
|
||||
|
||||
h4
|
||||
margin-bottom .3rem
|
||||
|
||||
h5
|
||||
font-style italic
|
||||
font-weight 200
|
||||
margin 0
|
||||
|
||||
h1 code
|
||||
h2 code
|
||||
h3 code
|
||||
font-size inherit
|
||||
padding .3rem
|
||||
|
||||
pre
|
||||
code
|
||||
font-size 1rem
|
||||
|
||||
pre
|
||||
background-color #f5f5f5
|
||||
padding .3rem
|
||||
margin-left -.3rem
|
||||
overflow-y scroll
|
||||
|
||||
code
|
||||
line-height 1.2rem
|
||||
background-color #f4f4f4
|
||||
margin-top -.05rem
|
||||
padding .2rem
|
||||
display inline-block
|
||||
white-space pre
|
||||
|
||||
blockquote
|
||||
background-color #f5f5f5
|
||||
margin 0
|
||||
padding 1rem
|
||||
font-style italic
|
||||
margin-left 3rem
|
||||
|
||||
blockquote p
|
||||
margin 0
|
||||
|
||||
blockquote em
|
||||
font-style normal
|
||||
|
||||
ul
|
||||
list-style none
|
||||
padding 0
|
||||
|
||||
li:before
|
||||
font-family 'scp'
|
||||
content "\2022"
|
||||
padding-right .3rem
|
||||
font-size 1rem
|
||||
font-weight 500
|
||||
|
||||
#nav
|
||||
#cont
|
||||
left 50%
|
||||
|
||||
#cont
|
||||
width 42rem
|
||||
margin-left -21rem
|
||||
background-color #fff
|
||||
z-index 1
|
||||
|
||||
#nav
|
||||
position fixed
|
||||
top 0rem
|
||||
width 57rem
|
||||
padding-top 1rem
|
||||
z-index 0
|
||||
margin-left -32rem
|
||||
overflow hidden
|
||||
transition opacity 1s ease-in-out
|
||||
|
||||
#nav.moving
|
||||
opacity 1
|
||||
transition opacity .3s ease-in-out
|
||||
|
||||
#nav:hover
|
||||
opacity 1
|
||||
transition opacity .3s ease-in-out
|
||||
|
||||
#cont
|
||||
position relative
|
||||
top 0
|
||||
margin-bottom 9rem
|
||||
|
||||
.loading
|
||||
display inline-block
|
||||
|
||||
.spin
|
||||
color #fff
|
||||
padding .6rem
|
||||
font-size .7rem
|
||||
font-weight 600
|
||||
letter-spacing .1rem
|
||||
z-index 3
|
||||
|
||||
.loading > .spin
|
||||
background-color #555
|
||||
|
||||
#body .loading > .spin
|
||||
background-color #000
|
||||
|
||||
.spin.state-0:before
|
||||
content "\2599"
|
||||
.spin.state-1:before
|
||||
content "\259B"
|
||||
.spin.state-2:before
|
||||
content "\259C"
|
||||
.spin.state-3:before
|
||||
content "\259F"
|
||||
|
||||
#load.load
|
||||
display inline-block
|
||||
font-weight 500
|
||||
position fixed
|
||||
top 0
|
||||
left 0
|
||||
width 100%
|
||||
height 100%
|
||||
background-color rgba(10,10,10,.4)
|
||||
opacity 1
|
||||
transition opacity 1s ease-in-out
|
||||
z-index 4
|
||||
|
||||
img.logo
|
||||
height 2rem
|
||||
width 2rem
|
||||
|
||||
h3.time
|
||||
margin-top: .3rem
|
||||
font-size .7rem
|
||||
font-weight 200
|
||||
|
||||
#nav .links > div
|
||||
display inline-block
|
||||
vertical-align top
|
||||
|
||||
#nav #sibs
|
||||
width 8rem
|
||||
transition margin-top .3s ease-in-out
|
||||
overflow hidden
|
||||
|
||||
#nav #sibs > div
|
||||
margin-bottom .6rem
|
||||
|
||||
.focus #sibs
|
||||
margin-top 0 !important
|
||||
transition margin-top .3s ease-in-out
|
||||
|
||||
#nav a
|
||||
.list > li > a
|
||||
display inline
|
||||
|
||||
#nav a
|
||||
text-transform uppercase
|
||||
font-size .7rem
|
||||
line-height 1rem
|
||||
font-weight 200
|
||||
letter-spacing 1px
|
||||
|
||||
.link-next
|
||||
margin-top 2rem
|
||||
font-weight 500
|
||||
|
||||
.list > li
|
||||
margin-bottom 1rem
|
||||
|
||||
.list > li > a h1
|
||||
font-size inherit
|
||||
line-height inherit
|
||||
|
||||
#nav .active a
|
||||
font-weight 500
|
||||
text-decoration none
|
||||
|
||||
#up
|
||||
padding-right 1rem
|
||||
margin-top -8px
|
||||
|
||||
#sides
|
||||
float right
|
||||
|
||||
#sides a
|
||||
display inline-block
|
||||
margin-right .6rem
|
||||
|
||||
.arow-up
|
||||
.arow-next
|
||||
.arow-prev
|
||||
width 0
|
||||
height 0
|
||||
border .4rem solid transparent
|
||||
|
||||
.arow-up
|
||||
border-bottom .6rem solid #000
|
||||
.arow-next
|
||||
border-left .6rem solid #000
|
||||
.arow-prev
|
||||
border-right .6rem solid #000
|
||||
|
||||
#bred
|
||||
width 5rem
|
||||
padding-right 1rem
|
||||
text-align right
|
||||
font-size .6rem
|
||||
white-space nowrap
|
||||
overflow hidden
|
||||
|
||||
#bred a
|
||||
text-transform lowercase
|
||||
vertical-align top
|
||||
|
||||
#bred > div
|
||||
float right
|
||||
|
||||
#bred > div > div
|
||||
display inline-block
|
||||
margin-top -.2rem
|
||||
|
||||
#bred a
|
||||
#kids a
|
||||
margin-right .3rem
|
||||
|
||||
#bred a
|
||||
margin-left .3rem
|
||||
|
||||
.short
|
||||
width 32rem
|
||||
|
||||
.list h1
|
||||
.list li a > div p
|
||||
margin 0
|
||||
|
||||
.list li a > div
|
||||
.list li a > div p
|
||||
display inline
|
||||
|
||||
.list li a > div p
|
||||
margin-left .3rem
|
||||
|
||||
.list li a > div p:first-child
|
||||
margin-left 0
|
||||
|
||||
.list li a > div p code
|
||||
font-size .7rem
|
||||
font-weight 400
|
||||
text-transform none
|
||||
|
||||
.list li a h1 code
|
||||
text-transform lowercase
|
||||
|
||||
.list li a code
|
||||
padding .2rem
|
||||
|
||||
.list h1
|
||||
.list li a > div div
|
||||
display inline
|
||||
|
||||
.list li a > div div
|
||||
margin-left .6rem
|
||||
overflow hidden
|
||||
|
||||
.list h1
|
||||
font-size .7rem
|
||||
|
||||
div.root
|
||||
h1
|
||||
margin-bottom 2rem
|
||||
|
||||
.list .sub
|
||||
margin-left 0
|
||||
margin-right .6rem
|
||||
|
||||
div.root > p
|
||||
width 27rem
|
||||
margin-top 2rem
|
||||
|
||||
h2.sub
|
||||
font-size .7rem
|
||||
font-weight 400
|
||||
line-height 1rem
|
||||
letter-spacing 1px
|
||||
margin-top 0
|
||||
text-transform uppercase
|
||||
|
||||
div.toc
|
||||
margin-top 3rem
|
||||
margin-bottom 3rem
|
||||
|
||||
h1
|
||||
h2
|
||||
h3
|
||||
h4
|
||||
font-weight 400
|
||||
cursor pointer
|
||||
text-decoration underline
|
||||
font-size 1.2rem
|
||||
margin-top .3rem
|
||||
margin-bottom .3rem
|
||||
|
||||
h2
|
||||
margin-left 1rem
|
||||
|
||||
h3
|
||||
margin-left 2rem
|
||||
|
||||
h4
|
||||
margin-left 3rem
|
||||
|
||||
h1.t
|
||||
font-weight 500
|
||||
font-size 2rem
|
||||
text-decoration none
|
||||
margin-bottom 2rem
|
||||
|
||||
#body .spam
|
||||
width 9rem
|
||||
background-color #555
|
||||
padding 1rem
|
||||
letter-spacing 1px
|
||||
font-weight 500
|
||||
margin-bottom 2rem
|
||||
|
||||
#body .spam
|
||||
#body .spam a
|
||||
color #fff
|
||||
|
||||
#body .spam a
|
||||
border-color #fff
|
||||
|
||||
#body .CodeMirror
|
||||
font-size .8rem
|
||||
line-height 1rem
|
||||
|
||||
#body .CodeMirror .cm-header
|
||||
font-weight 200
|
||||
|
||||
#body .CodeMirror-gutters
|
||||
background-color #fff
|
||||
padding-right 1rem
|
||||
margin-left -1rem
|
||||
|
||||
.footer p
|
||||
font-family 'scp'
|
||||
font-size .7rem
|
||||
font-weight 400
|
||||
margin-top 3rem
|
||||
color #ccc
|
||||
|
||||
.error
|
||||
color rgba(249,23,51,1)
|
||||
|
||||
.warning
|
||||
background-color rgb(255,53,55)
|
||||
padding 1rem
|
||||
width 18rem
|
||||
margin 2rem 0
|
||||
color #fff
|
||||
|
||||
a
|
||||
color inherit
|
||||
border-color #fff
|
||||
|
||||
h1
|
||||
font-size 1rem
|
||||
|
||||
h1
|
||||
p
|
||||
margin 0 .3rem
|
||||
|
||||
.warning.w
|
||||
width auto
|
||||
|
||||
@import 'posts'
|
||||
@import 'leads'
|
||||
@import 'video'
|
||||
|
||||
@import 'mobile'
|
@ -1,138 +0,0 @@
|
||||
/* laptops / small screens ----------- */
|
||||
@media only screen and (max-width: 1170px)
|
||||
#nav
|
||||
#nav > div
|
||||
#nav.up
|
||||
#nav.top
|
||||
#nav .focus
|
||||
transform: translate3d(0,0,0);
|
||||
-webkit-transform: translate3d(0,0,0);
|
||||
|
||||
#nav
|
||||
position fixed
|
||||
top 0
|
||||
opacity 1
|
||||
width 42rem
|
||||
margin-left -21rem
|
||||
background-color #fff
|
||||
z-index 2
|
||||
|
||||
#nav a
|
||||
white-space nowrap
|
||||
|
||||
#nav #sibs
|
||||
width 12rem
|
||||
|
||||
#nav #sibs > div
|
||||
height 20px
|
||||
margin-bottom 4px
|
||||
|
||||
#nav #sibs > div.active a
|
||||
#nav #sibs > div a
|
||||
border-bottom none
|
||||
text-decoration underline
|
||||
|
||||
#nav.m-down
|
||||
#nav.m-up
|
||||
position absolute
|
||||
|
||||
#nav.m-down.m-fixed
|
||||
position fixed
|
||||
top 0
|
||||
|
||||
#nav > div > div
|
||||
max-height 2rem
|
||||
overflow hidden
|
||||
transition max-height .3s ease-in-out
|
||||
|
||||
#nav .focus
|
||||
max-height 40rem
|
||||
transition max-height .3s ease-in-out
|
||||
|
||||
#cont
|
||||
top 3rem
|
||||
#cont.no-anchor
|
||||
top 0
|
||||
|
||||
/* tablets + phones ----------- */
|
||||
@media only screen and (min-width: 320px) and (max-width: 1024px)
|
||||
body
|
||||
html
|
||||
font-size 21px
|
||||
|
||||
p
|
||||
font-size 1rem
|
||||
line-height 2rem
|
||||
|
||||
#nav
|
||||
#cont
|
||||
width 94%
|
||||
padding-left 3%
|
||||
margin-left 0
|
||||
|
||||
#nav
|
||||
position fixed
|
||||
padding-top 0
|
||||
opacity 1
|
||||
left 0
|
||||
z-index 2
|
||||
|
||||
#nav > div > div
|
||||
max-height 1.2rem
|
||||
|
||||
#nav > div
|
||||
padding-top .6rem
|
||||
|
||||
#nav #sibs
|
||||
width 11rem
|
||||
padding-top 0
|
||||
|
||||
#nav #sibs > div
|
||||
height 20px
|
||||
line-height 20px
|
||||
|
||||
#nav a
|
||||
display inline-block
|
||||
font-size .7rem
|
||||
|
||||
#nav #sides
|
||||
float none
|
||||
margin-left 1rem
|
||||
|
||||
#nav .arow-up
|
||||
#nav .arow-next
|
||||
#nav .arow-prev
|
||||
margin-right 0
|
||||
border .4rem solid transparent
|
||||
|
||||
#nav .arow-up
|
||||
border-bottom .6rem solid #000
|
||||
#nav .arow-next
|
||||
border-left .6rem solid #000
|
||||
#nav .arow-prev
|
||||
margin-right 1rem
|
||||
border-right .6rem solid #000
|
||||
|
||||
#cont
|
||||
left 0
|
||||
padding-bottom 9rem
|
||||
|
||||
#cont h1:first-child
|
||||
margin-top 0
|
||||
|
||||
.short
|
||||
width 100%
|
||||
|
||||
/* phones portrait and landscape ----------- */
|
||||
@media only screen and (min-device-width: 320px) and (max-device-width: 480px)
|
||||
#nav > div > div
|
||||
max-height 1.6rem
|
||||
|
||||
#nav a
|
||||
line-height auto
|
||||
font-size .7rem
|
||||
|
||||
#nav #sibs > div
|
||||
height 20px
|
||||
line-height 20px
|
||||
|
@ -1,50 +0,0 @@
|
||||
div.post
|
||||
h1
|
||||
font-size 2.8rem
|
||||
line-height 4rem
|
||||
margin-top 1rem
|
||||
margin-bottom 1rem
|
||||
|
||||
h2
|
||||
font-family 'scp'
|
||||
font-size .7rem
|
||||
line-height 1rem
|
||||
letter-spacing 1px
|
||||
|
||||
h3
|
||||
margin-top 0
|
||||
font-size .7rem
|
||||
font-weight 200
|
||||
letter-spacing .1rem
|
||||
text-transform uppercase
|
||||
h3::before
|
||||
content '\2014'
|
||||
margin-right .3rem
|
||||
|
||||
.list li
|
||||
margin-bottom 0
|
||||
font-size 1.2rem
|
||||
|
||||
p
|
||||
font-size 1.2rem
|
||||
line-height 2.2rem
|
||||
|
||||
li p
|
||||
display inline
|
||||
|
||||
p.ib
|
||||
margin-top 0
|
||||
|
||||
@media only screen and (min-width: 320px) and (max-width: 1024px)
|
||||
div.post
|
||||
h2
|
||||
h3
|
||||
font-size .5rem
|
||||
p
|
||||
font-size 1rem
|
||||
line-height 2rem
|
||||
|
||||
li h1
|
||||
font-weight 400
|
||||
li::before
|
||||
font-weight 200
|
@ -1,15 +0,0 @@
|
||||
.video
|
||||
iframe
|
||||
width 42rem
|
||||
height 24rem
|
||||
|
||||
.leader
|
||||
font-size 2rem
|
||||
font-weight 500
|
||||
line-height 2.6rem
|
||||
margin-bottom 4rem
|
||||
|
||||
.short img
|
||||
margin-top 2rem
|
||||
width 42rem
|
||||
|
@ -1,16 +0,0 @@
|
||||
TreeDispatcher = require '../dispatcher/Dispatcher.coffee'
|
||||
TreePersistence = require '../persistence/TreePersistence.coffee'
|
||||
|
||||
module.exports =
|
||||
loadPath: (path,data) ->
|
||||
TreeDispatcher.handleServerAction {path,data,type:"path-load"}
|
||||
|
||||
sendQuery: (path,query) ->
|
||||
return unless query?
|
||||
if path.slice(-1) is "/" then path = path.slice(0,-1)
|
||||
TreePersistence.get path,query,(err,res) => @loadPath path,res
|
||||
|
||||
setCurr: (path) ->
|
||||
TreeDispatcher.handleViewAction
|
||||
type:"set-curr"
|
||||
path:path
|
@ -1,163 +0,0 @@
|
||||
clas = require 'classnames'
|
||||
|
||||
BodyComponent = React.createFactory require './BodyComponent.coffee'
|
||||
query = require './Async.coffee'
|
||||
reactify = require './Reactify.coffee'
|
||||
|
||||
TreeStore = require '../stores/TreeStore.coffee'
|
||||
TreeActions = require '../actions/TreeActions.coffee'
|
||||
|
||||
recl = React.createClass
|
||||
{div,a} = React.DOM
|
||||
|
||||
Links = React.createFactory query {
|
||||
path:'t'
|
||||
kids:
|
||||
name:'t'
|
||||
head:'r'
|
||||
meta:'j'
|
||||
}, (recl
|
||||
displayName: "Links"
|
||||
render: -> div {className:'links'},
|
||||
@props.children,
|
||||
@renderUp(),
|
||||
@renderSibs(),
|
||||
@renderArrows()
|
||||
renderUp: ->
|
||||
if @props.sein
|
||||
div {id:"up",key:"up"}, @renderArrow "up", @props.sein
|
||||
renderSibs: ->
|
||||
keys = window.tree.util.getKeys @props.kids
|
||||
if keys.indexOf(@props.curr) isnt -1
|
||||
style = {marginTop: -24 * (keys.indexOf @props.curr) + "px"}
|
||||
div {id:"sibs",style}, keys.map (key) =>
|
||||
href = window.tree.basepath @props.path+"/"+key
|
||||
data = @props.kids[key]
|
||||
head = data.meta.title if data.meta
|
||||
head ?= @toText data.head
|
||||
head ||= key
|
||||
className = clas active: key is @props.curr
|
||||
(div {className,key}, (a {href,onClick:@props.onClick}, head))
|
||||
renderArrow: (name, path) ->
|
||||
href = window.tree.basepath path
|
||||
(a {href,key:"arow-#{name}",className:"arow-#{name}"},"")
|
||||
renderArrows: ->
|
||||
keys = window.tree.util.getKeys @props.kids
|
||||
if keys.length > 1
|
||||
index = keys.indexOf(@props.curr)
|
||||
prev = index-1
|
||||
next = index+1
|
||||
if prev < 0 then prev = keys.length-1
|
||||
if next is keys.length then next = 0
|
||||
prev = keys[prev]
|
||||
next = keys[next]
|
||||
if @props.sein
|
||||
sein = @props.sein
|
||||
if sein is "/" then sein = ""
|
||||
if prev or next then _.filter [
|
||||
div {id:"sides",key:"sides"},
|
||||
if prev then @renderArrow "prev", "#{sein}/#{prev}"
|
||||
if next then @renderArrow "next", "#{sein}/#{next}"
|
||||
]
|
||||
|
||||
toText: (elem)-> reactify.walk elem,
|
||||
()->''
|
||||
(s)->s
|
||||
({c})->(c ? []).join ''
|
||||
), recl
|
||||
displayName: "Links_loading"
|
||||
render: -> div {className:'links'}, @props.children, @_render()
|
||||
_render: -> div {id:"sibs"}, div {className:"active"}, a {}, @props.curr
|
||||
|
||||
CLICK = 'a'
|
||||
module.exports = query {
|
||||
sein:'t'
|
||||
path:'t'
|
||||
name:'t'
|
||||
meta:'j'
|
||||
},(recl
|
||||
displayName: "Anchor"
|
||||
getInitialState: -> url: window.location.pathname
|
||||
|
||||
onClick: -> @toggleFocus()
|
||||
onMouseOver: -> @toggleFocus true
|
||||
onMouseOut: -> @toggleFocus false
|
||||
onTouchStart: -> @ts = Number Date.now()
|
||||
onTouchEnd: -> dt = @ts - Number Date.now()
|
||||
|
||||
toggleFocus: (state) -> $(@getDOMNode()).toggleClass 'focus',state
|
||||
|
||||
componentWillUnmount: -> clearInterval @interval; $('body').off 'click', CLICK
|
||||
componentDidUpdate: -> @setTitle()
|
||||
componentDidMount: ->
|
||||
@setTitle()
|
||||
@interval = setInterval @checkURL,100
|
||||
|
||||
# $('body').on 'keyup', (e) =>
|
||||
# switch e.keyCode
|
||||
# when 37 then @goTo @props.prev # left
|
||||
# when 39 then @goTo @props.next # right
|
||||
|
||||
_this = @
|
||||
$('body').on 'click', CLICK, (e) ->
|
||||
href = $(@).attr('href')
|
||||
id = $(@).attr('id')
|
||||
if href and not /^https?:\/\//i.test(href)
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
if href?[0] isnt "/"
|
||||
href = (document.location.pathname.replace /[^\/]*\/?$/, '') + href
|
||||
_this.goTo window.tree.fragpath href
|
||||
if id
|
||||
window.location.hash = id
|
||||
|
||||
setTitle: ->
|
||||
title = $('#cont h1').first().text() || @props.name
|
||||
title = @props.meta.title if @props.meta?.title
|
||||
document.title = "#{title} - #{@props.path}"
|
||||
|
||||
setPath: (href,hist) ->
|
||||
href_parts = href.split("#")
|
||||
next = href_parts[0]
|
||||
if next.substr(-1) is "/" then next = next.slice(0,-1)
|
||||
href_parts[0] = next
|
||||
if hist isnt false
|
||||
history.pushState {}, "", window.tree.basepath href_parts.join ""
|
||||
if next isnt @props.path
|
||||
React.unmountComponentAtNode $('#cont')[0]
|
||||
TreeActions.setCurr next
|
||||
React.render (BodyComponent {}, ""),$('#cont')[0]
|
||||
|
||||
reset: ->
|
||||
$("html,body").animate {scrollTop:0}
|
||||
# $("#cont").attr 'class',''
|
||||
$('#nav').attr 'style',''
|
||||
$('#nav').removeClass 'scrolling m-up'
|
||||
$('#nav').addClass 'm-down m-fixed'
|
||||
|
||||
goTo: (path) ->
|
||||
@toggleFocus false
|
||||
@reset()
|
||||
@setPath path
|
||||
|
||||
checkURL: ->
|
||||
if @state.url isnt window.location.pathname
|
||||
@reset()
|
||||
@setPath (window.tree.fragpath window.location.pathname),false
|
||||
@setState url: window.location.pathname
|
||||
|
||||
render: ->
|
||||
if @props.meta.anchor is 'none'
|
||||
return (div {}, "")
|
||||
|
||||
obj = {@onMouseOver,@onMouseOut,@onClick,@onTouchStart,@onTouchEnd}
|
||||
if _.keys(window).indexOf("ontouchstart") isnt -1
|
||||
delete obj.onMouseOver
|
||||
delete obj.onMouseOut
|
||||
|
||||
div obj, Links {
|
||||
@onClick
|
||||
curr:@props.name
|
||||
dataPath:@props.sein
|
||||
sein:@props.sein
|
||||
}), "div"
|
@ -1,67 +0,0 @@
|
||||
_load = require './LoadComponent.coffee'
|
||||
|
||||
TreeStore = require '../stores/TreeStore.coffee'
|
||||
TreeActions = require '../actions/TreeActions.coffee'
|
||||
|
||||
recl = React.createClass
|
||||
{div,span,code} = React.DOM
|
||||
|
||||
module.exports = (queries, Child, load=_load)-> recl
|
||||
displayName: "Async"
|
||||
|
||||
getInitialState: -> @stateFromStore()
|
||||
_onChangeStore: ->
|
||||
if @isMounted() then @setState @stateFromStore()
|
||||
|
||||
getPath: ->
|
||||
path = @props.dataPath ? TreeStore.getCurr()
|
||||
if path.slice(-1) is "/"
|
||||
path.slice 0,-1
|
||||
else path
|
||||
stateFromStore: -> got: TreeStore.fulfill @getPath(), queries
|
||||
|
||||
componentDidMount: ->
|
||||
TreeStore.addChangeListener @_onChangeStore
|
||||
@checkPath()
|
||||
|
||||
componentWillUnmount: ->
|
||||
TreeStore.removeChangeListener @_onChangeStore
|
||||
|
||||
componentDidUpdate: (_props,_state) ->
|
||||
if _props isnt @props
|
||||
@setState @stateFromStore()
|
||||
@checkPath()
|
||||
|
||||
checkPath: -> TreeActions.sendQuery @getPath(), @filterQueries()
|
||||
|
||||
filterQueries: -> @filterWith @state.got, queries
|
||||
filterWith: (have,_queries)->
|
||||
return _queries unless have?
|
||||
request = {}
|
||||
for k of _queries when k isnt 'kids'
|
||||
request[k] = _queries[k] unless have[k] isnt undefined
|
||||
if _queries.kids?
|
||||
if not have.kids?
|
||||
request.kids = _queries.kids
|
||||
else
|
||||
request.kids = {}
|
||||
for k,kid of have.kids
|
||||
_.merge request.kids, @filterWith kid, _queries.kids
|
||||
if _.isEmpty request.kids
|
||||
delete request.kids
|
||||
request unless _.isEmpty request
|
||||
|
||||
scrollHash: -> @getHashElement()?.scrollIntoView()
|
||||
getHashElement: ->
|
||||
{hash} = document.location
|
||||
if hash then document.getElementById hash[1..]
|
||||
|
||||
render: -> div {},
|
||||
if @filterQueries()?
|
||||
React.createElement load, @props
|
||||
else
|
||||
if not @getHashElement() # onmount?
|
||||
setTimeout @scrollHash,0
|
||||
React.createElement Child,
|
||||
(_.extend {}, @props, @state.got),
|
||||
@props.children
|
@ -1,84 +0,0 @@
|
||||
clas = require 'classnames'
|
||||
|
||||
query = require './Async.coffee'
|
||||
reactify = require './Reactify.coffee'
|
||||
|
||||
recl = React.createClass
|
||||
rele = React.createElement
|
||||
{div,p,img,a} = React.DOM
|
||||
|
||||
extras =
|
||||
spam: recl
|
||||
displayName:"Spam"
|
||||
render: ->
|
||||
if document.location.hostname isnt 'urbit.org'
|
||||
return (div {})
|
||||
(div {className:'spam'},
|
||||
(a {href:"http://urbit.org#sign-up"}, "Sign up")
|
||||
" for our newsletter."
|
||||
)
|
||||
|
||||
logo: recl
|
||||
displayName:"Logo"
|
||||
render: ->
|
||||
{color} = @props
|
||||
if color is "white" or color is "black" # else?
|
||||
src = "//storage.googleapis.com/urbit-extra/logo/logo-#{color}-100x100.png"
|
||||
(a {href:"http://urbit.org",style:{border:"none"}},
|
||||
(img {src,className:"logo"})
|
||||
)
|
||||
|
||||
|
||||
next: query {
|
||||
path:'t'
|
||||
kids:
|
||||
name:'t'
|
||||
head:'r'
|
||||
meta:'j'
|
||||
}, recl
|
||||
displayName: "Next"
|
||||
render: ->
|
||||
curr = @props.kids[@props.curr]
|
||||
if curr?.meta?.next
|
||||
keys = window.tree.util.getKeys @props.kids
|
||||
if keys.length > 1
|
||||
index = keys.indexOf(@props.curr)
|
||||
next = index+1
|
||||
if next is keys.length then next = 0
|
||||
next = keys[next]
|
||||
next = @props.kids[next]
|
||||
|
||||
if next
|
||||
return (div {className:"link-next"}, [
|
||||
(a {href:"#{@props.path}/#{next.name}"}, "Next: #{next.meta.title}")
|
||||
])
|
||||
return (div {},"")
|
||||
footer: recl
|
||||
displayName: "Footer"
|
||||
render: ->
|
||||
(div {className:"footer"}, (p {}, "This page was served by Urbit."))
|
||||
|
||||
module.exports = query {
|
||||
body:'r'
|
||||
name:'t'
|
||||
path:'t'
|
||||
meta:'j'
|
||||
sein:'t'
|
||||
}, recl
|
||||
displayName: "Body"
|
||||
render: ->
|
||||
className = clas (@props.meta.layout?.split ',')
|
||||
extra = (name,props={})=>
|
||||
if @props.meta[name]? then React.createElement extras[name], props
|
||||
|
||||
(div {
|
||||
id:'body',
|
||||
key:"body"+@props.path
|
||||
className
|
||||
},
|
||||
extra 'spam'
|
||||
extra 'logo', color: @props.meta.logo
|
||||
reactify @props.body
|
||||
extra 'next', {dataPath:@props.sein,curr:@props.name}
|
||||
extra 'footer'
|
||||
)
|
@ -1,9 +0,0 @@
|
||||
recl = React.createClass
|
||||
{div,textarea} = React.DOM
|
||||
|
||||
module.exports = recl
|
||||
render: -> div {}, textarea ref:'ed', value:@props.value
|
||||
componentDidMount: ->
|
||||
CodeMirror.fromTextArea @refs.ed.getDOMNode(),
|
||||
readOnly:true
|
||||
lineNumbers:true
|
@ -1,11 +0,0 @@
|
||||
recl = React.createClass
|
||||
{div} = React.DOM
|
||||
|
||||
module.exports =
|
||||
codemirror: require './CodeMirror.coffee'
|
||||
search: require './SearchComponent.coffee'
|
||||
list: require './ListComponent.coffee'
|
||||
kids: require './KidsComponent.coffee'
|
||||
toc: require './TocComponent.coffee'
|
||||
email: require './EmailComponent.coffee'
|
||||
lost: recl render: -> (div {}, "<lost(", @props.children, ")>")
|
@ -1,45 +0,0 @@
|
||||
reactify = require './Reactify.coffee'
|
||||
|
||||
recl = React.createClass
|
||||
{div,p,button,input} = React.DOM
|
||||
|
||||
module.exports = recl
|
||||
displayName: "email"
|
||||
|
||||
getInitialState: -> {submit:false,email:""}
|
||||
|
||||
onClick: -> @submit()
|
||||
onKeyUp: (e) ->
|
||||
email = @$email.val()
|
||||
valid = (email.indexOf('@') != -1 &&
|
||||
email.indexOf('.') != -1 &&
|
||||
email.length > 7 &&
|
||||
email.split(".")[1].length > 1 &&
|
||||
email.split("@")[0].length > 0 &&
|
||||
email.split("@")[1].length > 4)
|
||||
@$email.toggleClass 'valid',valid
|
||||
@$email.removeClass 'error'
|
||||
if e.keyCode is 13
|
||||
if valid is true
|
||||
@submit()
|
||||
e.stopPropagation()
|
||||
e.preventDefault()
|
||||
return false
|
||||
else
|
||||
@$email.addClass 'error'
|
||||
|
||||
submit: ->
|
||||
$.post @props.dataPath,{email:@$email.val()},() =>
|
||||
@setState {submit:true}
|
||||
|
||||
componentDidMount: -> @$email = $('input.email')
|
||||
|
||||
render: ->
|
||||
if @state.submit is false
|
||||
cont = [
|
||||
(input {key:"field",className:"email",placeholder:"your@email.com",@onKeyUp}, @state.email)
|
||||
(button {key:"submit",className:"submit",@onClick}, "Sign up")
|
||||
]
|
||||
else
|
||||
cont = [(div {className:"submitted"},"Got it. Thanks!")]
|
||||
(p {className:"email",id:"sign-up"}, cont)
|
@ -1,42 +0,0 @@
|
||||
reactify = require './Reactify.coffee'
|
||||
query = require './Async.coffee'
|
||||
|
||||
recl = React.createClass
|
||||
{div,a,ul,li,hr} = React.DOM
|
||||
|
||||
module.exports = query {kids: {body:'r', meta:'j'}}, recl
|
||||
displayName: "Kids"
|
||||
render: ->
|
||||
klass = "kids"
|
||||
if @props.dataType then klass += " #{@props.dataType}"
|
||||
|
||||
sorted = true
|
||||
keyed = {}
|
||||
for k,v of @props.kids
|
||||
if @props.sortBy
|
||||
if @props.sortBy is 'date'
|
||||
if not v.meta?.date?
|
||||
sorted = false
|
||||
continue
|
||||
d = v.meta.date.slice(1).split "."
|
||||
if d.length < 3
|
||||
sorted = false
|
||||
continue
|
||||
str = "#{d[0]}-#{d[1]}-#{d[2]}"
|
||||
if d.length > 3
|
||||
str += " #{d[3]}:#{d[4]}:#{d[5]}"
|
||||
_k = Number(new Date(str))
|
||||
keyed[_k] = k
|
||||
else
|
||||
if not v.meta?.sort? then sorted = false
|
||||
keyed[Number(v.meta?.sort)] = k
|
||||
|
||||
if sorted is false then keyed = _.keys this.props.kids
|
||||
|
||||
keys = _.keys(keyed).sort()
|
||||
if @props.sortBy is 'date' then keys.reverse()
|
||||
|
||||
div {className:klass},
|
||||
for k in keys
|
||||
elem = @props.kids[keyed[k]] ? ""
|
||||
[(div {key:keyed[k]}, reactify elem.body), (hr {},"")]
|
@ -1,109 +0,0 @@
|
||||
clas = require 'classnames'
|
||||
|
||||
reactify = require './Reactify.coffee'
|
||||
query = require './Async.coffee'
|
||||
|
||||
recl = React.createClass
|
||||
{div,pre,span,a,ul,li,h1} = React.DOM
|
||||
|
||||
module.exports = query {
|
||||
path:'t'
|
||||
kids:
|
||||
snip:'r'
|
||||
head:'r'
|
||||
meta:'j'
|
||||
}, recl
|
||||
displayName: "List"
|
||||
|
||||
render: ->
|
||||
k = clas
|
||||
list: true
|
||||
@props.dataType
|
||||
posts: @props.dataType is 'post' # needs css update
|
||||
default: @props['data-source'] is 'default'
|
||||
kids = @renderList()
|
||||
unless kids.length is 0 and @props.is404?
|
||||
return (ul {className:k}, kids)
|
||||
|
||||
div {className:k},
|
||||
h1 {className:'error'}, 'Error: Empty path'
|
||||
div {},
|
||||
pre {}, @props.path
|
||||
span {}, 'is either empty or does not exist.'
|
||||
|
||||
renderList: ->
|
||||
# check if kids all have a sort meta tag
|
||||
sorted = true
|
||||
_keys = []
|
||||
for k,v of @props.kids
|
||||
if @props.sortBy
|
||||
if @props.sortBy is 'date'
|
||||
if not v.meta?.date? then sorted = false
|
||||
_k = Number v.meta.date.slice(1).replace /\./g,""
|
||||
_keys[_k] = k
|
||||
else
|
||||
if not v.meta?.sort? then sorted = false
|
||||
_keys[Number(v.meta?.sort)] = k
|
||||
if @props.sortBy is 'date' then _keys.reverse()
|
||||
if sorted isnt true
|
||||
_keys = _.keys(@props.kids).sort()
|
||||
if @props.dataType is 'post' then _keys=_keys.reverse()
|
||||
for item in _.values _keys
|
||||
path = @props.path+"/"+item
|
||||
elem = @props.kids[item]
|
||||
if elem.meta.hide? then continue
|
||||
href = window.tree.basepath path
|
||||
if elem.meta.link then href = elem.meta.link
|
||||
parts = []
|
||||
title = null
|
||||
if elem.meta?.title
|
||||
title =
|
||||
gn: 'h1'
|
||||
c: [elem.meta.title]
|
||||
if not title && elem.head.c.length > 0
|
||||
title = elem.head
|
||||
if not title
|
||||
title =
|
||||
gn: 'h1'
|
||||
c: [item]
|
||||
unless @props.titlesOnly # redundant? this seems familiar
|
||||
if @props.dataDates
|
||||
_date = elem.meta.date
|
||||
if not _date or _date.length is 0 then _date = ""
|
||||
date =
|
||||
gn: 'div'
|
||||
ga:
|
||||
className: 'date'
|
||||
c: [_date]
|
||||
parts.push date
|
||||
parts.push title
|
||||
unless @props.titlesOnly # redundant? this seems familiar
|
||||
if @props.dataPreview
|
||||
if @props.dataType is 'post' and not elem.meta.preview
|
||||
parts.push (elem.snip.c.slice 0,2)...
|
||||
else
|
||||
if elem.meta.preview
|
||||
preview =
|
||||
gn: 'p'
|
||||
c: [elem.meta.preview]
|
||||
else
|
||||
preview = elem.snip
|
||||
parts.push preview
|
||||
li {key:item,className:@props.dataType ? ""},
|
||||
a {href,className:(clas preview: @props.dataPreview?)},
|
||||
reactify
|
||||
gn: 'div'
|
||||
c: parts
|
||||
|
||||
# if not @props.dataPreview? then (h1 {},item)
|
||||
# else if @props.dataType is 'post'
|
||||
# head =
|
||||
# if elem.meta?.title
|
||||
# gn: 'h1'
|
||||
# c: [elem.meta.title]
|
||||
# else elem.head
|
||||
# reactify
|
||||
# gn: 'div'
|
||||
# c: [head, (elem.snip.c.slice 0,2)...]
|
||||
# else if @props.titlesOnly? then reactify elem.head
|
||||
# else div {}, (reactify elem.head), (reactify elem.snip)
|
@ -1,18 +0,0 @@
|
||||
recl = React.createClass
|
||||
{div,input,textarea} = React.DOM
|
||||
|
||||
module.exports = recl
|
||||
displayName: "Load"
|
||||
getInitialState: -> {anim: 0}
|
||||
|
||||
componentDidMount: -> @interval = setInterval @setAnim, 100
|
||||
|
||||
componentWillUnmount: -> clearInterval @interval
|
||||
|
||||
setAnim: ->
|
||||
anim = @state.anim+1
|
||||
if anim > 3 then anim = 0
|
||||
@setState {anim:anim}
|
||||
|
||||
render: -> (div {className:"loading"},
|
||||
(div {className:"spin state-#{@state.anim}"}, ""))
|
@ -1,30 +0,0 @@
|
||||
recl = React.createClass
|
||||
rele = React.createElement
|
||||
{div,span} = React.DOM
|
||||
load = React.createFactory require './LoadComponent.coffee'
|
||||
|
||||
walk = (root,_nil,_str,_comp)->
|
||||
# manx: {fork: ["string", {gn:"string" ga:{dict:"string"} c:{list:"manx"}}]}
|
||||
_walk = (elem,key)-> switch
|
||||
when !elem? then _nil()
|
||||
when typeof elem == "string" then _str elem
|
||||
when elem.gn?
|
||||
{gn,ga,c} = elem
|
||||
c = (c?.map _walk) ? []
|
||||
_comp.call elem, {gn,ga,c}, key
|
||||
else throw "Bad react-json #{JSON.stringify elem}"
|
||||
_walk root
|
||||
|
||||
Virtual = recl
|
||||
displayName: "Virtual"
|
||||
render: ->
|
||||
{components} = window.tree
|
||||
walk @props.manx,
|
||||
()-> (load {},"")
|
||||
(str)-> str
|
||||
({gn,ga,c},key)-> rele (components[gn] ? gn),
|
||||
(_.extend {key}, ga),
|
||||
c
|
||||
|
||||
reactify = (manx,key)-> rele Virtual, {manx,key}
|
||||
module.exports = _.extend reactify, {walk,Virtual}
|
@ -1,48 +0,0 @@
|
||||
query = require './Async.coffee'
|
||||
reactify = require './Reactify.coffee'
|
||||
|
||||
recl = React.createClass
|
||||
{a,div,input} = React.DOM
|
||||
|
||||
|
||||
module.exports = query {name:'t', kids: sect:'j'}, recl
|
||||
hash:null
|
||||
displayName: "Search"
|
||||
getInitialState: -> search: 'wut'
|
||||
onKeyUp: (e)-> @setState search: e.target.value
|
||||
wrap: (elem,dir,path)->
|
||||
path = path[...-1] if path[-1...] is "/"
|
||||
href = @props.name+"/"+dir+path
|
||||
if elem?.ga?.id
|
||||
{gn,ga,c} = elem
|
||||
ga = _.clone ga
|
||||
href += "#"+ga.id
|
||||
delete ga.id
|
||||
elem = {gn,ga,c}
|
||||
{gn:'div', c:[{gn:'a', ga:{href}, c:[elem]}]}
|
||||
|
||||
render: -> div {},
|
||||
input {@onKeyUp,ref:'inp',defaultValue:'wut'}
|
||||
_(@props.kids)
|
||||
.map(({sect},dir)=> @wrap h,dir,path for h in heds for path,heds of sect)
|
||||
.flatten()
|
||||
.flatten()
|
||||
.map(@highlight)
|
||||
.filter()
|
||||
.take(50)
|
||||
.map(reactify)
|
||||
.value()
|
||||
|
||||
highlight: (e)->
|
||||
return e unless @state.search
|
||||
got = false
|
||||
res = reactify.walk e,
|
||||
()-> null
|
||||
(s)=>
|
||||
m = s.split @state.search
|
||||
return [s] unless m[1]?
|
||||
lit = gn:'span',c:[@state.search],ga:style:background: '#ff6'
|
||||
got = true
|
||||
[m[0], _.flatten([lit,s] for s in m[1..])...]
|
||||
({gn,ga,c})->{gn,ga,c:_.flatten c}
|
||||
res if got
|
@ -1,71 +0,0 @@
|
||||
query = require './Async.coffee'
|
||||
reactify = require './Reactify.coffee'
|
||||
|
||||
recl = React.createClass
|
||||
{div} = React.DOM
|
||||
|
||||
|
||||
module.exports = query {body:'r'}, recl
|
||||
hash:null
|
||||
displayName: "TableOfContents"
|
||||
|
||||
_click: (id)->
|
||||
-> if id then document.location.hash = id
|
||||
|
||||
componentDidMount: ->
|
||||
@int = setInterval @checkHash,100
|
||||
@st = $(window).scrollTop()
|
||||
# $(window).on 'scroll',@checkScroll
|
||||
@$headers = $('#toc').children('h1,h2,h3,h4').filter('[id]')
|
||||
|
||||
checkScroll: ->
|
||||
st = $(window).scrollTop()
|
||||
if Math.abs(@st-st) > 10
|
||||
hash = null
|
||||
@st = st
|
||||
for v in @$headers
|
||||
continue if v.tagName is undefined
|
||||
$h = $ v
|
||||
hst = $h.offset().top-$h.outerHeight(true)+10
|
||||
if hst < st
|
||||
hash = $h.attr('id')
|
||||
if hst > st and hash isnt @hash and hash isnt null
|
||||
@hash = "#"+hash
|
||||
document.location.hash = hash
|
||||
break
|
||||
|
||||
checkHash: ->
|
||||
if document.location.hash?.length > 0 and document.location.hash isnt @hash
|
||||
hash = document.location.hash.slice(1)
|
||||
for v in @$headers
|
||||
$h = $ v
|
||||
if hash is $h.attr('id')
|
||||
@hash = document.location.hash
|
||||
offset = $h.offset().top - $h.outerHeight(true)
|
||||
setTimeout -> $(window).scrollTop offset
|
||||
, 10
|
||||
break
|
||||
|
||||
componentWillUnmount: ->
|
||||
clearInterval @int
|
||||
|
||||
collectHeader: ({gn,ga,c})->
|
||||
if gn and gn[0] is 'h' and parseInt(gn[1]) isnt NaN
|
||||
ga = _.clone ga
|
||||
ga.onClick = @_click ga.id
|
||||
delete ga.id
|
||||
{gn,ga,c}
|
||||
|
||||
parseHeaders: ->
|
||||
if @props.body.c
|
||||
for v in @props.body.c
|
||||
if v.gn is 'div' and v.ga?.id is "toc"
|
||||
return {
|
||||
gn:"div"
|
||||
ga:{className:"toc"}
|
||||
c:[
|
||||
{gn:"h1", ga:{className:"t"}, c:["Table of contents"]}
|
||||
(_.filter v.c.map @collectHeader)...
|
||||
]}
|
||||
|
||||
render: -> reactify @parseHeaders()
|
@ -1,13 +0,0 @@
|
||||
Dispatcher = require('flux').Dispatcher
|
||||
|
||||
module.exports = _.extend new Dispatcher(), {
|
||||
handleServerAction: (action) ->
|
||||
@dispatch
|
||||
source: 'server'
|
||||
action: action
|
||||
|
||||
handleViewAction: (action) ->
|
||||
@dispatch
|
||||
source: 'view'
|
||||
action: action
|
||||
}
|
@ -1,135 +0,0 @@
|
||||
rend = React.render
|
||||
|
||||
$ ->
|
||||
$body = $('body')
|
||||
|
||||
React.initializeTouchEvents(true)
|
||||
|
||||
head = React.createFactory require './components/AnchorComponent.coffee'
|
||||
body = React.createFactory require './components/BodyComponent.coffee'
|
||||
window.tree.components = require './components/Components.coffee' # sigh
|
||||
|
||||
window.tree._basepath = window.urb.util.basepath("/")
|
||||
window.tree._basepath +=
|
||||
(window.location.pathname.replace window.tree._basepath, "").split("/")[0]
|
||||
window.tree.basepath = (path) ->
|
||||
prefix = window.tree._basepath
|
||||
if prefix is "/" then prefix = ""
|
||||
if path[0] isnt "/" then path = "/"+path
|
||||
_path = prefix + path
|
||||
if _path.slice(-1) is "/" then _path = _path.slice(0,-1)
|
||||
_path
|
||||
window.tree.fragpath = (path) ->
|
||||
path.replace(/\/$/,'')
|
||||
.replace(window.tree._basepath,"")
|
||||
|
||||
TreeActions = require './actions/TreeActions.coffee'
|
||||
TreePersistence = require './persistence/TreePersistence.coffee'
|
||||
|
||||
frag = window.tree.fragpath window.location.pathname
|
||||
|
||||
TreeActions.setCurr frag
|
||||
TreeActions.loadPath frag,window.tree.body,window.tree.kids
|
||||
|
||||
rend (head {}, ""),$('#nav')[0]
|
||||
rend (body {}, ""),$('#cont')[0]
|
||||
|
||||
window.tree.util =
|
||||
getKeys: (kids) ->
|
||||
sorted = true
|
||||
keys = []
|
||||
for k,v of kids
|
||||
continue if v.meta?.hide
|
||||
if not v.meta?.sort? then sorted = false
|
||||
keys[Number(v.meta?.sort)] = k
|
||||
if sorted isnt true
|
||||
keys = _.keys(kids).sort()
|
||||
else
|
||||
keys = _.values keys
|
||||
|
||||
checkScroll = ->
|
||||
if $(window).scrollTop() > 20
|
||||
$('#nav').addClass 'scrolling'
|
||||
else
|
||||
$('#nav').removeClass 'scrolling'
|
||||
setInterval checkScroll, 500
|
||||
|
||||
po = {}
|
||||
po.cm = null
|
||||
po.lm = null
|
||||
po.cs = $(window).scrollTop()
|
||||
po.ls = $(window).scrollTop()
|
||||
$(document).mousemove (e) -> po.cm = {x:e.pageX, y:e.pageY}
|
||||
checkMove = ->
|
||||
if po.lm isnt null and po.cm isnt null
|
||||
po.cs = $(window).scrollTop()
|
||||
|
||||
db = $(window).height()-(po.cs+window.innerHeight)
|
||||
|
||||
ds = Math.abs po.cs-po.ls
|
||||
dx = Math.abs po.cm.x-po.lm.x
|
||||
dy = Math.abs po.cm.y-po.lm.y
|
||||
|
||||
$('#nav').toggleClass 'moving',(dx > 20 or dy > 20 or db < 180)
|
||||
po.lm = po.cm
|
||||
po.ls = po.cs
|
||||
setInterval checkMove,200
|
||||
|
||||
so = {}
|
||||
so.ls = $(window).scrollTop()
|
||||
so.cs = $(window).scrollTop()
|
||||
so.w = null
|
||||
so.$n = $('#nav')
|
||||
so.$d = $('#nav > div')
|
||||
so.nh = $('#nav').outerHeight(true)
|
||||
setSo = ->
|
||||
so.w = $(window).width()
|
||||
so.$n = $('#nav')
|
||||
setInterval setSo,200
|
||||
|
||||
$(window).on 'resize', (e) ->
|
||||
if so.w > 1170
|
||||
so.$n.removeClass 'm-up m-down m-fixed'
|
||||
|
||||
$(window).on 'scroll', (e) ->
|
||||
so.cs = $(window).scrollTop()
|
||||
|
||||
if so.w > 1170
|
||||
so.$n.removeClass 'm-up m-down m-fixed'
|
||||
if so.w < 1170
|
||||
dy = so.ls-so.cs
|
||||
|
||||
so.$d.removeClass 'focus'
|
||||
|
||||
if so.cs <= 0
|
||||
so.$n.removeClass 'm-up'
|
||||
so.$n.addClass 'm-down m-fixed'
|
||||
return
|
||||
|
||||
if so.$n.hasClass 'm-fixed' and
|
||||
so.w < 1024
|
||||
so.$n.css left:-1*$(window).scrollLeft()
|
||||
|
||||
if dy > 0
|
||||
if not so.$n.hasClass 'm-down'
|
||||
so.$n.removeClass('m-up').addClass 'm-down'
|
||||
top = so.cs-so.nh
|
||||
if top < 0 then top = 0
|
||||
so.$n.offset top:top
|
||||
if so.$n.hasClass('m-down') and
|
||||
not so.$n.hasClass('m-fixed') and
|
||||
so.$n.offset().top >= so.cs
|
||||
so.$n.addClass 'm-fixed'
|
||||
so.$n.attr {style:''}
|
||||
|
||||
if dy < 0
|
||||
if not so.$n.hasClass 'm-up'
|
||||
so.$n.removeClass('m-down m-fixed').addClass 'm-up'
|
||||
so.$n.attr {style:''}
|
||||
top = so.cs
|
||||
sto = so.$n.offset().top
|
||||
if top < 0 then top = 0
|
||||
if top > sto and top < sto+so.nh then top = sto
|
||||
so.$n.offset top:top
|
||||
|
||||
so.ls = so.cs
|
@ -1,27 +0,0 @@
|
||||
{
|
||||
"name": "tree",
|
||||
"version": "0.0.0",
|
||||
"description": "urbit tree browser",
|
||||
"main": "main.js",
|
||||
"dependencies": {
|
||||
"classnames": "^2.1.3",
|
||||
"coffeeify": "~1.0.0",
|
||||
"flux": "~2.0.1",
|
||||
"react": "~0.12.2",
|
||||
"react-tap-event-plugin": "0.1.4"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/urbit/tree"
|
||||
},
|
||||
"author": "galen wolfe-pauly",
|
||||
"license": "ISC",
|
||||
"bugs": {
|
||||
"url": "https://github.com/urbit/tree/issues"
|
||||
},
|
||||
"homepage": "https://github.com/urbit/tree"
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
dedup = {} # XX wrong layer
|
||||
module.exports =
|
||||
get: (path,query="no-query",cb) ->
|
||||
url = "#{window.tree.basepath(path)}.json?q=#{@encode query}"
|
||||
return if dedup[url]
|
||||
dedup[url] = true
|
||||
$.get url, {}, (data) -> if cb then cb null,data
|
||||
encode: (obj)->
|
||||
delim = (n)-> Array(n+1).join('_') || '.'
|
||||
_encode = (obj)->
|
||||
if typeof obj isnt 'object'
|
||||
return [0,obj]
|
||||
dep = 0
|
||||
sub = for k,v of obj
|
||||
[_dep,res] = _encode v
|
||||
dep = _dep if _dep > dep
|
||||
k+(delim _dep)+res if res?
|
||||
dep++
|
||||
[dep, sub.join delim dep]
|
||||
(_encode obj)[1]
|
@ -1,130 +0,0 @@
|
||||
EventEmitter = require('events').EventEmitter
|
||||
|
||||
MessageDispatcher = require '../dispatcher/Dispatcher.coffee'
|
||||
clog = console.log.bind(console)
|
||||
|
||||
_tree = {}
|
||||
_data = {}
|
||||
_curr = ""
|
||||
|
||||
QUERIES = {body:'r', head:'r', snip:'r', sect:'j', meta:'j'}
|
||||
|
||||
TreeStore = _.extend EventEmitter.prototype, {
|
||||
addChangeListener: (cb) -> @on 'change', cb
|
||||
|
||||
removeChangeListener: (cb) -> @removeListener "change", cb
|
||||
|
||||
emitChange: -> @emit 'change'
|
||||
|
||||
pathToArr: (_path) -> _path.split "/"
|
||||
|
||||
fulfill: (path,query) ->
|
||||
if path is "/" then path = ""
|
||||
@fulfillAt (@getTree path.split '/'),path,query
|
||||
fulfillAt: (tree,path,query)->
|
||||
data = @fulfillLocal path, query
|
||||
have = _data[path]
|
||||
if have?
|
||||
for k,t of query when QUERIES[k]
|
||||
if t isnt QUERIES[k] then throw TypeError "Wrong query type: #{k}, '#{t}'"
|
||||
data[k] = have[k]
|
||||
if query.kids
|
||||
if have.kids is false
|
||||
data.kids = {}
|
||||
else for k,sub of tree
|
||||
data.kids ?= {}
|
||||
data.kids[k] = @fulfillAt sub, path+"/"+k, query.kids
|
||||
data unless _.isEmpty data
|
||||
|
||||
fulfillLocal: (path, query)->
|
||||
data = {}
|
||||
if query.path then data.path = path
|
||||
if query.name then data.name = path.split("/").pop()
|
||||
if query.sein then data.sein = @getPare path
|
||||
if query.next then data.next = @getNext path
|
||||
if query.prev then data.prev = @getPrev path
|
||||
data
|
||||
|
||||
setCurr: (path) -> _curr = path
|
||||
getCurr: -> _curr
|
||||
|
||||
loadPath: (path,data) ->
|
||||
@loadValues (@getTree (path.split '/'),true), path, data
|
||||
loadValues: (tree,path,data) ->
|
||||
old = _data[path] ? {}
|
||||
for k of data when QUERIES[k]
|
||||
old[k] = data[k]
|
||||
|
||||
for k,v of data.kids
|
||||
tree[k] ?= {}
|
||||
@loadValues tree[k], path+"/"+k, v
|
||||
|
||||
if data.kids && _.isEmpty data.kids
|
||||
old.kids = false
|
||||
|
||||
_data[path] = old
|
||||
|
||||
getSiblings: (path=_curr)->
|
||||
curr = path.split("/")
|
||||
curr.pop()
|
||||
if curr.length isnt 0
|
||||
@getTree curr
|
||||
else
|
||||
{}
|
||||
|
||||
getTree: (_path,make=false) ->
|
||||
tree = _tree
|
||||
for sub in _path
|
||||
if not tree[sub]?
|
||||
if not make then return null
|
||||
tree[sub] = {}
|
||||
tree = tree[sub]
|
||||
tree
|
||||
|
||||
getPrev: (path=_curr)->
|
||||
sibs = _.keys(@getSiblings path).sort()
|
||||
if sibs.length < 2
|
||||
null
|
||||
else
|
||||
par = path.split "/"
|
||||
key = par.pop()
|
||||
ind = sibs.indexOf key
|
||||
win = if ind-1 >= 0 then sibs[ind-1] else sibs[sibs.length-1]
|
||||
par.push win
|
||||
par.join "/"
|
||||
|
||||
getNext: (path=_curr)->
|
||||
sibs = _.keys(@getSiblings path).sort()
|
||||
if sibs.length < 2
|
||||
null
|
||||
else
|
||||
par = path.split "/"
|
||||
key = par.pop()
|
||||
ind = sibs.indexOf key
|
||||
win = if ind+1 < sibs.length then sibs[ind+1] else sibs[0]
|
||||
par.push win
|
||||
par.join "/"
|
||||
|
||||
getPare: (path=_curr)->
|
||||
_path = @pathToArr path
|
||||
if _path.length > 1
|
||||
_path.pop()
|
||||
_path = _path.join "/"
|
||||
if _path is "" then _path = "/"
|
||||
_path
|
||||
else
|
||||
null
|
||||
}
|
||||
|
||||
TreeStore.dispatchToken = MessageDispatcher.register (payload) ->
|
||||
action = payload.action
|
||||
|
||||
switch action.type
|
||||
when 'path-load'
|
||||
TreeStore.loadPath action.path,action.data
|
||||
TreeStore.emitChange()
|
||||
when 'set-curr'
|
||||
TreeStore.setCurr action.path
|
||||
TreeStore.emitChange()
|
||||
|
||||
module.exports = TreeStore
|
@ -1,12 +0,0 @@
|
||||
# installing
|
||||
|
||||
`npm install`
|
||||
|
||||
# building
|
||||
|
||||
in `src/js/`:
|
||||
`watchify -v -t coffeeify -o main.js main.coffee`
|
||||
|
||||
in `src/css/`:
|
||||
`stylus -w main.styl`
|
||||
|
Loading…
Reference in New Issue
Block a user