m9sh 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.idea/hotcdn.iml +30 -0
  3. data/.mise.toml +2 -2
  4. data/app/assets/config/manifest.js +4 -0
  5. data/app/assets/images/icons/activity.svg +3 -0
  6. data/app/assets/images/icons/bell.svg +4 -0
  7. data/app/assets/images/icons/book.svg +4 -0
  8. data/app/assets/images/icons/chevron-down.svg +3 -0
  9. data/app/assets/images/icons/chevron-left.svg +3 -0
  10. data/app/assets/images/icons/chevron-right.svg +3 -0
  11. data/app/assets/images/icons/credit-card.svg +4 -0
  12. data/app/assets/images/icons/dollar-sign.svg +3 -0
  13. data/app/assets/images/icons/edit.svg +4 -0
  14. data/app/assets/images/icons/github.svg +3 -0
  15. data/app/assets/images/icons/home.svg +4 -0
  16. data/app/assets/images/icons/info.svg +5 -0
  17. data/app/assets/images/icons/layout.svg +6 -0
  18. data/app/assets/images/icons/logout.svg +5 -0
  19. data/app/assets/images/icons/menu.svg +5 -0
  20. data/app/assets/images/icons/moon.svg +3 -0
  21. data/app/assets/images/icons/paintbrush.svg +6 -0
  22. data/app/assets/images/icons/search.svg +4 -0
  23. data/app/assets/images/icons/settings.svg +4 -0
  24. data/app/assets/images/icons/sun.svg +11 -0
  25. data/app/assets/images/icons/user.svg +4 -0
  26. data/app/assets/images/icons/users.svg +5 -0
  27. data/app/assets/stylesheets/tailwind.css +1180 -0
  28. data/app/components/backdrop_component.rb +103 -0
  29. data/app/components/docs/code_block_component.rb +56 -0
  30. data/app/components/docs/component_api_component.rb +16 -0
  31. data/app/components/docs/component_examples_component.rb +16 -0
  32. data/app/components/docs/component_header_component.html.erb +8 -0
  33. data/app/components/docs/component_header_component.rb +14 -0
  34. data/app/components/docs/component_installation_component.html.erb +15 -0
  35. data/app/components/docs/component_installation_component.rb +13 -0
  36. data/app/components/docs/component_page_component.html.erb +9 -0
  37. data/app/components/docs/component_page_component.rb +19 -0
  38. data/app/components/docs/component_preview_component.rb +318 -0
  39. data/app/components/docs/component_usage_component.rb +18 -0
  40. data/app/components/docs/prop_table_component.rb +64 -0
  41. data/app/controllers/application_controller.rb +3 -0
  42. data/app/controllers/blocks_controller.rb +51 -0
  43. data/app/controllers/docs_controller.rb +162 -0
  44. data/app/controllers/showcase_controller.rb +42 -0
  45. data/app/helpers/blocks_helper.rb +343 -0
  46. data/app/helpers/docs_helper.rb +3807 -0
  47. data/app/helpers/m9sh/toast_helper.rb +46 -0
  48. data/app/helpers/m9sh_helper.rb +343 -0
  49. data/app/javascript/application.js +3 -0
  50. data/app/javascript/controllers/application.js +9 -0
  51. data/app/javascript/controllers/backdrop_controller.js +137 -0
  52. data/app/javascript/controllers/color_customizer_controller.js +569 -0
  53. data/app/javascript/controllers/color_theme_controller.js +120 -0
  54. data/app/javascript/controllers/docs/component_preview_controller.js +149 -0
  55. data/app/javascript/controllers/docs/copy_button_controller.js +20 -0
  56. data/app/javascript/controllers/index.js +6 -0
  57. data/app/javascript/controllers/theme_controller.js +23 -0
  58. data/app/views/blocks/_sidebar.html.erb +31 -0
  59. data/app/views/blocks/_toc.html.erb +29 -0
  60. data/app/views/blocks/examples/dashboard-01.html.erb +180 -0
  61. data/app/views/blocks/examples/dashboard-02.html.erb +190 -0
  62. data/app/views/blocks/examples/dashboard-03.html.erb +210 -0
  63. data/app/views/blocks/examples/settings-01.html.erb +220 -0
  64. data/app/views/blocks/examples/settings-02.html.erb +231 -0
  65. data/app/views/blocks/examples/settings-03.html.erb +340 -0
  66. data/app/views/blocks/index.html.erb +65 -0
  67. data/app/views/docs/_sidebar.html.erb +47 -0
  68. data/app/views/docs/_toc.html.erb +19 -0
  69. data/app/views/docs/about.html.erb +68 -0
  70. data/app/views/docs/components/accordion.html.erb +196 -0
  71. data/app/views/docs/components/alert.html.erb +272 -0
  72. data/app/views/docs/components/alert_dialog.html.erb +232 -0
  73. data/app/views/docs/components/avatar.html.erb +207 -0
  74. data/app/views/docs/components/badge.html.erb +145 -0
  75. data/app/views/docs/components/breadcrumb.html.erb +264 -0
  76. data/app/views/docs/components/button.html.erb +229 -0
  77. data/app/views/docs/components/card.html.erb +378 -0
  78. data/app/views/docs/components/checkbox.html.erb +212 -0
  79. data/app/views/docs/components/collapsible.html.erb +252 -0
  80. data/app/views/docs/components/dialog.html.erb +323 -0
  81. data/app/views/docs/components/dropdown_menu.html.erb +289 -0
  82. data/app/views/docs/components/hover_card.html.erb +220 -0
  83. data/app/views/docs/components/input.html.erb +254 -0
  84. data/app/views/docs/components/label.html.erb +128 -0
  85. data/app/views/docs/components/main.html.erb +352 -0
  86. data/app/views/docs/components/navbar.html.erb +394 -0
  87. data/app/views/docs/components/navigation_menu.html.erb +226 -0
  88. data/app/views/docs/components/popover.html.erb +267 -0
  89. data/app/views/docs/components/progress.html.erb +107 -0
  90. data/app/views/docs/components/radio_group.html.erb +209 -0
  91. data/app/views/docs/components/select.html.erb +260 -0
  92. data/app/views/docs/components/separator.html.erb +162 -0
  93. data/app/views/docs/components/sheet.html.erb +270 -0
  94. data/app/views/docs/components/sidebar.html.erb +597 -0
  95. data/app/views/docs/components/skeleton.html.erb +150 -0
  96. data/app/views/docs/components/slider.html.erb +218 -0
  97. data/app/views/docs/components/spinner.html.erb +132 -0
  98. data/app/views/docs/components/switch.html.erb +148 -0
  99. data/app/views/docs/components/table.html.erb +259 -0
  100. data/app/views/docs/components/tabs.html.erb +225 -0
  101. data/app/views/docs/components/textarea.html.erb +239 -0
  102. data/app/views/docs/components/theme_toggle.html.erb +135 -0
  103. data/app/views/docs/components/toast.html.erb +205 -0
  104. data/app/views/docs/components/toaster.html.erb +227 -0
  105. data/app/views/docs/components/toggle.html.erb +154 -0
  106. data/app/views/docs/components/tooltip.html.erb +216 -0
  107. data/app/views/docs/components/typography.html.erb +180 -0
  108. data/app/views/docs/index.html.erb +143 -0
  109. data/app/views/docs/installation.html.erb +155 -0
  110. data/app/views/docs/simple_test.html.erb +13 -0
  111. data/app/views/docs/test_accordion.html.erb +14 -0
  112. data/app/views/docs/usage.html.erb +272 -0
  113. data/app/views/layouts/application.html.erb +107 -0
  114. data/app/views/layouts/backdrop.html.erb +77 -0
  115. data/app/views/shared/_app_navbar.html.erb +240 -0
  116. data/app/views/shared/_navbar.html.erb +69 -0
  117. data/app/views/showcase/v2/_components_grid.html.erb +38 -0
  118. data/app/views/showcase/v2/_features.html.erb +59 -0
  119. data/app/views/showcase/v2/_forms.html.erb +195 -0
  120. data/app/views/showcase/v2/_hero.html.erb +55 -0
  121. data/app/views/showcase/v2/_metrics.html.erb +107 -0
  122. data/app/views/showcase/v2.html.erb +18 -0
  123. data/lib/m9sh/version.rb +1 -1
  124. data/m9sh.gemspec +1 -1
  125. metadata +120 -1
