lookbook 1.2.1 → 1.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +47 -14
  4. data/app/assets/lookbook/css/themes/blue.css +4 -2
  5. data/app/assets/lookbook/css/themes/green.css +66 -0
  6. data/app/assets/lookbook/css/themes/indigo.css +4 -2
  7. data/app/assets/lookbook/css/themes/rose.css +66 -0
  8. data/app/assets/lookbook/css/themes/zinc.css +4 -2
  9. data/app/components/lookbook/base_component.rb +2 -2
  10. data/app/components/lookbook/code/component.css +2 -2
  11. data/app/components/lookbook/code/component.html.erb +3 -2
  12. data/app/components/lookbook/code/component.rb +13 -2
  13. data/app/components/lookbook/code/highlight_github.css +406 -0
  14. data/app/components/lookbook/header/component.html.erb +1 -1
  15. data/app/components/lookbook/inspector_panel/component.rb +4 -6
  16. data/app/components/lookbook/nav/component.rb +8 -15
  17. data/app/components/lookbook/nav/directory/component.html.erb +28 -0
  18. data/app/components/lookbook/nav/directory/component.rb +4 -0
  19. data/app/components/lookbook/nav/{item → entity}/component.html.erb +8 -8
  20. data/app/components/lookbook/nav/entity/component.rb +49 -0
  21. data/app/components/lookbook/nav/item/component.css +15 -0
  22. data/app/components/lookbook/nav/item/component.js +4 -0
  23. data/app/components/lookbook/nav/item/component.rb +13 -56
  24. data/app/components/lookbook/params/editor/component.html.erb +2 -2
  25. data/app/components/lookbook/params/editor/component.rb +3 -10
  26. data/app/components/lookbook/params/field/component.css +3 -3
  27. data/app/components/lookbook/params/field/component.html.erb +8 -8
  28. data/app/components/lookbook/params/field/component.rb +21 -72
  29. data/app/components/lookbook/split_layout/component.html.erb +1 -1
  30. data/app/components/lookbook/tabs/component.html.erb +1 -1
  31. data/app/components/lookbook/tabs/component.js +4 -0
  32. data/app/components/lookbook/tag_component.rb +1 -1
  33. data/app/components/lookbook/viewport/component.css +1 -1
  34. data/app/components/lookbook/viewport/component.html.erb +1 -1
  35. data/app/components/lookbook/viewport/component.rb +1 -1
  36. data/app/controllers/concerns/lookbook/targetable_concern.rb +131 -0
  37. data/app/controllers/concerns/lookbook/with_preview_controller_concern.rb +13 -0
  38. data/app/controllers/lookbook/application_controller.rb +21 -9
  39. data/app/controllers/lookbook/inspector_controller.rb +45 -0
  40. data/app/controllers/lookbook/page_controller.rb +13 -9
  41. data/app/controllers/lookbook/pages_controller.rb +9 -15
  42. data/app/controllers/lookbook/previews_controller.rb +4 -210
  43. data/app/helpers/lookbook/application_helper.rb +2 -2
  44. data/app/helpers/lookbook/output_helper.rb +5 -5
  45. data/app/helpers/lookbook/page_helper.rb +7 -4
  46. data/app/views/layouts/lookbook/application.html.erb +40 -38
  47. data/app/views/layouts/lookbook/page.html.erb +2 -2
  48. data/app/views/layouts/lookbook/shell.html.erb +3 -2
  49. data/app/views/layouts/lookbook/skeleton.html.erb +7 -7
  50. data/app/views/lookbook/index.html.erb +13 -2
  51. data/app/views/lookbook/{previews → inspector}/inputs/_color.html.erb +0 -0
  52. data/app/views/lookbook/{previews → inspector}/inputs/_range.html.erb +0 -0
  53. data/app/views/lookbook/{previews → inspector}/inputs/_select.html.erb +0 -0
  54. data/app/views/lookbook/{previews → inspector}/inputs/_text.html.erb +0 -0
  55. data/app/views/lookbook/{previews → inspector}/inputs/_textarea.html.erb +0 -0
  56. data/app/views/lookbook/{previews → inspector}/inputs/_toggle.html.erb +5 -5
  57. data/app/views/lookbook/{previews → inspector}/panels/_content.html.erb +0 -0
  58. data/app/views/lookbook/{previews → inspector}/panels/_notes.html.erb +2 -2
  59. data/app/views/lookbook/{previews → inspector}/panels/_output.html.erb +0 -0
  60. data/app/views/lookbook/inspector/panels/_params.html.erb +15 -0
  61. data/app/views/lookbook/{previews → inspector}/panels/_preview.html.erb +0 -0
  62. data/app/views/lookbook/{previews → inspector}/panels/_source.html.erb +0 -0
  63. data/app/views/lookbook/{previews → inspector}/show.html.erb +5 -2
  64. data/config/app.yml +11 -1
  65. data/config/inputs.yml +12 -12
  66. data/config/languages.yml +41 -0
  67. data/config/panels.yml +6 -6
  68. data/config/routes.rb +5 -5
  69. data/config/tags.yml +8 -1
  70. data/lib/lookbook/engine.rb +103 -130
  71. data/lib/lookbook/entities/collections/component_collection.rb +4 -0
  72. data/lib/lookbook/entities/collections/concerns/hierarchical_collection.rb +23 -0
  73. data/lib/lookbook/entities/collections/entity_collection.rb +61 -0
  74. data/lib/lookbook/entities/collections/page_collection.rb +30 -0
  75. data/lib/lookbook/entities/collections/preview_collection.rb +41 -0
  76. data/lib/lookbook/entities/collections/preview_example_collection.rb +4 -0
  77. data/lib/lookbook/entities/component.rb +31 -0
  78. data/lib/lookbook/entities/concerns/annotatable.rb +58 -0
  79. data/lib/lookbook/entities/concerns/inspectable.rb +44 -0
  80. data/lib/lookbook/entities/concerns/locatable.rb +73 -0
  81. data/lib/lookbook/entities/concerns/navigable.rb +43 -0
  82. data/lib/lookbook/entities/entity.rb +53 -0
  83. data/lib/lookbook/entities/page.rb +80 -0
  84. data/lib/lookbook/entities/page_section.rb +43 -0
  85. data/lib/lookbook/entities/preview.rb +87 -0
  86. data/lib/lookbook/entities/preview_example.rb +100 -0
  87. data/lib/lookbook/entities/preview_group.rb +48 -0
  88. data/lib/lookbook/file_watcher.rb +47 -0
  89. data/lib/lookbook/lang.rb +12 -35
  90. data/lib/lookbook/param.rb +99 -0
  91. data/lib/lookbook/{preview_controller.rb → preview_actions.rb} +14 -3
  92. data/lib/lookbook/preview_parser.rb +53 -0
  93. data/lib/lookbook/process.rb +21 -0
  94. data/lib/lookbook/rendered_example.rb +37 -0
  95. data/lib/lookbook/services/code/code_beautifier.rb +21 -0
  96. data/lib/lookbook/services/code/code_highlighter.rb +69 -0
  97. data/lib/lookbook/services/code/code_indenter.rb +14 -0
  98. data/lib/lookbook/services/data/parsers/data_parser.rb +22 -0
  99. data/lib/lookbook/services/data/parsers/json_parser.rb +7 -0
  100. data/lib/lookbook/services/data/parsers/yaml_parser.rb +7 -0
  101. data/lib/lookbook/services/data/resolvers/data_resolver.rb +70 -0
  102. data/lib/lookbook/services/data/resolvers/eval_resolver.rb +10 -0
  103. data/lib/lookbook/services/data/resolvers/file_resolver.rb +28 -0
  104. data/lib/lookbook/services/data/resolvers/method_resolver.rb +10 -0
  105. data/lib/lookbook/services/data/resolvers/yaml_resolver.rb +18 -0
  106. data/lib/lookbook/services/entities/entity_tree_builder.rb +45 -0
  107. data/lib/lookbook/services/markdown_renderer.rb +29 -0
  108. data/lib/lookbook/services/position_prefix_parser.rb +16 -0
  109. data/lib/lookbook/services/string_value_caster.rb +60 -0
  110. data/lib/lookbook/services/tags/tag_options_parser.rb +62 -0
  111. data/lib/lookbook/services/templates/action_view_annotations_handler.rb +21 -0
  112. data/lib/lookbook/services/templates/action_view_annotations_stripper.rb +15 -0
  113. data/lib/lookbook/services/templates/frontmatter_extractor.rb +28 -0
  114. data/lib/lookbook/services/templates/styles_extractor.rb +38 -0
  115. data/lib/lookbook/services/{search_param_builder.rb → urls/search_param_builder.rb} +1 -1
  116. data/lib/lookbook/services/{search_param_parser.rb → urls/search_param_parser.rb} +1 -1
  117. data/lib/lookbook/stores/config_store.rb +12 -9
  118. data/lib/lookbook/stores/input_store.rb +7 -3
  119. data/lib/lookbook/stores/panel_store.rb +2 -2
  120. data/lib/lookbook/stores/tag_store.rb +3 -5
  121. data/lib/lookbook/support/null_object.rb +10 -0
  122. data/lib/lookbook/support/service.rb +2 -2
  123. data/lib/lookbook/support/store.rb +2 -35
  124. data/lib/lookbook/support/tree_node.rb +87 -0
  125. data/lib/lookbook/support/utils/path_utils.rb +32 -5
  126. data/lib/lookbook/support/utils/utils.rb +24 -0
  127. data/lib/lookbook/tags/component_tag.rb +13 -0
  128. data/lib/lookbook/tags/custom_tag.rb +61 -0
  129. data/lib/lookbook/tags/display_tag.rb +15 -0
  130. data/lib/lookbook/tags/hidden_tag.rb +13 -0
  131. data/lib/lookbook/tags/id_tag.rb +7 -0
  132. data/lib/lookbook/tags/label_tag.rb +4 -0
  133. data/lib/lookbook/tags/logical_path_tag.rb +7 -0
  134. data/lib/lookbook/tags/param_tag.rb +63 -0
  135. data/lib/lookbook/tags/position_tag.rb +16 -0
  136. data/lib/lookbook/tags/source_tag.rb +7 -0
  137. data/lib/lookbook/tags/tag_provider.rb +18 -0
  138. data/lib/lookbook/tags/yard_tag.rb +90 -0
  139. data/lib/lookbook/theme.rb +8 -0
  140. data/lib/lookbook/version.rb +1 -1
  141. data/lib/lookbook/websocket.rb +60 -0
  142. data/lib/lookbook.rb +13 -8
  143. data/public/lookbook-assets/css/lookbook.css +487 -411
  144. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  145. data/public/lookbook-assets/css/themes/blue.css +3 -1
  146. data/public/lookbook-assets/css/themes/blue.css.map +1 -1
  147. data/public/lookbook-assets/css/themes/green.css +68 -0
  148. data/public/lookbook-assets/css/themes/green.css.map +1 -0
  149. data/public/lookbook-assets/css/themes/indigo.css +3 -1
  150. data/public/lookbook-assets/css/themes/indigo.css.map +1 -1
  151. data/public/lookbook-assets/css/themes/rose.css +68 -0
  152. data/public/lookbook-assets/css/themes/rose.css.map +1 -0
  153. data/public/lookbook-assets/css/themes/zinc.css +3 -1
  154. data/public/lookbook-assets/css/themes/zinc.css.map +1 -1
  155. data/public/lookbook-assets/js/embed.js +10 -1
  156. data/public/lookbook-assets/js/embed.js.map +1 -1
  157. data/public/lookbook-assets/js/lookbook.js +358 -629
  158. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  159. metadata +96 -44
  160. data/app/components/lookbook/code/highlight_github_light.css +0 -217
  161. data/app/views/lookbook/previews/panels/_params.html.erb +0 -15
  162. data/lib/lookbook/code_formatter.rb +0 -68
  163. data/lib/lookbook/collection.rb +0 -161
  164. data/lib/lookbook/component.rb +0 -34
  165. data/lib/lookbook/entity.rb +0 -47
  166. data/lib/lookbook/markdown.rb +0 -22
  167. data/lib/lookbook/page.rb +0 -195
  168. data/lib/lookbook/page_collection.rb +0 -19
  169. data/lib/lookbook/page_section.rb +0 -29
  170. data/lib/lookbook/params.rb +0 -157
  171. data/lib/lookbook/parser.rb +0 -42
  172. data/lib/lookbook/preview.rb +0 -174
  173. data/lib/lookbook/preview_collection.rb +0 -23
  174. data/lib/lookbook/preview_example.rb +0 -93
  175. data/lib/lookbook/preview_group.rb +0 -62
  176. data/lib/lookbook/source_inspector.rb +0 -95
  177. data/lib/lookbook/support/utils/attribute_utils.rb +0 -9
  178. data/lib/lookbook/tag.rb +0 -122
  179. data/lib/lookbook/tag_options.rb +0 -111
  180. data/lib/lookbook/tags.rb +0 -17
  181. data/lib/lookbook/template_parser.rb +0 -72
  182. data/lib/lookbook/utils.rb +0 -105
