lookbook 0.4.6 → 0.5.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/app/assets/lookbook/css/app.css +66 -5
  4. data/app/assets/lookbook/css/tooltip_theme.css +28 -0
  5. data/app/assets/lookbook/js/app.js +41 -53
  6. data/app/assets/lookbook/js/components/code.js +5 -0
  7. data/app/assets/lookbook/js/components/copy.js +16 -0
  8. data/app/assets/lookbook/js/components/filter.js +24 -0
  9. data/app/assets/lookbook/js/components/inspector.js +58 -0
  10. data/app/assets/lookbook/js/{nav/node.js → components/nav-group.js} +17 -16
  11. data/app/assets/lookbook/js/components/nav-item.js +27 -0
  12. data/app/assets/lookbook/js/components/nav.js +35 -0
  13. data/app/assets/lookbook/js/components/page.js +45 -0
  14. data/app/assets/lookbook/js/components/param.js +34 -0
  15. data/app/assets/lookbook/js/components/preview-window.js +107 -0
  16. data/app/assets/lookbook/js/components/sidebar.js +3 -0
  17. data/app/assets/lookbook/js/components/sizes.js +16 -0
  18. data/app/assets/lookbook/js/components/splitter.js +25 -0
  19. data/app/assets/lookbook/js/components/tabs.js +50 -0
  20. data/app/assets/lookbook/js/config.js +20 -0
  21. data/app/assets/lookbook/js/{utils/reloader.js → lib/socket.js} +7 -12
  22. data/app/assets/lookbook/js/lib/split.js +21 -0
  23. data/app/assets/lookbook/js/lib/utils.js +3 -0
  24. data/app/assets/lookbook/js/stores/filter.js +11 -0
  25. data/app/assets/lookbook/js/stores/inspector.js +24 -0
  26. data/app/assets/lookbook/js/stores/layout.js +12 -0
  27. data/app/assets/lookbook/js/stores/nav.js +21 -0
  28. data/app/assets/lookbook/js/stores/sidebar.js +14 -0
  29. data/app/controllers/lookbook/app_controller.rb +71 -96
  30. data/app/helpers/lookbook/application_helper.rb +48 -4
  31. data/app/views/layouts/lookbook/app.html.erb +58 -0
  32. data/app/views/layouts/lookbook/preview.html.erb +12 -0
  33. data/app/views/lookbook/components/_code.html.erb +13 -0
  34. data/app/views/lookbook/components/_copy.html.erb +14 -0
  35. data/app/views/lookbook/components/_drawer.html.erb +121 -0
  36. data/app/views/lookbook/components/_filter.html.erb +15 -0
  37. data/app/views/lookbook/{shared → components}/_header.html.erb +3 -3
  38. data/app/views/lookbook/components/_icon.html.erb +5 -0
  39. data/app/views/lookbook/components/_nav.html.erb +17 -0
  40. data/app/views/lookbook/components/_nav_collection.html.erb +5 -0
  41. data/app/views/lookbook/components/_nav_group.html.erb +14 -0
  42. data/app/views/lookbook/components/_nav_item.html.erb +23 -0
  43. data/app/views/lookbook/components/_nav_preview.html.erb +11 -0
  44. data/app/views/lookbook/components/_param.html.erb +21 -0
  45. data/app/views/lookbook/components/_preview.html.erb +52 -0
  46. data/app/views/lookbook/{app/error.html.erb → error.html.erb} +0 -0
  47. data/app/views/lookbook/index.html.erb +9 -0
  48. data/app/views/lookbook/{workbench/inspector/params → inputs}/_select.html.erb +2 -3
  49. data/app/views/lookbook/inputs/_text.html.erb +8 -0
  50. data/app/views/lookbook/inputs/_textarea.html.erb +8 -0
  51. data/app/views/lookbook/inputs/_toggle.html.erb +13 -0
  52. data/app/views/lookbook/{app/not_found.html.erb → not_found.html.erb} +2 -4
  53. data/app/views/lookbook/panels/_notes.html.erb +25 -0
  54. data/app/views/lookbook/panels/_output.html.erb +18 -0
  55. data/app/views/lookbook/panels/_params.html.erb +17 -0
  56. data/app/views/lookbook/panels/_source.html.erb +20 -0
  57. data/app/views/lookbook/show.html.erb +73 -0
  58. data/lib/lookbook/code_formatter.rb +20 -0
  59. data/lib/lookbook/engine.rb +8 -1
  60. data/lib/lookbook/lang.rb +10 -5
  61. data/lib/lookbook/preview.rb +1 -1
  62. data/lib/lookbook/preview_controller.rb +1 -1
  63. data/lib/lookbook/preview_group.rb +5 -1
  64. data/lib/lookbook/version.rb +1 -1
  65. data/lib/lookbook.rb +2 -0
  66. data/public/lookbook-assets/css/app.css +4 -0
  67. data/public/lookbook-assets/css/app.css.map +1 -0
  68. data/public/lookbook-assets/js/app.js +2 -0
  69. data/public/lookbook-assets/js/app.js.map +1 -0
  70. metadata +59 -45
  71. data/app/assets/lookbook/js/nav/leaf.js +0 -20
  72. data/app/assets/lookbook/js/nav.js +0 -38
  73. data/app/assets/lookbook/js/page.js +0 -38
  74. data/app/assets/lookbook/js/utils/clipboard.js +0 -13
  75. data/app/assets/lookbook/js/utils/morph.js +0 -19
  76. data/app/assets/lookbook/js/utils/screen.js +0 -44
  77. data/app/assets/lookbook/js/utils/size_observer.js +0 -16
  78. data/app/assets/lookbook/js/utils/split.js +0 -26
  79. data/app/assets/lookbook/js/workbench/inspector.js +0 -11
  80. data/app/assets/lookbook/js/workbench/param.js +0 -19
  81. data/app/assets/lookbook/js/workbench/preview.js +0 -39
  82. data/app/assets/lookbook/js/workbench.js +0 -14
  83. data/app/views/lookbook/app/index.html.erb +0 -11
  84. data/app/views/lookbook/app/show.html.erb +0 -1
  85. data/app/views/lookbook/layouts/app.html.erb +0 -41
  86. data/app/views/lookbook/nav/_collection.html.erb +0 -5
  87. data/app/views/lookbook/nav/_leaf.html.erb +0 -22
  88. data/app/views/lookbook/nav/_node.html.erb +0 -19
  89. data/app/views/lookbook/nav/_preview.html.erb +0 -11
  90. data/app/views/lookbook/preview/group.html.erb +0 -8
  91. data/app/views/lookbook/shared/_clipboard.html.erb +0 -11
  92. data/app/views/lookbook/shared/_sidebar.html.erb +0 -45
  93. data/app/views/lookbook/shared/_workbench.html.erb +0 -12
  94. data/app/views/lookbook/workbench/_header.html.erb +0 -39
  95. data/app/views/lookbook/workbench/_inspector.html.erb +0 -38
  96. data/app/views/lookbook/workbench/_preview.html.erb +0 -24
  97. data/app/views/lookbook/workbench/inspector/_code.html.erb +0 -3
  98. data/app/views/lookbook/workbench/inspector/_notes.html.erb +0 -24
  99. data/app/views/lookbook/workbench/inspector/_params.html.erb +0 -28
  100. data/app/views/lookbook/workbench/inspector/_plain.html.erb +0 -3
  101. data/app/views/lookbook/workbench/inspector/params/_text.html.erb +0 -8
  102. data/app/views/lookbook/workbench/inspector/params/_textarea.html.erb +0 -8
  103. data/app/views/lookbook/workbench/inspector/params/_toggle.html.erb +0 -13
  104. data/public/lookbook-assets/app.css +0 -2626
  105. data/public/lookbook-assets/app.js +0 -8718
