ecrire 0.28.3 → 0.29.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Rakefile +22 -0
  4. data/lib/ecrire/app/assets/images/favicon.ico +0 -0
  5. data/lib/ecrire/app/assets/javascripts/admin/editor/content.coffee +3 -0
  6. data/lib/ecrire/app/assets/javascripts/admin/navigation/save.js.coffee +9 -2
  7. data/lib/ecrire/app/assets/javascripts/admin/posts/filter.js.coffee +19 -0
  8. data/lib/ecrire/app/assets/javascripts/admin/posts/filters/tags.js.coffee +15 -6
  9. data/lib/ecrire/app/assets/javascripts/admin/posts/header.coffee +17 -9
  10. data/lib/ecrire/app/assets/javascripts/admin/posts/list.coffee +6 -0
  11. data/lib/ecrire/app/assets/javascripts/admin/posts/tags/form.coffee +39 -0
  12. data/lib/ecrire/app/assets/javascripts/admin/posts/tags/list.coffee +27 -0
  13. data/lib/ecrire/app/assets/javascripts/admin/posts/tags/tag.coffee +17 -0
  14. data/lib/ecrire/app/assets/javascripts/admin/posts/tags.coffee +11 -0
  15. data/lib/ecrire/app/assets/javascripts/admin/posts/title.coffee +6 -39
  16. data/lib/ecrire/app/assets/javascripts/admin/posts/titles.coffee +8 -0
  17. data/lib/ecrire/app/assets/javascripts/shared/popup.js.coffee +17 -4
  18. data/lib/ecrire/app/assets/stylesheets/admin/header.scss +126 -17
  19. data/lib/ecrire/app/assets/stylesheets/admin/navigation.scss +5 -1
  20. data/lib/ecrire/app/assets/stylesheets/admin/posts.scss +80 -281
  21. data/lib/ecrire/app/assets/stylesheets/admin/preview.scss +55 -0
  22. data/lib/ecrire/app/assets/stylesheets/admin/tags.scss +59 -0
  23. data/lib/ecrire/app/assets/stylesheets/admin/title.scss +79 -89
  24. data/lib/ecrire/app/assets/stylesheets/shared/popup.scss +4 -20
  25. data/lib/ecrire/app/assets/stylesheets/vendor/prism.scss +1 -0
  26. data/lib/ecrire/app/controllers/admin/posts/tags_controller.rb +30 -2
  27. data/lib/ecrire/app/controllers/admin/posts/titles_controller.rb +10 -5
  28. data/lib/ecrire/app/controllers/admin/posts_controller.rb +10 -10
  29. data/lib/ecrire/app/helpers/admin/posts_helper.rb +7 -3
  30. data/lib/ecrire/app/helpers/application_helper.rb +20 -0
  31. data/lib/ecrire/app/helpers/content_tag_helper.rb +4 -0
  32. data/lib/ecrire/app/models/admin/post.rb +23 -0
  33. data/lib/ecrire/app/models/post.rb +1 -1
  34. data/lib/ecrire/app/models/tag.rb +8 -0
  35. data/lib/ecrire/app/views/admin/posts/_post.html.erb +9 -0
  36. data/lib/ecrire/app/views/admin/posts/edit.html.erb +21 -61
  37. data/lib/ecrire/app/views/admin/posts/header/_base.html.erb +54 -0
  38. data/lib/ecrire/app/views/admin/posts/index.html.erb +52 -33
  39. data/lib/ecrire/app/views/admin/posts/index.js.erb +1 -1
  40. data/lib/ecrire/app/views/admin/posts/show.html.erb +5 -23
  41. data/lib/ecrire/app/views/admin/posts/tags/_tag.html.erb +11 -2
  42. data/lib/ecrire/app/views/admin/posts/tags/_tags.html.erb +12 -0
  43. data/lib/ecrire/app/views/admin/posts/tags/create.js.erb +2 -0
  44. data/lib/ecrire/app/views/admin/posts/tags/index.js.erb +1 -0
  45. data/lib/ecrire/app/views/admin/posts/tags/toggle.js.erb +2 -1
  46. data/lib/ecrire/app/views/admin/posts/titles/_form.html.erb +2 -2
  47. data/lib/ecrire/app/views/admin/posts/titles/_index.html.erb +10 -0
  48. data/lib/ecrire/app/views/admin/posts/titles/_titles.html.erb +6 -0
  49. data/lib/ecrire/app/views/admin/posts/titles/index.html.erb +2 -37
  50. data/lib/ecrire/app/views/admin/posts/titles/index.js.erb +2 -0
  51. data/lib/ecrire/app/views/admin/posts/titles/update.js.erb +1 -0
  52. data/lib/ecrire/app/views/admin/tags/_tags.html.erb +6 -10
  53. data/lib/ecrire/app/views/admin/tags/index.js.erb +1 -1
  54. data/lib/ecrire/app/views/layouts/admin/application.html.erb +1 -1
  55. data/lib/ecrire/application.rb +0 -2
  56. data/lib/ecrire/commands/console.rb +1 -1
  57. data/lib/ecrire/config/environment/development.rb +2 -0
  58. data/lib/ecrire/db/migrate/20140618321984_add_properties_to_posts.rb +1 -1
  59. data/lib/ecrire/onboarding/assets/stylesheets/shared/base.scss +11 -10
  60. data/lib/ecrire/onboarding/assets/stylesheets/shared/complete.scss +1 -0
  61. data/lib/ecrire/onboarding/assets/stylesheets/shared/welcome.scss +1 -1
  62. data/lib/ecrire/routes.rb +1 -1
  63. data/lib/ecrire/theme/template/assets/stylesheets/shared/{base.css.scss → base.scss} +4 -18
  64. data/lib/ecrire/theme/template/assets/stylesheets/shared/code.scss +33 -0
  65. data/lib/ecrire/theme/template/assets/stylesheets/shared/{header.css.scss → header.scss} +13 -3
  66. data/lib/ecrire/theme/template/assets/stylesheets/shared/{posts.css.scss → posts.scss} +10 -0
  67. data/lib/ecrire/theme/template/controllers/posts_controller.rb +0 -4
  68. data/lib/ecrire/theme/template/secrets.yml +4 -4
  69. data/lib/ecrire/theme/template/views/layouts/application.html.erb +2 -2
  70. data/lib/ecrire/version.rb +1 -1
  71. data/lib/ecrire.rb +1 -0
  72. data/test/editor/models/post_test.rb +1 -1
  73. data/test/theme/theme/views/layouts/application.html.erb +1 -0
  74. metadata +35 -18
  75. data/lib/ecrire/app/assets/javascripts/admin/posts/filters/filter.js.coffee +0 -21
  76. data/lib/ecrire/app/assets/javascripts/admin/posts/tag.js.coffee +0 -11
  77. data/lib/ecrire/app/views/admin/posts/_posts.html.erb +0 -26
  78. /data/lib/ecrire/app/assets/javascripts/admin/posts/{new.js.coffee → new.coffee} +0 -0
  79. /data/lib/ecrire/app/assets/javascripts/admin/posts/{toggle.js.coffee → toggle.coffee} +0 -0
  80. /data/lib/ecrire/theme/template/assets/stylesheets/browser/{base.css.scss → base.scss} +0 -0
  81. /data/lib/ecrire/theme/template/assets/stylesheets/{browser.css.scss → browser.scss} +0 -0
  82. /data/lib/ecrire/theme/template/assets/stylesheets/mobile/{base.css.scss → base.scss} +0 -0
  83. /data/lib/ecrire/theme/template/assets/stylesheets/{mobile.css.scss → mobile.scss} +0 -0
  84. /data/lib/ecrire/theme/template/assets/stylesheets/shared/{tags.css.scss → tags.scss} +0 -0
  85. /data/lib/ecrire/theme/template/assets/stylesheets/tablet/{base.css.scss → base.scss} +0 -0
  86. /data/lib/ecrire/theme/template/assets/stylesheets/{tablet.css.scss → tablet.scss} +0 -0
  87. /data/lib/ecrire/theme/template/assets/stylesheets/{variables.css.scss → variables.scss} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 629884e8e58d57c5c64d4f888d93ba8bf33549fb
