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.
- checksums.yaml +7 -0
- data/.ai-reviewer/README.md +182 -0
- data/.ai-reviewer/ai-reviewer.sh +56 -0
- data/.ai-reviewer/build-system-prompt.sh +136 -0
- data/.ai-reviewer/extract-claude-sections.sh +32 -0
- data/.ai-reviewer/test-ai-reviewer.sh +40 -0
- data/.ai-reviewer-config.yml +190 -0
- data/.github/dependabot.yml +12 -0
- data/.github/settings.yml +70 -0
- data/.github/workflows/ai-pr-review-on-comment.yml +384 -0
- data/.github/workflows/ai-pr-review.yml +328 -0
- data/.github/workflows/license-check.yml +78 -0
- data/.github/workflows/lint.yml +79 -0
- data/.github/workflows/security.yml +131 -0
- data/.github/workflows/semgrep.yml +26 -0
- data/.github/workflows/test.yml +44 -0
- data/.gitignore +75 -0
- data/.rubocop.yml +33 -0
- data/.ruby-version +1 -0
- data/.simplecov +14 -0
- data/.stylelintignore +10 -0
- data/.stylelintrc.json +37 -0
- data/AGENTS.md +51 -0
- data/CHANGELOG.md +568 -0
- data/CLAUDE.md +632 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +327 -0
- data/LICENSE +21 -0
- data/README.md +1209 -0
- data/Rakefile +25 -0
- data/app/assets/images/cherry_blossom.svg +1525 -0
- data/app/assets/images/cherry_blossom_tree.png +0 -0
- data/app/assets/images/prysm-icon.png +0 -0
- data/app/assets/stylesheets/base.css +29 -0
- data/app/assets/stylesheets/components.css +1652 -0
- data/app/assets/stylesheets/forms.css +152 -0
- data/app/assets/stylesheets/loading.css +145 -0
- data/app/assets/stylesheets/neon_sakura.css +40 -0
- data/app/assets/stylesheets/pagy-tailwind.css +120 -0
- data/app/assets/stylesheets/theme-default.css +40 -0
- data/app/assets/stylesheets/theme-green.css +84 -0
- data/app/assets/stylesheets/theme-purple.css +94 -0
- data/app/assets/stylesheets/theme-red.css +84 -0
- data/app/assets/stylesheets/utility-borders.css +29 -0
- data/app/assets/stylesheets/utility-colors.css +185 -0
- data/app/assets/stylesheets/utility-effects.css +123 -0
- data/app/assets/stylesheets/utility-gradients.css +158 -0
- data/app/assets/stylesheets/utility-layout.css +132 -0
- data/app/assets/stylesheets/utility-reset.css +13 -0
- data/app/assets/stylesheets/utility-responsive.css +145 -0
- data/app/assets/stylesheets/utility-sizing.css +99 -0
- data/app/assets/stylesheets/utility-spacing.css +174 -0
- data/app/assets/stylesheets/utility-typography.css +97 -0
- data/app/controllers/errors_controller.rb +120 -0
- data/app/controllers/style_guide_controller.rb +117 -0
- data/app/helpers/errors_helper.rb +12 -0
- data/app/helpers/neon_sakura/navbar_helper.rb +43 -0
- data/app/helpers/style_guide_helper.rb +36 -0
- data/app/javascript/neon_sakura/dropdown.js +22 -0
- data/app/javascript/neon_sakura/navbar.js +71 -0
- data/app/javascript/neon_sakura/theme_switcher.js +187 -0
- data/app/views/errors/show.html.erb +105 -0
- data/app/views/layouts/error.html.erb +19 -0
- data/app/views/layouts/mission_control/jobs/_application_selection.html.erb +14 -0
- data/app/views/layouts/mission_control/jobs/_navigation.html.erb +21 -0
- data/app/views/layouts/mission_control/jobs/application.html.erb +453 -0
- data/app/views/layouts/style_guide.html.erb +416 -0
- data/app/views/shared/_file_upload.html.erb +184 -0
- data/app/views/shared/_footer.html.erb +23 -0
- data/app/views/shared/_header.html.erb +42 -0
- data/app/views/shared/_navbar.html.erb +306 -0
- data/app/views/shared/_profile_image_selector.html.erb +165 -0
- data/app/views/shared/_theme_switcher.html.erb +64 -0
- data/app/views/shared/icons/_adjustments.html.erb +10 -0
- data/app/views/shared/icons/_alert_circle.html.erb +3 -0
- data/app/views/shared/icons/_alert_triangle.html.erb +3 -0
- data/app/views/shared/icons/_archive.html.erb +3 -0
- data/app/views/shared/icons/_arrow_down.html.erb +3 -0
- data/app/views/shared/icons/_arrow_left.html.erb +3 -0
- data/app/views/shared/icons/_arrow_up.html.erb +3 -0
- data/app/views/shared/icons/_arrows_pointing_in.html.erb +10 -0
- data/app/views/shared/icons/_arrows_pointing_out.html.erb +10 -0
- data/app/views/shared/icons/_artemis_logo.html.erb +26 -0
- data/app/views/shared/icons/_auth_banner.html.erb +1 -0
- data/app/views/shared/icons/_bars.html.erb +10 -0
- data/app/views/shared/icons/_bell.html.erb +3 -0
- data/app/views/shared/icons/_book.html.erb +3 -0
- data/app/views/shared/icons/_bookmark.html.erb +3 -0
- data/app/views/shared/icons/_box.html.erb +3 -0
- data/app/views/shared/icons/_brain.html.erb +3 -0
- data/app/views/shared/icons/_briefcase.html.erb +3 -0
- data/app/views/shared/icons/_calendar.html.erb +3 -0
- data/app/views/shared/icons/_camera.html.erb +4 -0
- data/app/views/shared/icons/_chart_bar.html.erb +3 -0
- data/app/views/shared/icons/_chart_line.html.erb +10 -0
- data/app/views/shared/icons/_chart_pie.html.erb +11 -0
- data/app/views/shared/icons/_chat.html.erb +3 -0
- data/app/views/shared/icons/_check.html.erb +3 -0
- data/app/views/shared/icons/_check_circle.html.erb +3 -0
- data/app/views/shared/icons/_cherry_blossom.html.erb +1516 -0
- data/app/views/shared/icons/_cherry_blossom_silhouette.html.erb +1016 -0
- data/app/views/shared/icons/_cherry_blossom_single_flower.html.erb +1125 -0
- data/app/views/shared/icons/_cherry_blossom_tree.html.erb +159 -0
- data/app/views/shared/icons/_chevron_down.html.erb +3 -0
- data/app/views/shared/icons/_chevron_right.html.erb +9 -0
- data/app/views/shared/icons/_clipboard.html.erb +3 -0
- data/app/views/shared/icons/_clock.html.erb +3 -0
- data/app/views/shared/icons/_close.html.erb +3 -0
- data/app/views/shared/icons/_cog.html.erb +4 -0
- data/app/views/shared/icons/_crop.html.erb +10 -0
- data/app/views/shared/icons/_crown.html.erb +3 -0
- data/app/views/shared/icons/_disc.html.erb +3 -0
- data/app/views/shared/icons/_download.html.erb +3 -0
- data/app/views/shared/icons/_dragonfly.html.erb +58 -0
- data/app/views/shared/icons/_duplicate.html.erb +4 -0
- data/app/views/shared/icons/_edit.html.erb +3 -0
- data/app/views/shared/icons/_envelope.html.erb +3 -0
- data/app/views/shared/icons/_eraser.html.erb +10 -0
- data/app/views/shared/icons/_external_link.html.erb +3 -0
- data/app/views/shared/icons/_eye.html.erb +4 -0
- data/app/views/shared/icons/_file_csv.html.erb +10 -0
- data/app/views/shared/icons/_file_export.html.erb +10 -0
- data/app/views/shared/icons/_file_image.html.erb +10 -0
- data/app/views/shared/icons/_file_import.html.erb +10 -0
- data/app/views/shared/icons/_file_question.html.erb +6 -0
- data/app/views/shared/icons/_film.html.erb +3 -0
- data/app/views/shared/icons/_filter.html.erb +3 -0
- data/app/views/shared/icons/_folder.html.erb +3 -0
- data/app/views/shared/icons/_folder_open.html.erb +3 -0
- data/app/views/shared/icons/_folder_plus.html.erb +3 -0
- data/app/views/shared/icons/_globe.html.erb +3 -0
- data/app/views/shared/icons/_google.html.erb +11 -0
- data/app/views/shared/icons/_heart.html.erb +3 -0
- data/app/views/shared/icons/_heart_broken.html.erb +11 -0
- data/app/views/shared/icons/_heart_pulse.html.erb +4 -0
- data/app/views/shared/icons/_history.html.erb +11 -0
- data/app/views/shared/icons/_home.html.erb +10 -0
- data/app/views/shared/icons/_image.html.erb +3 -0
- data/app/views/shared/icons/_inbox.html.erb +3 -0
- data/app/views/shared/icons/_info_circle.html.erb +10 -0
- data/app/views/shared/icons/_key.html.erb +3 -0
- data/app/views/shared/icons/_layers.html.erb +10 -0
- data/app/views/shared/icons/_lightbulb.html.erb +10 -0
- data/app/views/shared/icons/_lightning.html.erb +3 -0
- data/app/views/shared/icons/_list.html.erb +3 -0
- data/app/views/shared/icons/_lock.html.erb +3 -0
- data/app/views/shared/icons/_logout.html.erb +3 -0
- data/app/views/shared/icons/_magazine.html.erb +3 -0
- data/app/views/shared/icons/_magic.html.erb +3 -0
- data/app/views/shared/icons/_minus.html.erb +10 -0
- data/app/views/shared/icons/_mobile.html.erb +10 -0
- data/app/views/shared/icons/_moon.html.erb +3 -0
- data/app/views/shared/icons/_network.html.erb +10 -0
- data/app/views/shared/icons/_new_item_banner.html.erb +1 -0
- data/app/views/shared/icons/_ouroboros.html.erb +24 -0
- data/app/views/shared/icons/_package.html.erb +3 -0
- data/app/views/shared/icons/_palette.html.erb +3 -0
- data/app/views/shared/icons/_paper_plane.html.erb +10 -0
- data/app/views/shared/icons/_photo.html.erb +10 -0
- data/app/views/shared/icons/_play.html.erb +4 -0
- data/app/views/shared/icons/_plus.html.erb +3 -0
- data/app/views/shared/icons/_pocket.html.erb +11 -0
- data/app/views/shared/icons/_prysm-icon.html.erb +34 -0
- data/app/views/shared/icons/_prysm.html.erb +13 -0
- data/app/views/shared/icons/_pushbullet-1.html.erb +29 -0
- data/app/views/shared/icons/_pushbullet-2.html.erb +2 -0
- data/app/views/shared/icons/_puzzle.html.erb +10 -0
- data/app/views/shared/icons/_qrcode.html.erb +3 -0
- data/app/views/shared/icons/_question.html.erb +3 -0
- data/app/views/shared/icons/_receipt.html.erb +10 -0
- data/app/views/shared/icons/_redo.html.erb +3 -0
- data/app/views/shared/icons/_refresh.html.erb +3 -0
- data/app/views/shared/icons/_rocket.html.erb +10 -0
- data/app/views/shared/icons/_rss.html.erb +3 -0
- data/app/views/shared/icons/_save.html.erb +3 -0
- data/app/views/shared/icons/_search.html.erb +3 -0
- data/app/views/shared/icons/_search_minus.html.erb +10 -0
- data/app/views/shared/icons/_search_plus.html.erb +10 -0
- data/app/views/shared/icons/_server_error.html.erb +6 -0
- data/app/views/shared/icons/_share.html.erb +3 -0
- data/app/views/shared/icons/_shield_check.html.erb +3 -0
- data/app/views/shared/icons/_sign_in.html.erb +3 -0
- data/app/views/shared/icons/_spinner.html.erb +4 -0
- data/app/views/shared/icons/_star.html.erb +3 -0
- data/app/views/shared/icons/_store.html.erb +10 -0
- data/app/views/shared/icons/_sun.html.erb +3 -0
- data/app/views/shared/icons/_sync.html.erb +3 -0
- data/app/views/shared/icons/_table.html.erb +3 -0
- data/app/views/shared/icons/_tag.html.erb +3 -0
- data/app/views/shared/icons/_tags.html.erb +11 -0
- data/app/views/shared/icons/_tools.html.erb +4 -0
- data/app/views/shared/icons/_trash.html.erb +3 -0
- data/app/views/shared/icons/_undo.html.erb +3 -0
- data/app/views/shared/icons/_unlock.html.erb +3 -0
- data/app/views/shared/icons/_upload.html.erb +3 -0
- data/app/views/shared/icons/_user.html.erb +3 -0
- data/app/views/shared/icons/_user_circle.html.erb +10 -0
- data/app/views/shared/icons/_user_plus.html.erb +10 -0
- data/app/views/shared/icons/_video.html.erb +3 -0
- data/app/views/shared/icons/_wrench.html.erb +11 -0
- data/app/views/style_guide/index.html.erb +77 -0
- data/app/views/style_guide/sections/_alerts.html.erb +114 -0
- data/app/views/style_guide/sections/_badges.html.erb +78 -0
- data/app/views/style_guide/sections/_buttons.html.erb +130 -0
- data/app/views/style_guide/sections/_cards.html.erb +84 -0
- data/app/views/style_guide/sections/_colors.html.erb +106 -0
- data/app/views/style_guide/sections/_file_upload.html.erb +135 -0
- data/app/views/style_guide/sections/_forms.html.erb +129 -0
- data/app/views/style_guide/sections/_gradients.html.erb +253 -0
- data/app/views/style_guide/sections/_header.html.erb +12 -0
- data/app/views/style_guide/sections/_icons.html.erb +55 -0
- data/app/views/style_guide/sections/_images.html.erb +40 -0
- data/app/views/style_guide/sections/_loading.html.erb +242 -0
- data/app/views/style_guide/sections/_pagination.html.erb +212 -0
- data/app/views/style_guide/sections/_profile_components.html.erb +203 -0
- data/app/views/style_guide/sections/_theme_switcher.html.erb +72 -0
- data/app/views/style_guide/sections/_typography.html.erb +65 -0
- data/bin/ai-optimize-claude-md +540 -0
- data/bin/ai-review-local +345 -0
- data/bin/ai-security-review +585 -0
- data/bin/brakeman +9 -0
- data/bin/install-hooks +57 -0
- data/bin/rake +7 -0
- data/bin/rubocop +10 -0
- data/bin/verify_setup.rb +31 -0
- data/config/brakeman.ignore +28 -0
- data/config/initializers/neon_sakura.rb +15 -0
- data/config/license_overrides.yml +13 -0
- data/config/routes.rb +21 -0
- data/config/theme_mappings.yml +61 -0
- data/docs/PRYSM_ASSETS.md +210 -0
- data/docs/plans/extract_ai_reviewer_plan.md +151 -0
- data/docs/plans/neon_sakura_gem_plan.md +138 -0
- data/lib/neon_sakura/configuration.rb +94 -0
- data/lib/neon_sakura/engine.rb +48 -0
- data/lib/neon_sakura/icon_helper.rb +54 -0
- data/lib/neon_sakura/profile_helper.rb +24 -0
- data/lib/neon_sakura/stylesheet_helper.rb +40 -0
- data/lib/neon_sakura/theme_helper.rb +63 -0
- data/lib/neon_sakura/theme_importer.rb +112 -0
- data/lib/neon_sakura/version.rb +5 -0
- data/lib/neon_sakura.rb +13 -0
- data/neon_sakura.gemspec +50 -0
- data/package.json +18 -0
- data/scripts/git-hooks/post-merge +132 -0
- data/scripts/git-hooks/pre-commit +123 -0
- data/scripts/git-hooks/pre-push +127 -0
- data/scripts/license-check.rb +587 -0
- data/settings.local.json +12 -0
- data/yarn.lock +778 -0
- 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
|