neon_sakura 0.1.4

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 (251) hide show
  1. checksums.yaml +7 -0
  2. data/.ai-reviewer/README.md +182 -0
  3. data/.ai-reviewer/ai-reviewer.sh +56 -0
  4. data/.ai-reviewer/build-system-prompt.sh +136 -0
  5. data/.ai-reviewer/extract-claude-sections.sh +32 -0
  6. data/.ai-reviewer/test-ai-reviewer.sh +40 -0
  7. data/.ai-reviewer-config.yml +190 -0
  8. data/.github/dependabot.yml +12 -0
  9. data/.github/settings.yml +70 -0
  10. data/.github/workflows/ai-pr-review-on-comment.yml +384 -0
  11. data/.github/workflows/ai-pr-review.yml +328 -0
  12. data/.github/workflows/license-check.yml +78 -0
  13. data/.github/workflows/lint.yml +79 -0
  14. data/.github/workflows/security.yml +131 -0
  15. data/.github/workflows/semgrep.yml +26 -0
  16. data/.github/workflows/test.yml +44 -0
  17. data/.gitignore +75 -0
  18. data/.rubocop.yml +33 -0
  19. data/.ruby-version +1 -0
  20. data/.simplecov +14 -0
  21. data/.stylelintignore +10 -0
  22. data/.stylelintrc.json +37 -0
  23. data/AGENTS.md +51 -0
  24. data/CHANGELOG.md +568 -0
  25. data/CLAUDE.md +632 -0
  26. data/Gemfile +8 -0
  27. data/Gemfile.lock +327 -0
  28. data/LICENSE +21 -0
  29. data/README.md +1209 -0
  30. data/Rakefile +25 -0
  31. data/app/assets/images/cherry_blossom.svg +1525 -0
  32. data/app/assets/images/cherry_blossom_tree.png +0 -0
  33. data/app/assets/images/prysm-icon.png +0 -0
  34. data/app/assets/stylesheets/base.css +29 -0
  35. data/app/assets/stylesheets/components.css +1652 -0
  36. data/app/assets/stylesheets/forms.css +152 -0
  37. data/app/assets/stylesheets/loading.css +145 -0
  38. data/app/assets/stylesheets/neon_sakura.css +40 -0
  39. data/app/assets/stylesheets/pagy-tailwind.css +120 -0
  40. data/app/assets/stylesheets/theme-default.css +40 -0
  41. data/app/assets/stylesheets/theme-green.css +84 -0
  42. data/app/assets/stylesheets/theme-purple.css +94 -0
  43. data/app/assets/stylesheets/theme-red.css +84 -0
  44. data/app/assets/stylesheets/utility-borders.css +29 -0
  45. data/app/assets/stylesheets/utility-colors.css +185 -0
  46. data/app/assets/stylesheets/utility-effects.css +123 -0
  47. data/app/assets/stylesheets/utility-gradients.css +158 -0
  48. data/app/assets/stylesheets/utility-layout.css +132 -0
  49. data/app/assets/stylesheets/utility-reset.css +13 -0
  50. data/app/assets/stylesheets/utility-responsive.css +145 -0
  51. data/app/assets/stylesheets/utility-sizing.css +99 -0
  52. data/app/assets/stylesheets/utility-spacing.css +174 -0
  53. data/app/assets/stylesheets/utility-typography.css +97 -0
  54. data/app/controllers/errors_controller.rb +120 -0
  55. data/app/controllers/style_guide_controller.rb +117 -0
  56. data/app/helpers/errors_helper.rb +12 -0
  57. data/app/helpers/neon_sakura/navbar_helper.rb +43 -0
  58. data/app/helpers/style_guide_helper.rb +36 -0
  59. data/app/javascript/neon_sakura/dropdown.js +22 -0
  60. data/app/javascript/neon_sakura/navbar.js +71 -0
  61. data/app/javascript/neon_sakura/theme_switcher.js +187 -0
  62. data/app/views/errors/show.html.erb +105 -0
  63. data/app/views/layouts/error.html.erb +19 -0
  64. data/app/views/layouts/mission_control/jobs/_application_selection.html.erb +14 -0
  65. data/app/views/layouts/mission_control/jobs/_navigation.html.erb +21 -0
  66. data/app/views/layouts/mission_control/jobs/application.html.erb +453 -0
  67. data/app/views/layouts/style_guide.html.erb +416 -0
  68. data/app/views/shared/_file_upload.html.erb +184 -0
  69. data/app/views/shared/_footer.html.erb +23 -0
  70. data/app/views/shared/_header.html.erb +42 -0
  71. data/app/views/shared/_navbar.html.erb +306 -0
  72. data/app/views/shared/_profile_image_selector.html.erb +165 -0
  73. data/app/views/shared/_theme_switcher.html.erb +64 -0
  74. data/app/views/shared/icons/_adjustments.html.erb +10 -0
  75. data/app/views/shared/icons/_alert_circle.html.erb +3 -0
  76. data/app/views/shared/icons/_alert_triangle.html.erb +3 -0
  77. data/app/views/shared/icons/_archive.html.erb +3 -0
  78. data/app/views/shared/icons/_arrow_down.html.erb +3 -0
  79. data/app/views/shared/icons/_arrow_left.html.erb +3 -0
  80. data/app/views/shared/icons/_arrow_up.html.erb +3 -0
  81. data/app/views/shared/icons/_arrows_pointing_in.html.erb +10 -0
  82. data/app/views/shared/icons/_arrows_pointing_out.html.erb +10 -0
  83. data/app/views/shared/icons/_artemis_logo.html.erb +26 -0
  84. data/app/views/shared/icons/_auth_banner.html.erb +1 -0
  85. data/app/views/shared/icons/_bars.html.erb +10 -0
  86. data/app/views/shared/icons/_bell.html.erb +3 -0
  87. data/app/views/shared/icons/_book.html.erb +3 -0
  88. data/app/views/shared/icons/_bookmark.html.erb +3 -0
  89. data/app/views/shared/icons/_box.html.erb +3 -0
  90. data/app/views/shared/icons/_brain.html.erb +3 -0
  91. data/app/views/shared/icons/_briefcase.html.erb +3 -0
  92. data/app/views/shared/icons/_calendar.html.erb +3 -0
  93. data/app/views/shared/icons/_camera.html.erb +4 -0
  94. data/app/views/shared/icons/_chart_bar.html.erb +3 -0
  95. data/app/views/shared/icons/_chart_line.html.erb +10 -0
  96. data/app/views/shared/icons/_chart_pie.html.erb +11 -0
  97. data/app/views/shared/icons/_chat.html.erb +3 -0
  98. data/app/views/shared/icons/_check.html.erb +3 -0
  99. data/app/views/shared/icons/_check_circle.html.erb +3 -0
  100. data/app/views/shared/icons/_cherry_blossom.html.erb +1516 -0
  101. data/app/views/shared/icons/_cherry_blossom_silhouette.html.erb +1016 -0
  102. data/app/views/shared/icons/_cherry_blossom_single_flower.html.erb +1125 -0
  103. data/app/views/shared/icons/_cherry_blossom_tree.html.erb +159 -0
  104. data/app/views/shared/icons/_chevron_down.html.erb +3 -0
  105. data/app/views/shared/icons/_chevron_right.html.erb +9 -0
  106. data/app/views/shared/icons/_clipboard.html.erb +3 -0
  107. data/app/views/shared/icons/_clock.html.erb +3 -0
  108. data/app/views/shared/icons/_close.html.erb +3 -0
  109. data/app/views/shared/icons/_cog.html.erb +4 -0
  110. data/app/views/shared/icons/_crop.html.erb +10 -0
  111. data/app/views/shared/icons/_crown.html.erb +3 -0
  112. data/app/views/shared/icons/_disc.html.erb +3 -0
  113. data/app/views/shared/icons/_download.html.erb +3 -0
  114. data/app/views/shared/icons/_dragonfly.html.erb +58 -0
  115. data/app/views/shared/icons/_duplicate.html.erb +4 -0
  116. data/app/views/shared/icons/_edit.html.erb +3 -0
  117. data/app/views/shared/icons/_envelope.html.erb +3 -0
  118. data/app/views/shared/icons/_eraser.html.erb +10 -0
  119. data/app/views/shared/icons/_external_link.html.erb +3 -0
  120. data/app/views/shared/icons/_eye.html.erb +4 -0
  121. data/app/views/shared/icons/_file_csv.html.erb +10 -0
  122. data/app/views/shared/icons/_file_export.html.erb +10 -0
  123. data/app/views/shared/icons/_file_image.html.erb +10 -0
  124. data/app/views/shared/icons/_file_import.html.erb +10 -0
  125. data/app/views/shared/icons/_file_question.html.erb +6 -0
  126. data/app/views/shared/icons/_film.html.erb +3 -0
  127. data/app/views/shared/icons/_filter.html.erb +3 -0
  128. data/app/views/shared/icons/_folder.html.erb +3 -0
  129. data/app/views/shared/icons/_folder_open.html.erb +3 -0
  130. data/app/views/shared/icons/_folder_plus.html.erb +3 -0
  131. data/app/views/shared/icons/_globe.html.erb +3 -0
  132. data/app/views/shared/icons/_google.html.erb +11 -0
  133. data/app/views/shared/icons/_heart.html.erb +3 -0
  134. data/app/views/shared/icons/_heart_broken.html.erb +11 -0
  135. data/app/views/shared/icons/_heart_pulse.html.erb +4 -0
  136. data/app/views/shared/icons/_history.html.erb +11 -0
  137. data/app/views/shared/icons/_home.html.erb +10 -0
  138. data/app/views/shared/icons/_image.html.erb +3 -0
  139. data/app/views/shared/icons/_inbox.html.erb +3 -0
  140. data/app/views/shared/icons/_info_circle.html.erb +10 -0
  141. data/app/views/shared/icons/_key.html.erb +3 -0
  142. data/app/views/shared/icons/_layers.html.erb +10 -0
  143. data/app/views/shared/icons/_lightbulb.html.erb +10 -0
  144. data/app/views/shared/icons/_lightning.html.erb +3 -0
  145. data/app/views/shared/icons/_list.html.erb +3 -0
  146. data/app/views/shared/icons/_lock.html.erb +3 -0
  147. data/app/views/shared/icons/_logout.html.erb +3 -0
  148. data/app/views/shared/icons/_magazine.html.erb +3 -0
  149. data/app/views/shared/icons/_magic.html.erb +3 -0
  150. data/app/views/shared/icons/_minus.html.erb +10 -0
  151. data/app/views/shared/icons/_mobile.html.erb +10 -0
  152. data/app/views/shared/icons/_moon.html.erb +3 -0
  153. data/app/views/shared/icons/_network.html.erb +10 -0
  154. data/app/views/shared/icons/_new_item_banner.html.erb +1 -0
  155. data/app/views/shared/icons/_ouroboros.html.erb +24 -0
  156. data/app/views/shared/icons/_package.html.erb +3 -0
  157. data/app/views/shared/icons/_palette.html.erb +3 -0
  158. data/app/views/shared/icons/_paper_plane.html.erb +10 -0
  159. data/app/views/shared/icons/_photo.html.erb +10 -0
  160. data/app/views/shared/icons/_play.html.erb +4 -0
  161. data/app/views/shared/icons/_plus.html.erb +3 -0
  162. data/app/views/shared/icons/_pocket.html.erb +11 -0
  163. data/app/views/shared/icons/_prysm-icon.html.erb +34 -0
  164. data/app/views/shared/icons/_prysm.html.erb +13 -0
  165. data/app/views/shared/icons/_pushbullet-1.html.erb +29 -0
  166. data/app/views/shared/icons/_pushbullet-2.html.erb +2 -0
  167. data/app/views/shared/icons/_puzzle.html.erb +10 -0
  168. data/app/views/shared/icons/_qrcode.html.erb +3 -0
  169. data/app/views/shared/icons/_question.html.erb +3 -0
  170. data/app/views/shared/icons/_receipt.html.erb +10 -0
  171. data/app/views/shared/icons/_redo.html.erb +3 -0
  172. data/app/views/shared/icons/_refresh.html.erb +3 -0
  173. data/app/views/shared/icons/_rocket.html.erb +10 -0
  174. data/app/views/shared/icons/_rss.html.erb +3 -0
  175. data/app/views/shared/icons/_save.html.erb +3 -0
  176. data/app/views/shared/icons/_search.html.erb +3 -0
  177. data/app/views/shared/icons/_search_minus.html.erb +10 -0
  178. data/app/views/shared/icons/_search_plus.html.erb +10 -0
  179. data/app/views/shared/icons/_server_error.html.erb +6 -0
  180. data/app/views/shared/icons/_share.html.erb +3 -0
  181. data/app/views/shared/icons/_shield_check.html.erb +3 -0
  182. data/app/views/shared/icons/_sign_in.html.erb +3 -0
  183. data/app/views/shared/icons/_spinner.html.erb +4 -0
  184. data/app/views/shared/icons/_star.html.erb +3 -0
  185. data/app/views/shared/icons/_store.html.erb +10 -0
  186. data/app/views/shared/icons/_sun.html.erb +3 -0
  187. data/app/views/shared/icons/_sync.html.erb +3 -0
  188. data/app/views/shared/icons/_table.html.erb +3 -0
  189. data/app/views/shared/icons/_tag.html.erb +3 -0
  190. data/app/views/shared/icons/_tags.html.erb +11 -0
  191. data/app/views/shared/icons/_tools.html.erb +4 -0
  192. data/app/views/shared/icons/_trash.html.erb +3 -0
  193. data/app/views/shared/icons/_undo.html.erb +3 -0
  194. data/app/views/shared/icons/_unlock.html.erb +3 -0
  195. data/app/views/shared/icons/_upload.html.erb +3 -0
  196. data/app/views/shared/icons/_user.html.erb +3 -0
  197. data/app/views/shared/icons/_user_circle.html.erb +10 -0
  198. data/app/views/shared/icons/_user_plus.html.erb +10 -0
  199. data/app/views/shared/icons/_video.html.erb +3 -0
  200. data/app/views/shared/icons/_wrench.html.erb +11 -0
  201. data/app/views/style_guide/index.html.erb +77 -0
  202. data/app/views/style_guide/sections/_alerts.html.erb +114 -0
  203. data/app/views/style_guide/sections/_badges.html.erb +78 -0
  204. data/app/views/style_guide/sections/_buttons.html.erb +130 -0
  205. data/app/views/style_guide/sections/_cards.html.erb +84 -0
  206. data/app/views/style_guide/sections/_colors.html.erb +106 -0
  207. data/app/views/style_guide/sections/_file_upload.html.erb +135 -0
  208. data/app/views/style_guide/sections/_forms.html.erb +129 -0
  209. data/app/views/style_guide/sections/_gradients.html.erb +253 -0
  210. data/app/views/style_guide/sections/_header.html.erb +12 -0
  211. data/app/views/style_guide/sections/_icons.html.erb +55 -0
  212. data/app/views/style_guide/sections/_images.html.erb +40 -0
  213. data/app/views/style_guide/sections/_loading.html.erb +242 -0
  214. data/app/views/style_guide/sections/_pagination.html.erb +212 -0
  215. data/app/views/style_guide/sections/_profile_components.html.erb +203 -0
  216. data/app/views/style_guide/sections/_theme_switcher.html.erb +72 -0
  217. data/app/views/style_guide/sections/_typography.html.erb +65 -0
  218. data/bin/ai-optimize-claude-md +540 -0
  219. data/bin/ai-review-local +345 -0
  220. data/bin/ai-security-review +585 -0
  221. data/bin/brakeman +9 -0
  222. data/bin/install-hooks +57 -0
  223. data/bin/rake +7 -0
  224. data/bin/rubocop +10 -0
  225. data/bin/verify_setup.rb +31 -0
  226. data/config/brakeman.ignore +28 -0
  227. data/config/initializers/neon_sakura.rb +15 -0
  228. data/config/license_overrides.yml +13 -0
  229. data/config/routes.rb +21 -0
  230. data/config/theme_mappings.yml +61 -0
  231. data/docs/PRYSM_ASSETS.md +210 -0
  232. data/docs/plans/extract_ai_reviewer_plan.md +151 -0
  233. data/docs/plans/neon_sakura_gem_plan.md +138 -0
  234. data/lib/neon_sakura/configuration.rb +94 -0
  235. data/lib/neon_sakura/engine.rb +48 -0
  236. data/lib/neon_sakura/icon_helper.rb +54 -0
  237. data/lib/neon_sakura/profile_helper.rb +24 -0
  238. data/lib/neon_sakura/stylesheet_helper.rb +40 -0
  239. data/lib/neon_sakura/theme_helper.rb +63 -0
  240. data/lib/neon_sakura/theme_importer.rb +112 -0
  241. data/lib/neon_sakura/version.rb +5 -0
  242. data/lib/neon_sakura.rb +13 -0
  243. data/neon_sakura.gemspec +50 -0
  244. data/package.json +18 -0
  245. data/scripts/git-hooks/post-merge +132 -0
  246. data/scripts/git-hooks/pre-commit +123 -0
  247. data/scripts/git-hooks/pre-push +127 -0
  248. data/scripts/license-check.rb +587 -0
  249. data/settings.local.json +12 -0
  250. data/yarn.lock +778 -0
  251. metadata +503 -0
