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,159 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" fill="none">
2
+ <rect width="500" height="500" fill="#000000"/>
3
+
4
+ <!-- Tree trunk -->
5
+ <path d="M 250 450 Q 220 400 230 350 Q 235 300 245 250 Q 250 200 255 150 Q 260 100 250 50"
6
+ stroke="#FFFFFF" stroke-width="15" fill="none" stroke-linecap="round"/>
7
+
8
+ <!-- Main branches -->
9
+ <path d="M 255 150 Q 280 130 310 120" stroke="#FFFFFF" stroke-width="8" fill="none" stroke-linecap="round"/>
10
+ <path d="M 255 150 Q 230 140 200 130" stroke="#FFFFFF" stroke-width="8" fill="none" stroke-linecap="round"/>
11
+ <path d="M 250 100 Q 280 90 300 85" stroke="#FFFFFF" stroke-width="7" fill="none" stroke-linecap="round"/>
12
+ <path d="M 250 100 Q 220 95 190 90" stroke="#FFFFFF" stroke-width="7" fill="none" stroke-linecap="round"/>
13
+ <path d="M 250 50 Q 270 45 285 40" stroke="#FFFFFF" stroke-width="6" fill="none" stroke-linecap="round"/>
14
+ <path d="M 250 50 Q 230 50 210 48" stroke="#FFFFFF" stroke-width="6" fill="none" stroke-linecap="round"/>
15
+
16
+ <!-- Cherry blossom clusters - Right top -->
17
+ <g transform="translate(280, 40)">
18
+ <circle cx="0" cy="0" r="8" fill="#FFB6D9"/>
19
+ <circle cx="12" cy="-5" r="7" fill="#FFC8E3"/>
20
+ <circle cx="8" cy="8" r="7" fill="#FFAAD4"/>
21
+ <circle cx="-8" cy="5" r="7" fill="#FFB6D9"/>
22
+ <circle cx="5" cy="-10" r="6" fill="#FFDAEF"/>
23
+ <circle cx="15" cy="3" r="6" fill="#FFB6D9"/>
24
+ <circle cx="-5" cy="-7" r="6" fill="#FFC8E3"/>
25
+ <circle cx="10" cy="15" r="6" fill="#FFAAD4"/>
26
+ </g>
27
+
28
+ <!-- Cherry blossom clusters - Left top -->
29
+ <g transform="translate(215, 45)">
30
+ <circle cx="0" cy="0" r="8" fill="#FFB6D9"/>
31
+ <circle cx="-12" cy="-5" r="7" fill="#FFC8E3"/>
32
+ <circle cx="-8" cy="8" r="7" fill="#FFAAD4"/>
33
+ <circle cx="8" cy="5" r="7" fill="#FFB6D9"/>
34
+ <circle cx="-5" cy="-10" r="6" fill="#FFDAEF"/>
35
+ <circle cx="-15" cy="3" r="6" fill="#FFB6D9"/>
36
+ <circle cx="5" cy="-7" r="6" fill="#FFC8E3"/>
37
+ <circle cx="-10" cy="15" r="6" fill="#FFAAD4"/>
38
+ </g>
39
+
40
+ <!-- Cherry blossom clusters - Right middle -->
41
+ <g transform="translate(295, 80)">
42
+ <circle cx="0" cy="0" r="9" fill="#FFB6D9"/>
43
+ <circle cx="15" cy="-7" r="8" fill="#FFC8E3"/>
44
+ <circle cx="10" cy="10" r="8" fill="#FFAAD4"/>
45
+ <circle cx="-10" cy="7" r="8" fill="#FFB6D9"/>
46
+ <circle cx="7" cy="-13" r="7" fill="#FFDAEF"/>
47
+ <circle cx="20" cy="5" r="7" fill="#FFB6D9"/>
48
+ <circle cx="-7" cy="-9" r="7" fill="#FFC8E3"/>
49
+ <circle cx="13" cy="18" r="7" fill="#FFAAD4"/>
50
+ <circle cx="-15" cy="-3" r="6" fill="#FFB6D9"/>
51
+ <circle cx="22" cy="-12" r="6" fill="#FFC8E3"/>
52
+ </g>
53
+
54
+ <!-- Cherry blossom clusters - Left middle -->
55
+ <g transform="translate(195, 85)">
56
+ <circle cx="0" cy="0" r="9" fill="#FFB6D9"/>
57
+ <circle cx="-15" cy="-7" r="8" fill="#FFC8E3"/>
58
+ <circle cx="-10" cy="10" r="8" fill="#FFAAD4"/>
59
+ <circle cx="10" cy="7" r="8" fill="#FFB6D9"/>
60
+ <circle cx="-7" cy="-13" r="7" fill="#FFDAEF"/>
61
+ <circle cx="-20" cy="5" r="7" fill="#FFB6D9"/>
62
+ <circle cx="7" cy="-9" r="7" fill="#FFC8E3"/>
63
+ <circle cx="-13" cy="18" r="7" fill="#FFAAD4"/>
64
+ <circle cx="15" cy="-3" r="6" fill="#FFB6D9"/>
65
+ <circle cx="-22" cy="-12" r="6" fill="#FFC8E3"/>
66
+ </g>
67
+
68
+ <!-- Cherry blossom clusters - Right lower -->
69
+ <g transform="translate(305, 115)">
70
+ <circle cx="0" cy="0" r="10" fill="#FFB6D9"/>
71
+ <circle cx="18" cy="-8" r="9" fill="#FFC8E3"/>
72
+ <circle cx="12" cy="12" r="9" fill="#FFAAD4"/>
73
+ <circle cx="-12" cy="8" r="9" fill="#FFB6D9"/>
74
+ <circle cx="8" cy="-15" r="8" fill="#FFDAEF"/>
75
+ <circle cx="23" cy="6" r="8" fill="#FFB6D9"/>
76
+ <circle cx="-8" cy="-10" r="8" fill="#FFC8E3"/>
77
+ <circle cx="15" cy="20" r="8" fill="#FFAAD4"/>
78
+ <circle cx="-18" cy="-4" r="7" fill="#FFB6D9"/>
79
+ <circle cx="25" cy="-14" r="7" fill="#FFC8E3"/>
80
+ <circle cx="-22" cy="15" r="7" fill="#FFAAD4"/>
81
+ <circle cx="30" cy="0" r="7" fill="#FFB6D9"/>
82
+ </g>
83
+
84
+ <!-- Cherry blossom clusters - Left lower -->
85
+ <g transform="translate(205, 125)">
86
+ <circle cx="0" cy="0" r="10" fill="#FFB6D9"/>
87
+ <circle cx="-18" cy="-8" r="9" fill="#FFC8E3"/>
88
+ <circle cx="-12" cy="12" r="9" fill="#FFAAD4"/>
89
+ <circle cx="12" cy="8" r="9" fill="#FFB6D9"/>
90
+ <circle cx="-8" cy="-15" r="8" fill="#FFDAEF"/>
91
+ <circle cx="-23" cy="6" r="8" fill="#FFB6D9"/>
92
+ <circle cx="8" cy="-10" r="8" fill="#FFC8E3"/>
93
+ <circle cx="-15" cy="20" r="8" fill="#FFAAD4"/>
94
+ <circle cx="18" cy="-4" r="7" fill="#FFB6D9"/>
95
+ <circle cx="-25" cy="-14" r="7" fill="#FFC8E3"/>
96
+ <circle cx="22" cy="15" r="7" fill="#FFAAD4"/>
97
+ <circle cx="-30" cy="0" r="7" fill="#FFB6D9"/>
98
+ </g>
99
+
100
+ <!-- Additional blossom clusters for fuller appearance - Top right extended -->
101
+ <g transform="translate(310, 60)">
102
+ <circle cx="5" cy="0" r="7" fill="#FFB6D9"/>
103
+ <circle cx="12" cy="-8" r="6" fill="#FFC8E3"/>
104
+ <circle cx="8" cy="10" r="6" fill="#FFAAD4"/>
105
+ <circle cx="-5" cy="8" r="6" fill="#FFB6D9"/>
106
+ <circle cx="15" cy="5" r="5" fill="#FFDAEF"/>
107
+ </g>
108
+
109
+ <!-- Additional blossom clusters - Top left extended -->
110
+ <g transform="translate(200, 65)">
111
+ <circle cx="-5" cy="0" r="7" fill="#FFB6D9"/>
112
+ <circle cx="-12" cy="-8" r="6" fill="#FFC8E3"/>
113
+ <circle cx="-8" cy="10" r="6" fill="#FFAAD4"/>
114
+ <circle cx="5" cy="8" r="6" fill="#FFB6D9"/>
115
+ <circle cx="-15" cy="5" r="5" fill="#FFDAEF"/>
116
+ </g>
117
+
118
+ <!-- Additional blossom clusters - Middle right -->
119
+ <g transform="translate(320, 100)">
120
+ <circle cx="0" cy="0" r="8" fill="#FFB6D9"/>
121
+ <circle cx="10" cy="-6" r="7" fill="#FFC8E3"/>
122
+ <circle cx="7" cy="9" r="7" fill="#FFAAD4"/>
123
+ <circle cx="-8" cy="6" r="7" fill="#FFB6D9"/>
124
+ <circle cx="14" cy="3" r="6" fill="#FFDAEF"/>
125
+ <circle cx="-6" cy="-8" r="6" fill="#FFC8E3"/>
126
+ </g>
127
+
128
+ <!-- Additional blossom clusters - Middle left -->
129
+ <g transform="translate(190, 105)">
130
+ <circle cx="0" cy="0" r="8" fill="#FFB6D9"/>
131
+ <circle cx="-10" cy="-6" r="7" fill="#FFC8E3"/>
132
+ <circle cx="-7" cy="9" r="7" fill="#FFAAD4"/>
133
+ <circle cx="8" cy="6" r="7" fill="#FFB6D9"/>
134
+ <circle cx="-14" cy="3" r="6" fill="#FFDAEF"/>
135
+ <circle cx="6" cy="-8" r="6" fill="#FFC8E3"/>
136
+ </g>
137
+
138
+ <!-- Top cluster -->
139
+ <g transform="translate(250, 35)">
140
+ <circle cx="0" cy="0" r="8" fill="#FFB6D9"/>
141
+ <circle cx="10" cy="-5" r="7" fill="#FFC8E3"/>
142
+ <circle cx="-10" cy="-5" r="7" fill="#FFAAD4"/>
143
+ <circle cx="7" cy="8" r="6" fill="#FFB6D9"/>
144
+ <circle cx="-7" cy="8" r="6" fill="#FFDAEF"/>
145
+ <circle cx="0" cy="-10" r="6" fill="#FFC8E3"/>
146
+ </g>
147
+
148
+ <!-- Larger blossom details - scattered throughout -->
149
+ <g opacity="0.9">
150
+ <circle cx="330" cy="125" r="5" fill="#FFB6D9"/>
151
+ <circle cx="180" cy="130" r="5" fill="#FFC8E3"/>
152
+ <circle cx="340" cy="95" r="4" fill="#FFAAD4"/>
153
+ <circle cx="170" cy="100" r="4" fill="#FFB6D9"/>
154
+ <circle cx="325" cy="70" r="4" fill="#FFDAEF"/>
155
+ <circle cx="185" cy="75" r="4" fill="#FFC8E3"/>
156
+ <circle cx="295" cy="50" r="3" fill="#FFAAD4"/>
157
+ <circle cx="205" cy="55" r="3" fill="#FFB6D9"/>
158
+ </g>
159
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="<%= local_assigns[:aria_hidden] || 'true' %>">
2
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
3
+ </svg>
@@ -0,0 +1,9 @@
1
+ <%
2
+ css_class ||= "w-6 h-6"
3
+ aria_label ||= "Chevron right"
4
+ role ||= "img"
5
+ title ||= "Chevron right"
6
+ %>
7
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="<%= css_class %>" role="<%= role %>" aria-label="<%= aria_label %>" title="<%= title %>">
8
+ <path stroke-linecap="round" stroke-linejoin="round" d="M8.25 4.5l7.5 7.5-7.5 7.5" />
9
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="<%= local_assigns[:aria_hidden] || 'true' %>">
2
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="<%= local_assigns[:aria_hidden] || 'true' %>">
2
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="<%= local_assigns[:aria_hidden] || 'true' %>">
2
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
3
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="<%= local_assigns[:aria_hidden] || 'true' %>">
2
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path>
3
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
4
+ </svg>
@@ -0,0 +1,10 @@
1
+ <%# Icon: Crop (crop image/resize) %>
2
+ <%# Source: Custom SVG - crop tool %>
3
+ <svg xmlns="http://www.w3.org/2000/svg"
4
+ fill="none"
5
+ viewBox="0 0 24 24"
6
+ stroke-width="1.5"
7
+ stroke="currentColor"
8
+ class="<%= css_class %>">
9
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 3v12a3 3 0 0 0 3 3h12M3 6h12a3 3 0 0 1 3 3v12" />
10
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="<%= local_assigns[:aria_hidden] || 'true' %>">
2
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 3l4 6 4-7 4 7 4-6v13H5z"></path>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="<%= local_assigns[:aria_hidden] || 'true' %>">
2
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-12.5c-2.49 0-4.5 2.01-4.5 4.5s2.01 4.5 4.5 4.5 4.5-2.01 4.5-4.5-2.01-4.5-4.5-4.5zm0 5.5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"></path>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg class="<%= local_assigns[:css_class] || 'w-4 h-4' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="<%= local_assigns[:aria_hidden] || 'true' %>">
2
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path>
3
+ </svg>