4
- data.tar.gz: 8cf5ac6fe7db70763605200d1d70195bb63a8d93
3
+ metadata.gz: 972644840a974c24fcf476528edce7ffff3360a5
4
+ data.tar.gz: 50ab53263e7654829b081cc356a13dde20afcf24
5
5
  SHA512:
6
- metadata.gz: 9f63c01f342f64ab815edb42ce430c5ebcd07a134f73af6b55e8e578e00a144d51fa8dd51a6262edd0ae1337031e0749420985d7d1a2838788e03f7f74737757
7
- data.tar.gz: 4defce3a565e5c53d7696191e6daeb4dd6bda4a94d6b13e71bf588f20cf8c4159a21bf147517a456572f42a5d38534954ab8c5933ada39a4145457dbfae8db3d
6
+ metadata.gz: 342ed664666e9efa6a4787ceb059aee6608b62a0e1ed647d971d0b847db0d98ffced77f9e97915c136cf318eace3e4d3d2841e8b25fb72d29a42ba0def2945aa
7
+ data.tar.gz: 7954cd679f01d36420e87b1bd2dc8ae18e0f3fa9cc9e8d480be1f77cb88d1952a277f735eb7eda400c8b0360f30642efaa2a8b0e2dd2891095829d65f51f4189
data/Gemfile CHANGED
@@ -18,6 +18,6 @@ gem 'coffee-rails', '~> 4.0'
18
18
  gem 'turbolinks', '~> 2.2'