@@ -0,0 +1,272 @@
1
+ <%- content_for :title, "Usage - m9sh/ui" -%>
2
+
3
+ <div class="space-y-12 max-w-3xl">
4
+ <!-- Page Header -->
5
+ <div class="space-y-4">
6
+ <h1 class="scroll-m-20 text-4xl font-bold tracking-tight lg:text-5xl">
7
+ Usage
8
+ </h1>
9
+ <p class="text-lg text-muted-foreground">
10
+ Three ways to use m9sh/ui components in your Rails application.
11
+ </p>
12
+ </div>
13
+
14
+ <!-- Overview -->
15
+ <div class="space-y-6">
16
+ <div>
17
+ <h2 class="scroll-m-20 pb-2 text-3xl font-semibold tracking-tight transition-colors">
18
+ Overview
19
+ </h2>
20
+ <%= render M9sh::SeparatorComponent.new(class: "my-4") %>
21
+ <p class="mt-4 text-muted-foreground leading-7">
22
+ m9sh/ui provides three different syntaxes for rendering components, giving you flexibility based on your preference and use case.
23
+ </p>
24
+ </div>
25
+
26
+ <!-- Short Syntax (Recommended) -->
27
+ <div>
28
+ <h2 class="scroll-m-20 pb-2 text-3xl font-semibold tracking-tight transition-colors">
29
+ Short Syntax (Recommended)
30
+ </h2>
31
+ <%= render M9sh::SeparatorComponent.new(class: "my-4") %>
32
+ <p class="mt-4 text-muted-foreground leading-7">
33
+ The <%= render M9sh::BadgeComponent.new(variant: :secondary) do %>ui_*<% end %> helper methods provide the most concise syntax, inspired by shadcn/ui.
34
+ </p>
35
+ <%= render Docs::CodeBlockComponent.new(
36
+ code: @short_syntax_code,
37
+ language: "erb"
38
+ ) %>
39
+ </div>
40
+
41
+ <!-- Backwards Compatible Syntax -->
42
+ <div>
43
+ <h2 class="scroll-m-20 pb-2 text-3xl font-semibold tracking-tight transition-colors">
44
+ Backwards Compatible Syntax
45
+ </h2>
46
+ <%= render M9sh::SeparatorComponent.new(class: "my-4") %>
47
+ <p class="mt-4 text-muted-foreground leading-7">
48
+ The <%= render M9sh::BadgeComponent.new(variant: :secondary) do %>render_*<% end %> aliases provide compatibility if you prefer more explicit naming.
49
+ </p>
50
+ <%= render Docs::CodeBlockComponent.new(
51
+ code: @backwards_syntax_code,
52
+ language: "erb"
53
+ ) %>
54
+ </div>
55
+
56
+ <!-- Original Syntax -->
57
+ <div>
58
+ <h2 class="scroll-m-20 pb-2 text-3xl font-semibold tracking-tight transition-colors">
59
+ Original Syntax (Still Supported)
60
+ </h2>
61
+ <%= render M9sh::SeparatorComponent.new(class: "my-4") %>
62
+ <p class="mt-4 text-muted-foreground leading-7">
63
+ The original ViewComponent syntax is still fully supported and useful when you need maximum control or explicit component instantiation.
64
+ </p>
65
+ <%= render Docs::CodeBlockComponent.new(
66
+ code: @original_syntax_code,
67
+ language: "erb"
68
+ ) %>
69
+ </div>
70
+
71
+ <!-- Available Helpers -->
72
+ <div>
73
+ <h2 class="scroll-m-20 pb-2 text-3xl font-semibold tracking-tight transition-colors">
74
+ Available Helpers
75
+ </h2>
76
+ <%= render M9sh::SeparatorComponent.new(class: "my-4") %>
77
+ <p class="mt-4 text-muted-foreground leading-7">
78
+ All m9sh/ui components have corresponding helper methods. Here's the complete list:
79
+ </p>
80
+ <div class="mt-6 grid gap-4 sm:grid-cols-2">
81
+ <% [
82
+ ["ui_button", "render_button"],
83
+ ["ui_badge", "render_badge"],
84
+ ["ui_card", "render_card"],
85
+ ["ui_input", "render_input"],
86
+ ["ui_label", "render_label"],
87
+ ["ui_textarea", "render_textarea"],
88
+ ["ui_checkbox", "render_checkbox"],
89
+ ["ui_switch", "render_switch"],
90
+ ["ui_separator", "render_separator"],
91
+ ["ui_spinner", "render_spinner"],
92
+ ["ui_skeleton", "render_skeleton"],
93
+ ["ui_progress", "render_progress"],
94
+ ["ui_avatar", "render_avatar"],
95
+ ["ui_alert", "render_alert"],
96
+ ["ui_slider", "render_slider"],
97
+ ["ui_toggle", "render_toggle"],
98
+ ["ui_accordion", "render_accordion"],
99
+ ["ui_tabs", "render_tabs"],
100
+ ["ui_dialog", "render_dialog"],
101
+ ["ui_alert_dialog", "render_alert_dialog"],
102
+ ["ui_sheet", "render_sheet"],
103
+ ["ui_popover", "render_popover"],
104
+ ["ui_tooltip", "render_tooltip"],
105
+ ["ui_hover_card", "render_hover_card"],
106
+ ["ui_dropdown_menu", "render_dropdown_menu"],
107
+ ["ui_collapsible", "render_collapsible"],
108
+ ["ui_table", "render_table"],
109
+ ["ui_breadcrumb", "render_breadcrumb"],
110
+ ["ui_navigation_menu", "render_navigation_menu"],
111
+ ["ui_radio_group", "render_radio_group"],
112
+ ["ui_select", "render_select"],
113
+ ["ui_typography", "render_typography"],
114
+ ["ui_theme_toggle", "render_theme_toggle"]
115
+ ].each do |short, long| %>
116
+ <%= render M9sh::CardComponent.new(class: "p-3") do %>
117
+ <div class="space-y-1">
118
+ <code class="text-sm font-mono text-primary"><%= short %></code>
119
+ <p class="text-xs text-muted-foreground">alias: <code class="font-mono"><%= long %></code></p>
120
+ </div>
121
+ <% end %>
122
+ <% end %>
123
+ </div>
124
+ </div>
125
+
126
+ <!-- Comparison -->
127
+ <div>
128
+ <h2 class="scroll-m-20 pb-2 text-3xl font-semibold tracking-tight transition-colors">
129
+ Syntax Comparison
130
+ </h2>
131
+ <%= render M9sh::SeparatorComponent.new(class: "my-4") %>
132
+ <p class="mt-4 text-muted-foreground leading-7">
133
+ Here's how the three syntaxes compare for a typical button with outline variant:
134
+ </p>
135
+ <div class="mt-6 space-y-4">
136
+ <%= render M9sh::CardComponent.new do |card| %>
137
+ <% card.with_header do %>
138
+ <div class="flex items-center justify-between">
139
+ <h3 class="font-semibold">Short Syntax</h3>
140
+ <%= render M9sh::BadgeComponent.new(variant: :secondary) do %>Recommended<% end %>
141
+ </div>
142
+ <% end %>
143
+ <% card.with_body do %>
144
+ <%= render Docs::CodeBlockComponent.new(
145
+ code: @inline_short_example,
146
+ language: "erb"
147
+ ) %>
148
+ <% end %>
149
+ <% end %>
150
+
151
+ <%= render M9sh::CardComponent.new do |card| %>
152
+ <% card.with_header do %>
153
+ <h3 class="font-semibold">Backwards Compatible</h3>
154
+ <% end %>
155
+ <% card.with_body do %>
156
+ <%= render Docs::CodeBlockComponent.new(
157
+ code: @comparison_backwards_code,
158
+ language: "erb"
159
+ ) %>
160
+ <% end %>
161
+ <% end %>
162
+
163
+ <%= render M9sh::CardComponent.new do |card| %>
164
+ <% card.with_header do %>
165
+ <h3 class="font-semibold">Original ViewComponent</h3>
166
+ <% end %>
167
+ <% card.with_body do %>
168
+ <%= render Docs::CodeBlockComponent.new(
169
+ code: @comparison_original_code,
170
+ language: "erb"
171
+ ) %>
172
+ <% end %>
173
+ <% end %>
174
+ </div>
175
+ </div>
176
+
177
+ <!-- Which Should I Use? -->
178
+ <div>
179
+ <h2 class="scroll-m-20 pb-2 text-3xl font-semibold tracking-tight transition-colors">
180
+ Which Should I Use?
181
+ </h2>
182
+ <%= render M9sh::SeparatorComponent.new(class: "my-4") %>
183
+ <div class="mt-6 space-y-6">
184
+ <%= render M9sh::CardComponent.new do |card| %>
185
+ <% card.with_header do %>
186
+ <h3 class="font-semibold">Use Short Syntax (ui_*) when:</h3>
187
+ <% end %>
188
+ <% card.with_body do %>
189
+ <ul class="list-disc ml-6 space-y-2 text-sm text-muted-foreground">
190
+ <li>You want the most concise, readable code</li>
191
+ <li>You're familiar with shadcn/ui and prefer similar syntax</li>
192
+ <li>You're writing new code</li>
193
+ <li>You want Rails-native helper method benefits (automatic escaping, etc.)</li>
194
+ </ul>
195
+ <% end %>
196
+ <% end %>
197
+
198
+ <%= render M9sh::CardComponent.new do |card| %>
199
+ <% card.with_header do %>
200
+ <h3 class="font-semibold">Use Backwards Compatible (render_*) when:</h3>
201
+ <% end %>
202
+ <% card.with_body do %>
203
+ <ul class="list-disc ml-6 space-y-2 text-sm text-muted-foreground">
204
+ <li>You prefer more explicit "render" naming</li>
205
+ <li>You're migrating from another component library</li>
206
+ <li>Your team prefers explicit over concise</li>
207
+ </ul>
208
+ <% end %>
209
+ <% end %>
210
+
211
+ <%= render M9sh::CardComponent.new do |card| %>
212
+ <% card.with_header do %>
213
+ <h3 class="font-semibold">Use Original Syntax when:</h3>
214
+ <% end %>
215
+ <% card.with_body do %>
216
+ <ul class="list-disc ml-6 space-y-2 text-sm text-muted-foreground">
217
+ <li>You need to assign the component to a variable first</li>
218
+ <li>You're working with complex component composition</li>
219
+ <li>You prefer explicit ViewComponent instantiation</li>
220
+ <li>You need maximum flexibility and control</li>
221
+ </ul>
222
+ <% end %>
223
+ <% end %>
224
+ </div>
225
+ </div>
226
+
227
+ <!-- Tips -->
228
+ <div>
229
+ <h2 class="scroll-m-20 pb-2 text-3xl font-semibold tracking-tight transition-colors">
230
+ Tips & Best Practices
231
+ </h2>
232
+ <%= render M9sh::SeparatorComponent.new(class: "my-4") %>
233
+ <div class="mt-6 space-y-4">
234
+ <div>
235
+ <h3 class="font-semibold">Mix and Match</h3>
236
+ <p class="mt-2 text-sm text-muted-foreground leading-7">
237
+ You can freely mix all three syntaxes in the same application. They all produce identical output.
238
+ </p>
239
+ </div>
240
+
241
+ <div>
242
+ <h3 class="font-semibold">Inline Blocks</h3>
243
+ <p class="mt-2 text-sm text-muted-foreground leading-7">
244
+ For single-line content, use the inline block syntax <%= render M9sh::BadgeComponent.new(variant: :secondary) do %><code class="text-xs">{ "text" }</code><% end %> for even more concise code.
245
+ </p>
246
+ <%= render Docs::CodeBlockComponent.new(
247
+ code: @inline_block_example,
248
+ language: "erb"
249
+ ) %>
250
+ </div>
251
+
252
+ <div>
253
+ <h3 class="font-semibold">All Parameters Supported</h3>
254
+ <p class="mt-2 text-sm text-muted-foreground leading-7">
255
+ All helper methods support the exact same parameters as their component counterparts. Check individual component documentation for available options.
256
+ </p>
257
+ </div>
258
+
259
+ <div>
260
+ <h3 class="font-semibold">Custom Classes</h3>
261
+ <p class="mt-2 text-sm text-muted-foreground leading-7">
262
+ Add custom Tailwind classes using the <%= render M9sh::BadgeComponent.new(variant: :secondary) do %>class:<% end %> parameter with any syntax.
263
+ </p>
264
+ <%= render Docs::CodeBlockComponent.new(
265
+ code: @custom_class_example,
266
+ language: "erb"
267
+ ) %>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ </div>
272
+ </div>
@@ -0,0 +1,107 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="h-full">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
6
+ <title><%= content_for(:title) || "m9sh/ui - Component Library for Rails" %></title>
7
+ <%= csrf_meta_tags %>
8
+ <%= csp_meta_tag %>
9
+
10
+ <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
11
+ <%= javascript_importmap_tags %>
12
+ </head>
13
+
14
+ <body class="min-h-screen bg-background text-foreground antialiased" data-controller="theme color-theme">
15
+ <%= render M9sh::ToasterComponent.new %>
16
+
17
+ <!-- Color Customizer Sheet -->
18
+ <div data-color-theme-target="customizer">
19
+ <%= render M9sh::SheetComponent.new(side: "right") do |sheet| %>
20
+ <% sheet.with_trigger do %>
21
+ <button id="color-customizer-trigger" class="hidden">Open Customizer</button>
22
+ <% end %>
23
+
24
+ <% sheet.with_sheet_content do %>
25
+ <%= render M9sh::ColorCustomizerComponent.new(theme_name: "neutral") %>
26
+ <% end %>
27
+ <% end %>
28
+ </div>
29
+
30
+ <!-- Top Navbar using NavbarComponent -->
31
+ <%= render "shared/app_navbar", sticky: true %>
32
+
33
+ <!-- Main Content -->
34
+ <main style="padding-top: calc(3.5rem + env(safe-area-inset-top)); padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right); padding-bottom: env(safe-area-inset-bottom);">
35
+ <%= yield %>
36
+ </main>
37
+
38
+ <!-- Footer -->
39
+ <footer class="border-t border-border bg-card">
40
+ <div class="container mx-auto px-4 md:px-6 py-16">
41
+ <div class="grid gap-12 md:grid-cols-[2fr_1fr_1fr_1fr] max-w-6xl mx-auto">
42
+ <!-- Brand Column -->
43
+ <div class="space-y-4">
44
+ <div class="flex items-center space-x-2">
45
+ <span class="font-bold text-xl text-foreground">m9sh/ui</span>
46
+ </div>
47
+ <p class="text-sm text-muted-foreground leading-relaxed max-w-xs">
48
+ A comprehensive collection of beautifully designed ViewComponents for Rails, built with Tailwind CSS and ready to use.
49
+ </p>
50
+ <div class="flex items-center gap-3 pt-2">
51
+ <a href="https://github.com" target="_blank" rel="noreferrer"
52
+ class="flex items-center justify-center w-9 h-9 rounded-lg bg-muted hover:bg-accent transition-colors text-muted-foreground hover:text-foreground"
53
+ aria-label="GitHub">
54
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" viewBox="0 0 24 24">
55
+ <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
56
+ </svg>
57
+ </a>
58
+ </div>
59
+ </div>
60
+
61
+ <!-- Documentation Column -->
62
+ <div class="space-y-4">
63
+ <h4 class="text-sm font-semibold text-foreground">Documentation</h4>
64
+ <ul class="space-y-3 text-sm">
65
+ <li><a href="/docs" class="text-muted-foreground hover:text-foreground transition-colors">Components</a></li>
66
+ <li><a href="/blocks" class="text-muted-foreground hover:text-foreground transition-colors">Blocks</a></li>
67
+ <li><a href="/docs/installation" class="text-muted-foreground hover:text-foreground transition-colors">Installation</a></li>
68
+ <li><a href="/docs" class="text-muted-foreground hover:text-foreground transition-colors">Examples</a></li>
69
+ </ul>
70
+ </div>
71
+
72
+ <!-- Resources Column -->
73
+ <div class="space-y-4">
74
+ <h4 class="text-sm font-semibold text-foreground">Resources</h4>
75
+ <ul class="space-y-3 text-sm">
76
+ <li><a href="https://github.com" target="_blank" rel="noreferrer" class="text-muted-foreground hover:text-foreground transition-colors">GitHub</a></li>
77
+ <li><a href="#" class="text-muted-foreground hover:text-foreground transition-colors">Changelog</a></li>
78
+ <li><a href="#" class="text-muted-foreground hover:text-foreground transition-colors">Contributing</a></li>
79
+ <li><a href="#" class="text-muted-foreground hover:text-foreground transition-colors">Community</a></li>
80
+ </ul>
81
+ </div>
82
+
83
+ <!-- Legal Column -->
84
+ <div class="space-y-4">
85
+ <h4 class="text-sm font-semibold text-foreground">Legal</h4>
86
+ <ul class="space-y-3 text-sm">
87
+ <li><a href="#" class="text-muted-foreground hover:text-foreground transition-colors">Privacy Policy</a></li>
88
+ <li><a href="#" class="text-muted-foreground hover:text-foreground transition-colors">Terms of Service</a></li>
89
+ <li><a href="#" class="text-muted-foreground hover:text-foreground transition-colors">License</a></li>
90
+ </ul>
91
+ </div>
92
+ </div>
93
+
94
+ <div class="border-t border-border mt-12 pt-8 max-w-6xl mx-auto">
95
+ <div class="flex flex-col sm:flex-row items-center justify-between gap-4">
96
+ <p class="text-sm text-muted-foreground">
97
+ © 2024 m9sh/ui. All rights reserved.
98
+ </p>
99
+ <p class="text-sm text-muted-foreground">
100
+ Built with Rails and Tailwind CSS
101
+ </p>
102
+ </div>
103
+ </div>
104
+ </div>
105
+ </footer>
106
+ </body>
107
+ </html>
@@ -0,0 +1,77 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="h-full">
3
+ <head>
4
+ <title><%= content_for(:title) || "m9sh/ui" %></title>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <%= csrf_meta_tags %>
8
+ <%= csp_meta_tag %>
9
+
10
+ <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
11
+ <%= javascript_importmap_tags %>
12
+ </head>
13
+
14
+ <body class="h-screen bg-background text-foreground" data-controller="theme color-theme">
15
+ <%= render ::BackdropComponent.new(
16
+ show_left_sidebar: content_for?(:left_sidebar) || @show_docs_sidebars || @show_blocks_sidebars,
17
+ show_right_sidebar: content_for?(:right_sidebar) || @show_docs_sidebars || @show_blocks_sidebars,
18
+ left_sidebar_width: content_for(:left_sidebar_width) || "w-[300px]",
19
+ right_sidebar_width: content_for(:right_sidebar_width) || "w-[300px]"
20
+ ) do |backdrop| %>
21
+ <!-- Navbar -->
22
+ <% if content_for?(:navbar) || @show_docs_sidebars || @show_blocks_sidebars %>
23
+ <% backdrop.with_navbar do %>
24
+ <% if content_for?(:navbar) %>
25
+ <%= yield :navbar %>
26
+ <% else %>
27
+ <%= render "shared/app_navbar",
28
+ sticky: false,
29
+ show_left_toggle: backdrop.instance_variable_get(:@show_left_sidebar),
30
+ show_right_toggle: backdrop.instance_variable_get(:@show_right_sidebar) %>
31
+ <% end %>
32
+ <% end %>
33
+ <% end %>
34
+
35
+ <!-- Left Sidebar -->
36
+ <% if content_for?(:left_sidebar) || @show_docs_sidebars || @show_blocks_sidebars %>
37
+ <% backdrop.with_left_sidebar do %>
38
+ <% if content_for?(:left_sidebar) %>
39
+ <%= yield :left_sidebar %>
40
+ <% elsif @show_docs_sidebars %>
41
+ <%= render "docs/sidebar" %>
42
+ <% elsif @show_blocks_sidebars %>
43
+ <%= render "blocks/sidebar" %>
44
+ <% end %>
45
+ <% end %>
46
+ <% end %>
47
+
48
+ <!-- Right Sidebar -->
49
+ <% if content_for?(:right_sidebar) || @show_docs_sidebars || @show_blocks_sidebars %>
50
+ <% backdrop.with_right_sidebar do %>
51
+ <% if content_for?(:right_sidebar) %>
52
+ <%= yield :right_sidebar %>
53
+ <% elsif @show_docs_sidebars %>
54
+ <%= render "docs/toc" %>
55
+ <% elsif @show_blocks_sidebars %>
56
+ <%= render "blocks/toc" %>
57
+ <% end %>
58
+ <% end %>
59
+ <% end %>
60
+
61
+ <!-- Main Content -->
62
+ <% backdrop.with_main_content do %>
63
+ <% if @show_docs_sidebars || @show_blocks_sidebars %>
64
+ <%= render M9sh::MainComponent.new(class_name: "m-0 md:mx-4 md:my-12") do %>
65
+ <div class="flex-1 overflow-y-auto">
66
+ <div class="max-w-4xl mx-auto">
67
+ <%= yield %>
68
+ </div>
69
+ </div>
70
+ <% end %>
71
+ <% else %>
72
+ <%= yield %>
73
+ <% end %>
74
+ <% end %>
75
+ <% end %>
76
+ </body>
77
+ </html>