@@ -0,0 +1,406 @@
1
+ .theme-github {
2
+ --dark-bg: #111111;
3
+ --dark-gray-1: #404040;
4
+ --dark-gray-2: #d0d0d0;
5
+ --dark-gray-3: #cccccc;
6
+ --dark-gray-4: #777777;
7
+ --dark-gray-5: #aaaaaa;
8
+ --dark-gray-6: #bbbbbb;
9
+ --dark-gray-7: #666666;
10
+ --dark-blue-1: #3677a9;
11
+ --dark-blue-2: #24909d;
12
+ --dark-blue-3: #447fcf;
13
+ --dark-blue-4: #009988;
14
+ --dark-red-1: #a61717;
15
+ --dark-red-2: #331111;
16
+ --dark-red-3: #e50808;
17
+ --dark-red-4: #520000;
18
+ --dark-red-5: #d22323;
19
+ --dark-red-6: #cd2828;
20
+ --dark-yellow-1: #e9b96e;
21
+ --dark-yellow-2: #ffa500;
22
+ --dark-orange: #d2691e;
23
+ --dark-white: #ffffff;
24
+ --dark-green-1: #589819;
25
+ --dark-green-2: #6ab825;
26
+ --dark-green-3: #44ccaa;
27
+
28
+ --light-bg: #ffffff;
29
+ --light-gray-1: #f8f8f8;
30
+ --light-gray-2: #27272a;
31
+ --light-gray-3: #cccccc;
32
+ --light-gray-4: #888888;
33
+ --light-gray-5: #999999;
34
+ --light-gray-6: #555555;
35
+ --light-gray-7: #bbbbbb;
36
+ --light-yellow-1: #999988;
37
+ --light-red-1: #a61717;
38
+ --light-red-2: #e3d2d2;
39
+ --light-red-3: #dd1144;
40
+ --light-red-4: #ffdddd;
41
+ --light-red-5: #aa0000;
42
+ --light-red-6: #990000;
43
+ --light-purple-1: #800080;
44
+ --light-purple-2: #990073;
45
+ --light-black: #000000;
46
+ --light-green-1: #ddffdd;
47
+ --light-green-2: #009926;
48
+ --light-blue-1: #445588;
49
+ --light-blue-2: #009999;
50
+ --light-blue-3: #008080;
51
+ --light-blue-4: #0086b3;
52
+ --light-blue-5: #3c5d5d;
53
+ --light-blue-6: #000080;
54
+
55
+ --hl-bg: var(--light-bg);
56
+ --hl-hll-bg: var(--light-gray-1);
57
+ --hl-border: var(--light-gray-3);
58
+ --hl-line-number: var(--light-gray-2);
59
+ --hl-comment: var(--light-yellow-1);
60
+ --hl-comment-preproc: var(--light-gray-5);
61
+ --hl-comment-special-fg: var(--light-gray-5);
62
+ --hl-comment-special-bg: transparent;
63
+ --hl-error-fg: var(--light-red-1);
64
+ --hl-error-bg: var(--light-red-2);
65
+ --hl-subtle-fg: var(--light-gray-2);
66
+ --hl-entity: var(--light-purple-1);
67
+ --hl-keyword: var(--light-black);
68
+ --hl-output: var(--light-gray-4);
69
+ --hl-operator: var(--light-black);
70
+ --hl-punctuation: var(--light-gray-6);
71
+ --hl-string: var(--light-red-3);
72
+ --hl-string-other: var(--light-red-3);
73
+ --hl-string-regex: var(--light-green-2);
74
+ --hl-string-symbol: var(--light-purple-2);
75
+ --hl-deleted-fg: var(--light-black);
76
+ --hl-deleted-bg: var(--light-red-4);
77
+ --hl-danger: var(--light-red-5);
78
+ --hl-heading: var(--light-gray-5);
79
+ --hl-inserted-fg: var(--light-black);
80
+ --hl-inserted-bg: var(--light-green-1);
81
+ --hl-prompt: var(--light-gray-6);
82
+ --hl-subheading: var(--light-purple-1);
83
+ --hl-keyword-crude: var(--light-black);
84
+ --hl-keyword-subtle: var(--light-blue-1);
85
+ --hl-number: var(--light-blue-2);
86
+ --hl-attribute: var(--light-blue-3);
87
+ --hl-builtin: var(--light-blue-4);
88
+ --hl-builtin-pseudo: var(--light-gray-5);
89
+ --hl-class: var(--light-blue-1);
90
+ --hl-variable: var(--light-blue-3);
91
+ --hl-decorator: var(--light-blue-5);
92
+ --hl-exception: var(--light-red-6);
93
+ --hl-function: var(--light-red-6);
94
+ --hl-namespace: var(--light-gray-6);
95
+ --hl-tag: var(--light-blue-6);
96
+ --hl-word: var(--light-black);
97
+ --hl-whitespace: var(--light-gray-7);
98
+
99
+ &.dark {
100
+ --hl-bg: var(--dark-bg);
101
+ --hl-hll-bg: var(--dark-gray-1);
102
+ --hl-border: var(--dark-gray-4);
103
+ --hl-line-number: var(--dark-gray-2);
104
+ --hl-comment: var(--dark-blue-1);
105
+ --hl-comment-preproc: var(--dark-orange);
106
+ --hl-comment-special-fg: var(--dark-red-3);
107
+ --hl-comment-special-bg: var(--dark-red-4);
108
+ --hl-error-fg: var(--dark-red-1);
109
+ --hl-error-bg: var(--dark-red-2);
110
+ --hl-subtle-fg: var(--dark-gray-2);
111
+ --hl-entity: var(--dark-gray-2);
112
+ --hl-keyword: var(--dark-gray-3);
113
+ --hl-output: var(--dark-gray-3);
114
+ --hl-operator: var(--dark-gray-4);
115
+ --hl-punctuation: var(--dark-yellow-1);
116
+ --hl-string: var(--dark-orange);
117
+ --hl-string-other: var(--dark-yellow-2);
118
+ --hl-string-regex: var(--dark-red-6);
119
+ --hl-string-symbol: var(--dark-orange);
120
+ --hl-deleted-fg: var(--dark-red-5);
121
+ --hl-deleted-bg: transparent;
122
+ --hl-danger: var(--dark-red-5);
123
+ --hl-heading: var(--dark-white);
124
+ --hl-inserted-fg: var(--dark-green-1);
125
+ --hl-inserted-bg: transparent;
126
+ --hl-prompt: var(--dark-gray-5);
127
+ --hl-subheading: var(--dark-white);
128
+ --hl-keyword-crude: var(--dark-green-2);
129
+ --hl-keyword-subtle: var(--dark-green-2);
130
+ --hl-number: var(--dark-red-6);
131
+ --hl-attribute: var(--dark-gray-6);
132
+ --hl-builtin: var(--dark-blue-2);
133
+ --hl-builtin-pseudo: var(--dark-blue-2);
134
+ --hl-class: var(--dark-blue-3);
135
+ --hl-variable: var(--dark-green-3);
136
+ --hl-decorator: var(--dark-yellow-2);
137
+ --hl-exception: var(--dark-gray-6);
138
+ --hl-function: var(--dark-blue-4);
139
+ --hl-namespace: var(--dark-blue-3);
140
+ --hl-tag: var(--dark-green-2);
141
+ --hl-word: var(--dark-green-2);
142
+ --hl-whitespace: var(--dark-gray-7);
143
+ }
144
+ }
145
+
146
+ .theme-github {
147
+ background-color: var(--hl-bg);
148
+
149
+ .line-numbers {
150
+ background-color: var(--hl-bg);
151
+ border-color: var(--hl-border);
152
+ color: var(--hl-line-number);
153
+ }
154
+
155
+ .highlight {
156
+ .hll {
157
+ background-color: var(--hl-hll-bg);
158
+ }
159
+ .c {
160
+ color: var(--hl-comment);
161
+ font-style: italic;
162
+ } /* Comment */
163
+ .err {
164
+ color: var(--hl-error-fg);
165
+ background-color: var(--hl-error-bg);
166
+ } /* Error */
167
+ .g {
168
+ color: var(--hl-subtle-fg);
169
+ } /* Generic */
170
+ .k {
171
+ color: var(--hl-keyword);
172
+ font-weight: bold;
173
+ } /* Keyword; catches prefixes and css3 */
174
+ .l {
175
+ color: var(--hl-subtle-fg);
176
+ } /* Literal */
177
+ .n,
178
+ .h {
179
+ color: var(--hl-keyword);
180
+ } /* Name */
181
+ .o {
182
+ color: var(--hl-operator);
183
+ font-weight: bold;
184
+ } /* Operator */
185
+ .x {
186
+ color: var(--hl-subtle-fg);
187
+ } /* Other */
188
+ .p {
189
+ color: var(--hl-punctuation);
190
+ } /* Punctuation */
191
+ .cm {
192
+ color: var(--hl-comment);
193
+ font-style: italic;
194
+ } /* Comment.Multiline */
195
+ .cp {
196
+ color: var(--hl-comment-preproc);
197
+ font-weight: bold;
198
+ } /* Comment.Preproc */
199
+ .c1 {
200
+ color: var(--hl-comment);
201
+ font-style: italic;
202
+ } /* Comment.Single */
203
+ .cs {
204
+ color: var(--hl-comment-special-fg);
205
+ background-color: var(--hl-comment-special-bg);
206
+ font-weight: bold;
207
+ font-style: italic;
208
+ } /* Comment.Special */
209
+ .gd {
210
+ color: var(--hl-deleted-fg);
211
+ background-color: var(--hl-deleted-bg);
212
+ } /* Generic.Deleted */
213
+ .ge {
214
+ color: var(--hl-subtle-fg);
215
+ font-style: italic;
216
+ } /* Generic.Emph */
217
+ .gr {
218
+ color: var(--hl-danger);
219
+ } /* Generic.Error */
220
+ .gh {
221
+ color: var(--hl-heading);
222
+ } /* Generic.Heading */
223
+ .gi {
224
+ color: var(--hl-inserted-fg);
225
+ background-color: var(--hl-inserted-bg);
226
+ } /* Generic.Inserted */
227
+ .go {
228
+ color: var(--hl-output);
229
+ } /* Generic.Output */
230
+ .gp {
231
+ color: var(--hl-prompt);
232
+ } /* Generic.Prompt */
233
+ .gs {
234
+ color: var(--hl-subtle-fg);
235
+ font-weight: bold;
236
+ } /* Generic.Strong */
237
+ .gu {
238
+ color: var(--hl-subheading);
239
+ font-weight: bold;
240
+ } /* Generic.Subheading */
241
+ .gt {
242
+ color: var(--hl-danger);
243
+ } /* Generic.Traceback */
244
+ .kc {
245
+ color: var(--hl-keyword-crude);
246
+ font-weight: bold;
247
+ } /* Keyword.Constant */
248
+ .kd {
249
+ color: var(--hl-keyword-crude);
250
+ font-weight: bold;
251
+ } /* Keyword.Declaration */
252
+ .kn {
253
+ color: var(--hl-keyword-crude);
254
+ font-weight: bold;
255
+ } /* Keyword.Namespace */
256
+ .kp {
257
+ color: var(--hl-keyword-crude);
258
+ font-weight: bold;
259
+ } /* Keyword.Pseudo */
260
+ .kr {
261
+ color: var(--hl-keyword-crude);
262
+ font-weight: bold;
263
+ } /* Keyword.Reserved */
264
+ .kt {
265
+ color: var(--hl-keyword-subtle);
266
+ font-weight: bold;
267
+ } /* Keyword.Type */
268
+ .ld {
269
+ color: var(--hl-subtle-fg);
270
+ } /* Literal.Date */
271
+ .m {
272
+ color: var(--hl-number);
273
+ } /* Literal.Number */
274
+ .s {
275
+ color: var(--hl-string);
276
+ } /* Literal.String */
277
+ .na {
278
+ color: var(--hl-attribute);
279
+ } /* Name.Attribute */
280
+ .nb {
281
+ color: var(--hl-builtin);
282
+ } /* Name.Builtin */
283
+ .nc {
284
+ color: var(--hl-class);
285
+ font-weight: bold;
286
+ } /* Name.Class */
287
+ .no {
288
+ color: var(--hl-variable);
289
+ } /* Name.Constant */
290
+ .nd {
291
+ color: var(--hl-decorator);
292
+ } /* Name.Decorator */
293
+ .ni {
294
+ color: var(--hl-entity);
295
+ } /* Name.Entity */
296
+ .ne {
297
+ color: var(--hl-exception);
298
+ font-weight: bold;
299
+ } /* Name.Exception */
300
+ .nf {
301
+ color: var(--hl-function);
302
+ font-weight: bold;
303
+ } /* Name.Function */
304
+ .nl {
305
+ color: var(--hl-subtle-fg);
306
+ } /* Name.Label */
307
+ .nn {
308
+ color: var(--hl-namespace);
309
+ } /* Name.Namespace */
310
+ .nx {
311
+ color: var(--hl-subtle-fg);
312
+ } /* Name.Other */
313
+ .py {
314
+ color: var(--hl-subtle-fg);
315
+ } /* Name.Property */
316
+ .nt {
317
+ color: var(--hl-tag);
318
+ } /* Name.Tag */
319
+ .nv {
320
+ color: var(--hl-variable);
321
+ } /* Name.Variable */
322
+ .ow {
323
+ color: var(--hl-word);
324
+ font-weight: bold;
325
+ } /* Operator.Word */
326
+ .w {
327
+ color: var(--hl-whitespace);
328
+ } /* Text.Whitespace */
329
+ .mf {
330
+ color: var(--hl-number);
331
+ } /* Literal.Number.Float */
332
+ .mh {
333
+ color: var(--hl-number);
334
+ } /* Literal.Number.Hex */
335
+ .mi {
336
+ color: var(--hl-number);
337
+ } /* Literal.Number.Integer */
338
+ .mo {
339
+ color: var(--hl-number);
340
+ } /* Literal.Number.Oct */
341
+ .sb {
342
+ color: var(--hl-string);
343
+ } /* Literal.String.Backtick */
344
+ .sc {
345
+ color: var(--hl-string);
346
+ } /* Literal.String.Char */
347
+ .sd {
348
+ color: var(--hl-string);
349
+ } /* Literal.String.Doc */
350
+ .s2 {
351
+ color: var(--hl-string);
352
+ } /* Literal.String.Double */
353
+ .se {
354
+ color: var(--hl-string);
355
+ } /* Literal.String.Escape */
356
+ .sh {
357
+ color: var(--hl-string);
358
+ } /* Literal.String.Heredoc */
359
+ .si {
360
+ color: var(--hl-string);
361
+ } /* Literal.String.Interpol */
362
+ .sx {
363
+ color: var(--hl-string-other);
364
+ } /* Literal.String.Other */
365
+ .sr {
366
+ color: var(--hl-string-regex);
367
+ } /* Literal.String.Regex */
368
+ .s1 {
369
+ color: var(--hl-string);
370
+ } /* Literal.String.Single */
371
+ .ss {
372
+ color: var(--hl-string-symbol);
373
+ } /* Literal.String.Symbol */
374
+ .bp {
375
+ color: var(--hl-builtin-pseudo);
376
+ } /* Name.Builtin.Pseudo */
377
+ .vc {
378
+ color: var(--hl-variable);
379
+ } /* Name.Variable.Class */
380
+ .vg {
381
+ color: var(--hl-variable);
382
+ } /* Name.Variable.Global */
383
+ .vi {
384
+ color: var(--hl-variable);
385
+ } /* Name.Variable.Instance */
386
+ .il {
387
+ color: var(--hl-number);
388
+ } /* Literal.Number.Integer.Long */
389
+
390
+ /* Make line numbers unselectable: excludes line numbers from copy-paste user ops */
391
+ .line-number {
392
+ -webkit-user-select: none;
393
+ -moz-user-select: none;
394
+ }
395
+
396
+ /* Mozilla specific */
397
+ .line-number::-moz-selection {
398
+ background-color: transparent;
399
+ }
400
+
401
+ /* Other major browsers */
402
+ .line-number::selection {
403
+ background-color: transparent;
404
+ }
405
+ }
406
+ }
@@ -25,7 +25,7 @@
25
25
  <% menu = lookbook_render :debug_menu,