19
19
  gem 'bourbon', '~> 3.2'
20
20
  gem 'uglifier', '~> 2.5'
21
- gem 'jbuilder', '~> 2.2'
21
+ gem 'jbuilder'
22
22
 
23
23
  gem 'byebug'
data/Rakefile CHANGED
@@ -66,6 +66,7 @@ namespace :test do
66
66
  t.verbose = true
67
67
  end
68
68
 
69
+
69
70
  end
70
71
 
71
72
  task :test do
@@ -73,3 +74,24 @@ task :test do
73
74
  Rake::Task[name].invoke
74
75
  end
75
76
  end
77
+
78
+
79
+ namespace :template do
80
+ desc 'Run a server set to use the template theme'
81
+ task :server do
82
+ require 'ecrire/commands/server'
83
+ Dir.chdir 'lib/ecrire/theme/template'
84
+ Rails.env = ENV['RAILS_ENV'] = 'development'
85
+ Ecrire::Commands::Server.new(Port: 3000).run!
86
+ end
87
+
88
+ task :routes do
89
+ Dir.chdir 'lib/ecrire/theme/template'
90
+ Rails.env = ENV['RAILS_ENV'] = 'development'
91
+ Ecrire::Application.initialize!
92
+ all_routes = Ecrire::Application.routes.routes
93
+ require 'action_dispatch/routing/inspector'
94
+ inspector = ActionDispatch::Routing::RoutesInspector.new(all_routes)
95
+ puts inspector.format(ActionDispatch::Routing::ConsoleFormatter.new, ENV['CONTROLLER'])
96
+ end
97
+ end
@@ -3,6 +3,9 @@ ObserveJS.bind 'Editor.Content', class @Editor
3
3
  loaded: =>
4
4
  @on 'keydown', @linefeed
5
5
 
6
+ if @parsers?
7
+ return
8
+
6
9
  @parsers = Editor.Parsers.sort()
7
10
 
8
11
  @extensions = Editor.Extensions.map (ext) =>
@@ -31,7 +31,11 @@ ObserveJS.bind 'Editor.Save', class
31
31
  e.preventDefault()
32
32
  e.stopPropagation()
33
33
 
34
- dialog = @retrieve('#SavePost').cloneNode(true)
34
+ dialog = @retrieve('#SavePost')
35
+
36
+ if e.type == 'click'
37
+ dialog.dataset.preview = true
38
+
35
39
  document.body.appendChild(dialog)
36
40
 
37
41
  saved: (e) =>
@@ -59,7 +63,10 @@ ObserveJS.bind 'Editor.Save.Dialog', class
59
63
  saved: (e) =>
60
64
  msg = @element().querySelector('.message')
61
65
  msg.innerHTML = e.MessageHTML
62
- window.setTimeout @remove, 400
66
+ if @element().dataset.preview == 'true'
67
+ window.location = @element().getAttribute('href')
68
+ else
69
+ window.setTimeout @remove, 400
63
70
 