@@ -0,0 +1,84 @@
1
+ <section id="cards">
2
+ <h2 class="text-3xl font-bold mb-4">Cards</h2>
3
+ <p class="text-text-secondary mb-6">
4
+ Card components for displaying grouped content with borders and backgrounds.
5
+ </p>
6
+
7
+ <!-- Basic Card -->
8
+ <div class="code-example-wrapper">
9
+ <div class="code-example-preview">
10
+ <h3 class="text-xl font-semibold mb-4">Basic Card</h3>
11
+ <div class="max-w-md p-6 border border-border rounded-lg bg-surface">
12
+ <h4 class="text-lg font-semibold mb-2">Card Title</h4>
13
+ <p class="text-text-secondary">This is a basic card with a title and description text.</p>
14
+ </div>
15
+ </div>
16
+ <div class="code-example-code">
17
+ <pre><code>&lt;div class="p-6 border border-border rounded-lg bg-surface"&gt;
18
+ &lt;h4 class="text-lg font-semibold mb-2"&gt;Card Title&lt;/h4&gt;
19
+ &lt;p class="text-text-secondary"&gt;Description&lt;/p&gt;
20
+ &lt;/div&gt;</code></pre>
21
+ </div>
22
+ </div>
23
+
24
+ <!-- Card with Header -->
25
+ <div class="code-example-wrapper">
26
+ <div class="code-example-preview">
27
+ <h3 class="text-xl font-semibold mb-4">Card with Header</h3>
28
+ <div class="max-w-md border border-border rounded-lg overflow-hidden bg-surface">
29
+ <div class="px-6 py-3 bg-background border-b border-border">
30
+ <h4 class="text-lg font-semibold">Card Header</h4>
31
+ </div>
32
+ <div class="p-6">
33
+ <p class="text-text-secondary">Card content goes here with separate header section.</p>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ <div class="code-example-code">
38
+ <pre><code>&lt;div class="border border-border rounded-lg overflow-hidden bg-surface"&gt;
39
+ &lt;div class="px-6 py-3 bg-background border-b border-border"&gt;
40
+ &lt;h4&gt;Header&lt;/h4&gt;
41
+ &lt;/div&gt;
42
+ &lt;div class="p-6"&gt;Content&lt;/div&gt;
43
+ &lt;/div&gt;</code></pre>
44
+ </div>
45
+ </div>
46
+
47
+ <!-- Card Grid -->
48
+ <div class="code-example-wrapper">
49
+ <div class="code-example-preview">
50
+ <h3 class="text-xl font-semibold mb-4">Card Grid</h3>
51
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
52
+ <div class="p-4 border border-border rounded-lg bg-surface hover:border-accent transition">
53
+ <div class="flex items-center gap-2 mb-2">
54
+ <%= render_theme_icon("star", css_class: "w-5 h-5 text-accent") %>
55
+ <h4 class="font-semibold">Feature 1</h4>
56
+ </div>
57
+ <p class="text-sm text-text-secondary">Description of feature one.</p>
58
+ </div>
59
+ <div class="p-4 border border-border rounded-lg bg-surface hover:border-accent transition">
60
+ <div class="flex items-center gap-2 mb-2">
61
+ <%= render_theme_icon("lightning", css_class: "w-5 h-5 text-accent") %>
62
+ <h4 class="font-semibold">Feature 2</h4>
63
+ </div>
64
+ <p class="text-sm text-text-secondary">Description of feature two.</p>
65
+ </div>
66
+ <div class="p-4 border border-border rounded-lg bg-surface hover:border-accent transition">
67
+ <div class="flex items-center gap-2 mb-2">
68
+ <%= render_theme_icon("heart", css_class: "w-5 h-5 text-accent") %>
69
+ <h4 class="font-semibold">Feature 3</h4>
70
+ </div>
71
+ <p class="text-sm text-text-secondary">Description of feature three.</p>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ <div class="code-example-code">
76
+ <pre><code>&lt;div class="grid grid-cols-1 md:grid-cols-3 gap-4"&gt;
77
+ &lt;div class="p-4 border border-border rounded-lg bg-surface hover:border-accent transition"&gt;
78
+ &lt;h4 class="font-semibold"&gt;Feature&lt;/h4&gt;
79
+ &lt;p class="text-sm text-text-secondary"&gt;Description&lt;/p&gt;
80
+ &lt;/div&gt;
81
+ &lt;/div&gt;</code></pre>
82
+ </div>
83
+ </div>
84
+ </section>
@@ -0,0 +1,106 @@
1
+ <section id="colors">
2
+ <h2 class="text-3xl font-bold mb-4">Colors</h2>
3
+ <p class="text-text-secondary mb-6">
4
+ CSS custom properties (variables) for theme-aware colors. All colors automatically adapt to the selected theme.
5
+ </p>
6
+
7
+ <!-- CSS Variables -->
8
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
9
+ <!-- Text Colors -->
10
+ <div class="p-4 border border-border rounded-lg bg-surface">
11
+ <h3 class="text-lg font-semibold mb-3">Text Colors</h3>
12
+ <div class="space-y-2 font-mono text-sm">
13
+ <div class="flex items-center gap-2">
14
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-text-primary); border: 1px solid var(--color-border);"></div>
15
+ <code>--color-text-primary</code>
16
+ </div>
17
+ <div class="flex items-center gap-2">
18
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-text-secondary); border: 1px solid var(--color-border);"></div>
19
+ <code>--color-text-secondary</code>
20
+ </div>
21
+ <div class="flex items-center gap-2">
22
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-text-muted); border: 1px solid var(--color-border);"></div>
23
+ <code>--color-text-muted</code>
24
+ </div>
25
+ </div>
26
+ </div>
27
+
28
+ <!-- Background Colors -->
29
+ <div class="p-4 border border-border rounded-lg bg-surface">
30
+ <h3 class="text-lg font-semibold mb-3">Background Colors</h3>
31
+ <div class="space-y-2 font-mono text-sm">
32
+ <div class="flex items-center gap-2">
33
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-background); border: 1px solid var(--color-border);"></div>
34
+ <code>--color-background</code>
35
+ </div>
36
+ <div class="flex items-center gap-2">
37
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-surface); border: 1px solid var(--color-border);"></div>
38
+ <code>--color-surface</code>
39
+ </div>
40
+ <div class="flex items-center gap-2">
41
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-border);"></div>
42
+ <code>--color-border</code>
43
+ </div>
44
+ </div>
45
+ </div>
46
+
47
+ <!-- Accent & Status Colors -->
48
+ <div class="p-4 border border-border rounded-lg bg-surface">
49
+ <h3 class="text-lg font-semibold mb-3">Accent Colors</h3>
50
+ <div class="space-y-2 font-mono text-sm">
51
+ <div class="flex items-center gap-2">
52
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-accent);"></div>
53
+ <code>--color-accent</code>
54
+ </div>
55
+ <div class="flex items-center gap-2">
56
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-notification);"></div>
57
+ <code>--color-notification</code>
58
+ </div>
59
+ <div class="flex items-center gap-2">
60
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-alert);"></div>
61
+ <code>--color-alert</code>
62
+ </div>
63
+ <div class="flex items-center gap-2">
64
+ <div class="w-8 h-8 rounded" style="background-color: var(--color-warning);"></div>
65
+ <code>--color-warning</code>
66
+ </div>
67
+ </div>
68
+ </div>
69
+
70
+ <!-- Gradient Colors -->
71
+ <div class="p-4 border border-border rounded-lg bg-surface">
72
+ <h3 class="text-lg font-semibold mb-3">Gradient Colors</h3>
73
+ <div class="space-y-2 font-mono text-sm">
74
+ <div class="flex items-center gap-2">
75
+ <div class="w-16 h-8 rounded" style="background: linear-gradient(to right, var(--gradient-from), var(--gradient-to));"></div>
76
+ <code>--gradient-from/to</code>
77
+ </div>
78
+ <div class="flex items-center gap-2">
79
+ <div class="w-16 h-8 rounded" style="background: linear-gradient(to right, var(--gradient-from-hover), var(--gradient-to-hover));"></div>
80
+ <code>--gradient-*-hover</code>
81
+ </div>
82
+ <div class="flex items-center gap-2">
83
+ <div class="w-16 h-8 rounded" style="background: linear-gradient(to right, var(--text-gradient-from), var(--text-gradient-to));"></div>
84
+ <code>--text-gradient-*</code>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+
90
+ <!-- Usage Example -->
91
+ <div class="code-example-wrapper mt-6">
92
+ <div class="code-example-preview">
93
+ <h3 class="text-xl font-semibold mb-4">Using CSS Variables</h3>
94
+ <div class="p-4 rounded" style="background-color: var(--color-surface); border: 1px solid var(--color-accent);">
95
+ <p style="color: var(--color-text-primary);">This box uses CSS custom properties for theming.</p>
96
+ </div>
97
+ </div>
98
+ <div class="code-example-code">
99
+ <pre><code>.my-component {
100
+ background-color: var(--color-surface);
101
+ border: 1px solid var(--color-accent);
102
+ color: var(--color-text-primary);
103
+ }</code></pre>
104
+ </div>
105
+ </div>
106
+ </section>
@@ -0,0 +1,135 @@
1
+ <section id="file-upload" class="mb-12">
2
+ <h2 class="text-3xl font-bold mb-6 bg-gradient-to-r from-gradient-from to-gradient-to bg-clip-text text-transparent">
3
+ File Upload Component
4
+ </h2>
5
+
6
+ <p class="text-text-secondary mb-6">
7
+ Drag-and-drop file upload component with preview support and validation.
8
+ </p>
9
+
10
+ <!-- Basic Upload -->
11
+ <div class="mb-8">
12
+ <h3 class="text-xl font-semibold mb-4 text-text-primary">Basic Upload</h3>
13
+ <div class="card p-6">
14
+ <%= render "shared/file_upload" %>
15
+ </div>
16
+ <div class="mt-4">
17
+ <h4 class="text-sm font-semibold text-text-muted mb-2">Code Example:</h4>
18
+ <pre class="bg-surface p-4 rounded-lg overflow-x-auto"><code>&lt;%= render "shared/file_upload" %&gt;</code></pre>
19
+ </div>
20
+ </div>
21
+
22
+ <!-- Upload with Preview -->
23
+ <div class="mb-8">
24
+ <h3 class="text-xl font-semibold mb-4 text-text-primary">Upload with Image Preview</h3>
25
+ <div class="card p-6">
26
+ <%= render "shared/file_upload", preview: true, accept: "image/*" %>
27
+ </div>
28
+ <div class="mt-4">
29
+ <h4 class="text-sm font-semibold text-text-muted mb-2">Code Example:</h4>
30
+ <pre class="bg-surface p-4 rounded-lg overflow-x-auto"><code>&lt;%= render "shared/file_upload", preview: true, accept: "image/*" %&gt;</code></pre>
31
+ </div>
32
+ </div>
33
+
34
+ <!-- Custom Configuration -->
35
+ <div class="mb-8">
36
+ <h3 class="text-xl font-semibold mb-4 text-text-primary">Custom Configuration</h3>
37
+ <div class="card p-6">
38
+ <%= render "shared/file_upload",
39
+ field_name: "custom_file",
40
+ accept: "application/pdf,application/msword",
41
+ max_size: 5,
42
+ css_class: "custom-upload" %>
43
+ </div>
44
+ <div class="mt-4">
45
+ <h4 class="text-sm font-semibold text-text-muted mb-2">Code Example:</h4>
46
+ <pre class="bg-surface p-4 rounded-lg overflow-x-auto"><code>&lt;%= render "shared/file_upload",
47
+ field_name: "custom_file",
48
+ accept: "application/pdf,application/msword",
49
+ max_size: 5,
50
+ css_class: "custom-upload" %&gt;</code></pre>
51
+ </div>
52
+ </div>
53
+
54
+ <!-- Multiple Files -->
55
+ <div class="mb-8">
56
+ <h3 class="text-xl font-semibold mb-4 text-text-primary">Multiple File Upload</h3>
57
+ <div class="card p-6">
58
+ <%= render "shared/file_upload", multiple: true, accept: "image/*", max_size: 10 %>
59
+ </div>
60
+ <div class="mt-4">
61
+ <h4 class="text-sm font-semibold text-text-muted mb-2">Code Example:</h4>
62
+ <pre class="bg-surface p-4 rounded-lg overflow-x-auto"><code>&lt;%= render "shared/file_upload", multiple: true, accept: "image/*", max_size: 10 %&gt;</code></pre>
63
+ </div>
64
+ </div>
65
+
66
+ <!-- Parameters -->
67
+ <div class="mt-8">
68
+ <h3 class="text-xl font-semibold mb-4 text-text-primary">Available Parameters</h3>
69
+ <div class="overflow-x-auto">
70
+ <table class="w-full">
71
+ <thead>
72
+ <tr>
73
+ <th class="text-left py-2 px-4 border-b border-border">Parameter</th>
74
+ <th class="text-left py-2 px-4 border-b border-border">Type</th>
75
+ <th class="text-left py-2 px-4 border-b border-border">Default</th>
76
+ <th class="text-left py-2 px-4 border-b border-border">Description</th>
77
+ </tr>
78
+ </thead>
79
+ <tbody>
80
+ <tr>
81
+ <td class="py-2 px-4 border-b border-border"><code>field_name</code></td>
82
+ <td class="py-2 px-4 border-b border-border">String</td>
83
+ <td class="py-2 px-4 border-b border-border">"file"</td>
84
+ <td class="py-2 px-4 border-b border-border">Name attribute for file input</td>
85
+ </tr>
86
+ <tr>
87
+ <td class="py-2 px-4 border-b border-border"><code>accept</code></td>
88
+ <td class="py-2 px-4 border-b border-border">String</td>
89
+ <td class="py-2 px-4 border-b border-border">"*/*"</td>
90
+ <td class="py-2 px-4 border-b border-border">Accepted file types</td>
91
+ </tr>
92
+ <tr>
93
+ <td class="py-2 px-4 border-b border-border"><code>max_size</code></td>
94
+ <td class="py-2 px-4 border-b border-border">Integer</td>
95
+ <td class="py-2 px-4 border-b border-border">10</td>
96
+ <td class="py-2 px-4 border-b border-border">Maximum file size in MB</td>
97
+ </tr>
98
+ <tr>
99
+ <td class="py-2 px-4 border-b border-border"><code>preview</code></td>
100
+ <td class="py-2 px-4 border-b border-border">Boolean</td>
101
+ <td class="py-2 px-4 border-b border-border">false</td>
102
+ <td class="py-2 px-4 border-b border-border">Show image preview</td>
103
+ </tr>
104
+ <tr>
105
+ <td class="py-2 px-4 border-b border-border"><code>multiple</code></td>
106
+ <td class="py-2 px-4 border-b border-border">Boolean</td>
107
+ <td class="py-2 px-4 border-b border-border">false</td>
108
+ <td class="py-2 px-4 border-b border-border">Allow multiple files</td>
109
+ </tr>
110
+ <tr>
111
+ <td class="py-2 px-4 border-b border-border"><code>css_class</code></td>
112
+ <td class="py-2 px-4 border-b border-border">String</td>
113
+ <td class="py-2 px-4 border-b border-border">""</td>
114
+ <td class="py-2 px-4 border-b border-border">Additional CSS classes</td>
115
+ </tr>
116
+ </tbody>
117
+ </table>
118
+ </div>
119
+ </div>
120
+
121
+ <!-- Features -->
122
+ <div class="mt-8">
123
+ <h3 class="text-xl font-semibold mb-4 text-text-primary">Features</h3>
124
+ <ul class="list-disc list-inside text-text-secondary space-y-2">
125
+ <li>Drag-and-drop support with visual feedback</li>
126
+ <li>File type validation via accept parameter</li>
127
+ <li>File size validation (configurable max size)</li>
128
+ <li>Optional image preview for uploaded images</li>
129
+ <li>Multiple file selection support</li>
130
+ <li>Theme-aware styling with CSS variables</li>
131
+ <li>Accessible with proper ARIA labels</li>
132
+ <li>Error messages for validation failures</li>
133
+ </ul>
134
+ </div>
135
+ </section>
@@ -0,0 +1,129 @@
1
+ <section id="forms">
2
+ <h2 class="text-3xl font-bold mb-4">Forms</h2>
3
+ <p class="text-text-secondary mb-6">
4
+ Form elements styled with Neon Sakura utilities and CSS variables.
5
+ </p>
6
+
7
+ <!-- Text Input -->
8
+ <div class="code-example-wrapper">
9
+ <div class="code-example-preview">
10
+ <h3 class="text-xl font-semibold mb-4">Text Input</h3>
11
+ <div class="max-w-md">
12
+ <label for="example-text" class="block mb-2">Email Address</label>
13
+ <input type="text" id="example-text" placeholder="Enter your email..." class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent">
14
+ </div>
15
+ </div>
16
+ <div class="code-example-code">
17
+ <pre><code>&lt;input type="text" placeholder="Enter text..."
18
+ class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent"&gt;</code></pre>
19
+ </div>
20
+ </div>
21
+
22
+ <!-- Textarea -->
23
+ <div class="code-example-wrapper">
24
+ <div class="code-example-preview">
25
+ <h3 class="text-xl font-semibold mb-4">Textarea</h3>
26
+ <div class="max-w-md">
27
+ <label for="example-textarea" class="block mb-2">Message</label>
28
+ <textarea id="example-textarea" rows="4" placeholder="Enter message..." class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent"></textarea>
29
+ </div>
30
+ </div>
31
+ <div class="code-example-code">
32
+ <pre><code>&lt;textarea rows="4"
33
+ class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent"&gt;&lt;/textarea&gt;</code></pre>
34
+ </div>
35
+ </div>
36
+
37
+ <!-- Select Dropdown -->
38
+ <div class="code-example-wrapper">
39
+ <div class="code-example-preview">
40
+ <h3 class="text-xl font-semibold mb-4">Select Dropdown</h3>
41
+ <div class="max-w-md">
42
+ <label for="example-select" class="block mb-2">Choose an option</label>
43
+ <select id="example-select" class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent">
44
+ <option>Option 1</option>
45
+ <option>Option 2</option>
46
+ <option>Option 3</option>
47
+ </select>
48
+ </div>
49
+ </div>
50
+ <div class="code-example-code">
51
+ <pre><code>&lt;select class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent"&gt;
52
+ &lt;option&gt;Option 1&lt;/option&gt;
53
+ &lt;/select&gt;</code></pre>
54
+ </div>
55
+ </div>
56
+
57
+ <!-- Checkbox -->
58
+ <div class="code-example-wrapper">
59
+ <div class="code-example-preview">
60
+ <h3 class="text-xl font-semibold mb-4">Checkbox</h3>
61
+ <div class="flex items-center gap-2">
62
+ <input type="checkbox" id="example-check" class="w-4 h-4 cursor-pointer">
63
+ <label for="example-check" class="cursor-pointer">I agree to the terms and conditions</label>
64
+ </div>
65
+ </div>
66
+ <div class="code-example-code">
67
+ <pre><code>&lt;input type="checkbox" id="example-check" class="w-4 h-4"&gt;
68
+ &lt;label for="example-check"&gt;I agree&lt;/label&gt;</code></pre>
69
+ </div>
70
+ </div>
71
+
72
+ <!-- Radio Buttons -->
73
+ <div class="code-example-wrapper">
74
+ <div class="code-example-preview">
75
+ <h3 class="text-xl font-semibold mb-4">Radio Buttons</h3>
76
+ <div class="space-y-2">
77
+ <div class="flex items-center gap-2">
78
+ <input type="radio" name="example-radio" id="radio1" class="w-4 h-4 cursor-pointer" checked>
79
+ <label for="radio1" class="cursor-pointer">Option 1</label>
80
+ </div>
81
+ <div class="flex items-center gap-2">
82
+ <input type="radio" name="example-radio" id="radio2" class="w-4 h-4 cursor-pointer">
83
+ <label for="radio2" class="cursor-pointer">Option 2</label>
84
+ </div>
85
+ <div class="flex items-center gap-2">
86
+ <input type="radio" name="example-radio" id="radio3" class="w-4 h-4 cursor-pointer">
87
+ <label for="radio3" class="cursor-pointer">Option 3</label>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ <div class="code-example-code">
92
+ <pre><code>&lt;input type="radio" name="group" id="radio1" class="w-4 h-4"&gt;
93
+ &lt;label for="radio1"&gt;Option 1&lt;/label&gt;</code></pre>
94
+ </div>
95
+ </div>
96
+
97
+ <!-- Full Form Example -->
98
+ <div class="code-example-wrapper">
99
+ <div class="code-example-preview">
100
+ <h3 class="text-xl font-semibold mb-4">Complete Form Example</h3>
101
+ <form class="max-w-md space-y-4">
102
+ <div>
103
+ <label for="form-name" class="block mb-2">Name</label>
104
+ <input type="text" id="form-name" class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent">
105
+ </div>
106
+ <div>
107
+ <label for="form-email" class="block mb-2">Email</label>
108
+ <input type="email" id="form-email" class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent">
109
+ </div>
110
+ <div>
111
+ <label for="form-message" class="block mb-2">Message</label>
112
+ <textarea id="form-message" rows="4" class="w-full px-4 py-2 border border-border rounded bg-surface text-text-primary focus:outline-none focus:border-accent"></textarea>
113
+ </div>
114
+ <div>
115
+ <input type="submit" value="Submit Form" class="px-6 py-2 rounded cursor-pointer">
116
+ </div>
117
+ </form>
118
+ </div>
119
+ <div class="code-example-code">
120
+ <pre><code>&lt;form class="space-y-4"&gt;
121
+ &lt;div&gt;
122
+ &lt;label&gt;Name&lt;/label&gt;
123
+ &lt;input type="text" class="w-full px-4 py-2 border border-border rounded bg-surface"&gt;
124
+ &lt;/div&gt;
125
+ &lt;input type="submit" value="Submit" class="px-6 py-2 rounded"&gt;
126
+ &lt;/form&gt;</code></pre>
127
+ </div>
128
+ </div>
129
+ </section>