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
data/CHANGELOG.md ADDED
@@ -0,0 +1,568 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.4] - 2025-01-XX
11
+
12
+ ### Added
13
+ - **Gravatar Support** - New `ProfileHelper` with `gravatar_url` method
14
+ - Generates Gravatar URLs from email addresses
15
+ - Configurable image size (default: 80px)
16
+ - Uses MD5 hashing for Gravatar GUID (acceptable for public identifiers)
17
+ - Returns identicon as default for unregistered emails
18
+
19
+ - **File Upload Component** - Drag-and-drop file upload with preview
20
+ - Configurable file types (`accept` parameter)
21
+ - Maximum file size validation
22
+ - Optional image preview
23
+ - Multiple file support
24
+ - Drag-and-drop highlighting
25
+ - Stimulus controller integration
26
+ - Theme-aware styling with CSS variables
27
+
28
+ - **Profile Image Selector Component** - Radio card selection UI
29
+ - Choose between default avatar, Gravatar, or uploaded image
30
+ - Preview images for each option
31
+ - Selection indicator
32
+ - Fully accessible with hidden radio buttons
33
+ - ActiveStorage integration for uploads (optional)
34
+ - Responsive grid layout
35
+
36
+ - **9 New Heroicons** - High-priority icons for prys-m migration
37
+ - `bars` - Hamburger menu (bars-3)
38
+ - `chart_line` - Line chart visualization
39
+ - `chart_pie` - Pie chart visualization
40
+ - `user_circle` - User profile circle
41
+ - `user_plus` - Add user/invitation
42
+ - `info_circle` - Information/help
43
+ - `lightbulb` - Ideas/tips/features
44
+ - `paper_plane` - Send/submit
45
+ - `history` - Recent/past items
46
+
47
+ - **Icon Audit Documentation** - Complete missing icons analysis
48
+ - Created `docs/MISSING_ICONS.md`
49
+ - Tracks 20-25 missing icons from prys-m
50
+ - Prioritized by usage frequency
51
+ - Heroicons source mapping
52
+ - Implementation plan for remaining icons
53
+
54
+ ### Added (Previous)
55
+ - **Style Guide Favicon** - Added palette icon as favicon for style guide
56
+ - Uses inline SVG data URI with purple color (#a855f7)
57
+ - Appears in browser tab for easy identification
58
+ - Matches the style guide's theme-focused purpose
59
+
60
+ - **Enhanced Pagy Examples** - Comprehensive pagination control examples in style guide
61
+ - **4 Live Examples**: info_tag, series_nav_js, series_nav, input_nav_js
62
+ - **Pagy 43.x API**: Updated to use instance methods (`@pagy.info_tag` instead of `pagy_info(@pagy)`)
63
+ - **Interactive**: All navigation controls are functional and demonstrate different pagination styles
64
+ - **Code Examples**: Each example shows the exact ERB code needed for Pagy 43.x
65
+ - **Controller Setup**: Includes Pagy 43.x controller configuration with `:offset` paginator
66
+ - **Helper Reference**: Complete documentation of available Pagy 43.x instance methods
67
+
68
+ ### Fixed
69
+ - **CRITICAL: Propshaft @import Bug Fixed** - Resolved asset loading issues in consuming applications
70
+ - **Issue**: CSS `@import` statements do NOT work with Propshaft across gem boundaries
71
+ - **Root Cause**: Previous documentation incorrectly claimed Propshaft expands `@import` into `<link>` tags (this is Sprockets behavior, not Propshaft)
72
+ - **Impact**: Apps using neon_sakura with Propshaft would fail to load any styles
73
+ - **Solution**: Created `neon_sakura_stylesheets` helper that loads all CSS files individually in correct cascade order
74
+
75
+ - **Style Guide Pagy Pagination** - Fixed Pagy 43.x API compatibility
76
+ - **Issue**: "wrong number of arguments (given 1, expected 0)" error when viewing pagination section
77
+ - **Root Cause**: Pagy 43.x has completely different API - uses `Pagy::Method` instead of `Pagy::Backend`
78
+ - **Impact**: Style guide pagination examples failed to initialize in apps using Pagy 43.x
79
+ - **Solution**:
80
+ - Added support for Pagy 43.x API: `include Pagy::Method` and `pagy(:offset, collection, **options)`
81
+ - Maintained backward compatibility with older Pagy versions using `Pagy::Backend` and `pagy_array`
82
+ - Controller now detects Pagy version and uses appropriate API automatically
83
+ - Changed parameter from `items:` to `limit:` (modern Pagy convention)
84
+
85
+ - **Style Guide Icon Modal Display** - Fixed icons not appearing in modal zoom viewer
86
+ - **Issue**: Icons appeared blank/invisible in modal even though modal opened correctly
87
+ - **Root Cause 1**: Prysm icon had hardcoded `class="w-6 h-6"` instead of using `css_class` parameter
88
+ - **Root Cause 2**: JavaScript used fragile selector `[class*="w-8"]` which failed for icons without that class
89
+ - **Root Cause 3**: ERB template engine tried to evaluate `<%= %>` inside JavaScript string literal
90
+ - **Root Cause 4**: Tailwind classes (`w-64 h-64`) not reliably sizing SVG elements in modal context
91
+ - **Impact**: Modal opened but showed blank/broken content, MissingTemplate errors
92
+ - **Solution**:
93
+ - Updated prysm icon to use proper `css_class` parameter like all other icons
94
+ - Rewrote JavaScript to use robust SVG cloning with `querySelector('svg')`
95
+ - Set explicit width/height styles (256px) instead of Tailwind classes for reliable sizing
96
+ - Properly handle SVG className using `baseVal` property
97
+ - Preserve color classes while removing size classes
98
+ - Escaped ERB delimiters in JavaScript using string concatenation
99
+
100
+ - **Style Guide Modal Display** - Fixed icon and image zoom modal not appearing as overlay
101
+ - **Issue**: Modal was appearing at bottom of page instead of as centered overlay
102
+ - **Root Cause**: Conflicting CSS classes (both `hidden` and `flex`) and inline styles
103
+ - **Solution**: Restructured modal with proper CSS classes and backdrop
104
+ - New modal structure: `.modal-overlay` → `.modal-backdrop` + `.modal-container`
105
+ - Proper fixed positioning with z-index layering
106
+ - Modal backdrop prevents page scrolling when open
107
+ - Smooth fade-in/out transitions
108
+ - Close via button, backdrop click, or ESC key
109
+
110
+ ### Added
111
+ - **Style Guide Modal Zoom** - Interactive zoom functionality for icon and image modals
112
+ - **Zoom Controls**: Visible control panel with zoom in, zoom out, and reset buttons
113
+ - **Zoom Range**: 50% to 500% in 25% increments
114
+ - **Mouse Wheel Support**: Scroll to zoom in/out directly on modal content
115
+ - **Pan/Drag**: Click and drag to pan when zoomed in (cursor changes to grab/grabbing)
116
+ - **Keyboard Shortcuts**:
117
+ - `+` or `=` - Zoom in
118
+ - `-` or `_` - Zoom out
119
+ - `0` - Reset to 100%
120
+ - `Esc` - Close modal
121
+ - **Smart Features**:
122
+ - Auto-reset zoom when opening/closing modals
123
+ - Buttons disable at min/max zoom levels
124
+ - Smooth transitions for zoom and pan
125
+ - Zoom level percentage display
126
+ - **New Icons**: Added `minus` and `arrows_pointing_in` icons for zoom controls
127
+ - **CSS Classes**: `.zoom-controls`, `.zoom-control-button`, `.zoomable-wrapper`, `.zoomable-content`
128
+
129
+ - **Secondary Blue Gradient** - New theme-independent cyan-to-blue gradient for all themes
130
+ - CSS variables: `--gradient-secondary-blue-from` (#0891b2) and `--gradient-secondary-blue-to` (#2563eb)
131
+ - Utility class: `.bg-gradient-secondary-blue` for background gradients
132
+ - Available in all themes (purple, green, red × light, dark)
133
+ - Added to style guide with live preview and code examples
134
+ - Usage: `<button class="bg-gradient-secondary-blue">Secondary Blue</button>`
135
+
136
+ - **Navbar Link Color System** - Unified cyan navbar styling across all themes
137
+ - CSS variables: `--navbar-link-color` and `--navbar-link-hover` in all themes
138
+ - Dark modes: Bright cyan (#06b6d4) with lighter hover (#22d3ee)
139
+ - Light modes: Darker cyan (#0891b2) with darker hover (#0e7490) for contrast
140
+ - Utility classes: `.text-navbar-link` and `.hover:text-navbar-link`
141
+ - All navbar links (regular, dropdown, logout) use consistent cyan colors
142
+ - Active links show cyan color with cyan underline
143
+ - Replaces theme-specific accent colors with unified cyan across purple, green, and red themes
144
+
145
+ - **StylesheetHelper Module** - New helper for Propshaft-compatible CSS loading
146
+ - `neon_sakura_stylesheets` helper loads all 18 CSS files in correct order (added loading.css)
147
+ - Proper cascade: themes → utilities → loading → components → forms → pagination
148
+ - Replaces broken `@import` approach with individual `stylesheet_link_tag` calls
149
+ - Available automatically in all views via ActionView integration
150
+
151
+ - **Ouroboros Logo Icon** - New SVG icon depicting a serpent eating its own tail
152
+ - Available via `render_theme_icon("ouroboros", css_class: "w-6 h-6")`
153
+ - Theme-aware coloring with currentColor
154
+ - Includes decorative scales and detailed head/tail design
155
+
156
+ - **Loading Indicators** - Comprehensive loading states and animations (`loading.css`)
157
+ - **Spinners**: Basic, accent, small (16px), and large (48px) variants
158
+ - `.spinner-basic` - Border color spinner
159
+ - `.spinner-accent` - Accent color spinner
160
+ - `.spinner-small` - Compact 16px spinner
161
+ - `.spinner-large` - Large 48px spinner
162
+ - **Progress Bars**: Determinate and indeterminate progress indicators
163
+ - `.progress-bar-container` - Progress bar wrapper
164
+ - `.progress-bar-fill` - Fill with gradient (set width via style)
165
+ - `.progress-bar-indeterminate` - Animated sliding progress bar
166
+ - **Skeleton Loaders**: Placeholder content while loading
167
+ - `.skeleton-text` - Text line placeholder with shimmer animation
168
+ - `.skeleton-avatar` - Circular avatar placeholder
169
+ - **Loading Overlay**: Full-screen loading state (`.loading-overlay`)
170
+ - All loading indicators are theme-aware using CSS custom properties
171
+
172
+ - **Gradient System Enhancements**
173
+ - **Alternative Purple Gradient** - Secondary three-color purple gradient
174
+ - CSS Variables: `--gradient-secondary-start`, `--gradient-secondary-mid`, `--gradient-secondary-end`
175
+ - Colors: Purple (#b038dc) → Blue (#4c3ba5) → Indigo (#393e9c)
176
+ - Utility class: `.bg-gradient-secondary-purple`
177
+ - Available only in purple themes (light and dark)
178
+ - **Navbar Gradient** - Accent to notification gradient (third gradient option)
179
+ - CSS Variables: `--gradient-navbar-from`, `--gradient-navbar-to`
180
+ - Maps to accent color → notification color for each theme
181
+ - Utility class: `.bg-gradient-navbar`
182
+ - Available in all themes:
183
+ - Purple: Purple → Green
184
+ - Red: Red → Green
185
+ - Green: Green → Green
186
+ - **Gradients Section** in Style Guide - Showcases all gradient options with examples
187
+ - Primary gradient (theme-specific button gradients)
188
+ - Navbar gradient (accent to notification)
189
+ - Secondary gradient (purple themes only)
190
+ - Complete CSS variables documentation
191
+ - Visual comparisons and code examples
192
+
193
+ - **Style Guide Feature** - Development/test-only comprehensive UI documentation at `/style-guide`
194
+ - Automatically injected route and navbar link (visible only in dev/test environments)
195
+ - Configurable via `enable_style_guide` (default: true) and `style_guide_navbar_position` (default: :end)
196
+ - Dynamic sections showcasing all components with live previews and code examples:
197
+ - **Icons**: All 94 SVG icons (including ouroboros) with clickable zoom modal and helper usage examples
198
+ - **Images**: All gem images with clickable zoom modal, display and usage instructions
199
+ - **Theme Switcher**: Live theme preview for all 6 themes (green/purple/red × light/dark)
200
+ - **Typography**: Heading styles, text colors, gradients
201
+ - **Colors**: CSS custom property reference with theme-aware color swatches
202
+ - **Gradients**: Primary, navbar, and secondary (purple only) gradient examples with visual comparisons
203
+ - **Buttons**: Submit buttons, primary buttons, icon buttons, link buttons
204
+ - **Forms**: Text inputs, textareas, selects, checkboxes, radio buttons
205
+ - **Cards**: Basic cards, cards with headers, card grids
206
+ - **Badges**: Status badges, outline badges, counter badges, tag badges
207
+ - **Alerts**: Success, error, warning, and info alerts
208
+ - **Loading Indicators**: Spinners, progress bars, skeleton loaders with working animations
209
+ - **Pagination**: Pagy integration examples (configurable via `style_guide_pagy_examples`, graceful error handling)
210
+ - Environment-restricted: Returns 404 in production (route not defined)
211
+ - Comprehensive test coverage with 30+ new tests
212
+ - Helper method: `example_with_code(title, code, &block)` for rendering component examples
213
+ - Navbar auto-injection via engine initializer (configurable position: :start, :end, :before_logout, or integer)
214
+ - **Pagy Configuration**: New `style_guide_pagy_examples` option (default: true)
215
+ - When enabled: Automatically detects Pagy availability and shows working examples
216
+ - When disabled: Hides pagination section entirely
217
+ - Graceful error handling: Shows helpful error message if Pagy installation fails
218
+ - Error messages include configuration instructions to disable examples if Pagy not needed
219
+
220
+ ### Changed
221
+ - **Documentation Corrections** - Fixed incorrect Propshaft information in CLAUDE.md and README.md
222
+ - Removed misleading "each @import becomes a separate <link> tag" claims (lines 34, 293, 427)
223
+ - Added correct usage instructions with `neon_sakura_stylesheets` helper
224
+ - Updated "Usage" section with proper Propshaft-compatible code examples
225
+ - Added warning against using `@import "neon_sakura.css"` in application.css (doesn't work with Propshaft)
226
+
227
+ ### Migration Guide (CRITICAL for all Propshaft users)
228
+ Apps experiencing missing styles must update their layouts:
229
+
230
+ **Before (BROKEN with Propshaft):**
231
+ ```erb
232
+ <%= stylesheet_link_tag "neon_sakura", "data-turbo-track": "reload" %>
233
+ ```
234
+ OR
235
+ ```css
236
+ /* application.css */
237
+ @import "neon_sakura.css";
238
+ ```
239
+
240
+ **After (CORRECT for Propshaft):**
241
+ ```erb
242
+ <%# Load neon_sakura stylesheets (Propshaft-compatible) %>
243
+ <%= neon_sakura_stylesheets %>
244
+
245
+ <%# Load your app-specific styles %>
246
+ <%= stylesheet_link_tag 'application', 'data-turbo-track': 'reload' %>
247
+ ```
248
+
249
+ ## [0.1.2] - 2025-12-21
250
+
251
+ ### Changed
252
+ - **CSS Architecture Refactored**: Split monolithic `base.css` into 18 modular files with flat structure
253
+ - Created 4 theme files (`theme-default.css`, `theme-purple.css`, `theme-green.css`, `theme-red.css`)
254
+ - Created 10 utility files (`utility-reset.css`, `utility-layout.css`, `utility-sizing.css`, `utility-spacing.css`, `utility-colors.css`, `utility-borders.css`, `utility-typography.css`, `utility-gradients.css`, `utility-effects.css`, `utility-responsive.css`)
255
+ - Each theme file contains both light and dark variants for easier maintenance
256
+ - **Flat file structure** in root `app/assets/stylesheets/` (no subdirectories) for Propshaft compatibility
257
+ - Improved discoverability and maintainability with descriptive file naming
258
+ - **Color Consistency**: Replaced all remaining hardcoded colors with CSS variables
259
+ - Gradient utilities now use theme-aware variables instead of hardcoded hex colors
260
+ - Button text colors now use `var(--color-text-primary)` in all files
261
+ - Focus ring colors updated to use CSS variables
262
+ - **Documentation**: Updated CLAUDE.md and README.md with new CSS file structure and contribution guidelines
263
+ - **CSS Linting**: Added Stylelint with industry-standard configuration
264
+ - Created package.json with Stylelint dependencies
265
+ - Added .stylelintrc.json configuration file
266
+ - Added .stylelintignore for vendor files
267
+ - Integrated Stylelint into pre-commit git hook
268
+ - Created GitHub Actions workflow for automated linting (RuboCop, Stylelint, Brakeman, Bundle Audit)
269
+ - Fixed duplicate `.pagy-nav` selector in components.css
270
+ - **Asset Pipeline Fix**: Restructured to flat file architecture for Propshaft compatibility
271
+ - **Critical fix**: Moved all CSS files to root `app/assets/stylesheets/` directory (removed subdirectories)
272
+ - Propshaft serves all assets from flat `/assets/` URL path; subdirectory `@import` statements caused 404 errors
273
+ - `base.css` imports all theme and utility files (backward compatibility for apps loading base.css directly)
274
+ - `neon_sakura.css` imports all theme and utility files plus components (complete manifest)
275
+ - Each `@import` becomes a separate `<link>` tag served by Propshaft
276
+ - **Breaking for subdirectory references**: Any custom CSS importing via subdirectory paths must update to flat file names
277
+ - Fixed 404 errors: `/assets/themes/purple.css` → `/assets/theme-purple.css`
278
+
279
+ ### Fixed
280
+ - Gradient utilities now properly adapt to current theme (green themes show green gradients, purple themes show purple gradients)
281
+ - All components now fully support theme switching without hardcoded color values
282
+
283
+ ### Migration Guide
284
+ 1. Update Gemfile: `gem 'neon_sakura', '~> 0.1.2'`
285
+ 2. Run `bundle update neon_sakura`
286
+ 3. **No application changes required** - the refactoring is fully backward compatible
287
+ 4. The new modular structure only affects gem development, not consuming applications
288
+
289
+ ### Backward Compatibility
290
+ - **100% backward compatible** - all existing applications continue to work without changes
291
+ - `base.css` is now a manifest file that imports all theme and utility modules
292
+ - No changes to utility class names or component styles
293
+ - CSS cascade order preserved
294
+
295
+ ## [0.1.1] - 2025-12-20
296
+
297
+ ### Added
298
+ - **406 Not Acceptable error page** - Added custom error page with helpful message for browser compatibility issues
299
+ - **Multi-theme support**: 6 built-in themes (Green Light/Dark, Purple Light/Dark, Red Light/Dark)
300
+ - **Theme switcher component** (`shared/theme_switcher`) with 3 modes:
301
+ - Disabled mode (1 theme): Shows current theme, button disabled
302
+ - Toggle mode (2 themes): Simple moon/sun toggle button
303
+ - Dropdown mode (3+ themes): Dropdown menu with checkmarks on current theme
304
+ - **Theme configuration API**: Configure `default_theme`, `available_themes`, `enable_theme_persistence`, `theme_api_endpoint`
305
+ - **Theme persistence**: localStorage-based with optional backend API support
306
+ - **Theme Helper module** (`NeonSakura::ThemeHelper`) for server-side theme detection
307
+ - **Theme Importer** (`NeonSakura::ThemeImporter`) for importing Bootstrap, Material UI, and custom themes
308
+ - **Theme mapping system**: YAML configuration (`config/theme_mappings.yml`) for framework theme conversion
309
+ - **Reusable dropdown.js module**: Extracted from navbar for use across components
310
+ - **New icons**: `sun`, `moon`, `palette`, `prysm` (prys-m logo with two triangles design)
311
+ - **Icon Helper module** (`NeonSakura::IconHelper`) with methods for icon management:
312
+ - `render_icon(name, options = {})` - Renders an icon partial with CSS class, aria-hidden, and aria-label options
313
+ - `available_icons` - Returns array of all available icon names
314
+ - `icon_exists?(name)` - Checks if an icon exists
315
+ - `render_icon_list(icon_names, options = {})` - Renders multiple icons in a container with custom styling
316
+ - **Theme Helper icon rendering** (`render_theme_icon`) - Theme-aware icon rendering method in ThemeHelper
317
+ - **Bootstrap compatibility CSS** (`compat/bootstrap.css`): Optional class aliases for gradual migration
318
+ - **Theme switching JavaScript** (`theme_switcher.js`): Handles theme switching, localStorage, cookies, and optional backend sync
319
+
320
+ ### Changed
321
+ - **CSS refactored to use custom properties**: All hardcoded colors replaced with `var(--color-*)` references
322
+ - base.css: All utility classes now use CSS variables for colors
323
+ - components.css: All component styles now use CSS variables for colors
324
+ - forms.css: All form styles now use CSS variables for colors and gradients
325
+ - Base.css now uses CSS custom properties with 4 theme variants via `data-theme-name` and `data-theme-mode` attributes
326
+ - Dropdown JavaScript extracted to separate tested module for reusability
327
+ - **Default configuration**: All 4 themes available by default in new installations
328
+ - Color system now uses semantic variables: `--color-text-primary`, `--color-background`, `--color-accent`, etc.
329
+ - Intermediate color shades now use `color-mix()` function for smooth transitions
330
+ - **Gradient system**: Added `--gradient-from`, `--gradient-to`, `--gradient-from-hover`, `--gradient-to-hover` variables for theme-configurable button gradients
331
+ - Green themes: Green to cyan gradients (#10b981 → #06b6d4)
332
+ - Purple themes: Blue to purple gradients (#2563eb → #9333ea)
333
+ - Red themes: Red to orange gradients (#dc2626 → #f97316)
334
+ - **Text gradient system**: Added `--text-gradient-from`, `--text-gradient-to` variables for theme-configurable heading and link gradients
335
+ - Each theme has color-appropriate text gradients for headings
336
+ - **Warning color**: Added `--color-warning` variable for consistent warning colors across themes
337
+ - Mission Control navbar now synchronized with main navbar styling and includes theme selector
338
+ - **Red themes**: Added 2 new themes (Red Light and Red Dark) with red-to-orange color scheme
339
+
340
+ ### Fixed
341
+ - Search button text visibility in light theme (now uses white text)
342
+ - Advanced search toggle button now uses theme-configurable gradients instead of hardcoded cyan/blue
343
+ - Input submit buttons now use theme-configurable gradients instead of hardcoded purple
344
+ - Heading and link gradients now match theme colors (green for green themes, purple/blue for purple themes)
345
+ - Green themes now use green gradients throughout instead of purple/blue
346
+ - Navbar link colors now properly show white by default with cyan hover state
347
+ - Theme selector dropdown now appears in Mission Control navbar Tools menu
348
+ - Dropdown event listeners no longer duplicate on re-initialization
349
+ - **Navbar dropdown menus now work correctly after Turbo page navigation** - removed blocking initialization guard that prevented dropdowns from re-initializing on subsequent page loads
350
+ - **Pagy pagination now uses pagy_input_nav_js for responsive design** - Fastest! Combines navigation and info in minimum space using Pagy's built-in JavaScript navigation with input field for direct page jumping.
351
+ - **Download button text color** - Changed from mixed accent color to solid white (#ffffff) for better contrast and readability on gradient backgrounds
352
+
353
+ ### Migration Guide
354
+ 1. Update Gemfile: `gem 'neon_sakura', '~> 0.1.1'`
355
+ 2. Run `bundle update neon_sakura`
356
+ 3. **IMPORTANT**: Mount the engine in `config/routes.rb`:
357
+ ```ruby
358
+ Rails.application.routes.draw do
359
+ mount NeonSakura::Engine => "/", as: "neon_sakura"
360
+ # ... rest of your routes
361
+ end
362
+ ```
363
+ 4. **For responsive pagination** (recommended):
364
+ - Enable pagy extra in `config/initializers/pagy.rb`:
365
+ ```ruby
366
+ require 'pagy/extras/input_nav_js'
367
+ ```
368
+ - Add pagy to `config/importmap.rb`:
369
+ ```ruby
370
+ pin "pagy", to: "https://cdn.jsdelivr.net/npm/pagy@9.3.3/javascripts/pagy.min.js"
371
+ ```
372
+ - Import in `app/javascript/application.js`:
373
+ ```javascript
374
+ import "pagy"
375
+ ```
376
+ - Replace `pagy_nav` or `pagy_nav_search` with `pagy_input_nav_js` in views
377
+ 3. **Optional - Enable theme switching**:
378
+ - Add to `config/initializers/neon_sakura.rb`:
379
+ ```ruby
380
+ config.available_themes = [
381
+ { name: "green", mode: "light", label: "Green Light" },
382
+ { name: "green", mode: "dark", label: "Green Dark" },
383
+ { name: "purple", mode: "light", label: "Purple Light" },
384
+ { name: "purple", mode: "dark", label: "Purple Dark" }
385
+ ]
386
+ config.default_theme = { name: "purple", mode: "dark" } # Optional, defaults to purple-dark
387
+ ```
388
+ - Add theme switcher to navbar: `<%= render "shared/theme_switcher" %>`
389
+ 4. **Optional - Database persistence**:
390
+ - Add migration: `rails g migration AddThemeToUsers theme_name:string theme_mode:string`
391
+ - Configure endpoint: `config.theme_api_endpoint = "/settings/theme"`
392
+ 5. **Optional - Import external themes**:
393
+ - Use `NeonSakura::ThemeImporter.from_bootstrap(vars)` or `.from_material_ui(vars)`
394
+ - Use Bootstrap compatibility CSS: `@import "neon_sakura/compat/bootstrap.css"` (optional)
395
+
396
+ ### Backward Compatibility
397
+ - Existing apps continue to work without changes (defaults to "purple-dark" theme)
398
+ - All utility classes maintain their original names
399
+ - CSS variables have sensible fallbacks
400
+ - No breaking changes to existing APIs
401
+
402
+ ## [0.1.0] - 2025-12-20
403
+
404
+ ### Added
405
+ - Extracted Artemis navigation bar component as reusable `shared/navbar` partial
406
+ - Configurable navigation positioning via `nav_position` (:none, :top, :under_heading)
407
+ - Support for three link types: simple links, dropdown menus, and form buttons
408
+ - Block/yield support for custom content in navbar (e.g., prys-m's Quick Import form)
409
+ - NavbarHelper module with utility methods for active state detection and condition evaluation
410
+ - Icon support for all navigation links via `icon` parameter
411
+ - Conditional link rendering via `condition` parameter for dynamic navigation
412
+ - Navbar JavaScript module (navbar.js) for dropdown functionality using vanilla JS
413
+ - Configuration options: `nav_position`, `app_icon`, `show_search`
414
+ - Active state highlighting for current page navigation links with `nav-active` class
415
+ - Responsive navigation design with mobile support
416
+
417
+ ### Changed
418
+ - **BREAKING**: Removed `mission_control_nav_links` configuration option
419
+ - Migration: Use `nav_links` instead for unified navigation across all layouts
420
+ - Enhanced `nav_links` schema to support:
421
+ - `type` field for link, dropdown, or button types
422
+ - `icon` field for icon partial names
423
+ - `condition` field for conditional rendering with Ruby code evaluation
424
+ - `active_paths` array for additional path matching
425
+ - `method` field for button HTTP methods (:get, :post, :patch, :delete)
426
+ - `target` field for link targets (e.g., "_blank")
427
+ - `aria_label` field for custom accessibility labels
428
+ - Dropdown functionality now uses gem's navbar.js instead of requiring Stimulus
429
+ - Navigation styling consolidated in components.css (already present)
430
+
431
+ ### Fixed
432
+ - Navigation dropdown z-index for proper layering above other content
433
+ - Active state detection now supports multiple paths via `active_paths` array
434
+ - Logout button styling properly supports Rails form button helpers
435
+
436
+ ### Removed
437
+ - `mission_control_nav_links` configuration option (use `nav_links` instead)
438
+
439
+ ### Migration Guide
440
+ 1. Update Gemfile: `gem 'neon_sakura', '~> 0.1.0'`
441
+ 2. Run `bundle update neon_sakura`
442
+ 3. Replace `render "shared/nav"` with `render "shared/navbar"` in views
443
+ 4. Update configuration in `config/initializers/neon_sakura.rb`:
444
+ - Rename `mission_control_nav_links` to `nav_links`
445
+ - Add `nav_position` (options: `:none`, `:top`, `:under_heading`)
446
+ - Enhance nav_links with new schema (type, icon, condition, etc.)
447
+ 5. Remove application-specific navbar partials (now provided by gem)
448
+ 6. Remove Stimulus dropdown controller if only used for navbar (now handled by gem)
449
+
450
+ ## [0.0.9] - 2025-12-18
451
+
452
+ ### Added
453
+ - Configurable Mission Control navigation via `mission_control_nav_links` configuration option
454
+ - Support for flat links, dropdown menus, and form buttons in Mission Control navigation
455
+ - Navigation link types: "link", "dropdown", and "button"
456
+ - Automatic "Back to {app_name}" link and "Start Auto-refresh" button displayed inline below custom navigation
457
+ - Comprehensive Mission Control navigation documentation in README.md
458
+ - Remove duplicated back button
459
+
460
+ ### Changed
461
+ - Mission Control layout now uses configured navigation instead of hardcoded Artemis navigation
462
+ - When `mission_control_nav_links` is nil or empty, the custom navigation is hidden (falls back to default Mission Control navigation)
463
+ - `app_name` configuration now used for "Back to {app_name}" link
464
+ - "Start Auto-refresh" button now appears inline with "Back to" link, not in the navigation bar
465
+ - Icon names in documentation updated to use underscores (e.g., `arrow_left` instead of `arrow-left`) to match actual file names
466
+
467
+ ### Fixed
468
+ - Mission Control auto-refresh button positioning - now inline with "Back to" link instead of in navigation bar
469
+ - Hardcoded navigation that prevented customization for different applications
470
+ - Icon naming inconsistencies in documentation (hyphens vs underscores)
471
+
472
+ ## [0.0.8] - 2025-12-17
473
+
474
+ ### Changed
475
+ - **BREAKING**: Converted all icons to inline `.svg.erb` partials with `currentColor` support
476
+ - Icons now properly work with Tailwind `text-*` color classes
477
+ - Simplified usage: `<%= render 'shared/icons/clock', css_class: 'w-6 h-6 text-green-400' %>`
478
+ - Removed all external SVG files (now inline partials only)
479
+ - Updated spinner to use CSS animation
480
+
481
+ ### Fixed
482
+ - Multi-colored icons now work correctly in consuming applications
483
+ - Icons properly inherit colors from CSS classes
484
+
485
+ ## [0.0.5 - 0.0.7] - 2025-12-17
486
+ - Extracted all embedded SVG icons to external files
487
+ - Icon SVGs use explicit cyan color (#7DD3FC) for Propshaft compatibility
488
+ - Converted spinner from SVG to animated GIF
489
+ - Updated 87 icon view partials to use image_tag
490
+ - Moved icons to root app/assets/images/ directory
491
+ - Resolve issues loading assets
492
+
493
+ ### Changed
494
+ - **BREAKING**: Extracted all embedded SVG icons to external files in `app/assets/images/`
495
+ - All icon SVGs now use explicit cyan color (#7DD3FC) instead of `currentColor` for compatibility with Propshaft
496
+ - Converted spinner from SVG to animated GIF for better visual feedback
497
+ - Updated all 87 icon view partials to use `image_tag` instead of embedded SVG code
498
+ - Moved all icon files from `app/assets/images/icons/` to root `app/assets/images/` for Propshaft compatibility
499
+
500
+ ### Fixed
501
+ - Fixed `chevron_down.svg` broken SVG (removed embedded ERB code)
502
+ - Fixed `server_error.svg` X visibility by changing color to red (#EF4444)
503
+ - Added explicit Propshaft asset paths configuration in engine initializer
504
+ - All icon SVGs now have proper `width="24" height="24"` attributes for correct rendering
505
+
506
+ ### Updated
507
+ - Updated artemis application spinner usage to remove `animate-spin` class (no longer needed with GIF)
508
+
509
+ ## [0.0.4] - 2025-12-16
510
+
511
+ ### Added
512
+ - Progress bar component (`.progress-bar-container` and `.progress-bar`)
513
+ - Support for dynamic progress width via CSS custom property `--progress-width`
514
+ - Gradient styling for progress bars (cyan-500 to blue-500)
515
+ - SVGs from Dragonfly archived project
516
+ - Cherry blossom tree icon in both PNG and SVG formats (`cherry_blossom_tree.png` and `cherry_blossom_tree.svg`) with corresponding view partial
517
+ - Add in Prys-m images
518
+ - Update mission control ui to have auto-refresh
519
+ - Minor workflow fix
520
+
521
+ ## [0.0.3] - 2025-12-10
522
+
523
+ ### Added
524
+ - ErrorsController for handling common HTTP error codes (400, 401, 403, 404, 422, 500, 503)
525
+ - ErrorsHelper with route helper support for error pages
526
+ - Error view template with dark-themed styling and icon support
527
+ - Automatic error page routes via Rails engine (can be disabled via configuration)
528
+ - Configuration option `enable_error_pages` to control automatic error routes (default: true)
529
+ - Comprehensive error controller and helper tests
530
+ - Configuration tests for new `enable_error_pages` option
531
+ - Support for both HTML and JSON error responses
532
+ - Custom error messages and details via request parameters
533
+ - Comprehensive configuration documentation in README.md
534
+ - Documentation for automatic error routes and configuration in README.md
535
+
536
+ ## [0.0.2] - 2025-12-10
537
+ ### Bugfixes
538
+ - Resolved name-spacing issues
539
+
540
+ ## [0.0.1] - 2025-12-09
541
+
542
+ ### Added
543
+ - Initial release of neon_sakura gem
544
+ - Extracted styling and theming components from Artemis Rails application
545
+ - Base CSS styles with utility classes, layout, typography, and colors
546
+ - Component CSS for UI elements (navigation, cards, badges, buttons, tables, alerts)
547
+ - Form styling CSS
548
+ - Pagination styles (pagy-tailwind.css)
549
+ - Mission Control layout template
550
+ - Error page layout template
551
+ - SVG icon components (29 files)
552
+ - Site footer component
553
+ - Vanilla JavaScript dropdown functionality
554
+ - Proper gem structure with lib/, app/, and asset directories
555
+
556
+ ### Changed
557
+ - Updated gemspec with proper metadata and author details
558
+ - Configured gem for Rails 8+ compatibility
559
+ - Set up proper asset pipeline integration
560
+ - Updated AI reviewer configuration to use Neon Sakura gem project context
561
+ - Updated AI reviewer build system prompt for Neon Sakura gem project
562
+ - Updated CLAUDE.md to include detailed project guidelines for AI reviewer
563
+
564
+ ### Fixed
565
+ - Ensured all CSS imports work correctly in gem context
566
+ - Verified JavaScript components work with Propshaft asset pipeline
567
+
568
+ [0.0.1]: https://github.com/trex22/neon_sakura/releases/tag/v0.0.1