64
71
  download: (e) =>
65
72
  if e.lengthComputable
@@ -0,0 +1,19 @@
1
+ ObserveJS.bind 'Posts.Filter', class
2
+ loaded: =>
3
+ for el in @element().elements
4
+ switch el.type
5
+ when 'text', 'hidden' then @on 'input', el, @search
6
+ when 'radio' then @on 'change', el, @search
7
+
8
+ document.querySelector('input.search').focus()
9
+
10
+ search: =>
11
+ xhr = new ObserveJS.XHR(@element())
12
+ for el in @element().elements
13
+ switch el.type
14
+ when 'text', 'hidden' then xhr.data.set(el.name, el.value) if el.value.length > 0
15
+ when 'radio' then xhr.data.set(el.name, el.value) if el.checked == true && el.value.length > 0
16
+ xhr.send()
17
+
18
+ document.querySelector('input.search').focus()
19
+
@@ -15,26 +15,35 @@ ObserveJS.bind 'Posts.Filter.Tags', class
15
15
 
16
16
  return unless el?
17
17
 
18
+ input = @element().querySelector('input[type=hidden]')
18
19
  span = @retrieve('span.tag')
19
20
  span.textContent = el.textContent
21
+ input.value = el.getAttribute('oid')
22
+
20
23
  @retrieve('svg.placeholder').remove()
21
24
  @element().appendChild(span)
22
25
  @element().appendChild(@retrieve('svg.clear'))
23
- @element().setAttribute('tid', el.getAttribute('oid'))
24
26
  @element().classList.add 'tagged'
27
+
25
28
  document.querySelector("[as='Overlay']").instance.remove()
26
- document.querySelector("[as='Posts.Filter']").instance.search()
27
- document.querySelector("[as='Posts.Filter'] input.search").focus()
29
+
30
+ @changed(input)
28
31
 
29
32
  action: =>
33
+ input = @element().querySelector('input[type=hidden]')
30
34
  if @element().classList.contains('tagged')
31
35
  @retrieve('svg.clear').remove()
32
36
  @retrieve('span.tag').remove()
33
37
  @element().appendChild(@retrieve('svg.placeholder'))
34
38
  @element().classList.remove('tagged')
35
- @element().removeAttribute('tid')
39
+ input.value = null
40
+ @changed(input)
36
41
  else
37
42
  xhr = new ObserveJS.XHR(@element())
38
43
  xhr.send()
39
- document.querySelector("[as='Posts.Filter']").instance.search()
40
- document.querySelector("[as='Posts.Filter'] input.search").focus()
44
+
45
+
46
+ changed: (el) =>
47
+ event = new Event('input')
48
+ el.dispatchEvent(event)
49
+
@@ -11,12 +11,24 @@ ObserveJS.bind 'Post.Header', class
11
11
 
12
12
  @on 'images:create', @refresh
13
13
  @on 'images:destroy', @refresh
14
- @on 'titles:index', @popup
15
- @on 'titles:update', document, @updateTitle
16
- @on 'titles:create', document, @updateTitle
17
14
 
18
- popup: (e) =>
19
- document.body.appendChild(e.HTML)
15
+ @on 'scroll', window, @resize
16
+
17
+ @maxHeight = parseFloat(window.getComputedStyle(this.element())['height'])
18
+
19
+ @resize()
20
+
21
+ resize: =>
22
+ height = @maxHeight - window.scrollY
23
+ if height < 0
24
+ height = 0
25
+
26
+ if height != @maxHeight
27
+ @element().querySelector('nav').classList.add 'hidden'
28
+ else
29
+ @element().querySelector('nav').classList.remove 'hidden'
30
+
31
+ @element().style.height = "#{height}px"
20
32
 
21
33
  show: (el) =>
22
34
  @show.container ||= @element().querySelector('div.drop')
@@ -118,7 +130,3 @@ ObserveJS.bind 'Post.Header', class
118
130
  @element().style.backgroundImage = null
119
131
 
120
132
  @clear()
