better_ui 0.5.0 → 0.5.1

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +137 -245
  3. data/app/assets/stylesheets/better_ui/_base.scss +9 -0
  4. data/app/assets/stylesheets/better_ui/_components.scss +2 -0
  5. data/app/assets/stylesheets/better_ui/_utilities.scss +14 -0
  6. data/app/assets/stylesheets/better_ui/application.css +3 -1
  7. data/app/assets/stylesheets/better_ui/components/_avatar.scss +200 -0
  8. data/app/assets/stylesheets/better_ui/components/_badge.scss +154 -0
  9. data/app/assets/stylesheets/better_ui/components/_breadcrumb.scss +106 -0
  10. data/app/assets/stylesheets/better_ui/components/_button.scss +105 -0
  11. data/app/assets/stylesheets/better_ui/components/_card.scss +60 -0
  12. data/app/assets/stylesheets/better_ui/components/_heading.scss +81 -0
  13. data/app/assets/stylesheets/better_ui/components/_icon.scss +134 -0
  14. data/app/assets/stylesheets/better_ui/components/_index.scss +17 -0
  15. data/app/assets/stylesheets/better_ui/components/_link.scss +100 -0
  16. data/app/assets/stylesheets/better_ui/components/_panel.scss +104 -0
  17. data/app/assets/stylesheets/better_ui/components/_spinner.scss +129 -0
  18. data/app/assets/stylesheets/better_ui/components/_table.scss +156 -0
  19. data/app/assets/stylesheets/better_ui/components/_variables.scss +1 -0
  20. data/app/assets/stylesheets/better_ui.scss +4 -0
  21. data/app/components/better_ui/general/avatar_component.html.erb +2 -2
  22. data/app/components/better_ui/general/avatar_component.rb +29 -29
  23. data/app/components/better_ui/general/badge_component.html.erb +3 -3
  24. data/app/components/better_ui/general/badge_component.rb +32 -20
  25. data/app/components/better_ui/general/breadcrumb_component.html.erb +2 -2
  26. data/app/components/better_ui/general/breadcrumb_component.rb +23 -23
  27. data/app/components/better_ui/general/button_component.html.erb +6 -6
  28. data/app/components/better_ui/general/button_component.rb +20 -22
  29. data/app/components/better_ui/general/heading_component.html.erb +1 -25
  30. data/app/components/better_ui/general/heading_component.rb +17 -116
  31. data/app/components/better_ui/general/icon_component.html.erb +1 -1
  32. data/app/components/better_ui/general/icon_component.rb +33 -56
  33. data/app/components/better_ui/general/link_component.html.erb +4 -4
  34. data/app/components/better_ui/general/link_component.rb +28 -28
  35. data/app/components/better_ui/general/panel_component.rb +30 -41
  36. data/app/components/better_ui/general/spinner_component.html.erb +3 -3
  37. data/app/components/better_ui/general/spinner_component.rb +13 -13
  38. data/app/components/better_ui/general/table_component.rb +35 -59
  39. data/app/helpers/better_ui/general/components/avatar_helper.rb +17 -0
  40. data/app/helpers/better_ui/general/components/badge_helper.rb +17 -0
  41. data/app/helpers/better_ui/general/components/breadcrumb_helper.rb +17 -0
  42. data/app/helpers/better_ui/general/components/button_helper.rb +17 -0
  43. data/app/helpers/better_ui/general/components/heading_helper.rb +17 -0
  44. data/app/helpers/better_ui/general/components/icon_helper.rb +17 -0
  45. data/app/helpers/better_ui/general/components/link_helper.rb +17 -0
  46. data/app/helpers/better_ui/general/components/panel_helper.rb +16 -0
  47. data/app/helpers/better_ui/general/components/spinner_helper.rb +17 -0
  48. data/app/helpers/better_ui/general/components/table_helper.rb +17 -0
  49. data/app/helpers/better_ui/general_helper.rb +15 -0
  50. data/app/helpers/better_ui_helper.rb +12 -0
  51. data/config/routes.rb +2 -13
  52. data/lib/better_ui/engine.rb +67 -11
  53. data/lib/better_ui/version.rb +1 -1
  54. data/lib/better_ui.rb +10 -2
  55. data/lib/generators/better_ui/install_generator.rb +103 -0
  56. data/lib/generators/better_ui/stylesheet_generator.rb +93 -30
  57. data/lib/generators/better_ui/templates/README +74 -5
  58. data/lib/generators/better_ui/templates/components/_avatar.scss +199 -150
  59. data/lib/generators/better_ui/templates/components/_badge.scss +153 -141
  60. data/lib/generators/better_ui/templates/components/_breadcrumb.scss +105 -106
  61. data/lib/generators/better_ui/templates/components/_button.scss +104 -101
  62. data/lib/generators/better_ui/templates/components/_card.scss +56 -65
  63. data/lib/generators/better_ui/templates/components/_heading.scss +80 -179
  64. data/lib/generators/better_ui/templates/components/_icon.scss +133 -89
  65. data/lib/generators/better_ui/templates/components/_index.scss +17 -0
  66. data/lib/generators/better_ui/templates/components/_link.scss +99 -129
  67. data/lib/generators/better_ui/templates/components/_panel.scss +103 -143
  68. data/lib/generators/better_ui/templates/components/_spinner.scss +127 -130
  69. data/lib/generators/better_ui/templates/components/_table.scss +156 -105
  70. data/lib/generators/better_ui/templates/components/_variables.scss +0 -33
  71. data/lib/generators/better_ui/templates/components_stylesheet.scss +25 -56
  72. data/lib/generators/better_ui/templates/index.scss +18 -0
  73. data/lib/generators/better_ui/templates/initializer.rb +41 -0
  74. metadata +91 -49
  75. data/app/assets/javascripts/better_ui/controllers/navbar_controller.js +0 -138
  76. data/app/assets/javascripts/better_ui/controllers/sidebar_controller.js +0 -211
  77. data/app/assets/javascripts/better_ui/controllers/toast_controller.js +0 -161
  78. data/app/assets/javascripts/better_ui/index.js +0 -159
  79. data/app/assets/javascripts/better_ui/toast_manager.js +0 -77
  80. data/app/components/better_ui/theme_helper.rb +0 -171
  81. data/app/controllers/better_ui/docs_controller.rb +0 -34
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module IconHelper
5
+ def bui_icon(name = nil, **options)
6
+ render BetterUi::General::IconComponent.new(
7
+ name: name,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_icon, :bui_icon
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module LinkHelper
5
+ def bui_link(label = nil, **options)
6
+ render BetterUi::General::LinkComponent.new(
7
+ label: label,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_link, :bui_link
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module PanelHelper
5
+ def bui_panel(**options, &block)
6
+ render BetterUi::General::PanelComponent.new(
7
+ **options
8
+ ), &block
9
+ end
10
+
11
+ # Supporto per la sintassi originale per compatibilità
12
+ alias_method :better_ui_general_panel, :bui_panel
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module SpinnerHelper
5
+ def bui_spinner(label = nil, **options)
6
+ render BetterUi::General::SpinnerComponent.new(
7
+ label: label,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_spinner, :bui_spinner
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module TableHelper
5
+ def bui_table(data = nil, **options, &block)
6
+ render BetterUi::General::TableComponent.new(
7
+ data: data,
8
+ **options
9
+ ), &block
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_table, :bui_table
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module BetterUi
2
+ module GeneralHelper
3
+ # Inclusione di tutti i componenti general
4
+ include BetterUi::General::Components::ButtonHelper
5
+ include BetterUi::General::Components::IconHelper
6
+ include BetterUi::General::Components::LinkHelper
7
+ include BetterUi::General::Components::BadgeHelper
8
+ include BetterUi::General::Components::AvatarHelper
9
+ include BetterUi::General::Components::TableHelper
10
+ include BetterUi::General::Components::SpinnerHelper
11
+ include BetterUi::General::Components::HeadingHelper
12
+ include BetterUi::General::Components::PanelHelper
13
+ include BetterUi::General::Components::BreadcrumbHelper
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module BetterUi
2
+ # Includi esplicitamente il GeneralHelper
3
+ require_relative 'better_ui/general_helper'
4
+
5
+ module Helper
6
+ # Estendi il modulo con ActiveSupport::Concern per funzionalità helper
7
+ extend ActiveSupport::Concern
8
+
9
+ # Includi gli helper disponibili
10
+ include BetterUi::GeneralHelper
11
+ end
12
+ end
data/config/routes.rb CHANGED
@@ -1,15 +1,4 @@
1
1
  BetterUi::Engine.routes.draw do
2
- # Route principale per la documentazione
3
- root to: 'docs#index'
4
-
5
- # Route per le pagine di documentazione generiche
6
- get 'docs/:page', to: 'docs#show', as: :docs_page
7
-
8
- # Route specifica per i componenti
9
- get 'docs/components/:component', to: 'docs#component', as: :docs_component
10
-
11
- # Montaggio di Lookbook per lo sviluppo e il test
12
- if Rails.env.development? || Rails.env.test?
13
- mount Lookbook::Engine, at: "/lookbook"
14
- end
2
+ # Montaggio di Lookbook come root
3
+ mount Lookbook::Engine, at: "/"
15
4
  end
@@ -3,43 +3,99 @@ require 'redcarpet'
3
3
  require 'tailwindcss-rails'
4
4
  require 'coderay'
5
5
  require 'font-awesome-sass'
6
- require 'lookbook'
7
- require 'listen'
8
- require 'action_cable'
6
+ begin
7
+ require 'lookbook'
8
+ rescue LoadError
9
+ # Lookbook non è richiesto, è una dipendenza opzionale
10
+ end
11
+ begin
12
+ require 'listen'
13
+ rescue LoadError
14
+ # Listen non è richiesto, è una dipendenza opzionale
15
+ end
16
+ begin
17
+ require 'action_cable'
18
+ rescue LoadError
19
+ # ActionCable non è richiesto, è una dipendenza opzionale
20
+ end
9
21
 
10
22
  module BetterUi
23
+ # Engine Rails per Better UI
24
+ # Gestisce l'isolamento del namespace, le dipendenze, gli asset e le configurazioni
11
25
  class Engine < ::Rails::Engine
12
26
  isolate_namespace BetterUi
13
27
 
14
28
  # Configurazione per rendere disponibili gli assets all'applicazione host
15
29
  initializer 'better_ui.assets' do |app|
30
+ # Aggiungi i percorsi asset
16
31
  app.config.assets.paths << root.join('app', 'assets', 'stylesheets')
17
32
  app.config.assets.paths << root.join('app', 'assets', 'images')
33
+ app.config.assets.paths << root.join('app', 'assets', 'fonts')
34
+
35
+ # Aggiungi i file SCSS e CSS alla precompilazione
36
+ if app.config.respond_to?(:assets)
37
+ app.config.assets.precompile += %w(
38
+ better_ui/application.css
39
+ better_ui/components/*.css
40
+ better_ui/components/**/*.css
41
+ better_ui/components/index.css
42
+ )
43
+ end
44
+
45
+ # Configurazione per Propshaft se disponibile
46
+ if defined?(Propshaft) && app.config.respond_to?(:asset_host)
47
+ app.config.asset_host = app.config.asset_host
48
+ end
18
49
  end
19
50
 
20
51
  # Assicuriamo che gli helper siano correttamente caricati
21
52
  config.autoload_paths << root.join('app', 'helpers')
53
+ config.eager_load_paths << root.join('app', 'helpers')
22
54
 
23
- # Configurazione per rendere disponibili i componenti all'applicazione host
24
- initializer 'better_ui.view_helpers' do
25
- require_relative '../../app/helpers/better_ui_application_helper'
55
+ # Caricamento dei componenti helper
56
+ initializer 'better_ui.load_helpers', before: :load_config_initializers do
57
+ # Carica prima i componenti singoli
58
+ Dir.glob(root.join('app/helpers/better_ui/general/components/*.rb')).sort.each do |component|
59
+ require component
60
+ end
61
+
62
+ # Poi carica il general_helper che li unisce tutti
63
+ require_relative '../../app/helpers/better_ui/general_helper' if File.exist?(root.join('app/helpers/better_ui/general_helper.rb'))
26
64
 
65
+ # Infine carica il modulo principale
66
+ require_relative '../../app/helpers/better_ui_helper' if File.exist?(root.join('app/helpers/better_ui_helper.rb'))
67
+ end
68
+
69
+ # Configurazione per rendere disponibili i componenti all'applicazione host
70
+ initializer 'better_ui.view_helpers' do
27
71
  ActiveSupport.on_load :action_controller do
28
- helper BetterUi::ApplicationHelper
72
+ helper BetterUi::Helper if defined?(BetterUi::Helper)
29
73
  end
30
74
 
31
75
  ActiveSupport.on_load :action_view do
32
- include BetterUi::ApplicationHelper
76
+ include BetterUi::Helper if defined?(BetterUi::Helper)
33
77
  end
34
78
  end
35
79
 
36
80
  # Configurazione per ViewComponent
81
+ config.view_component.preview_paths ||= []
37
82
  config.view_component.preview_paths << root.join('test', 'components', 'previews')
38
83
 
39
84
  # Configurazione per Lookbook in sviluppo e test
40
- initializer 'better_ui.lookbook' do
41
- if Rails.env.development? || Rails.env.test?
42
- config.lookbook = Lookbook
85
+ if defined?(Lookbook)
86
+ initializer 'better_ui.lookbook' do
87
+ if Rails.env.development? || Rails.env.test?
88
+ config.lookbook = Lookbook
89
+ end
90
+ end
91
+ end
92
+
93
+ # Configurazione per l'uso personalizzato dei componenti
94
+ initializer 'better_ui.custom_configuration', before: :load_config_initializers do |app|
95
+ app.config.to_prepare do
96
+ BetterUi.configure do |config|
97
+ # Configurazione di default, può essere sovrascritta dall'applicazione host
98
+ end
43
99
  end
44
100
  end
45
101
  end
@@ -1,3 +1,3 @@
1
1
  module BetterUi
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
data/lib/better_ui.rb CHANGED
@@ -21,9 +21,17 @@ module BetterUi
21
21
  def configure
22
22
  yield(configuration) if block_given?
23
23
  end
24
+
25
+ # Metodo utile per accedere al percorso degli stilesheets
26
+ def stylesheets_path
27
+ File.join(File.dirname(__FILE__), '..', 'app', 'assets', 'stylesheets')
28
+ end
24
29
  end
25
30
  end
26
31
 
27
- # Caricamento del generator
32
+ # Caricamento dei generator
28
33
  require 'rails/generators'
29
- require 'generators/better_ui/stylesheet_generator' if defined?(Rails::Generators)
34
+ if defined?(Rails::Generators)
35
+ require 'generators/better_ui/stylesheet_generator'
36
+ require 'generators/better_ui/install_generator'
37
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module Generators
5
+ # Generatore per l'installazione di Better UI in un'applicazione Rails
6
+ #
7
+ # Questo generatore:
8
+ # 1. Aggiunge le dipendenze necessarie
9
+ # 2. Monta l'engine nelle routes
10
+ # 3. Aggiunge gli asset all'applicazione
11
+ # 4. Crea un file di configurazione initializer
12
+ # 5. Genera i file di stile personalizzabili (opzionalmente)
13
+ class InstallGenerator < Rails::Generators::Base
14
+ source_root File.expand_path('templates', __dir__)
15
+
16
+ desc "Installa Better UI nell'applicazione Rails"
17
+
18
+ class_option :skip_routes, type: :boolean, default: false,
19
+ desc: "Salta l'aggiunta del mount engine nelle routes"
20
+ class_option :skip_stylesheets, type: :boolean, default: false,
21
+ desc: "Salta la generazione dei file di stile personalizzabili"
22
+ class_option :skip_config, type: :boolean, default: false,
23
+ desc: "Salta la creazione del file di configurazione"
24
+
25
+ def mount_engine
26
+ return if options[:skip_routes]
27
+
28
+ route_file = "config/routes.rb"
29
+
30
+ if File.exist?(route_file)
31
+ mount_code = " mount BetterUi::Engine => '/better_ui'"
32
+
33
+ append_to_file route_file, injectible_routes(mount_code)
34
+
35
+ say "Engine di Better UI montato in #{route_file}", :green
36
+ else
37
+ say "File routes.rb non trovato. Salta il montaggio dell'engine.", :yellow
38
+ end
39
+ end
40
+
41
+ def copy_initializer
42
+ return if options[:skip_config]
43
+
44
+ template "initializer.rb", "config/initializers/better_ui.rb"
45
+ say "File di configurazione creato in config/initializers/better_ui.rb", :green
46
+ end
47
+
48
+ def add_assets
49
+ application_css = "app/assets/stylesheets/application.css"
50
+ application_scss = "app/assets/stylesheets/application.scss"
51
+
52
+ file_to_update = if File.exist?(application_scss)
53
+ application_scss
54
+ elsif File.exist?(application_css)
55
+ application_css
56
+ else
57
+ nil
58
+ end
59
+
60
+ if file_to_update
61
+ if file_to_update.end_with?('.css')
62
+ inject_into_file file_to_update, " *= require better_ui/application\n", before: " */\n"
63
+ else
64
+ append_to_file file_to_update, "\n@import 'better_ui/application';\n"
65
+ end
66
+
67
+ say "Better UI assets aggiunti a #{file_to_update}", :green
68
+ else
69
+ say "File CSS dell'applicazione non trovato. Salta l'aggiunta degli assets.", :yellow
70
+ end
71
+ end
72
+
73
+ def create_stylesheets
74
+ return if options[:skip_stylesheets]
75
+
76
+ generate "better_ui:stylesheet"
77
+ say "Fogli di stile personalizzabili generati", :green
78
+ end
79
+
80
+ def show_instructions
81
+ say "\n========================================================", :green
82
+ say "Better UI installato con successo!", :green
83
+ say "========================================================", :green
84
+ say "\nPer utilizzare i componenti nella tua applicazione:", :blue
85
+ say "- Accedi a http://localhost:3000/better_ui per vedere la documentazione", :blue
86
+ say "- Utilizza i componenti nel tuo codice, ad esempio:", :blue
87
+ say " <%= render BetterUi::General::ButtonComponent.new(label: 'Clicca qui') %>", :blue
88
+ say "\nPer personalizzare i componenti, modifica i file in:", :blue
89
+ say " app/assets/stylesheets/components/", :blue
90
+ say "- I file *_overrides.scss contengono le classi vuote per le personalizzazioni", :blue
91
+ say "\nPer configurare i valori predefiniti, modifica:", :blue
92
+ say " config/initializers/better_ui.rb", :blue
93
+ say "\n========================================================\n", :green
94
+ end
95
+
96
+ private
97
+
98
+ def injectible_routes(mount_code)
99
+ "\n#{mount_code}\n"
100
+ end
101
+ end
102
+ end
103
+ end
@@ -2,56 +2,71 @@
2
2
 
3
3
  module BetterUi
4
4
  module Generators
5
+ # Generatore per creare file SCSS personalizzati per i componenti BetterUI
6
+ #
7
+ # Questo generatore crea:
8
+ # 1. Un foglio di stile principale che importa tutti i componenti usando @use/@forward
9
+ # 2. File di override per ogni componente che permettono personalizzazioni senza modificare i file originali
10
+ # 3. Un file indice che raccoglie tutti gli override usando @forward
5
11
  class StylesheetGenerator < Rails::Generators::Base
6
12
  source_root File.expand_path('templates', __dir__)
7
13
 
8
- desc "Genera un foglio di stile SCSS di base per personalizzare i componenti di BetterUi"
14
+ desc "Genera un foglio di stile SCSS di base per personalizzare i componenti di BetterUI"
9
15
 
16
+ # Opzioni configurabili
10
17
  class_option :prefix, type: :string, default: "custom",
11
18
  desc: "Prefisso da utilizzare per il foglio di stile (default: 'custom')"
19
+ class_option :path, type: :string, default: "app/assets/stylesheets",
20
+ desc: "Path dove installare i file CSS all'interno della cartella app (default: 'app/assets/stylesheets')"
12
21
 
22
+ # Lista dei file dei componenti da gestire
23
+ COMPONENT_FILES = [
24
+ '_variables.scss',
25
+ '_button.scss',
26
+ '_heading.scss',
27
+ '_breadcrumb.scss',
28
+ '_link.scss',
29
+ '_panel.scss',
30
+ '_icon.scss',
31
+ '_table.scss',
32
+ '_badge.scss',
33
+ '_spinner.scss',
34
+ '_avatar.scss',
35
+ '_card.scss'
36
+ ].freeze
37
+
38
+ # Crea il foglio di stile principale
13
39
  def create_stylesheet
14
- # Crea il file principale
40
+ # Crea il file principale che importa tutti i componenti
15
41
  template "components_stylesheet.scss",
16
- File.join("app/assets/stylesheets", "#{options[:prefix]}_better_ui_components.scss")
42
+ File.join(options[:path], "#{options[:prefix]}_better_ui.scss")
17
43
 
18
44
  # Crea la directory dei componenti se non esiste
19
- directory = File.join("app/assets/stylesheets", "components")
45
+ directory = File.join(options[:path], "components")
20
46
  FileUtils.mkdir_p(directory) unless File.directory?(directory)
21
47
 
22
- # Lista dei file dei componenti
23
- component_files = ['_variables.scss', '_button.scss', '_heading.scss', '_breadcrumb.scss',
24
- '_link.scss', '_panel.scss', '_icon.scss', '_table.scss', '_badge.scss',
25
- '_spinner.scss', '_avatar.scss']
26
-
27
- # Copia i file originali
28
- component_files.each do |filename|
29
- copy_file "components/#{filename}", File.join(directory, filename)
30
- end
48
+ # Crea il file indice che raccoglie tutti gli override
49
+ template "index.scss", File.join(directory, "_index.scss")
31
50
  end
32
51
 
52
+ # Crea i file di override per ogni componente
33
53
  def create_overrides
34
54
  # Crea la directory dei componenti se non esiste
35
- directory = File.join("app/assets/stylesheets", "components")
55
+ directory = File.join(options[:path], "components")
36
56
  FileUtils.mkdir_p(directory) unless File.directory?(directory)
37
57
 
38
- # Lista dei file dei componenti
39
- component_files = ['_variables.scss', '_button.scss', '_heading.scss', '_breadcrumb.scss',
40
- '_link.scss', '_panel.scss', '_icon.scss', '_table.scss', '_badge.scss',
41
- '_spinner.scss', '_avatar.scss']
42
-
43
- # Crea i file di override
44
- component_files.each do |filename|
45
- # Nome del file di override
58
+ # Crea i file di override per ogni componente
59
+ COMPONENT_FILES.each do |filename|
60
+ # Nome del file di override (es. _button_overrides.scss)
46
61
  override_filename = filename.sub('.scss', '_overrides.scss')
47
62
  override_path = File.join(directory, override_filename)
48
63
 
49
64
  # Crea il file di override solo se non esiste già
50
65
  unless File.exist?(override_path)
51
- # Leggi il contenuto del file originale dalla directory templates
66
+ # Percorso del file template originale
52
67
  template_path = File.join(self.class.source_root, "components", filename)
53
68
 
54
- # Se il file template esiste, crea il file di override
69
+ # Se il file template esiste, crea il file di override basato su di esso
55
70
  if File.exist?(template_path)
56
71
  original_content = File.read(template_path)
57
72
  override_content = generate_empty_override(original_content, filename)
@@ -61,6 +76,7 @@ module BetterUi
61
76
  end
62
77
  end
63
78
 
79
+ # Mostra le istruzioni README dopo l'esecuzione del generatore
64
80
  def show_readme
65
81
  readme "README" if behavior == :invoke
66
82
  end
@@ -68,8 +84,15 @@ module BetterUi
68
84
  private
69
85
 
70
86
  # Genera un file di override vuoto con le stesse classi del file originale
87
+ #
88
+ # @param content [String] Il contenuto del file SCSS originale
89
+ # @param filename [String] Il nome del file del componente
90
+ # @return [String] Il contenuto formattato del file di override
71
91
  def generate_empty_override(content, filename)
92
+ # Estrae il nome del componente dal nome file (es. "_button.scss" -> "button")
72
93
  component_name = filename.sub('_', '').sub('.scss', '')
94
+
95
+ # Intestazione del file di override
73
96
  result = "/* ==============================\n"
74
97
  result += " * #{component_name.capitalize} Component Overrides\n"
75
98
  result += " * ==============================\n"
@@ -77,20 +100,60 @@ module BetterUi
77
100
  result += " * Aggiungi qui le tue personalizzazioni.\n"
78
101
  result += " */\n\n"
79
102
 
80
- # Estrae le classi tramite regex
103
+ # Aggiungiamo il layer di Tailwind se presente nell'originale
104
+ if content.include?('@layer components')
105
+ result += "@layer components {\n"
106
+ layer_present = true
107
+ end
108
+
109
+ # Estrae le classi principali (Block) usando regex
81
110
  class_matches = content.scan(/\.(bui-[a-zA-Z0-9_-]+)\s*\{/)
82
111
  class_matches.flatten.uniq.each do |css_class|
83
- result += ".#{css_class} {\n // Sovrascrivi qui gli stili per .#{css_class}\n}\n\n"
112
+ result += layer_present ? " " : ""
113
+ result += ".#{css_class} {\n // Aggiungi personalizzazioni qui\n#{layer_present ? " " : ""}}\n\n"
84
114
  end
85
115
 
86
- # Estrae anche classi annidate usando la sintassi SCSS
87
- nested_matches = content.scan(/\.(bui-[a-zA-Z0-9_-]+)\s*{[^{]*\.([\w-]+)\s*{/)
88
- nested_matches.each do |parent_class, child_class|
89
- result += ".#{parent_class} {\n .#{child_class} {\n // Sovrascrivi qui gli stili annidati\n }\n}\n\n"
116
+ # Estrae classi modifier (es. &--small, &__icon, ecc.)
117
+ modifier_matches = content.scan(/&([a-zA-Z0-9_-]+)\s*\{/)
118
+ if !modifier_matches.empty?
119
+ # Raggruppa i modifier per classe principale
120
+ main_classes = class_matches.flatten.uniq
121
+ main_classes.each do |main_class|
122
+ # Estrae tutti i modifier di questa classe principale
123
+ class_content = extract_class_block(content, main_class)
124
+ modifiers = class_content.scan(/&([a-zA-Z0-9_-]+)\s*\{/).flatten.uniq
125
+
126
+ if !modifiers.empty?
127
+ result += layer_present ? " " : ""
128
+ result += ".#{main_class} {\n"
129
+
130
+ modifiers.each do |modifier|
131
+ result += layer_present ? " " : " "
132
+ result += "&#{modifier} {\n // Aggiungi personalizzazioni qui\n#{layer_present ? " " : " "}}\n\n"
133
+ end
134
+
135
+ result += layer_present ? " " : ""
136
+ result += "}\n\n"
137
+ end
138
+ end
90
139
  end
91
140
 
141
+ # Chiude il layer se presente
142
+ result += "}\n" if layer_present
143
+
92
144
  result
93
145
  end
146
+
147
+ # Estrae il blocco di codice relativo a una classe CSS specifica
148
+ #
149
+ # @param content [String] Il contenuto del file SCSS completo
150
+ # @param css_class [String] Il nome della classe CSS da estrarre
151
+ # @return [String] Il blocco di codice della classe
152
+ def extract_class_block(content, css_class)
153
+ regex = /\.(#{css_class})\s*\{((?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*)\}/m
154
+ match = content.match(regex)
155
+ match ? match[2] : ""
156
+ end
94
157
  end
95
158
  end
96
159
  end