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,28 @@
1
+ {
2
+ "ignored_warnings": [
3
+ {
4
+ "warning_type": "Cross-Site Request Forgery",
5
+ "warning_code": 86,
6
+ "fingerprint": "811fccd4f1d716b6b7a6467653259cdfe25de28e0c24d729729f6bc78670da05",
7
+ "check_name": "ForgerySetting",
8
+ "message": "`protect_from_forgery` should be configured with `with: :exception`",
9
+ "file": "app/controllers/errors_controller.rb",
10
+ "line": 11,
11
+ "link": "https://brakemanscanner.org/docs/warning_types/cross-site_request_forgery/",
12
+ "code": "protect_from_forgery(:with => :null_session)",
13
+ "render_path": null,
14
+ "location": {
15
+ "type": "controller",
16
+ "controller": "ErrorsController"
17
+ },
18
+ "user_input": null,
19
+ "confidence": "Medium",
20
+ "cwe_id": [
21
+ 352
22
+ ],
23
+ "note": "Error pages don't have forms to submit, so :null_session is appropriate for CSRF protection"
24
+ }
25
+ ],
26
+ "updated": "2025-12-10 00:00:00 +0000",
27
+ "brakeman_version": "7.1.1"
28
+ }
@@ -0,0 +1,15 @@
1
+ # Configure Neon Sakura gem
2
+ # This file should be placed in config/initializers/neon_sakura.rb
3
+
4
+ require "pagy"
5
+
6
+ # Configure default values
7
+ NeonSakura.configure do |config|
8
+ config.app_name = "My Application"
9
+ config.show_version = true
10
+ config.show_header = true
11
+ config.nav_links = [
12
+ { name: "Home", path: "/" },
13
+ { name: "About", path: "/about" }
14
+ ]
15
+ end
@@ -0,0 +1,13 @@
1
+ # License Override Configuration
2
+ # This file allows manual approval of gems with problematic or unknown licenses
3
+ # Use this for gems that have been manually verified as safe for commercial use
4
+
5
+ # Gems with licenses that have been manually verified as commercial-friendly
6
+ approved_gems:
7
+ bundler-audit: "GPL-3 allows commercial use"
8
+
9
+ # Notes:
10
+ # - Each entry should include the reason for approval
11
+ # - Review these periodically when updating gems
12
+ # - Remove entries when gems are updated with proper license metadata
13
+ # - Consider contributing license fixes back to upstream gems
data/config/routes.rb ADDED
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ NeonSakura::Engine.routes.draw do
4
+ # Error routes - only if enabled in configuration
5
+ if NeonSakura.configuration.enable_error_pages
6
+ get "/400", to: "errors#bad_request", as: :bad_request
7
+ get "/401", to: "errors#unauthorized", as: :unauthorized
8
+ get "/403", to: "errors#forbidden", as: :forbidden
9
+ get "/404", to: "errors#not_found", as: :not_found
10
+ get "/406", to: "errors#not_acceptable", as: :not_acceptable
11
+ get "/422", to: "errors#unprocessable_entity", as: :unprocessable_entity
12
+ get "/500", to: "errors#internal_server_error", as: :internal_server_error
13
+ get "/503", to: "errors#service_unavailable", as: :service_unavailable
14
+ end
15
+
16
+ # Style guide route - only if enabled AND in development/test environment
17
+ # Route is NOT defined in production (returns Rails 404)
18
+ if NeonSakura.configuration.enable_style_guide && (Rails.env.development? || Rails.env.test?)
19
+ get "/style-guide", to: "style_guide#index", as: :style_guide
20
+ end
21
+ end
@@ -0,0 +1,61 @@
1
+ # Theme Mappings for External CSS Frameworks
2
+ # Maps framework-specific color variables to neon_sakura CSS custom properties
3
+
4
+ # Bootstrap 5 Theme Mapping
5
+ bootstrap:
6
+ primary: --color-accent
7
+ secondary: --color-text-secondary
8
+ success: --color-notification
9
+ danger: --color-alert
10
+ warning: --color-warning
11
+ info: --color-info
12
+ light: --color-surface
13
+ dark: --color-background-dark
14
+ body-bg: --color-background
15
+ body-color: --color-text-primary
16
+ border-color: --color-border
17
+ link-color: --color-accent
18
+ link-hover-color: --color-accent-hover
19
+
20
+ # Material UI Theme Mapping
21
+ material_ui:
22
+ palette.primary.main: --color-accent
23
+ palette.primary.light: --color-accent-light
24
+ palette.primary.dark: --color-accent-dark
25
+ palette.secondary.main: --color-text-secondary
26
+ palette.background.default: --color-background
27
+ palette.background.paper: --color-surface
28
+ palette.text.primary: --color-text-primary
29
+ palette.text.secondary: --color-text-secondary
30
+ palette.text.disabled: --color-text-muted
31
+ palette.success.main: --color-notification
32
+ palette.error.main: --color-alert
33
+ palette.divider: --color-border
34
+
35
+ # Tailwind CSS Theme Mapping
36
+ tailwind:
37
+ # Primary colors
38
+ gray-900: --color-background-dark
39
+ gray-800: --color-surface-dark
40
+ gray-700: --color-border
41
+ gray-600: --color-text-secondary
42
+ gray-50: --color-background-light
43
+ white: --color-background
44
+
45
+ # Accent colors (customize based on theme)
46
+ blue-500: --color-accent
47
+ blue-600: --color-accent-dark
48
+ green-500: --color-notification
49
+ red-500: --color-alert
50
+
51
+ # Custom Theme Structure
52
+ # Use this as a template for creating custom themes
53
+ custom:
54
+ accent: --color-accent
55
+ background: --color-background
56
+ surface: --color-surface
57
+ text: --color-text-primary
58
+ text-muted: --color-text-muted
59
+ success: --color-notification
60
+ error: --color-alert
61
+ border: --color-border
@@ -0,0 +1,210 @@
1
+ # Prys-m Assets Catalog
2
+
3
+ Assets extracted from the Prys-m application for use in Neon Sakura.
4
+
5
+ ## SVG Assets
6
+
7
+ ### Application Icons
8
+
9
+ #### prysm-icon.svg
10
+ - **Source**: `/public/icon.svg`
11
+ - **Description**: Main application icon featuring a magazine/document design
12
+ - **Colors**:
13
+ - Accent Green: `#009990` (Persian green)
14
+ - Text Gray: `#545E75` (Payne's gray)
15
+ - Alert Red: `#DE5959` (Chestnut)
16
+ - White: `#ffffff`
17
+ - **Design**: Layered magazine pages with content lines and bookmark
18
+ - **Dimensions**: 512x512
19
+ - **Features**: Gradient background, rounded corners (rx="64")
20
+
21
+ ### Third-Party Service Icons
22
+
23
+ #### pushbullet-1.svg
24
+ - **Source**: `/app/assets/images/pushbullet-1.svg`
25
+ - **Description**: Pushbullet logo (colored version)
26
+ - **Colors**: Green gradient (#67BF79, #4CB36B to #3EA16F)
27
+ - **Dimensions**: 256x256
28
+ - **Design**: Circle badge with "P!" branding
29
+
30
+ #### pushbullet-2.svg
31
+ - **Source**: `/app/assets/images/pushbullet-2.svg`
32
+ - **Description**: Pushbullet logo (simple stroke version)
33
+ - **Colors**: Black stroke (#000000)
34
+ - **Dimensions**: 192x192
35
+ - **Design**: Minimalist outline version of "P!" branding
36
+
37
+ ## PNG Assets
38
+
39
+ #### prysm-icon.png
40
+ - **Source**: `/public/icon.png`
41
+ - **Description**: Raster version of the main application icon
42
+ - **Format**: PNG
43
+ - **Use Case**: Fallback for environments that don't support SVG
44
+
45
+ ## Font Awesome Icons Used
46
+
47
+ The Prys-m application extensively uses Font Awesome 6.5.1 icons. Below is a comprehensive list of all icons used:
48
+
49
+ ### Navigation & UI
50
+ - `fa-bars` - Menu toggle
51
+ - `fa-arrow-left` - Back navigation
52
+ - `fa-times` - Close/dismiss
53
+ - `fa-search` - Search functionality
54
+ - `fa-filter` - Filter controls
55
+ - `fa-filter-circle-xmark` - Clear filters
56
+ - `fa-cog` / `fa-cogs` - Settings
57
+ - `fa-expand-arrows-alt` - Expand/fullscreen
58
+
59
+ ### User & Authentication
60
+ - `fa-user` - User profile
61
+ - `fa-user-circle` - User avatar
62
+ - `fa-user-plus` - Add user
63
+ - `fa-sign-in-alt` - Login
64
+ - `fa-sign-out-alt` - Logout
65
+ - `fa-key` - API keys/credentials
66
+ - `fa-lock` / `fa-unlock` - Security status
67
+ - `fa-crown` - Premium/admin status
68
+ - `fa-shield-alt` - Security features
69
+
70
+ ### Content & Actions
71
+ - `fa-bookmark` - Bookmarked items
72
+ - `fa-heart` - Favorites
73
+ - `fa-heart-broken` - Unfavorite
74
+ - `fa-star` - Featured/starred
75
+ - `fa-archive` - Archived items
76
+ - `fa-trash` - Delete
77
+ - `fa-edit` - Edit
78
+ - `fa-copy` - Copy/duplicate
79
+ - `fa-save` - Save
80
+ - `fa-check` / `fa-check-circle` - Success/completed
81
+ - `fa-plus` - Add new
82
+ - `fa-undo` / `fa-redo` - Undo/redo
83
+
84
+ ### Import & Export
85
+ - `fa-file-import` - Import data
86
+ - `fa-file-export` - Export data
87
+ - `fa-file-csv` - CSV export
88
+ - `fa-cloud-upload-alt` - Upload
89
+ - `fa-upload` - Upload files
90
+ - `fa-download` - Download
91
+ - `fa-inbox` - Inbox/unread items
92
+ - `fa-get-pocket` - Pocket integration
93
+
94
+ ### Tools & Features
95
+ - `fa-receipt` - Receipt processing
96
+ - `fa-qrcode` - QR code generator
97
+ - `fa-image` / `fa-file-image` - Image tools
98
+ - `fa-crop` - Image cropping
99
+ - `fa-palette` - Color/theme tools
100
+ - `fa-magic` - AI/auto features
101
+ - `fa-brain` - AI processing
102
+ - `fa-tools` - Tool collection
103
+ - `fa-eraser` - Clear/reset
104
+ - `fa-adjust` - Image adjustments
105
+
106
+ ### Organization
107
+ - `fa-folder` / `fa-folder-open` - Collections
108
+ - `fa-folder-plus` - New collection
109
+ - `fa-tag` / `fa-tags` - Tags
110
+ - `fa-layer-group` - Groups/categories
111
+ - `fa-table` - Table view
112
+ - `fa-list` - List view
113
+
114
+ ### Information & Status
115
+ - `fa-info-circle` - Information
116
+ - `fa-question-circle` - Help
117
+ - `fa-exclamation-circle` - Warning
118
+ - `fa-exclamation-triangle` - Alert
119
+ - `fa-bell` / `fa-bell-exclamation` - Notifications
120
+ - `fa-spinner` / `fa-spin` - Loading
121
+ - `fa-clock` - Time/history
122
+ - `fa-history` - History
123
+ - `fa-calendar` / `fa-calendar-alt` - Date/schedule
124
+
125
+ ### Analytics & Stats
126
+ - `fa-chart-bar` - Bar charts
127
+ - `fa-chart-line` - Line charts
128
+ - `fa-chart-pie` - Pie charts
129
+ - `fa-user-stats` - User statistics
130
+
131
+ ### Social & Sharing
132
+ - `fa-share-alt` - Share
133
+ - `fa-external-link-alt` - External link
134
+ - `fa-paper-plane` - Send/submit
135
+ - `fa-envelope` - Email
136
+ - `fa-rss` - RSS feed
137
+ - `fa-globe` - Public/web
138
+
139
+ ### Theme & Display
140
+ - `fa-sun` / `fa-moon` - Light/dark mode toggle
141
+ - `fa-lightbulb` - Ideas/tips
142
+ - `fa-eye` - View/preview
143
+ - `fa-search-plus` / `fa-search-minus` - Zoom controls
144
+
145
+ ### Misc
146
+ - `fa-magazine` - Magazine view style
147
+ - `fa-book` - Documentation
148
+ - `fa-store` - Marketplace/shop
149
+ - `fa-rocket` - Launch/deploy
150
+ - `fa-puzzle-piece` - Plugins/extensions
151
+ - `fa-network-wired` - Integrations
152
+ - `fa-mobile-alt` - Mobile devices
153
+ - `fa-camera` - Camera capture
154
+ - `fa-file-alt` - Documents
155
+ - `fa-play` - Start/run
156
+ - `fa-sync` - Refresh/sync
157
+ - `fa-google` - Google integration
158
+
159
+ ## Color Palette
160
+
161
+ The Prys-m application uses a consistent color scheme:
162
+
163
+ - **Primary Text**: `#545E75` (Payne's gray)
164
+ - **Accent Color**: `#009990` (Persian green)
165
+ - **Alert Color**: `#DE5959` (Chestnut)
166
+ - **Background**: `#FFFFFF` (White) / `#0f172a` (Dark mode)
167
+ - **Bold Text**: `#000000` (Black) / `#f8fafc` (Dark mode)
168
+
169
+ ## Typography
170
+
171
+ - **Primary Font**: Montserrat (sans-serif) - Headings, navigation, UI elements
172
+ - **Secondary Font**: Source Serif 4 (serif) - Article content, body text
173
+
174
+ ## Integration with Neon Sakura
175
+
176
+ When Prys-m is used as part of the Neon Sakura application:
177
+
178
+ 1. Replace custom SVG icons with Neon Sakura icon system
179
+ 2. Unify Font Awesome icon usage across applications
180
+ 3. Sync color palettes and theming
181
+ 4. Consolidate typography choices
182
+ 5. Share image processing utilities
183
+
184
+ ## File Locations
185
+
186
+ All Prys-m assets are now integrated into the main Neon Sakura asset structure:
187
+
188
+ ```
189
+ neon_sakura/
190
+ ├── docs/
191
+ │ └── PRYSM_ASSETS.md (this file)
192
+ └── app/
193
+ └── assets/
194
+ └── images/
195
+ ├── prysm-icon.svg
196
+ ├── prysm-icon.png
197
+ ├── pushbullet-1.svg
198
+ └── pushbullet-2.svg
199
+ ```
200
+
201
+ ## Notes
202
+
203
+ - All SVG files use viewBox for responsive scaling
204
+ - Icons maintain accessibility through proper semantic markup
205
+ - Color values can be customized via CSS variables
206
+ - Font Awesome version: 6.5.1
207
+
208
+ ## License
209
+
210
+ Assets extracted from Prys-m application. Refer to source repository for licensing information.
@@ -0,0 +1,151 @@
1
+ Below is a concise “recipe” for pulling the Neon Sakura AI‑reviewer pipeline out into its own
2
+ repository and wiring it up in any number of downstream projects.
3
+
4
+ ---
5
+ 1. What files are involved in the current repo?
6
+
7
+ | Directory | What it holds
8
+ | Why it matters |
9
+ |--------------------|-------------------------------------------------------------------------
10
+ ------------------------------|--------------------------------------------|
11
+ | .github/workflows/ | GitHub Actions YAMLs that run RuboCop, Brakeman, the AI‑reviewer, etc.
12
+ | These are what actually execute in CI. |
13
+ | .ai‑reviewer/ | Bash/Ruby scripts that orchestrate the AI‑review – e.g. token‑counting,
14
+ API calls, result formatting. | Core logic that can be reused. |
15
+ | bin/ | Wrapper scripts that may call the reviewer or run pre‑commit / pre‑push
16
+ hooks. | These are the entry points for developers. |
17
+
18
+ ---
19
+ 2. Turn it into a reusable GitHub Action
20
+
21
+ a. Create a new repo
22
+
23
+ - ai-reviewer-action (or similar) – a public or private GitHub org/repo.
24
+
25
+ b. Re‑organise the source
26
+
27
+ ai-reviewer-action/
28
+ ├─ action.yml # composite action metadata
29
+ ├─ scripts/
30
+ │ ├─ run-review.sh # entry script
31
+ │ └─ … # copy everything from .ai‑reviewer/
32
+ └─ tests/ (optional) # small test harness for the composite action
33
+
34
+ *Move the contents of .ai‑reviewer/ into scripts/ and make the bash file executable (chmod +x).
35
+ If the reviewer was written in Ruby, you can keep the Ruby files in scripts/ and invoke them
36
+ from the shell script.
37
+
38
+ c. Define the composite action
39
+
40
+ # action.yml
41
+ name: "Neon Sakura AI Reviewer"
42
+ description: "Runs RuboCop/Brakeman and the AI‑review pipeline."
43
+ branding:
44
+ icon: "shield"
45
+ color: "purple"
46
+ inputs:
47
+ repo-token:
48
+ description: "GitHub token for API access"
49
+ required: true
50
+ runs:
51
+ using: "composite"
52
+ steps:
53
+ - name: Checkout repo
54
+ uses: actions/checkout@v4
55
+ with:
56
+ fetch-depth: 0
57
+
58
+ - name: Set up Ruby
59
+ uses: ruby/setup-ruby@v1
60
+ with: { ruby-version: 3.3 }
61
+
62
+ - name: Install deps
63
+ run: bundle install --jobs 4
64
+
65
+ - name: Run RuboCop
66
+ run: bundle exec rubocop
67
+
68
+ - name: Run Brakeman
69
+ run: bundle exec brakeman --quiet
70
+
71
+ - name: Run AI review
72
+ env:
73
+ GH_TOKEN: ${{ inputs.repo-token }}
74
+ run: |
75
+ bash scripts/run-review.sh
76
+
77
+ The run-review.sh script should be a thin wrapper around whatever logic lives in the old
78
+ .ai‑reviewer/ folder. Pass any environment vars you need (API keys, etc.) from the calling
79
+ workflow.
80
+
81
+ ---
82
+ 3. Create a reusable CI workflow that calls the action
83
+
84
+ Place the following in any repo that should use the AI‑reviewer:
85
+
86
+ name: 🐛 AI‑Reviewer
87
+
88
+ on:
89
+ pull_request:
90
+ branches: [main]
91
+ workflow_dispatch: # Manual trigger if desired
92
+
93
+ jobs:
94
+ review:
95
+ permissions:
96
+ contents: read # needed for checkout
97
+ issues: write # optional, if you want to comment
98
+ uses: org/ai-reviewer-action/.github/workflows/review.yml@v1
99
+ secrets:
100
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # for GitHub API calls
101
+ AI_API_KEY: ${{ secrets.AI_API_KEY }} # your LLM key
102
+
103
+ Inside the reusable workflow (.github/workflows/review.yml) you would simply forward the
104
+ repo-token input to the action:
105
+
106
+ jobs:
107
+ run:
108
+ uses: org/ai-reviewer-action@v1
109
+ secrets:
110
+ repo-token: ${{ github.token }}
111
+
112
+ When the repo’s PR or push triggers the workflow, GitHub will fetch the ai-reviewer-action
113
+ repo, execute action.yml, and run the composite steps. All downstream projects just need to
114
+ depend on a tag (e.g. v1, v2) or branch that contains the action.
115
+
116
+ ---
117
+ 4. Optional: Turn the scripts into a tiny CLI
118
+
119
+ If you prefer to run the reviewer locally or in CI scripts, consider packaging bin/ai-reviewer
120
+ as a Ruby gem or a simple Docker container that exposes the same shell script. Keep the source
121
+ in ai-reviewer-action/cli/ and build a lightweight image that can be pushed to GitHub Container
122
+ Registry. Down‑stream repos can then call:
123
+
124
+ - name: Run AI reviewer
125
+ run: docker run --rm -e TOKEN=$AI_API_KEY ghcr.io/yourorg/ai-reviewer:latest
126
+
127
+ ---
128
+ 5. Documentation & publishing
129
+
130
+ 1. README – explain the action, inputs, outputs, required secrets.
131
+ 2. Action badges – action.yml generates
132
+ https://github.com/org/ai-reviewer-action/workflows/Release/badge.svg.
133
+ 3. Release workflow – Tag releases with semantic versioning (e.g. v1.0.0). Use git tag -a
134
+ v1.0.0 -m "Initial public release" && git push --tags.
135
+ 4. GitHub Template – If you foresee many repos needing the same setup, create a template
136
+ repository in GitHub. Each new project can copy from it.
137
+
138
+ ---
139
+ Quick checklist
140
+
141
+ - Move .ai‑reviewer/ → ai-reviewer-action/scripts/
142
+ - Convert scripts to a composite action.yml
143
+ - Publish the action in a separate org/repo
144
+ - Add a reusable workflow that references the action
145
+ - Update downstream projects to use the reusable workflow (uses:)
146
+ - Add documentation and badges
147
+
148
+ With this structure, every project that wants the same AI‑reviewer logic just pulls a single
149
+ action and any future changes—bug fixes, new LLM providers, or workflow tweaks—are propagated
150
+ by bumping the action’s tag. No matter how many repos you own, you deploy the CI logic once,
151
+ keep it under version control, and reuse it everywhere.
@@ -0,0 +1,138 @@
1
+ # Plan: Extract Styling and Theming Components into `neon_sakura` Gem
2
+
3
+ ## Overview
4
+ This document outlines the approach for extracting the styling and theming components from the Artemis Rails application into a separate `neon_sakura` gem that can be reused across multiple Rails projects.
5
+
6
+ ## Analyzed Components
7
+
8
+ ### Core CSS Structure
9
+ Based on my analysis, the application uses a modular CSS approach with the following files:
10
+ - `app/assets/stylesheets/application.css` - Main manifest file
11
+ - `app/assets/stylesheets/base.css` - Core utility classes (713 lines)
12
+ - `app/assets/stylesheets/components.css` - UI components (278 lines)
13
+ - `app/assets/stylesheets/forms.css` - Form styling (87 lines)
14
+ - `app/assets/stylesheets/pagy-tailwind.css` - Pagination styles (65 lines)
15
+
16
+ ### Layout Components
17
+ - `app/views/layouts/mission_control/jobs/application.html.erb` - Mission Control layout with custom dropdown JavaScript
18
+ - `app/views/layouts/error.html.erb` - Error page layout
19
+ - `app/views/shared/_footer.html.erb` - Site footer component
20
+ - `app/views/shared/icons/*.html.erb` - SVG icon components
21
+
22
+ ### Authentication Views
23
+ - `app/views/devise/sessions/new.html.erb` - Login form with dark theme styling
24
+
25
+ ## Components to Extract
26
+
27
+ ### 1. CSS Stylesheets
28
+ - All CSS files from `app/assets/stylesheets/`
29
+ - `base.css` - Core utilities, layout, typography, colors, responsive utilities
30
+ - `components.css` - UI components (navigation, cards, badges, buttons, tables, alerts)
31
+ - `forms.css` - Form element styling
32
+ - `pagy-tailwind.css` - Pagination styles
33
+
34
+ ### 2. Layout Templates
35
+ - `app/views/layouts/mission_control/jobs/application.html.erb` - Mission Control layout
36
+ - `app/views/layouts/error.html.erb` - Error page layout
37
+
38
+ ### 3. View Components
39
+ - `app/views/shared/icons/` - All SVG icon partials (29 files)
40
+ - `app/views/shared/_footer.html.erb` - Site footer
41
+
42
+ ### 4. JavaScript Components (if needed)
43
+ - Mission Control dropdown JavaScript from layout (vanilla JS, not Stimulus)
44
+ - May need to preserve it in a separate JS file
45
+
46
+ ## Implementation Approach
47
+
48
+ ### Step 1: Create Gem Structure
49
+ ```
50
+ neon_sakura/
51
+ ├── lib/
52
+ │ ├── neon_sakura/
53
+ │ │ ├── version.rb
54
+ │ │ └── engine.rb
55
+ │ └── neon_sakura.rb
56
+ ├── app/
57
+ │ ├── assets/
58
+ │ │ ├── stylesheets/
59
+ │ │ │ ├── application.css
60
+ │ │ │ ├── base.css
61
+ │ │ │ ├── components.css
62
+ │ │ │ ├── forms.css
63
+ │ │ │ └── pagy-tailwind.css
64
+ │ │ └── javascripts/
65
+ │ │ └── neon_sakura/
66
+ │ │ └── dropdown.js
67
+ │ └── views/
68
+ │ └── shared/
69
+ │ └── icons/
70
+ ├── neon_sakura.gemspec
71
+ ├── Gemfile
72
+ ├── Rakefile
73
+ └── README.md
74
+ ```
75
+
76
+ ### Step 2: Extract CSS Files
77
+ - Copy all CSS files to gem's `app/assets/stylesheets/`
78
+ - Update `application.css` to `@import` the extracted files
79
+ - Update import paths for proper gem resolution
80
+
81
+ ### Step 3: Extract Layouts and Partials
82
+ - Extract the layout templates to gem's `app/views/layouts/`
83
+ - Extract icon components to gem's `app/views/shared/icons/`
84
+ - Extract footer component to gem's `app/views/shared/`
85
+
86
+ ### Step 4: JavaScript Components
87
+ - Place dropdown JavaScript in `app/assets/javascripts/neon_sakura/dropdown.js`
88
+ - Ensure proper dependency management
89
+
90
+ ### Step 5: Gem Configuration
91
+ - Create gemspec with proper metadata
92
+ - Implement Rails engine to integrate with host application
93
+ - Handle asset precompilation properly
94
+
95
+ ### Step 6: Usage in Host Application
96
+ 1. Add gem to Gemfile: `gem 'neon_sakura'`
97
+ 2. Configure asset pipeline in host app
98
+ 3. Include the gem's assets in application layout
99
+ 4. Use gem-provided layouts and components
100
+
101
+ ### Step 7: Documentation
102
+ - Create comprehensive README
103
+ - Document usage and configuration options
104
+ - Include examples of how to customize theme
105
+
106
+ ## Key Considerations
107
+
108
+ ### Asset Precompilation
109
+ - The gem's assets should be precompilable for production
110
+ - Maintain proper CSS import order for style inheritance
111
+ - Ensure proper handling of digest paths in production
112
+
113
+ ### Layout Integration
114
+ - Mission Control layout has no Stimulus controllers, so it should work with vanilla JS
115
+ - Error layout should work directly without modification
116
+ - Footer and icons should integrate seamlessly
117
+
118
+ ### Customization
119
+ - Allow for theme overrides in host applications
120
+ - Document how to customize design system
121
+ - Support for multiple themes if needed
122
+
123
+ ### File Structure Migration
124
+ - Must maintain backwards compatibility where possible
125
+ - Host application should be able to override gem components
126
+ - Proper handling of relative paths in different environments
127
+
128
+ ## Dependencies
129
+ - Rails 8+
130
+ - Propshaft asset pipeline
131
+ - Modern browsers for CSS features used
132
+
133
+ ## Benefits
134
+ 1. Reusability across multiple projects
135
+ 2. Consistent theming across applications
136
+ 3. Easier maintenance of shared styling components
137
+ 4. Better separation of concerns
138
+ 5. Version control and deployment of theme components