121
-
122
- updateTitle: (e) =>
123
- unless e.Errors?
124
- @element().querySelector('a.title').textContent = e.Title
@@ -0,0 +1,6 @@
1
+ ObserveJS.bind 'Posts.List', class
2
+ loaded: =>
3
+ @on 'posts:index', document, @refresh
4
+
5
+ refresh: (e) =>
6
+ @element().innerHTML = e.HTML.innerHTML
@@ -0,0 +1,39 @@
1
+ ObserveJS.bind 'Post.Tags.Form', class
2
+ loaded: =>
3
+ @on 'input', @search
4
+ @on 'submit', @send
5
+ @on 'tags:index', @refresh
6
+ @on 'tags:create', @append
7
+
8
+ @element().querySelector('#TagName').focus()
9
+
10
+ send: (e) =>
11
+ e.preventDefault()
12
+ e.stopPropagation()
13
+ ObserveJS.XHR.send(@element())
14
+
15
+ search: (e) =>
16
+ xhr = new ObserveJS.XHR(@element())
17
+ xhr.method = 'GET'
18
+ xhr.data.set 'q', e.target.value
19
+ xhr.send()
20
+
21
+ append: (e) =>
22
+ oid = e.HTML.getAttribute('oid')
23
+ list = @element().nextElementSibling
24
+ el = list.querySelector("[oid='#{oid}']")
25
+
26
+ if el?
27
+ el.parentElement.replaceChild(e.HTML, el)
28
+ return
29
+
30
+ el = list.querySelector('li.empty')
31
+ if el?
32
+ el.remove()
33
+ list.appendChild(e.HTML)
34
+ return
35
+
36
+ refresh: (e) =>
37
+ sibling = @element().nextElementSibling
38
+ list = e.HTML.querySelector('ul.tags')
39
+ @element().parentElement.replaceChild(list, sibling)
@@ -0,0 +1,27 @@
1
+ ObserveJS.bind 'Post.Tags.List', class
2
+ loaded: =>
3
+ @on 'mouseover', @clear
4
+ @on 'keydown', @element().parentElement, @navigate
5
+
6
+ navigate: (e) =>
7
+ switch e.keyCode
8
+ when 40 then @down()
9
+ when 38 then @up()
10
+
11
+ down: =>
12
+ el = @element().querySelector('li:focus')
13
+ if el?
14
+ (el.nextElementSibling || el).focus()
15
+ else
16
+ @element().firstElementChild.focus()
17
+
18
+ up: =>
19
+ el = @element().querySelector('li:focus')
20
+ if el?
21
+ (el.previousElementSibling || @element().previousElementSibling.querySelector('#TagName')).focus()
22
+
23
+ clear: =>
24
+ el = document.activeElement
25
+ if el.getAttribute('as') == 'Post.Tags.Tag'
26
+ el.blur()
27
+
@@ -0,0 +1,17 @@
1
+ ObserveJS.bind 'Post.Tags.Tag', class
2
+ loaded: =>
3
+ @on 'change', @submit
4
+ @on 'tags:toggle', @update
5
+ @on 'keypress', @submit
6
+
7
+ submit: (e) =>
8
+ ObserveJS.XHR.send(@element())
9
+
10
+ update: (e) =>
11
+ oid = e.HTML.getAttribute('oid')
12
+ if @element().getAttribute('oid') == oid
13
+ activeElement = document.activeElement
14
+ @element().parentElement.replaceChild(e.HTML, @element())
15
+ if activeElement == @element()
16
+ e.HTML.focus()
17
+
@@ -0,0 +1,11 @@
1
+ ObserveJS.bind 'Post.Tags', class
2
+ loaded: =>
3
+ @on 'tags:toggle', document, @refresh
4
+ @on 'tags:create', document, @refresh
5
+ @on 'tags:index', @show
6
+
7
+ refresh: (e) =>
8
+ @element().innerHTML = e.TagsHTML.innerHTML
9
+
10
+ show: (e) =>
11
+ document.body.appendChild(e.HTML)
@@ -1,44 +1,11 @@
1
1
  ObserveJS.bind 'Post.Title', class
2
2
  loaded: =>
3
- @on 'keydown', @enter
4
- @observer = new MutationObserver(@modified)
5
- @observer.settings = {
6
- childList: true,
7
- subtree: true,
8
- }
9
- @input = @element().querySelector('div.input')
10
- @errors = @element().querySelector('ul.errors')
11
- @observe()
12
- @on 'titles:update', @update
13
- @on 'titles:create', @update
14
- @input.focus()
3
+ @on 'titles:index', @show
4
+ @on 'titles:update', document, @refresh
15
5
 