@@ -1,12 +0,0 @@
1
- <div id="workbench" class="bg-gray-50 h-screen flex flex-col" x-data="workbench">
2
- <%= render "workbench/header" %>
3
- <div class="md:grid flex-grow" :style="`grid-template-rows: 1fr 1px ${$store.inspector.height}px`">
4
- <%= render "workbench/preview" %>
5
- <div class="w-full gutter border-t border-gray-300 relative" x-data="split(splitProps)" x-show="$screen('md')">
6
- <div class="h-[11px] w-full bg-transparent hover:bg-indigo-100 hover:bg-opacity-20 transition absolute left-0 right-0 transform -translate-y-1/2 cursor-[row-resize]"></div>
7
- </div>
8
- <% if @inspector %>
9
- <%= render "workbench/inspector", **@inspector %>
10
- <% end %>
11
- </div>
12
- </div>
@@ -1,39 +0,0 @@
1
- <%= render "shared/header" do %>
2
- <div class="flex items-center">
3
- <div class="flex items-center space-x-1">
4
- <strong class="whitespace-nowrap truncate"><%= @preview.label %></strong>
5
- <% if @preview.get_examples.many? %>
6
- <span>/</span>
7
- <span class="whitespace-nowrap truncate"><%= @example.label %></span>
8
- <% end %>
9
- </div>
10
- </div>
11
- <div class="flex text-xs ml-auto font-monospace text-gray-700 space-x-1" x-show="$screen('md')">
12
- <span x-text="`${previewViewportWidth}px`"></span>
13
- <span class="text-gray-500">x</span>
14
- <span x-text="`${previewViewportHeight}px`"></span>
15
- </div>
16
- <div class="flex items-center ml-auto md:ml-3 md:pl-3 space-x-3 md:border-l border-gray-300 text-gray-400">
17
- <a
18
- href="<%= url_for %>"
19
- class="block transition hover:text-indigo-800"
20
- x-tooltip.theme.lookbook="`Refresh preview`"
21
- @click.prevent.stop="$dispatch('navigate')"
22
- data-hotkey="r"
23
- >
24
- <svg class="feather w-4 h-4">
25
- <use xlink:href="/lookbook-assets/feather-sprite.svg#refresh-cw" />
26
- </svg>
27
- </a>
28
- <a
29
- href="<%= preview_path %>"
30
- class="block transition hover:text-indigo-800" target="_blank"
31
- x-tooltip.theme.lookbook="`Open in new window`"
32
- data-hotkey="w"
33
- >
34
- <svg class="feather w-4 h-4">
35
- <use xlink:href="/lookbook-assets/feather-sprite.svg#external-link" />
36
- </svg>
37
- </a>
38
- </div>
39
- <% end %>
@@ -1,38 +0,0 @@
1
- <div id="inspector" class="bg-white w-full overflow-hidden flex flex-col" x-data="inspector" x-show="$screen('md')">
2
- <div class="px-4 border-b border-gray-200 flex items-center flex-none select-none">
3
- <nav class="-mb-px flex space-x-8 cursor-auto">
4
- <% panes.each do |key, props| %>
5
- <a
6
- id="inspector-tab-<%= key %>"
7
- href="#<%= key %>"
8
- class="whitespace-nowrap py-2 px-1 border-b-2 cursor-pointer <%= "!text-gray-300" if props[:disabled] %>"
9
- :class="{
10
- 'border-indigo-400': active('<%= key %>'),
11
- 'border-transparent text-gray-500 hover:text-gray-700': !active('<%= key %>')
12
- }"
13
- @click.stop.prevent="switchTo('<%= key %>')"
14
- <% if props[:hotkey] %>data-hotkey="<%= props[:hotkey] %>"<% end %>
15
- >
16
- <%== props[:label] %>
17
- </a>
18
- <% end %>
19
- </nav>
20
- </div>
21
- <div class="flex-auto overflow-auto bg-gray-50">
22
- <% panes.each do |key, props| %>
23
- <div class="flex flex-col h-full relative" x-show="active('<%= key %>')" x-effect="
24
- if ($store.inspector.active === '<%= key %>') {
25
- const input = $el.querySelector('[data-param-input]');
26
- if (input) setTimeout(() => input.focus(), 0)
27
- }
28
- " x-cloak>
29
- <% if props[:clipboard].present? %>
30
- <%= render "shared/clipboard" do %><%= h props[:clipboard].strip %><% end %>
31
- <% end %>
32
- <div id="inspector-content-<%= key %>" class="flex flex-col h-full overflow-auto">
33
- <%= render "workbench/inspector/#{props[:template]}", key: key, **props %>
34
- </div>
35
- </div>
36
- <% end %>
37
- </div>
38
- </div>
@@ -1,24 +0,0 @@
1
- <div id="preview" class="h-full md:h-auto md:min-h-0 flex w-full bg-gray-50">
2
- <div class="relative mx-auto bg-white" x-data="preview" :style="`width: ${$screen('md') ? $store.preview.width : '100%'}`">
3
- <iframe seamless
4
- class="absolute h-full inset-0 w-full border-l border-gray-300 md:pr-4 md:-mx-px"
5
- src="<%= url_for lookbook.preview_path %>"
6
- <% if config.preview_srcdoc %>srcdoc="<%== @rendered_example %>"<% end %>
7
- frameborder="0"
8
- x-data="sizeObserver"
9
- x-effect="previewViewportWidth = observedWidth; previewViewportHeight = observedHeight;"
10
- ></iframe>
11
- <div class="absolute opacity-0 inset-0 pointer-events-none" :class="{ 'pointer-events-none': !$store.page.reflowing }"></div>
12
- <div
13
- class="border-l border-r border-gray-300 bg-white hover:bg-indigo-100 hover:bg-opacity-20 transition absolute right-0 inset-y-0 flex items-center w-4 cursor-[col-resize] select-none"
14
- style="touch-action: none"
15
- @pointerdown="onResizeStart"
16
- @dblclick="toggleFullWidth"
17
- x-show="$screen('md')"
18
- >
19
- <svg class="h-4 w-4 text-gray-600 pointer-events-none" fill="currentColor" viewBox="0 0 24 24">
20
- <path d="M8 5h2v14H8zM14 5h2v14h-2z"></path>
21
- </svg>
22
- </div>
23
- </div>
24
- </div>
@@ -1,3 +0,0 @@
1
- <pre class="h-full"><code class="h-full p-4 block highlight font-monospace" style="background-image: none"><% items.each do |item| %><%== highlight( "#{items.many? ? item[:label] + "\n" : ""}#{item[:content].strip}", item[:lang][:name]) %>
2
-
3
- <% end %></code></pre>
@@ -1,24 +0,0 @@
1
- <div class="text-gray-600">
2
- <% if items.many? %>
3
- <div class="divide-y divide-gray-300">
4
- <% items.each do |item| %>
5
- <div class="px-4 pt-10 pb-8 relative">
6
- <div class="prose prose-sm">
7
- <%= markdown(item[:content]) %>
8
- </div>
9
- <h6 class="text-[11px] text-gray-600 inline-block px-2 py-0.25 bg-gray-100 border border-t-0 border-gray-300 absolute top-0 left-4 rounded-b">
10
- <%= item[:label] %>
11
- </h6>
12
- </div>
13
- <% end %>
14
- </div>
15
- <% else %>
16
- <div class="p-4 prose prose-sm">
17
- <% if items.any? %>
18
- <%= markdown(items[0][:content]) %>
19
- <% else %>
20
- <em class='opacity-50'>No notes provided.</em>
21
- <% end %>
22
- </div>
23
- <% end %>
24
- </div>
@@ -1,28 +0,0 @@
1
- <% if @example.type == :group %>
2
- <div class="p-4 prose prose-sm">
3
- <em class='opacity-50'>Params are not supported for grouped previews.</em>
4
- </div>
5
- <% elsif items.none? %>
6
- <div class="p-4 prose prose-sm">
7
- <em class='opacity-50'>No params configured.</em>
8
- </div>
9
- <% else %>
10
- <div class="py-3">
11
- <% items.each do |param| %>
12
- <div class="px-4 py-3" x-data="param" @document:patched="setFocus">
13
- <div class="flex items-start max-w-[800px]">
14
- <div class="w-[200px] flex-none py-2">
15
- <label for="param-<%= param[:name] %>" class="font-bold"><%= param[:name].titleize %></label>
16
- </div>
17
- <div class="flex-grow" @focus="focussed = true" @blur="focussed = false">
18
- <%= render "workbench/inspector/params/#{param[:input]}",
19
- **param,
20
- value: params.key?(param[:name]) ? params[param[:name]] : param[:default],
21
- id: "#{@example.id}-param-#{param[:name]}"
22
- %>
23
- </div>
24
- </div>
25
- </div>
26
- <% end %>
27
- </div>
28
- <% end %>
@@ -1,3 +0,0 @@
1
- <div class="p-4">
2
- <%= content %>
3
- </div>
@@ -1,8 +0,0 @@
1
- <input
2
- id="<%= id %>"
3
- class="form-input"
4
- type="<%= input_type %>"
5
- name="<%= name %>"
6
- value="<%= value %>"
7
- @keyup.stop.debounce.400="if (validate()) update($el.name, $el.value)"
8
- data-param-input>
@@ -1,8 +0,0 @@
1
- <textarea
2
- id="<%= id %>"
3
- class="form-input"
4
- name="<%= name %>"
5
- rows="4"
6
- @keyup.stop.debounce.300="update($el.name, $el.value)"
7
- data-param-input
8
- ><%= value %></textarea>
@@ -1,13 +0,0 @@
1
- <div id="<%= id %>" x-init="checked = <%= value == true || value == "true" ? "true" : "false" %>" data-param-input>
2
- <button type="button"
3
- class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-400"
4
- :class="{'bg-indigo-500': checked, 'bg-gray-300': !checked}"
5
- role="switch"
6
- @click.stop="checked = !checked; update('<%= name %>', checked)">
7
- <span
8
- aria-hidden="true"
9
- class="pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200"
10
- :class="{'translate-x-5': checked, 'translate-x-0': !checked}"
11
- ></span>
12
- </button>
13
- </div>