26
26
  version: Lookbook::VERSION,
27
27
  docs_url: "https://lookbook.build/guide",
28
- repo_url: "https://github.com/allmarkedup/lookbook" do %>
28
+ repo_url: "https://github.com/ViewComponent/lookbook" do %>
29
29
  <%= helpers.pretty_json(Lookbook.debug_data) %>
30
30
  <% end %>
31
31
  <% button.dropdown({}).with_content(menu) %>
@@ -1,5 +1,3 @@
1
- require "css_parser"
2
-
3
1
  module Lookbook
4
2
  class InspectorPanel::Component < Lookbook::BaseComponent
5
3
  attr_reader :panel_styles, :panel_html
@@ -10,13 +8,13 @@ module Lookbook
10
8
  end
11
9
 
12
10
  def id
13
- AttributeUtils.dom_id("panel", @name)
11
+ Utils.id("panel", @name)
14
12
  end
15
13
 
16
14
  def before_render
17
- tpl = TemplateParser.new(content)
18
- @panel_styles = tpl.styles.map { |s| "##{id} #{s}" }.join("\n")
19
- @panel_html = tpl.content
15
+ styles, html = StylesExtractor.call(content)
16
+ @panel_styles = styles.map { |s| "##{id} #{s}" }.join("\n")
17
+ @panel_html = html.html_safe
20
18
  end
