view_primitives 0.1.3 → 0.2.0

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 (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -0
  3. data/README.md +57 -2
  4. data/lib/generators/view_primitives/add/add_generator.rb +8 -62
  5. data/lib/generators/view_primitives/add/templates/accordion/accordion_item_component.rb.tt +30 -11
  6. data/lib/generators/view_primitives/add/templates/alert/alert_component.rb.tt +1 -1
  7. data/lib/generators/view_primitives/add/templates/alert_dialog/alert_dialog_component.rb.tt +9 -9
  8. data/lib/generators/view_primitives/add/templates/aspect_ratio/aspect_ratio_component.rb.tt +1 -1
  9. data/lib/generators/view_primitives/add/templates/audio/audio_component.rb.tt +1 -1
  10. data/lib/generators/view_primitives/add/templates/avatar/avatar_component.rb.tt +8 -4
  11. data/lib/generators/view_primitives/add/templates/badge/badge_component.rb.tt +1 -1
  12. data/lib/generators/view_primitives/add/templates/banner/banner_component.rb.tt +6 -6
  13. data/lib/generators/view_primitives/add/templates/bottom_nav/bottom_nav_component.rb.tt +11 -4
  14. data/lib/generators/view_primitives/add/templates/breadcrumb/breadcrumb_component.rb.tt +2 -2
  15. data/lib/generators/view_primitives/add/templates/button/button_component.rb.tt +8 -5
  16. data/lib/generators/view_primitives/add/templates/button_group/button_group_component.rb.tt +5 -5
  17. data/lib/generators/view_primitives/add/templates/calendar/calendar_component.rb.tt +18 -16
  18. data/lib/generators/view_primitives/add/templates/card/card_component.rb.tt +1 -1
  19. data/lib/generators/view_primitives/add/templates/card/card_footer_component.rb.tt +1 -1
  20. data/lib/generators/view_primitives/add/templates/carousel/carousel_component.rb.tt +26 -13
  21. data/lib/generators/view_primitives/add/templates/chart/chart_component.rb.tt +10 -4
  22. data/lib/generators/view_primitives/add/templates/chart/chart_controller.js +26 -3
  23. data/lib/generators/view_primitives/add/templates/chat_bubble/chat_bubble_component.rb.tt +4 -4
  24. data/lib/generators/view_primitives/add/templates/checkbox/checkbox_component.rb.tt +1 -1
  25. data/lib/generators/view_primitives/add/templates/collapsible/collapsible_component.rb.tt +12 -5
  26. data/lib/generators/view_primitives/add/templates/combobox/combobox_component.rb.tt +3 -6
  27. data/lib/generators/view_primitives/add/templates/command/command_component.rb.tt +22 -18
  28. data/lib/generators/view_primitives/add/templates/command/command_controller.js +50 -0
  29. data/lib/generators/view_primitives/add/templates/context_menu/context_menu_component.rb.tt +9 -8
  30. data/lib/generators/view_primitives/add/templates/data_table/data_table_component.rb.tt +60 -29
  31. data/lib/generators/view_primitives/add/templates/data_table/data_table_controller.js +2 -2
  32. data/lib/generators/view_primitives/add/templates/date_picker/date_picker_component.rb.tt +8 -8
  33. data/lib/generators/view_primitives/add/templates/device_mockup/device_mockup_component.rb.tt +94 -21
  34. data/lib/generators/view_primitives/add/templates/dialog/dialog_component.rb.tt +13 -10
  35. data/lib/generators/view_primitives/add/templates/dialog/dialog_controller.js +52 -0
  36. data/lib/generators/view_primitives/add/templates/drawer/drawer_component.rb.tt +8 -7
  37. data/lib/generators/view_primitives/add/templates/dropdown_menu/dropdown_menu_component.rb.tt +5 -6
  38. data/lib/generators/view_primitives/add/templates/embed/embed_component.rb.tt +2 -2
  39. data/lib/generators/view_primitives/add/templates/figure/figure_component.rb.tt +1 -1
  40. data/lib/generators/view_primitives/add/templates/file_input/file_input_component.rb.tt +3 -12
  41. data/lib/generators/view_primitives/add/templates/floating_label/floating_label_component.rb.tt +1 -1
  42. data/lib/generators/view_primitives/add/templates/footer/footer_component.rb.tt +5 -4
  43. data/lib/generators/view_primitives/add/templates/form_field/form_field_component.rb.tt +18 -5
  44. data/lib/generators/view_primitives/add/templates/gallery/gallery_component.rb.tt +3 -3
  45. data/lib/generators/view_primitives/add/templates/gallery/gallery_controller.js +1 -1
  46. data/lib/generators/view_primitives/add/templates/hover_card/hover_card_component.rb.tt +6 -5
  47. data/lib/generators/view_primitives/add/templates/iframe/iframe_component.rb.tt +6 -4
  48. data/lib/generators/view_primitives/add/templates/image/image_component.rb.tt +1 -1
  49. data/lib/generators/view_primitives/add/templates/indicator/indicator_component.rb.tt +5 -4
  50. data/lib/generators/view_primitives/add/templates/input/input_component.rb.tt +2 -13
  51. data/lib/generators/view_primitives/add/templates/input_otp/input_otp_component.rb.tt +22 -10
  52. data/lib/generators/view_primitives/add/templates/kbd/kbd_component.rb.tt +3 -1
  53. data/lib/generators/view_primitives/add/templates/list_group/list_group_component.rb.tt +6 -2
  54. data/lib/generators/view_primitives/add/templates/list_group/list_group_item_component.rb.tt +6 -4
  55. data/lib/generators/view_primitives/add/templates/map_area/map_area_component.rb.tt +3 -2
  56. data/lib/generators/view_primitives/add/templates/mega_menu/mega_menu_component.rb.tt +9 -9
  57. data/lib/generators/view_primitives/add/templates/menubar/menubar_component.rb.tt +5 -5
  58. data/lib/generators/view_primitives/add/templates/menubar/menubar_menu_component.rb.tt +4 -5
  59. data/lib/generators/view_primitives/add/templates/navbar/navbar_component.rb.tt +51 -11
  60. data/lib/generators/view_primitives/add/templates/navbar/navbar_controller.js +8 -3
  61. data/lib/generators/view_primitives/add/templates/navigation_menu/navigation_menu_component.rb.tt +12 -16
  62. data/lib/generators/view_primitives/add/templates/number_input/number_input_component.rb.tt +4 -11
  63. data/lib/generators/view_primitives/add/templates/pagination/pagination_component.rb.tt +4 -3
  64. data/lib/generators/view_primitives/add/templates/picture/picture_component.rb.tt +2 -1
  65. data/lib/generators/view_primitives/add/templates/popover/popover_component.rb.tt +1 -2
  66. data/lib/generators/view_primitives/add/templates/progress/progress_component.rb.tt +3 -1
  67. data/lib/generators/view_primitives/add/templates/qr_code/qr_code_component.rb.tt +1 -1
  68. data/lib/generators/view_primitives/add/templates/radio_group/radio_group_component.rb.tt +8 -5
  69. data/lib/generators/view_primitives/add/templates/range/range_component.rb.tt +2 -3
  70. data/lib/generators/view_primitives/add/templates/rating/rating_component.rb.tt +1 -1
  71. data/lib/generators/view_primitives/add/templates/rating_input/rating_controller.js +1 -1
  72. data/lib/generators/view_primitives/add/templates/rating_input/rating_input_component.rb.tt +4 -3
  73. data/lib/generators/view_primitives/add/templates/resizable/resizable_component.rb.tt +27 -15
  74. data/lib/generators/view_primitives/add/templates/scroll_area/scroll_area_component.rb.tt +10 -11
  75. data/lib/generators/view_primitives/add/templates/search_input/search_input_component.rb.tt +2 -11
  76. data/lib/generators/view_primitives/add/templates/select/select_component.rb.tt +25 -6
  77. data/lib/generators/view_primitives/add/templates/separator/separator_component.rb.tt +6 -3
  78. data/lib/generators/view_primitives/add/templates/sheet/sheet_component.rb.tt +25 -21
  79. data/lib/generators/view_primitives/add/templates/sidebar/sidebar_component.rb.tt +27 -21
  80. data/lib/generators/view_primitives/add/templates/skeleton/skeleton_component.rb.tt +1 -1
  81. data/lib/generators/view_primitives/add/templates/speed_dial/speed_dial_component.rb.tt +8 -9
  82. data/lib/generators/view_primitives/add/templates/spinner/spinner_component.rb.tt +15 -6
  83. data/lib/generators/view_primitives/add/templates/stepper/stepper_component.rb.tt +17 -16
  84. data/lib/generators/view_primitives/add/templates/switch/switch_component.rb.tt +27 -14
  85. data/lib/generators/view_primitives/add/templates/tabs/tabs_component.html.erb +13 -7
  86. data/lib/generators/view_primitives/add/templates/tags_input/tags_input_component.rb.tt +136 -0
  87. data/lib/generators/view_primitives/add/templates/tags_input/tags_input_controller.js +90 -0
  88. data/lib/generators/view_primitives/add/templates/textarea/textarea_component.rb.tt +2 -11
  89. data/lib/generators/view_primitives/add/templates/timeline/timeline_component.rb.tt +9 -7
  90. data/lib/generators/view_primitives/add/templates/timepicker/timepicker_component.rb.tt +19 -15
  91. data/lib/generators/view_primitives/add/templates/toaster/toaster_component.rb.tt +10 -10
  92. data/lib/generators/view_primitives/add/templates/toaster/toaster_controller.js +6 -6
  93. data/lib/generators/view_primitives/add/templates/toggle/toggle_component.rb.tt +10 -3
  94. data/lib/generators/view_primitives/add/templates/toggle_group/toggle_group_component.rb.tt +6 -6
  95. data/lib/generators/view_primitives/add/templates/tooltip/tooltip_component.rb.tt +7 -6
  96. data/lib/generators/view_primitives/add/templates/video/video_component.rb.tt +1 -1
  97. data/lib/generators/view_primitives/add/templates/wysiwyg/wysiwyg_component.rb.tt +9 -3
  98. data/lib/generators/view_primitives/component_copier.rb +96 -0
  99. data/lib/generators/view_primitives/components.rb +16 -2
  100. data/lib/generators/view_primitives/install/install_generator.rb +13 -3
  101. data/lib/generators/view_primitives/install/templates/application_component.rb.tt +7 -0
  102. data/lib/generators/view_primitives/install/templates/styles.rb.tt +26 -0
  103. data/lib/generators/view_primitives/install/templates/view_primitives/themes/default.css +79 -0
  104. data/lib/generators/view_primitives/install/templates/view_primitives/themes/rose.css +57 -0
  105. data/lib/generators/view_primitives/install/templates/view_primitives/tokens.css +46 -0
  106. data/lib/generators/view_primitives/install/templates/view_primitives/utilities.css +64 -0
  107. data/lib/generators/view_primitives/install/templates/view_primitives.css +6 -66
  108. data/lib/generators/view_primitives/list/list_generator.rb +3 -1
  109. data/lib/generators/view_primitives/theme/theme_generator.rb +79 -0
  110. data/lib/generators/view_primitives/update/update_generator.rb +112 -0
  111. data/lib/view_primitives/class_helper.rb +4 -1
  112. data/lib/view_primitives/railtie.rb +1 -1
  113. data/lib/view_primitives/version.rb +1 -1
  114. metadata +12 -4
  115. data/lib/generators/view_primitives/add/templates/drawer/drawer_controller.js +0 -15
  116. data/lib/generators/view_primitives/add/templates/sheet/sheet_controller.js +0 -15
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../detector"
4
+
5
+ module ViewPrimitives
6
+ module Generators
7
+ class ThemeGenerator < Rails::Generators::Base
8
+ include Detector
9
+
10
+ source_root File.expand_path("../install/templates", __dir__)
11
+
12
+ desc "Install an optional ViewPrimitives color theme (CSS variables preset)"
13
+
14
+ argument :name, type: :string, default: "rose", banner: "Theme name (e.g. rose)"
15
+
16
+ def copy_theme_file
17
+ source = "view_primitives/themes/#{theme_name}.css"
18
+ dest = "#{css_dest_dir}/view_primitives/themes/#{theme_name}.css"
19
+
20
+ unless theme_available?
21
+ say " Unknown theme: #{theme_name}. Available: #{available_themes.join(", ")}", :red
22
+ abort
23
+ end
24
+
25
+ copy_file source, dest
26
+ enable_theme_import
27
+ print_usage
28
+ end
29
+
30
+ private
31
+
32
+ def theme_name
33
+ name.to_s.downcase
34
+ end
35
+
36
+ def theme_available?
37
+ File.exist?(File.join(self.class.source_root, "view_primitives/themes/#{theme_name}.css"))
38
+ end
39
+
40
+ def available_themes
41
+ Dir.children(File.join(self.class.source_root, "view_primitives/themes"))
42
+ .grep(/\.css\z/)
43
+ .map { |f| f.delete_suffix(".css") }
44
+ .reject { |t| t == "default" }
45
+ .sort
46
+ end
47
+
48
+ def enable_theme_import
49
+ entry = css_dest_path
50
+ import_line = %(@import "./view_primitives/themes/#{theme_name}.css";)
51
+ optional = "/* @import \"./view_primitives/themes/#{theme_name}.css\"; */"
52
+
53
+ unless File.exist?(File.join(destination_root, entry))
54
+ say " #{entry} not found. Run `rails g view_primitives:install` first.", :yellow
55
+ return
56
+ end
57
+
58
+ content = File.read(File.join(destination_root, entry))
59
+ return say " Theme import already present in #{entry}", :yellow if content.include?(import_line)
60
+
61
+ if content.include?(optional)
62
+ gsub_file entry, optional, import_line
63
+ else
64
+ append_to_file entry, "\n#{import_line}\n"
65
+ end
66
+
67
+ say " Enabled #{theme_name} theme in #{entry}", :green
68
+ end
69
+
70
+ def print_usage
71
+ say ""
72
+ say " Apply the theme by setting data-theme on your layout root:", :cyan
73
+ say ' <html lang="en" data-theme="' + theme_name + '">', :cyan
74
+ say " Dark mode still uses the .dark class alongside data-theme.", :cyan
75
+ say ""
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../components"
4
+ require_relative "../component_copier"
5
+ require_relative "../detector"
6
+
7
+ module ViewPrimitives
8
+ module Generators
9
+ class UpdateGenerator < Rails::Generators::Base
10
+ include Detector
11
+ include ComponentCopier
12
+
13
+ source_root File.expand_path("../install/templates", __dir__)
14
+
15
+ desc "Update installed ViewPrimitives components and CSS from the latest gem templates"
16
+
17
+ class_option :only, type: :array, desc: "Update only these components (default: all installed)"
18
+ class_option :skip_components, type: :boolean, default: false,
19
+ desc: "Skip component Ruby/JS templates"
20
+ class_option :skip_css, type: :boolean, default: false,
21
+ desc: "Skip view_primitives CSS bundle"
22
+ class_option :skip_styles, type: :boolean, default: false,
23
+ desc: "Skip UI::Styles module"
24
+ class_option :force, type: :boolean, default: false,
25
+ desc: "Overwrite files without prompting"
26
+
27
+ def update_components
28
+ return if options[:skip_components]
29
+
30
+ names = component_names_to_update
31
+ if names.empty?
32
+ say " No installed components found. Run `rails g view_primitives:add <name>` first.", :yellow
33
+ return
34
+ end
35
+
36
+ @updated = []
37
+ @skipped = []
38
+
39
+ names.each do |name|
40
+ unless Components.supported.include?(name)
41
+ @skipped << name
42
+ say " Unknown component: #{name}", :red
43
+ next
44
+ end
45
+
46
+ if copy_component(name)
47
+ @updated << name
48
+ else
49
+ @skipped << name
50
+ end
51
+ end
52
+
53
+ report_component_summary
54
+ end
55
+
56
+ def update_css_bundle
57
+ return if options[:skip_css]
58
+
59
+ copy_file "view_primitives.css", css_dest_path
60
+ directory "view_primitives", "#{css_dest_dir}/view_primitives"
61
+ preserve_optional_theme_imports
62
+ say " CSS bundle → #{css_dest_dir}/view_primitives/", :green
63
+ end
64
+
65
+ def update_ui_styles
66
+ return if options[:skip_styles]
67
+
68
+ legacy = "app/components/ui/ui_styles.rb"
69
+ remove_file legacy if File.exist?(File.join(destination_root, legacy))
70
+ template "styles.rb.tt", "app/components/ui/styles.rb"
71
+ end
72
+
73
+ def report_usage
74
+ say ""
75
+ say " Updated ViewPrimitives files from gem templates.", :green
76
+ say " Custom edits in generated files were overwritten.", :yellow
77
+ say " Rebuild CSS if Tailwind does not pick up changes automatically.", :cyan
78
+ say ""
79
+ end
80
+
81
+ private
82
+
83
+ def component_names_to_update
84
+ requested = Array(options[:only]).map(&:to_s).reject(&:empty?)
85
+ return requested if requested.any?
86
+
87
+ Components.installed(destination_root)
88
+ end
89
+
90
+ def report_component_summary
91
+ say " Updated components: #{@updated.join(", ")}", :green if @updated&.any?
92
+ say " Skipped (unknown): #{@skipped.join(", ")}", :red if @skipped&.any?
93
+ end
94
+
95
+ def preserve_optional_theme_imports
96
+ entry = File.join(destination_root, css_dest_path)
97
+ return unless File.exist?(entry)
98
+
99
+ content = File.read(entry)
100
+ Components.optional_theme_imports.each do |theme|
101
+ import_line = %(@import "./view_primitives/themes/#{theme}.css";)
102
+ next if content.include?(import_line)
103
+
104
+ optional = "/* @import \"./view_primitives/themes/#{theme}.css\"; */"
105
+ next unless content.include?(optional)
106
+
107
+ inject_into_file css_dest_path, "\n#{import_line}", after: optional
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -5,7 +5,10 @@ module ViewPrimitives
5
5
  private
6
6
 
7
7
  def cn(*classes)
8
- classes.flatten.compact.reject(&:empty?).join(" ")
8
+ merged = classes.flatten.compact.reject(&:empty?).join(" ")
9
+ return merged unless defined?(::TailwindMerge::Merger)
10
+
11
+ ::TailwindMerge::Merger.new.merge(merged)
9
12
  end
10
13
  end
11
14
  end
@@ -7,7 +7,7 @@ module ViewPrimitives
7
7
  end
8
8
 
9
9
  generators do
10
- %w[install add list].each do |gen|
10
+ %w[install add list update theme].each do |gen|
11
11
  require "generators/view_primitives/#{gen}/#{gen}_generator"
12
12
  end
13
13
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ViewPrimitives
4
- VERSION = "0.1.3"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: view_primitives
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Poimtsev
@@ -149,7 +149,6 @@ files:
149
149
  - lib/generators/view_primitives/add/templates/dialog/dialog_component.rb.tt
150
150
  - lib/generators/view_primitives/add/templates/dialog/dialog_controller.js
151
151
  - lib/generators/view_primitives/add/templates/drawer/drawer_component.rb.tt
152
- - lib/generators/view_primitives/add/templates/drawer/drawer_controller.js
153
152
  - lib/generators/view_primitives/add/templates/dropdown_menu/dropdown_controller.js
154
153
  - lib/generators/view_primitives/add/templates/dropdown_menu/dropdown_menu_component.rb.tt
155
154
  - lib/generators/view_primitives/add/templates/embed/embed_component.rb.tt
@@ -201,7 +200,6 @@ files:
201
200
  - lib/generators/view_primitives/add/templates/select/select_component.rb.tt
202
201
  - lib/generators/view_primitives/add/templates/separator/separator_component.rb.tt
203
202
  - lib/generators/view_primitives/add/templates/sheet/sheet_component.rb.tt
204
- - lib/generators/view_primitives/add/templates/sheet/sheet_controller.js
205
203
  - lib/generators/view_primitives/add/templates/sidebar/sidebar_component.rb.tt
206
204
  - lib/generators/view_primitives/add/templates/sidebar/sidebar_controller.js
207
205
  - lib/generators/view_primitives/add/templates/skeleton/skeleton_component.rb.tt
@@ -214,6 +212,8 @@ files:
214
212
  - lib/generators/view_primitives/add/templates/tabs/tabs_component.rb.tt
215
213
  - lib/generators/view_primitives/add/templates/tabs/tabs_controller.js
216
214
  - lib/generators/view_primitives/add/templates/tabs/tabs_item_component.rb.tt
215
+ - lib/generators/view_primitives/add/templates/tags_input/tags_input_component.rb.tt
216
+ - lib/generators/view_primitives/add/templates/tags_input/tags_input_controller.js
217
217
  - lib/generators/view_primitives/add/templates/textarea/textarea_component.rb.tt
218
218
  - lib/generators/view_primitives/add/templates/timeline/timeline_component.rb.tt
219
219
  - lib/generators/view_primitives/add/templates/timepicker/timepicker_component.rb.tt
@@ -228,12 +228,20 @@ files:
228
228
  - lib/generators/view_primitives/add/templates/video/video_component.rb.tt
229
229
  - lib/generators/view_primitives/add/templates/wysiwyg/wysiwyg_component.rb.tt
230
230
  - lib/generators/view_primitives/add/templates/wysiwyg/wysiwyg_controller.js
231
+ - lib/generators/view_primitives/component_copier.rb
231
232
  - lib/generators/view_primitives/components.rb
232
233
  - lib/generators/view_primitives/detector.rb
233
234
  - lib/generators/view_primitives/install/install_generator.rb
234
235
  - lib/generators/view_primitives/install/templates/application_component.rb.tt
236
+ - lib/generators/view_primitives/install/templates/styles.rb.tt
235
237
  - lib/generators/view_primitives/install/templates/view_primitives.css
238
+ - lib/generators/view_primitives/install/templates/view_primitives/themes/default.css
239
+ - lib/generators/view_primitives/install/templates/view_primitives/themes/rose.css
240
+ - lib/generators/view_primitives/install/templates/view_primitives/tokens.css
241
+ - lib/generators/view_primitives/install/templates/view_primitives/utilities.css
236
242
  - lib/generators/view_primitives/list/list_generator.rb
243
+ - lib/generators/view_primitives/theme/theme_generator.rb
244
+ - lib/generators/view_primitives/update/update_generator.rb
237
245
  - lib/view_primitives.rb
238
246
  - lib/view_primitives/class_helper.rb
239
247
  - lib/view_primitives/component_helper.rb
@@ -261,7 +269,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
269
  - !ruby/object:Gem::Version
262
270
  version: '0'
263
271
  requirements: []
264
- rubygems_version: 4.0.10
272
+ rubygems_version: 4.0.13
265
273
  specification_version: 4
266
274
  summary: Primitive view components and helpers for Rails applications
267
275
  test_files: []
@@ -1,15 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus"
2
-
3
- export default class extends Controller {
4
- static targets = ["panel"]
5
-
6
- open() {
7
- this.panelTarget.hidden = false
8
- document.body.style.overflow = "hidden"
9
- }
10
-
11
- close() {
12
- this.panelTarget.hidden = true
13
- document.body.style.overflow = ""
14
- }
15
- }
@@ -1,15 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus"
2
-
3
- export default class extends Controller {
4
- static targets = ["panel"]
5
-
6
- open() {
7
- this.panelTarget.hidden = false
8
- document.body.style.overflow = "hidden"
9
- }
10
-
11
- close() {
12
- this.panelTarget.hidden = true
13
- document.body.style.overflow = ""
14
- }
15
- }