16
- dismiss: =>
17
- @element().parentElement.instance.remove()
6
+ show: (e) =>
7
+ document.body.appendChild(e.HTML)
18
8
 
19
- update: (e) =>
20
- if e.Errors
21
- @errors.appendChild(error) for error in e.Errors
22
- else
23
- @dismiss()
9
+ refresh: (e) =>
10
+ @element().textContent = e.HTML.children[0].textContent
24
11
 
25
- enter: (e) =>
26
- if e.keyCode == 13
27
- @errors.innerHTML = ''
28
- e.stopPropagation()
29
- e.preventDefault()
30
- @save()
31
- return
32
-
33
- modified: (observedMutations) =>
34
- @observer.disconnect()
35
- @input.innerHTML = @input.textContent
36
- @observe()
37
-
38
- observe: =>
39
- @observer.observe @input, @observer.settings
40
-
41
- save: =>
42
- xhr = new ObserveJS.XHR(@element())
43
- xhr.data.set '[title]name', @input.textContent
44
- xhr.send()
@@ -0,0 +1,8 @@
1
+ ObserveJS.bind 'Post.Titles', class
2
+ loaded: =>
3
+ @on 'titles:update', document, @refresh
4
+ @on 'titles:create', document, @refresh
5
+
6
+ refresh: (e) =>
7
+ @element().innerHTML = e.HTML.innerHTML
8
+
@@ -1,6 +1,19 @@
1
- ObserveJS.bind 'Posts.Popup', class
1
+ ObserveJS.bind 'Popup', class
2
2
  loaded: =>
3
- @on 'posts:index', @show
3
+ @on 'click', document, @clicked
4
+ @on 'keyup', document, @escaped
4
5
 
5
- show: (e) =>
6
- document.body.appendChild(e.HTML)
6
+ clicked: (e) =>
7
+ el = e.target
8
+ while el != @element() && el?
9
+ el = el.parentElement
10
+
11
+ unless el?
12
+ @remove()
13
+
14
+ escaped: (e) =>
15
+ if e.keyCode == 27
16
+ @remove()
17
+
18
+ remove: (e) =>
19
+ @element().remove()
@@ -5,17 +5,50 @@ main.posts > header {
5
5
  @include justify-content(center);
6
6
  @include flex-direction(column);
7
7
 
8
+ position: fixed;
9
+ left: 0;
10
+ right: 0;
11
+
8
12
  background-color: $bright-blue;
9
13
  background-size: cover;
10
14
  background-position: center left;
11
15
 
12
16
  color: lighten($bright-blue, 50%);
13
17
 
14
- height: 30vh;
15
- min-height: 200px;
18
+ height: 200px;
19
+ min-height: 100px;
20
+ margin-top: 46px;
21
+
22
+ h2 {
23
+ @include display(flex);
24
+ @include flex(1);
25
+ font-size: 2.3em;
26
+ margin: 1em 0;
27
+ text-align: center;
28
+ color: lighten($gray-blue, 50%);
29
+ }
30
+
31
+ nav {
32
+ @include display(flex);
33
+ @include justify-content(space-between);
34
+ @include align-items(center);
35
+ @include flex(0 auto);
36
+ @include transition(opacity 0.2s);
37
+
38
+ z-index: 100;
39
+ width: 100%;
40
+ margin: 2em 0 0 0;
41
+ padding: 0 1em;
42
+ position: absolute;
43
+
44
+ &.hidden {
45
+ opacity: 0;
46
+ }
47
+ }
48
+
16
49
  }
17
50
 