21
19
  end
22
20
  end
@@ -3,25 +3,18 @@ module Lookbook
3
3
  renders_one :filter, Lookbook::Filter::Component
4
4
  renders_one :toolbar, Lookbook::Toolbar::Component
5
5
 
6
- def initialize(
7
- collection:, id: nil,
8
- collapse_singles: false,
9
- **attrs
10
- )
11
- @id = id.presence || "#{collection.id}-nav"
12
- @collection = collection.as_tree
13
- @item_args = {
14
- collapse_singles: collapse_singles
15
- }
6
+ attr_reader :id, :tree
7
+
8
+ def initialize(tree:, id: nil, **attrs)
9
+ @id = id
10
+ @tree = tree
16
11
  super(**attrs, id: id)
17
12
  end
18
13
 
19
14
  def items
20
- @collection.non_empty_items.map do |item|
21
- lookbook_render Lookbook::Nav::Item::Component.new item,
22
- nav_id: @id,
23
- depth: 1,
24
- **@item_args
15
+ @items ||= tree.map do |node|
16
+ item_class = (node.type == :directory) ? Nav::Directory::Component : Nav::Entity::Component
17
+ lookbook_render item_class.new node, nav_id: id
25
18
  end
26
19
  end
27
20
 
@@ -0,0 +1,28 @@
1
+ <%= render_component_tag :li,
2
+ id: id,
3
+ key: "#{id}-directory",
4
+ class: "list-none",
5
+ "x-show": "!filteredOut",
6
+ data: { "entity-type": :directory },
7
+ cloak: true do %>
8
+ <%= lookbook_tag :button,
9
+ key: "#{id}-action",
10
+ class: "nav-action",
11
+ style: "padding-left: #{left_pad}px",
12
+ "x-bind": "bindings.toggle" do %>
13
+ <div class="nav-action-inner">
14
+ <%= icon nil,
15
+ size: 3,
16
+ class: "nav-toggle-icon",
17
+ "x-effect": "iconName = open ? 'chevron-down' : 'chevron-right'" if children? %>
18
+ <%= icon nav_icon, size: 3.5, class: "mr-1.5 text-lookbook-nav-icon-stroke" %>
19
+ <span class="truncate"><%= label %></span>
20
+ </div>
21
+ <% end %>
22
+
23
+ <% if children? %>
24
+ <ul x-ref="items" x-show="open" x-cloak>
25
+ <%= safe_join(children) %>
26
+ </ul>
27
+ <% end %>
28
+ <% end %>
@@ -0,0 +1,4 @@
1
+ module Lookbook
2
+ class Nav::Directory::Component < Nav::Item::Component
3
+ end
4
+ end
@@ -1,23 +1,23 @@
1
1
  <%= render_component_tag :li,
