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,253 @@
1
+ <section id="gradients">
2
+ <h2 class="text-3xl font-bold mb-4">Gradients</h2>
3
+ <p class="text-text-secondary mb-6">
4
+ Theme-aware gradient utilities for backgrounds and text effects.
5
+ </p>
6
+
7
+ <!-- Primary Gradient -->
8
+ <div class="mb-8">
9
+ <h3 class="text-xl font-semibold mb-4">Primary Gradient</h3>
10
+ <div class="code-example-wrapper">
11
+ <div class="code-example-preview">
12
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
13
+ <!-- Button gradient example -->
14
+ <div>
15
+ <h4 class="text-sm font-semibold mb-3 text-text-secondary">Button Gradient</h4>
16
+ <button class="px-6 py-3 rounded-lg transition-all text-white font-semibold" style="background: linear-gradient(to right, var(--gradient-from), var(--gradient-to));">
17
+ Primary Gradient Button
18
+ </button>
19
+ </div>
20
+
21
+ <!-- Text gradient example -->
22
+ <div>
23
+ <h4 class="text-sm font-semibold mb-3 text-text-secondary">Text Gradient</h4>
24
+ <h3 class="text-3xl font-bold bg-gradient-to-r from-text-gradient-from to-text-gradient-to bg-clip-text text-transparent">
25
+ Gradient Text Heading
26
+ </h3>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ <div class="code-example-code">
31
+ <pre><code>/* Button */
32
+ &lt;button style="background: linear-gradient(to right, var(--gradient-from), var(--gradient-to));"&gt;
33
+ Primary Gradient Button
34
+ &lt;/button&gt;
35
+
36
+ /* Text */
37
+ &lt;h3 class="bg-gradient-to-r from-text-gradient-from to-text-gradient-to bg-clip-text text-transparent"&gt;
38
+ Gradient Text Heading
39
+ &lt;/h3&gt;</code></pre>
40
+ </div>
41
+ </div>
42
+ </div>
43
+
44
+ <!-- Navbar Gradient (All Themes) -->
45
+ <div class="mb-8">
46
+ <h3 class="text-xl font-semibold mb-4">Navbar Gradient <span class="text-sm text-text-secondary">(Accent to Notification)</span></h3>
47
+ <div class="code-example-wrapper">
48
+ <div class="code-example-preview">
49
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
50
+ <!-- Button gradient example -->
51
+ <div>
52
+ <h4 class="text-sm font-semibold mb-3 text-text-secondary">Navbar Style Gradient</h4>
53
+ <button class="bg-gradient-navbar px-6 py-3 rounded-lg transition-all text-white font-semibold">
54
+ Navbar Gradient Button
55
+ </button>
56
+ </div>
57
+
58
+ <!-- Visual comparison -->
59
+ <div>
60
+ <h4 class="text-sm font-semibold mb-3 text-text-secondary">Color Transition</h4>
61
+ <div class="bg-gradient-navbar h-16 rounded-lg border border-border"></div>
62
+ <p class="text-xs text-text-muted mt-2">
63
+ <%= @current_theme[:name].capitalize %> theme:
64
+ <%= @current_theme[:name] == "purple" ? "Purple → Green" : @current_theme[:name] == "red" ? "Red → Green" : "Green → Green" %>
65
+ </p>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ <div class="code-example-code">
70
+ <pre><code>/* Using utility class */
71
+ &lt;button class="bg-gradient-navbar text-white"&gt;
72
+ Navbar Gradient Button
73
+ &lt;/button&gt;
74
+
75
+ /* Using CSS variables directly */
76
+ &lt;div style="background: linear-gradient(to right, var(--gradient-navbar-from), var(--gradient-navbar-to));"&gt;
77
+ &lt;/div&gt;
78
+
79
+ /* As text gradient (like navbar title) */
80
+ &lt;h1 class="bg-gradient-to-r from-accent to-notification bg-clip-text text-transparent"&gt;
81
+ Gradient Text
82
+ &lt;/h1&gt;</code></pre>
83
+ </div>
84
+ </div>
85
+ </div>
86
+
87
+ <!-- Secondary Blue Gradient (All Themes) -->
88
+ <div class="mb-8">
89
+ <h3 class="text-xl font-semibold mb-4">Secondary Blue Gradient <span class="text-sm text-text-secondary">(Cyan to Blue)</span></h3>
90
+ <div class="code-example-wrapper">
91
+ <div class="code-example-preview">
92
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
93
+ <!-- Button gradient example -->
94
+ <div>
95
+ <h4 class="text-sm font-semibold mb-3 text-text-secondary">Secondary Blue Gradient Button</h4>
96
+ <button class="bg-gradient-secondary-blue px-6 py-3 rounded-lg transition-all text-white font-semibold hover:brightness-110">
97
+ Secondary Blue Gradient
98
+ </button>
99
+ </div>
100
+
101
+ <!-- Visual comparison -->
102
+ <div>
103
+ <h4 class="text-sm font-semibold mb-3 text-text-secondary">Color Transition</h4>
104
+ <div class="bg-gradient-secondary-blue h-16 rounded-lg border border-border"></div>
105
+ <p class="text-xs text-text-muted mt-2">
106
+ Cyan (#0891b2) → Blue (#2563eb)
107
+ </p>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ <div class="code-example-code">
112
+ <pre><code>/* Using utility class */
113
+ &lt;button class="bg-gradient-secondary-blue text-white"&gt;
114
+ Secondary Blue Gradient
115
+ &lt;/button&gt;
116
+
117
+ /* Using CSS variables directly */
118
+ &lt;div style="background: linear-gradient(to right, var(--gradient-secondary-blue-from), var(--gradient-secondary-blue-to));"&gt;
119
+ &lt;/div&gt;</code></pre>
120
+ </div>
121
+ </div>
122
+ </div>
123
+
124
+ <!-- Secondary Purple Gradient (Purple Theme Only) -->
125
+ <% if @current_theme[:name] == "purple" %>
126
+ <div class="mb-8">
127
+ <h3 class="text-xl font-semibold mb-4">Secondary Gradient <span class="text-sm text-text-secondary">(Purple Theme Only)</span></h3>
128
+ <div class="code-example-wrapper">
129
+ <div class="code-example-preview">
130
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
131
+ <!-- Button gradient example -->
132
+ <div>
133
+ <h4 class="text-sm font-semibold mb-3 text-text-secondary">Alternative Purple Gradient</h4>
134
+ <button class="bg-gradient-secondary-purple px-6 py-3 rounded-lg transition-all text-white font-semibold">
135
+ Secondary Gradient Button
136
+ </button>
137
+ </div>
138
+
139
+ <!-- Visual comparison -->
140
+ <div>
141
+ <h4 class="text-sm font-semibold mb-3 text-text-secondary">Color Transition</h4>
142
+ <div class="bg-gradient-secondary-purple h-16 rounded-lg border border-border"></div>
143
+ <p class="text-xs text-text-muted mt-2">Purple → Blue → Indigo (left to right)</p>
144
+ </div>
145
+ </div>
146
+ </div>
147
+ <div class="code-example-code">
148
+ <pre><code>/* Using utility class */
149
+ &lt;button class="bg-gradient-secondary-purple text-white"&gt;
150
+ Secondary Gradient Button
151
+ &lt;/button&gt;
152
+
153
+ /* Using CSS variables directly */
154
+ &lt;div style="background: linear-gradient(to left, var(--gradient-secondary-start), var(--gradient-secondary-mid), var(--gradient-secondary-end));"&gt;
155
+ &lt;/div&gt;</code></pre>
156
+ </div>
157
+ </div>
158
+ </div>
159
+
160
+ <!-- Gradient Comparison -->
161
+ <div class="p-6 bg-surface border border-border rounded-lg">
162
+ <h3 class="text-lg font-semibold mb-4">Purple Theme Gradient Comparison</h3>
163
+ <div class="space-y-4">
164
+ <div>
165
+ <p class="text-sm font-semibold mb-2">1. Primary Gradient (Blue → Purple)</p>
166
+ <div class="h-12 rounded-lg border border-border" style="background: linear-gradient(to right, var(--gradient-from), var(--gradient-to));"></div>
167
+ </div>
168
+ <div>
169
+ <p class="text-sm font-semibold mb-2">2. Navbar Gradient (Purple → Green)</p>
170
+ <div class="h-12 rounded-lg border border-border bg-gradient-navbar"></div>
171
+ </div>
172
+ <div>
173
+ <p class="text-sm font-semibold mb-2">3. Secondary Blue Gradient (Cyan → Blue)</p>
174
+ <div class="h-12 rounded-lg border border-border bg-gradient-secondary-blue"></div>
175
+ </div>
176
+ <div>
177
+ <p class="text-sm font-semibold mb-2">4. Secondary Purple Gradient (Purple → Blue → Indigo)</p>
178
+ <div class="h-12 rounded-lg border border-border bg-gradient-secondary-purple"></div>
179
+ </div>
180
+ </div>
181
+ <div class="mt-4 p-3 bg-background rounded-lg">
182
+ <p class="text-text-secondary text-sm">
183
+ <strong>Note:</strong> The secondary gradient is available only in purple themes.
184
+ Use <code class="text-accent font-mono text-xs">bg-gradient-secondary-purple</code> utility class
185
+ or CSS variables <code class="text-accent font-mono text-xs">--gradient-secondary-start</code>,
186
+ <code class="text-accent font-mono text-xs">--gradient-secondary-mid</code>,
187
+ <code class="text-accent font-mono text-xs">--gradient-secondary-end</code>.
188
+ </p>
189
+ </div>
190
+ </div>
191
+ <% else %>
192
+ <!-- Message for non-purple themes -->
193
+ <div class="p-8 text-center border border-border rounded-lg bg-surface">
194
+ <p class="text-text-muted mb-2">Secondary gradient is available only in purple themes.</p>
195
+ <p class="text-text-secondary text-sm">Switch to Purple Light or Purple Dark theme to view the secondary gradient options.</p>
196
+ </div>
197
+ <% end %>
198
+
199
+ <!-- CSS Variables Documentation -->
200
+ <div class="mt-8 p-6 bg-surface border border-border rounded-lg">
201
+ <h3 class="text-lg font-semibold mb-4">Available CSS Variables</h3>
202
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
203
+ <div class="space-y-2">
204
+ <div class="p-3 bg-background rounded-lg">
205
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-from</code>
206
+ <p class="text-text-secondary text-xs mt-1">Primary gradient start color</p>
207
+ </div>
208
+ <div class="p-3 bg-background rounded-lg">
209
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-to</code>
210
+ <p class="text-text-secondary text-xs mt-1">Primary gradient end color</p>
211
+ </div>
212
+ <div class="p-3 bg-background rounded-lg">
213
+ <code class="text-accent font-mono text-sm font-semibold">--text-gradient-from</code>
214
+ <p class="text-text-secondary text-xs mt-1">Text gradient start color</p>
215
+ </div>
216
+ <div class="p-3 bg-background rounded-lg">
217
+ <code class="text-accent font-mono text-sm font-semibold">--text-gradient-to</code>
218
+ <p class="text-text-secondary text-xs mt-1">Text gradient end color</p>
219
+ </div>
220
+ <div class="p-3 bg-background rounded-lg">
221
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-navbar-from</code>
222
+ <p class="text-text-secondary text-xs mt-1">Navbar gradient start (accent color)</p>
223
+ </div>
224
+ <div class="p-3 bg-background rounded-lg">
225
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-navbar-to</code>
226
+ <p class="text-text-secondary text-xs mt-1">Navbar gradient end (notification color)</p>
227
+ </div>
228
+ </div>
229
+ <div class="space-y-2">
230
+ <div class="p-3 bg-background rounded-lg">
231
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-secondary-blue-from</code>
232
+ <p class="text-text-secondary text-xs mt-1">Secondary blue gradient start (all themes)</p>
233
+ </div>
234
+ <div class="p-3 bg-background rounded-lg">
235
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-secondary-blue-to</code>
236
+ <p class="text-text-secondary text-xs mt-1">Secondary blue gradient end (all themes)</p>
237
+ </div>
238
+ <div class="p-3 bg-background rounded-lg">
239
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-secondary-start</code>
240
+ <p class="text-text-secondary text-xs mt-1">Secondary gradient start (purple only)</p>
241
+ </div>
242
+ <div class="p-3 bg-background rounded-lg">
243
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-secondary-mid</code>
244
+ <p class="text-text-secondary text-xs mt-1">Secondary gradient middle (purple only)</p>
245
+ </div>
246
+ <div class="p-3 bg-background rounded-lg">
247
+ <code class="text-accent font-mono text-sm font-semibold">--gradient-secondary-end</code>
248
+ <p class="text-text-secondary text-xs mt-1">Secondary gradient end (purple only)</p>
249
+ </div>
250
+ </div>
251
+ </div>
252
+ </div>
253
+ </section>
@@ -0,0 +1,12 @@
1
+ <section id="header" class="mb-8">
2
+ <h1 class="text-5xl font-bold mb-4 bg-gradient-to-r from-text-gradient-from to-text-gradient-to bg-clip-text text-transparent">
3
+ <%= @page_title %>
4
+ </h1>
5
+ <p class="text-xl text-text-secondary mb-6">
6
+ A comprehensive showcase of all UI components, themes, icons, and styling patterns available in the Neon Sakura gem.
7
+ </p>
8
+ <p class="text-text-muted">
9
+ <strong>Environment:</strong> <%= Rails.env %> |
10
+ <strong>Version:</strong> <%= NeonSakura::VERSION %>
11
+ </p>
12
+ </section>
@@ -0,0 +1,55 @@
1
+ <section id="icons">
2
+ <h2 class="text-3xl font-bold mb-4">Icons (<%= @icons.count %>)</h2>
3
+ <p class="text-text-secondary mb-6">
4
+ All <%= @icons.count %> available SVG icons in the Neon Sakura library. Icons are dynamically rendered from partials.
5
+ </p>
6
+
7
+ <!-- Icon Grid -->
8
+ <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 mb-8">
9
+ <% @icons.each do |icon_name| %>
10
+ <div class="p-4 border border-border rounded-lg text-center hover:bg-surface transition-colors cursor-pointer" data-icon-modal data-icon-name="<%= icon_name %>">
11
+ <div class="flex justify-center mb-2">
12
+ <%= render_theme_icon(icon_name, css_class: "w-8 h-8 text-accent") %>
13
+ </div>
14
+ <div class="text-xs text-text-secondary font-mono break-words">
15
+ <%= icon_name %>
16
+ </div>
17
+ </div>
18
+ <% end %>
19
+ </div>
20
+
21
+ <!-- Usage Example -->
22
+ <div class="code-example-wrapper">
23
+ <div class="code-example-preview">
24
+ <h3 class="text-xl font-semibold mb-4">Icon Usage Example</h3>
25
+ <div class="flex items-center gap-4 flex-wrap">
26
+ <%= render_theme_icon("heart", css_class: "w-6 h-6 text-notification") %>
27
+ <%= render_theme_icon("star", css_class: "w-6 h-6 text-warning") %>
28
+ <%= render_theme_icon("check_circle", css_class: "w-6 h-6 text-accent") %>
29
+ <span class="text-text-secondary">Using render_theme_icon helper</span>
30
+ </div>
31
+ </div>
32
+ <div class="code-example-code">
33
+ <pre><code>&lt;%= render_theme_icon("heart", css_class: "w-6 h-6 text-notification") %&gt;</code></pre>
34
+ </div>
35
+ </div>
36
+
37
+ <!-- Helper Method Documentation -->
38
+ <div class="mt-6 p-6 bg-surface border border-border rounded-lg">
39
+ <h3 class="text-lg font-semibold mb-4">Helper Methods</h3>
40
+ <div class="space-y-3">
41
+ <div class="p-3 bg-background rounded-lg">
42
+ <code class="text-accent font-mono text-sm font-semibold">render_theme_icon(name, options = {})</code>
43
+ <p class="text-text-secondary text-sm mt-2">Render an icon with optional CSS class</p>
44
+ </div>
45
+ <div class="p-3 bg-background rounded-lg">
46
+ <code class="text-accent font-mono text-sm font-semibold">available_icons()</code>
47
+ <p class="text-text-secondary text-sm mt-2">Get array of all icon names</p>
48
+ </div>
49
+ <div class="p-3 bg-background rounded-lg">
50
+ <code class="text-accent font-mono text-sm font-semibold">icon_exists?(name)</code>
51
+ <p class="text-text-secondary text-sm mt-2">Check if icon exists</p>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </section>
@@ -0,0 +1,40 @@
1
+ <section id="images">
2
+ <h2 class="text-3xl font-bold mb-4">Images (<%= @images.count %>)</h2>
3
+ <p class="text-text-secondary mb-6">
4
+ All <%= @images.count %> available image assets in the Neon Sakura library.
5
+ </p>
6
+
7
+ <% if @images.any? %>
8
+ <!-- Image Grid -->
9
+ <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 mb-8">
10
+ <% @images.each do |image_name| %>
11
+ <div class="border border-border rounded-lg overflow-hidden bg-surface hover:bg-background transition-colors cursor-pointer" data-image-modal data-image-src="<%= image_path(image_name) %>" data-image-name="<%= image_name %>" style="height: 200px; display: flex; flex-direction: column;">
12
+ <div class="bg-background" style="flex: 1; display: flex; align-items: center; justify-content: center; padding: 1rem; overflow: hidden;">
13
+ <%= image_tag image_name, alt: image_name, style: "max-width: 100%; max-height: 120px; width: auto; height: auto; object-fit: contain;" %>
14
+ </div>
15
+ <div class="p-2 border-t border-border" style="flex-shrink: 0;">
16
+ <div class="text-xs font-mono text-text-secondary" style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap;" title="<%= image_name %>">
17
+ <%= image_name %>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ <% end %>
22
+ </div>
23
+
24
+ <!-- Usage Example -->
25
+ <div class="code-example-wrapper">
26
+ <div class="code-example-preview">
27
+ <h3 class="text-xl font-semibold mb-4">Image Usage Example</h3>
28
+ <% first_image = @images.first %>
29
+ <%= image_tag first_image, alt: first_image, class: "max-w-xs" %>
30
+ </div>
31
+ <div class="code-example-code">
32
+ <pre><code>&lt;%= image_tag "<%= first_image %>", alt: "<%= first_image %>", class: "max-w-xs" %&gt;</code></pre>
33
+ </div>
34
+ </div>
35
+ <% else %>
36
+ <div class="p-8 text-center border border-border rounded-lg bg-surface">
37
+ <p class="text-text-muted">No images found in the gem.</p>
38
+ </div>
39
+ <% end %>
40
+ </section>
@@ -0,0 +1,242 @@
1
+ <section id="loading">
2
+ <h2 class="text-3xl font-bold mb-4">Loading Indicators</h2>
3
+ <p class="text-text-secondary mb-6">
4
+ Loading spinners, progress bars, and skeleton loaders for async operations.
5
+ </p>
6
+
7
+ <!-- Spinners -->
8
+ <div class="mb-8">
9
+ <h3 class="text-xl font-semibold mb-4">Spinners</h3>
10
+ <div class="code-example-wrapper">
11
+ <div class="code-example-preview">
12
+ <div class="flex flex-wrap items-start gap-12">
13
+ <!-- Basic spinner -->
14
+ <div class="flex flex-col items-center gap-3">
15
+ <p class="text-sm text-text-secondary">Basic Spinner</p>
16
+ <div class="spinner-basic"></div>
17
+ </div>
18
+
19
+ <!-- Accent spinner -->
20
+ <div class="flex flex-col items-center gap-3">
21
+ <p class="text-sm text-text-secondary">Accent Spinner</p>
22
+ <div class="spinner-accent"></div>
23
+ </div>
24
+
25
+ <!-- Small spinner -->
26
+ <div class="flex flex-col items-center gap-3">
27
+ <p class="text-sm text-text-secondary">Small Spinner</p>
28
+ <div class="spinner-small"></div>
29
+ </div>
30
+
31
+ <!-- Large spinner -->
32
+ <div class="flex flex-col items-center gap-3">
33
+ <p class="text-sm text-text-secondary">Large Spinner</p>
34
+ <div class="spinner-large"></div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ <div class="code-example-code">
39
+ <pre><code>&lt;!-- Basic spinner --&gt;
40
+ &lt;div class="spinner-basic"&gt;&lt;/div&gt;
41
+
42
+ &lt;!-- Accent spinner --&gt;
43
+ &lt;div class="spinner-accent"&gt;&lt;/div&gt;
44
+
45
+ &lt;!-- Small spinner --&gt;
46
+ &lt;div class="spinner-small"&gt;&lt;/div&gt;
47
+
48
+ &lt;!-- Large spinner --&gt;
49
+ &lt;div class="spinner-large"&gt;&lt;/div&gt;</code></pre>
50
+ </div>
51
+ </div>
52
+ </div>
53
+
54
+ <!-- Progress Bars -->
55
+ <div class="mb-8">
56
+ <h3 class="text-xl font-semibold mb-4">Progress Bars</h3>
57
+ <div class="code-example-wrapper">
58
+ <div class="code-example-preview">
59
+ <div class="space-y-6">
60
+ <!-- Indeterminate progress bar -->
61
+ <div>
62
+ <p class="text-sm text-text-secondary mb-3">Indeterminate Progress</p>
63
+ <div class="progress-bar-container">
64
+ <div class="progress-bar-indeterminate"></div>
65
+ </div>
66
+ </div>
67
+
68
+ <!-- Determinate progress bars -->
69
+ <div>
70
+ <p class="text-sm text-text-secondary mb-3">25% Complete</p>
71
+ <div class="progress-bar-container">
72
+ <div class="progress-bar-fill" style="width: 25%"></div>
73
+ </div>
74
+ </div>
75
+
76
+ <div>
77
+ <p class="text-sm text-text-secondary mb-3">50% Complete</p>
78
+ <div class="progress-bar-container">
79
+ <div class="progress-bar-fill" style="width: 50%"></div>
80
+ </div>
81
+ </div>
82
+
83
+ <div>
84
+ <p class="text-sm text-text-secondary mb-3">75% Complete</p>
85
+ <div class="progress-bar-container">
86
+ <div class="progress-bar-fill" style="width: 75%"></div>
87
+ </div>
88
+ </div>
89
+
90
+ <div>
91
+ <p class="text-sm text-text-secondary mb-3">100% Complete</p>
92
+ <div class="progress-bar-container">
93
+ <div class="progress-bar-fill" style="width: 100%"></div>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ <div class="code-example-code">
99
+ <pre><code>&lt;!-- Indeterminate progress --&gt;
100
+ &lt;div class="progress-bar-container"&gt;
101
+ &lt;div class="progress-bar-indeterminate"&gt;&lt;/div&gt;
102
+ &lt;/div&gt;
103
+
104
+ &lt;!-- Determinate progress --&gt;
105
+ &lt;div class="progress-bar-container"&gt;
106
+ &lt;div class="progress-bar-fill" style="width: 50%"&gt;&lt;/div&gt;
107
+ &lt;/div&gt;</code></pre>
108
+ </div>
109
+ </div>
110
+ </div>
111
+
112
+ <!-- Skeleton Loaders -->
113
+ <div class="mb-8">
114
+ <h3 class="text-xl font-semibold mb-4">Skeleton Loaders</h3>
115
+ <div class="code-example-wrapper">
116
+ <div class="code-example-preview">
117
+ <div class="space-y-4">
118
+ <!-- Text skeleton -->
119
+ <div>
120
+ <p class="text-sm text-text-secondary mb-3">Text Skeleton</p>
121
+ <div class="skeleton-text"></div>
122
+ <div class="skeleton-text" style="width: 80%"></div>
123
+ <div class="skeleton-text" style="width: 60%"></div>
124
+ </div>
125
+
126
+ <!-- Card skeleton -->
127
+ <div>
128
+ <p class="text-sm text-text-secondary mb-3">Card Skeleton</p>
129
+ <div class="border border-border rounded-lg p-4">
130
+ <div class="skeleton-avatar mb-3"></div>
131
+ <div class="skeleton-text mb-2"></div>
132
+ <div class="skeleton-text" style="width: 90%"></div>
133
+ <div class="skeleton-text" style="width: 70%"></div>
134
+ </div>
135
+ </div>
136
+ </div>
137
+ </div>
138
+ <div class="code-example-code">
139
+ <pre><code>&lt;!-- Text skeleton --&gt;
140
+ &lt;div class="skeleton-text"&gt;&lt;/div&gt;
141
+ &lt;div class="skeleton-text" style="width: 80%"&gt;&lt;/div&gt;
142
+
143
+ &lt;!-- Avatar skeleton --&gt;
144
+ &lt;div class="skeleton-avatar"&gt;&lt;/div&gt;</code></pre>
145
+ </div>
146
+ </div>
147
+ </div>
148
+
149
+ <!-- Loading States -->
150
+ <div class="mb-8">
151
+ <h3 class="text-xl font-semibold mb-4">Loading States</h3>
152
+ <div class="code-example-wrapper">
153
+ <div class="code-example-preview">
154
+ <div class="flex flex-wrap items-start gap-6">
155
+ <!-- Button loading state -->
156
+ <div class="flex flex-col gap-3">
157
+ <p class="text-sm text-text-secondary">Button Loading State</p>
158
+ <button type="button" class="px-6 py-2 rounded cursor-not-allowed flex items-center gap-2 opacity-75" disabled style="background-image: linear-gradient(to right, var(--gradient-from), var(--gradient-to)); color: var(--button-text-color); font-weight: 600;">
159
+ <div class="spinner-small"></div>
160
+ <span>Loading...</span>
161
+ </button>
162
+ </div>
163
+
164
+ <!-- Card loading state -->
165
+ <div class="flex flex-col gap-3">
166
+ <p class="text-sm text-text-secondary">Card Loading State</p>
167
+ <div class="border border-border rounded-lg p-6 bg-surface" style="width: 300px;">
168
+ <div class="flex items-center justify-center py-8">
169
+ <div class="spinner-accent"></div>
170
+ </div>
171
+ <p class="text-center text-text-secondary mt-4">Loading content...</p>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ <div class="code-example-code">
177
+ <pre><code>&lt;!-- Button loading state --&gt;
178
+ &lt;button type="button" class="px-6 py-2 rounded flex items-center gap-2 opacity-75" disabled
179
+ style="background-image: linear-gradient(to right, var(--gradient-from), var(--gradient-to));
180
+ color: var(--button-text-color); font-weight: 600;"&gt;
181
+ &lt;div class="spinner-small"&gt;&lt;/div&gt;
182
+ &lt;span&gt;Loading...&lt;/span&gt;
183
+ &lt;/button&gt;
184
+
185
+ &lt;!-- Card loading state --&gt;
186
+ &lt;div class="border border-border rounded-lg p-6 bg-surface"&gt;
187
+ &lt;div class="flex items-center justify-center py-8"&gt;
188
+ &lt;div class="spinner-accent"&gt;&lt;/div&gt;
189
+ &lt;/div&gt;
190
+ &lt;p class="text-center text-text-secondary mt-4"&gt;Loading content...&lt;/p&gt;
191
+ &lt;/div&gt;</code></pre>
192
+ </div>
193
+ </div>
194
+ </div>
195
+
196
+ <!-- CSS Classes Documentation -->
197
+ <div class="p-6 bg-surface border border-border rounded-lg">
198
+ <h3 class="text-lg font-semibold mb-4">Available CSS Classes</h3>
199
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
200
+ <div class="space-y-2">
201
+ <div class="p-3 bg-background rounded-lg">
202
+ <code class="text-accent font-mono text-sm font-semibold">.spinner-basic</code>
203
+ <p class="text-text-secondary text-xs mt-1">Basic spinning loader (border color)</p>
204
+ </div>
205
+ <div class="p-3 bg-background rounded-lg">
206
+ <code class="text-accent font-mono text-sm font-semibold">.spinner-accent</code>
207
+ <p class="text-text-secondary text-xs mt-1">Accent color spinner</p>
208
+ </div>
209
+ <div class="p-3 bg-background rounded-lg">
210
+ <code class="text-accent font-mono text-sm font-semibold">.spinner-small</code>
211
+ <p class="text-text-secondary text-xs mt-1">Small spinner (16px)</p>
212
+ </div>
213
+ <div class="p-3 bg-background rounded-lg">
214
+ <code class="text-accent font-mono text-sm font-semibold">.spinner-large</code>
215
+ <p class="text-text-secondary text-xs mt-1">Large spinner (48px)</p>
216
+ </div>
217
+ </div>
218
+ <div class="space-y-2">
219
+ <div class="p-3 bg-background rounded-lg">
220
+ <code class="text-accent font-mono text-sm font-semibold">.progress-bar-container</code>
221
+ <p class="text-text-secondary text-xs mt-1">Progress bar container</p>
222
+ </div>
223
+ <div class="p-3 bg-background rounded-lg">
224
+ <code class="text-accent font-mono text-sm font-semibold">.progress-bar-fill</code>
225
+ <p class="text-text-secondary text-xs mt-1">Progress bar fill (set width)</p>
226
+ </div>
227
+ <div class="p-3 bg-background rounded-lg">
228
+ <code class="text-accent font-mono text-sm font-semibold">.progress-bar-indeterminate</code>
229
+ <p class="text-text-secondary text-xs mt-1">Animated indeterminate progress</p>
230
+ </div>
231
+ <div class="p-3 bg-background rounded-lg">
232
+ <code class="text-accent font-mono text-sm font-semibold">.skeleton-text</code>
233
+ <p class="text-text-secondary text-xs mt-1">Text placeholder skeleton</p>
234
+ </div>
235
+ <div class="p-3 bg-background rounded-lg">
236
+ <code class="text-accent font-mono text-sm font-semibold">.skeleton-avatar</code>
237
+ <p class="text-text-secondary text-xs mt-1">Avatar/image placeholder</p>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ </section>