18
- main.edit.posts > header > div.title {
51
+ main.posts > header > div.title {
19
52
  @include display(flex);
20
53
  @include flex(1);
21
54
  @include flex-direction(column);
@@ -24,7 +57,6 @@ main.edit.posts > header > div.title {
24
57
  text-align: center;
25
58
  width: 100%;
26
59
  z-index: 5;
27
- margin: 1em 0;
28
60
 
29
61
  & > p.browse {
30
62
  @include transition(color 0.3s);
@@ -91,7 +123,6 @@ main.edit.posts > header > div.title {
91
123
 
92
124
  background-size: cover;
93
125
  position: relative;
94
- padding-bottom: 0.5em;
95
126
  border-bottom: 1px solid #E8E8E8;
96
127
 
97
128
  &.image {
@@ -110,6 +141,7 @@ main.edit.posts > header > div.title {
110
141
  input[type='file'] {
111
142
  visibility: hidden;
112
143
  height: 1px;
144
+ padding: 0;
113
145
  }
114
146
 
115
147
  }
@@ -198,19 +230,96 @@ main.edit.posts > header > div.title {
198
230
  }
199
231
  }
200
232
 
201
- main.posts [as='Navigation.Toggle'] {
202
- @include flex(0 auto);
203
- @include transition(transform 0.2s, color 0.2s);
204
- width: 2em;
205
- height: auto;
233
+ [as='Post.Header'] div.publish.state {
234
+ @include transition(background-color 0.2s);
235
+ position: relative;
236
+ padding: 2px;
237
+ width: 10em;
238
+ height: 30px;
239
+ background-color: rgba(black, 0.2);
240
+ color: darken($bright-blue, 25%);
241
+ border-radius: 60px;
206
242
  cursor: pointer;
207
- fill: rgba(212, 228, 237, 1);
208
- margin: 8px auto;
209
- &:hover {
210
- fill: #73CDFF;
243
+ overflow: hidden;
244
+
245
+ &:hover label:last-child {
246
+ background-color: darken(white, 2%);
247
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.6);
248
+ }
249
+
250
+ label {
251
+ display: block;
252
+ position: absolute;
253
+ font-weight: bold;
254
+ line-height: 2em;
255
+ text-indent: 0;
256
+ top: 1px;
257
+ left: 1px;
258
+ bottom: 1px;
259
+ cursor: pointer;
260
+ padding: 0 1em;
261
+ }
262
+
263
+ label:first-child {
264
+ @include transition(background 0.2s, text-indent 0.2s);
265
+ right: 1px;
266
+ background-color: #f1f1f1;
267
+ border-radius: 30px;
268
+ text-indent: 0;
211
269
  }
212
- &.active {
213
- @include transform(rotate(180deg));
214
- fill: #1A5371;
270
+
271
+ label:last-child {
272
+ @include transition(background 0.2s, box-shadow 0.2s, margin 0.2s);
273
+ width: 28px;
274
+ background-color: white;
275
+ border-radius: 100%;
276
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
277
+ text-indent: 30px;
278
+ }
279
+
280
+ &[published='true'] {
281
+ background-color: rgba(black, 0.5);
282
+
283
+ label:first-child {
284
+ background-color: darken($bright-blue, 25%);
285
+ color: lighten($bright-blue, 50%);
286
+ }
287
+
288
+ label:last-child {
289
+ margin-left: calc(10em - 30px);
290
+ text-indent: 10em;
291
+ }
292
+ }
293
+
294
+ &:not([published='true']) {
295
+ label:first-child {
296
+ text-indent: -20em;
297
+ }
298
+
299
+ label:last-child {
300
+ }
301
+ }
302
+
303
+ }
304
+
305
+ #PostsIndex header {
306
+ @include flex-direction(row);
307
+ @include flex-wrap(wrap);
308
+ @include align-items(center);
309
+ @include align-content(center);
310
+ @include justify-content(center);
311
+
312
+ position: relative;
313
+ min-height: 200px;
314
+
315
+ & > h1 {
316
+ text-align: center;
317
+ width: 100%;
318
+ }
319
+
320
+ & > section {
321
+ @include flex(0 auto);
322
+ @include display(flex);
215
323
  }
216
324
  }
325
+
@@ -15,7 +15,11 @@ nav#Menu.admin {
15
15
  font-size: 16px;
16
16
  font-weight: bold;
17
17
  padding: 0 2em;
18
- z-index: 10;
18
+ z-index: 1000;
19
+ position: fixed;
20
+ left: 0;
21
+ right: 0;
22
+ top: 0;
19
23
 
20
24
  background-color: lighten($gray-blue, 25%);
21
25
  color: darken($gray-blue, 30%);