2
2
  id: id,
3
+ key: "#{id}-entity-#{type}",
3
4
  class: "list-none",
4
5
  "x-show": "!filteredOut",
5
- data: {
6
- "entity-type": item.type
7
- },
6
+ data: { "entity-type": type },
8
7
  cloak: true do %>
9
- <%= lookbook_tag href.present? ? :a : :div,
8
+ <%= lookbook_tag href.present? ? :a : :button,
10
9
  href: href,
11
- class: "flex items-center py-1 select-none cursor-pointer text-lookbook-nav-text hover:bg-lookbook-nav-item-hover transition",
10
+ key: "#{id}-action",
11
+ class: "nav-action",
12
12
  style: "padding-left: #{left_pad}px",
13
13
  "x-bind": "bindings.#{href.present? ? "link" : "toggle"}" do %>
14
- <div class="relative flex items-center w-full">
14
+ <div class="nav-action-inner">
15
15
  <%= icon nil,
16
16
  size: 3,
17
- class: "mr-1 text-lookbook-nav-toggle absolute -left-4",
17
+ class: "nav-toggle-icon",
18
18
  "x-effect": "iconName = open ? 'chevron-down' : 'chevron-right'" if children? %>
19
19
  <%= icon nav_icon, size: 3.5, class: "mr-1.5 text-lookbook-nav-icon-stroke" %>
20
- <span class="truncate <% if @item.type == :preview %>font-bold<% end %>"><%= label %></span>
20
+ <span class="truncate <% if node.type == :preview %>font-bold<% end %>"><%= label %></span>
21
21
  </div>
22
22
  <% end %>
23
23
 
@@ -0,0 +1,49 @@
1
+ module Lookbook
2
+ class Nav::Entity::Component < Nav::Item::Component
3
+ ICONS = {
4
+ page: :file,
5
+ preview: :layers,
6
+ example: :eye,
7
+ group: :eye
8
+ }.freeze
9
+
10
+ def nav_icon
11
+ ICONS[collapsed? ? :preview : node.type] || :file
12
+ end
13
+
14
+ def href
15
+ if collapsed?
16
+ node.first.url_path
17
+ elsif type != :preview
18
+ node.url_path
19
+ end
20
+ end
21
+
22
+ def children
23
+ collapsed? ? [] : super
24
+ end
25
+
26
+ def type
27
+ collapsed? ? :example : node.type
28
+ end
29
+
30
+ def collapsed?
31
+ node.type == :preview && node.children.one?
32
+ end
33
+
34
+ def search_terms
35
+ matchers = if collapsed?
36
+ node.first.search_terms
37
+ else
38
+ node.respond_to?(:search_terms) ? Array(node.search_terms) : []
39
+ end
40
+ matchers.flatten.map { |m| m.gsub(/\s/, "").downcase }
41
+ end
42
+
43
+ protected
44
+
45
+ def alpine_data
46
+ alpine_encode({id: node.id, matchers: search_terms})
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,15 @@
1
+ @layer components {
2
+ [data-component="nav"] {
3
+ .nav-action {
4
+ @apply flex w-full items-center py-1 select-none cursor-pointer text-lookbook-nav-text hover:bg-lookbook-nav-item-hover transition;
5
+ }
6
+
7
+ .nav-action-inner {
8
+ @apply relative flex items-center w-full;
9
+ }
10
+
11
+ .nav-toggle-icon {
12
+ @apply mr-1 text-lookbook-nav-toggle absolute -left-4;
13
+ }
14
+ }
15
+ }
@@ -1,4 +1,8 @@
1
1
  export default function navItemComponent({ id, matchers }) {
2
+ matchers = matchers.map((matcher) =>
3
+ matcher.replace(/\s/g, "").toLowerCase()
4
+ );
5
+
2
6
  return {
3
7
  filteredOut: false,
4
8