nitro_kit 0.8.0 → 2.0.0.alpha.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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.agents/plugins/marketplace.json +20 -0
  3. data/CHANGELOG.md +151 -0
  4. data/LICENSE +28 -0
  5. data/README.md +21 -16
  6. data/STYLE_GUIDE.md +425 -0
  7. data/app/assets/stylesheets/nitro_kit-tailwind-v4.css +38 -0
  8. data/app/assets/stylesheets/nitro_kit.css +7225 -0
  9. data/app/components/nitro_kit/accordion.rb +125 -65
  10. data/app/components/nitro_kit/alert.rb +80 -43
  11. data/app/components/nitro_kit/app_navigation.rb +307 -0
  12. data/app/components/nitro_kit/app_shell.rb +227 -0
  13. data/app/components/nitro_kit/appearance_bootstrap.rb +146 -0
  14. data/app/components/nitro_kit/appearance_picker.rb +156 -0
  15. data/app/components/nitro_kit/auth_shell.rb +34 -0
  16. data/app/components/nitro_kit/avatar.rb +85 -29
  17. data/app/components/nitro_kit/avatar_stack.rb +155 -9
  18. data/app/components/nitro_kit/badge.rb +43 -81
  19. data/app/components/nitro_kit/button.rb +180 -103
  20. data/app/components/nitro_kit/button_group.rb +63 -11
  21. data/app/components/nitro_kit/button_to.rb +69 -0
  22. data/app/components/nitro_kit/card.rb +42 -45
  23. data/app/components/nitro_kit/checkbox.rb +115 -62
  24. data/app/components/nitro_kit/checkbox_group.rb +128 -22
  25. data/app/components/nitro_kit/choice.rb +55 -0
  26. data/app/components/nitro_kit/combobox.rb +292 -105
  27. data/app/components/nitro_kit/command_palette.rb +412 -0
  28. data/app/components/nitro_kit/component.rb +322 -46
  29. data/app/components/nitro_kit/container.rb +32 -0
  30. data/app/components/nitro_kit/control_group.rb +45 -0
  31. data/app/components/nitro_kit/danger_zone.rb +78 -0
  32. data/app/components/nitro_kit/data_section.rb +106 -0
  33. data/app/components/nitro_kit/details_table.rb +229 -0
  34. data/app/components/nitro_kit/dialog.rb +257 -83
  35. data/app/components/nitro_kit/dropdown.rb +336 -119
  36. data/app/components/nitro_kit/dropzone.rb +326 -0
  37. data/app/components/nitro_kit/empty_state.rb +99 -0
  38. data/app/components/nitro_kit/field.rb +461 -236
  39. data/app/components/nitro_kit/field_group.rb +15 -8
  40. data/app/components/nitro_kit/fieldset.rb +37 -39
  41. data/app/components/nitro_kit/flex.rb +49 -0
  42. data/app/components/nitro_kit/form_builder.rb +313 -72
  43. data/app/components/nitro_kit/form_section.rb +79 -0
  44. data/app/components/nitro_kit/grid.rb +34 -0
  45. data/app/components/nitro_kit/icon.rb +54 -25
  46. data/app/components/nitro_kit/input.rb +97 -10
  47. data/app/components/nitro_kit/label.rb +22 -6
  48. data/app/components/nitro_kit/layout_options.rb +7 -0
  49. data/app/components/nitro_kit/page_header.rb +76 -0
  50. data/app/components/nitro_kit/pagination.rb +355 -69
  51. data/app/components/nitro_kit/pagination_bar.rb +90 -0
  52. data/app/components/nitro_kit/progressive_image.rb +181 -0
  53. data/app/components/nitro_kit/radio_button.rb +77 -55
  54. data/app/components/nitro_kit/radio_button_group.rb +104 -36
  55. data/app/components/nitro_kit/responsive_value.rb +94 -0
  56. data/app/components/nitro_kit/rich_text_area.rb +31 -0
  57. data/app/components/nitro_kit/select.rb +129 -64
  58. data/app/components/nitro_kit/settings_layout.rb +152 -0
  59. data/app/components/nitro_kit/sheet.rb +202 -0
  60. data/app/components/nitro_kit/stat_grid.rb +75 -0
  61. data/app/components/nitro_kit/switch.rb +108 -51
  62. data/app/components/nitro_kit/table.rb +237 -45
  63. data/app/components/nitro_kit/tabs.rb +168 -63
  64. data/app/components/nitro_kit/textarea.rb +81 -10
  65. data/app/components/nitro_kit/toast.rb +211 -80
  66. data/app/components/nitro_kit/toolbar.rb +75 -0
  67. data/app/components/nitro_kit/tooltip.rb +235 -34
  68. data/app/components/nitro_kit/typeset.rb +28 -0
  69. data/app/javascript/controllers/nk/app_shell_controller.js +224 -0
  70. data/app/javascript/controllers/nk/appearance_controller.js +73 -0
  71. data/app/javascript/controllers/nk/avatar_controller.js +15 -0
  72. data/app/javascript/controllers/nk/button_controller.js +56 -0
  73. data/app/javascript/controllers/nk/checkable_controller.js +41 -0
  74. data/app/javascript/controllers/nk/combobox_controller.js +314 -82
  75. data/app/javascript/controllers/nk/command_palette_controller.js +249 -0
  76. data/app/javascript/controllers/nk/dialog_controller.js +14 -10
  77. data/app/javascript/controllers/nk/dropdown_controller.js +106 -58
  78. data/app/javascript/controllers/nk/dropzone/direct_upload.js +61 -0
  79. data/app/javascript/controllers/nk/dropzone/file_rules.js +77 -0
  80. data/app/javascript/controllers/nk/dropzone/form_submit_lock.js +30 -0
  81. data/app/javascript/controllers/nk/dropzone_controller.js +482 -0
  82. data/app/javascript/controllers/nk/overlay_position.js +37 -0
  83. data/app/javascript/controllers/nk/progressive_image_controller.js +116 -0
  84. data/app/javascript/controllers/nk/tabs_controller.js +135 -23
  85. data/app/javascript/controllers/nk/toast_controller.js +112 -45
  86. data/app/javascript/controllers/nk/tooltip_controller.js +12 -47
  87. data/config/importmap.rb +2 -0
  88. data/config/locales/en.yml +98 -0
  89. data/docs/agent_guide.md +139 -0
  90. data/docs/agent_native_spec.md +422 -0
  91. data/docs/component_contracts.md +263 -0
  92. data/docs/customization.md +595 -0
  93. data/docs/hotwire.md +94 -0
  94. data/docs/implementation_plan.md +279 -0
  95. data/docs/initialization_prompt.md +36 -0
  96. data/docs/migration_1_to_2.md +318 -0
  97. data/docs/new_app_strategy.md +24 -0
  98. data/docs/patterns/application_foundation.md +136 -0
  99. data/docs/patterns/crud_resource.md +144 -0
  100. data/docs/patterns/destructive_action.md +105 -0
  101. data/docs/patterns/flash_and_toast.md +57 -0
  102. data/docs/patterns/inline_edit.md +59 -0
  103. data/docs/patterns/queryable_collection.md +187 -0
  104. data/docs/patterns/resource_form.md +126 -0
  105. data/docs/rails_conventions.md +95 -0
  106. data/docs/rails_integration.md +514 -0
  107. data/lib/generators/nitro_kit/install_generator.rb +48 -0
  108. data/lib/generators/nitro_kit/upgrade_smoke_tests_generator.rb +67 -0
  109. data/lib/nitro_kit/engine.rb +20 -0
  110. data/lib/nitro_kit/installation.rb +671 -0
  111. data/lib/nitro_kit/migration_inventory.rb +345 -0
  112. data/lib/nitro_kit/upgrade_smoke_test.rb +403 -0
  113. data/lib/nitro_kit/version.rb +1 -1
  114. data/lib/nitro_kit.rb +5 -42
  115. data/lib/rails/commands/nitro_kit/nitro_kit_command.rb +42 -0
  116. data/lib/tasks/nitro_kit_tasks.rake +79 -4
  117. data/plugins/nitro-kit/.codex-plugin/plugin.json +28 -0
  118. data/plugins/nitro-kit/skills/nitro-kit-hotwire/SKILL.md +67 -0
  119. data/plugins/nitro-kit/skills/nitro-kit-hotwire/agents/openai.yaml +4 -0
  120. data/plugins/nitro-kit/skills/nitro-kit-rails/SKILL.md +60 -0
  121. data/plugins/nitro-kit/skills/nitro-kit-rails/agents/openai.yaml +4 -0
  122. data/plugins/nitro-kit/skills/nitro-kit-ui/SKILL.md +62 -0
  123. data/plugins/nitro-kit/skills/nitro-kit-ui/agents/openai.yaml +4 -0
  124. data/src/stylesheets/nitro_kit/components/accordion.css +119 -0
  125. data/src/stylesheets/nitro_kit/components/alert.css +82 -0
  126. data/src/stylesheets/nitro_kit/components/app_navigation.css +156 -0
  127. data/src/stylesheets/nitro_kit/components/app_shell.css +605 -0
  128. data/src/stylesheets/nitro_kit/components/appearance_picker.css +117 -0
  129. data/src/stylesheets/nitro_kit/components/auth_shell.css +8 -0
  130. data/src/stylesheets/nitro_kit/components/avatar.css +81 -0
  131. data/src/stylesheets/nitro_kit/components/avatar_stack.css +80 -0
  132. data/src/stylesheets/nitro_kit/components/badge.css +76 -0
  133. data/src/stylesheets/nitro_kit/components/button.css +283 -0
  134. data/src/stylesheets/nitro_kit/components/button_group.css +53 -0
  135. data/src/stylesheets/nitro_kit/components/button_to.css +6 -0
  136. data/src/stylesheets/nitro_kit/components/card.css +70 -0
  137. data/src/stylesheets/nitro_kit/components/checkbox.css +160 -0
  138. data/src/stylesheets/nitro_kit/components/checkbox_group.css +61 -0
  139. data/src/stylesheets/nitro_kit/components/combobox.css +148 -0
  140. data/src/stylesheets/nitro_kit/components/command_palette.css +255 -0
  141. data/src/stylesheets/nitro_kit/components/container.css +25 -0
  142. data/src/stylesheets/nitro_kit/components/control_group.css +149 -0
  143. data/src/stylesheets/nitro_kit/components/danger_zone.css +54 -0
  144. data/src/stylesheets/nitro_kit/components/data_section.css +40 -0
  145. data/src/stylesheets/nitro_kit/components/details_table.css +53 -0
  146. data/src/stylesheets/nitro_kit/components/dialog.css +80 -0
  147. data/src/stylesheets/nitro_kit/components/dropdown.css +152 -0
  148. data/src/stylesheets/nitro_kit/components/dropzone.css +189 -0
  149. data/src/stylesheets/nitro_kit/components/empty_state.css +53 -0
  150. data/src/stylesheets/nitro_kit/components/field.css +79 -0
  151. data/src/stylesheets/nitro_kit/components/field_group.css +6 -0
  152. data/src/stylesheets/nitro_kit/components/fieldset.css +28 -0
  153. data/src/stylesheets/nitro_kit/components/flex.css +455 -0
  154. data/src/stylesheets/nitro_kit/components/form_section.css +71 -0
  155. data/src/stylesheets/nitro_kit/components/grid.css +308 -0
  156. data/src/stylesheets/nitro_kit/components/icon.css +26 -0
  157. data/src/stylesheets/nitro_kit/components/input.css +80 -0
  158. data/src/stylesheets/nitro_kit/components/label.css +9 -0
  159. data/src/stylesheets/nitro_kit/components/layout.css +440 -0
  160. data/src/stylesheets/nitro_kit/components/page_header.css +62 -0
  161. data/src/stylesheets/nitro_kit/components/pagination.css +119 -0
  162. data/src/stylesheets/nitro_kit/components/pagination_bar.css +41 -0
  163. data/src/stylesheets/nitro_kit/components/palette.css +113 -0
  164. data/src/stylesheets/nitro_kit/components/progressive_image.css +139 -0
  165. data/src/stylesheets/nitro_kit/components/radio_button.css +127 -0
  166. data/src/stylesheets/nitro_kit/components/radio_button_group.css +143 -0
  167. data/src/stylesheets/nitro_kit/components/rich_text_area.css +21 -0
  168. data/src/stylesheets/nitro_kit/components/select.css +70 -0
  169. data/src/stylesheets/nitro_kit/components/settings_layout.css +100 -0
  170. data/src/stylesheets/nitro_kit/components/sheet.css +100 -0
  171. data/src/stylesheets/nitro_kit/components/stat_grid.css +51 -0
  172. data/src/stylesheets/nitro_kit/components/switch.css +152 -0
  173. data/src/stylesheets/nitro_kit/components/table.css +110 -0
  174. data/src/stylesheets/nitro_kit/components/tabs.css +138 -0
  175. data/src/stylesheets/nitro_kit/components/textarea.css +39 -0
  176. data/src/stylesheets/nitro_kit/components/toast.css +131 -0
  177. data/src/stylesheets/nitro_kit/components/toolbar.css +78 -0
  178. data/src/stylesheets/nitro_kit/components/tooltip.css +124 -0
  179. data/src/stylesheets/nitro_kit/components/typeset.css +191 -0
  180. data/src/stylesheets/nitro_kit/layers.css +7 -0
  181. data/src/stylesheets/nitro_kit/reset.css +192 -0
  182. data/src/stylesheets/nitro_kit/tokens.css +198 -0
  183. metadata +183 -50
  184. data/Rakefile +0 -8
  185. data/app/components/nitro_kit/datepicker.rb +0 -9
  186. data/app/helpers/nitro_kit/accordion_helper.rb +0 -9
  187. data/app/helpers/nitro_kit/alert_helper.rb +0 -11
  188. data/app/helpers/nitro_kit/avatar_helper.rb +0 -13
  189. data/app/helpers/nitro_kit/badge_helper.rb +0 -13
  190. data/app/helpers/nitro_kit/button_group_helper.rb +0 -9
  191. data/app/helpers/nitro_kit/button_helper.rb +0 -49
  192. data/app/helpers/nitro_kit/card_helper.rb +0 -9
  193. data/app/helpers/nitro_kit/checkbox_helper.rb +0 -50
  194. data/app/helpers/nitro_kit/combobox_helper.rb +0 -9
  195. data/app/helpers/nitro_kit/datepicker_helper.rb +0 -9
  196. data/app/helpers/nitro_kit/dialog_helper.rb +0 -9
  197. data/app/helpers/nitro_kit/dropdown_helper.rb +0 -9
  198. data/app/helpers/nitro_kit/field_group_helper.rb +0 -9
  199. data/app/helpers/nitro_kit/field_helper.rb +0 -9
  200. data/app/helpers/nitro_kit/fieldset_helper.rb +0 -9
  201. data/app/helpers/nitro_kit/form_helper.rb +0 -13
  202. data/app/helpers/nitro_kit/icon_helper.rb +0 -9
  203. data/app/helpers/nitro_kit/input_helper.rb +0 -37
  204. data/app/helpers/nitro_kit/label_helper.rb +0 -19
  205. data/app/helpers/nitro_kit/pagination_helper.rb +0 -42
  206. data/app/helpers/nitro_kit/radio_button_helper.rb +0 -23
  207. data/app/helpers/nitro_kit/select_helper.rb +0 -24
  208. data/app/helpers/nitro_kit/switch_helper.rb +0 -9
  209. data/app/helpers/nitro_kit/table_helper.rb +0 -9
  210. data/app/helpers/nitro_kit/tabs_helper.rb +0 -9
  211. data/app/helpers/nitro_kit/textarea_helper.rb +0 -9
  212. data/app/helpers/nitro_kit/toast_helper.rb +0 -25
  213. data/app/helpers/nitro_kit/tooltip_helper.rb +0 -9
  214. data/app/javascript/controllers/nk/accordion_controller.js +0 -18
  215. data/app/javascript/controllers/nk/datepicker_controller.js +0 -5
  216. data/app/javascript/controllers/nk/switch_controller.js +0 -32
  217. data/lib/generators/nitro_kit/component_generator.rb +0 -84
  218. data/lib/nitro_kit/schema_builder.rb +0 -121
  219. data/lib/nitro_kit/variants.rb +0 -21
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module CheckboxHelper
5
- # Make API compatible with Rails' checkbox but allow empty arguments
6
- def nk_checkbox(
7
- compat_object_name = nil,
8
- compat_method = nil,
9
- compat_options = {},
10
- compat_checked_value = "1",
11
- compat_unchecked_value = "0",
12
- label: nil,
13
- **attrs
14
- )
15
- name = field_name(compat_object_name, compat_method)
16
- checked = compat_options["checked"] || attrs[:checked]
17
-
18
- # TODO: multiple, unchecked hidden field
19
-
20
- render(Checkbox.from_template(name:, label:, value: compat_checked_value, checked:, **attrs))
21
- end
22
-
23
- def nk_checkbox_tag(name, *args)
24
- if args.length >= 4
25
- raise ArgumentError, "wrong number of arguments (given #{args.length + 1}, expected 1..4)"
26
- end
27
-
28
- options = args.extract_options!
29
- value, checked = args.empty? ? [ "1", false ] : [ *args, false ]
30
- attrs = {
31
- type: "checkbox",
32
- name: name,
33
- id: sanitize_to_id(name),
34
- value: value
35
- }.update(
36
- options.symbolize_keys
37
- )
38
-
39
- attrs[:checked] = "checked" if checked
40
-
41
- render(Checkbox.from_template(name:, **attrs))
42
- end
43
-
44
- alias :nk_check_box_tag :nk_checkbox_tag
45
-
46
- def nk_checkbox_group(**attrs, &block)
47
- render(CheckboxGroup.from_template(**attrs), &block)
48
- end
49
- end
50
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module ComboboxHelper
5
- def nk_combobox(name = nil, options = [], **attrs)
6
- render(NitroKit::Combobox.from_template(name:, options:, **attrs))
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module DatepickerHelper
5
- def nk_datepicker(**attrs, &block)
6
- render(Datepicker.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module DialogHelper
5
- def nk_dialog(**attrs, &block)
6
- render(Dialog.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module DropdownHelper
5
- def nk_dropdown(**attrs, &block)
6
- render(Dropdown.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module FieldGroupHelper
5
- def nk_field_group(**attrs)
6
- render(NitroKit::FieldGroup.from_template(**attrs)) { yield }
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module FieldHelper
5
- def nk_field(*args, **attrs, &block)
6
- render(NitroKit::Field.from_template(*args, **attrs), &block)
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module FieldsetHelper
5
- def nk_fieldset(**attrs, &block)
6
- render(NitroKit::Fieldset.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module FormHelper
5
- def nk_form_with(**attrs, &block)
6
- form_with(**attrs, builder: NitroKit::FormBuilder, &block)
7
- end
8
-
9
- def nk_form_for(*args, **attrs, &block)
10
- form_for(*args, **attrs, builder: NitroKit::FormBuilder, &block)
11
- end
12
- end
13
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module IconHelper
5
- def nk_icon(name, **attrs)
6
- render(NitroKit::Icon.from_template(name, **attrs))
7
- end
8
- end
9
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module InputHelper
5
- def nk_input(**attrs)
6
- render(Input.from_template(**attrs))
7
- end
8
-
9
- %w[
10
- color
11
- date
12
- datetime
13
- datetime_local
14
- email
15
- file
16
- hidden
17
- month
18
- number
19
- password
20
- phone
21
- range
22
- search
23
- telephone
24
- text
25
- time
26
- url
27
- week
28
- ]
29
- .each do |type|
30
- define_method("nk_#{type}_field_tag") do |compat_name = nil, compat_value = nil, **attrs|
31
- attrs[:name] ||= compat_name
32
- attrs[:value] ||= compat_value
33
- nk_input(type:, **attrs)
34
- end
35
- end
36
- end
37
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module LabelHelper
5
- def nk_label(compat_object_name = nil, compat_method = nil, content_or_options = nil, **attrs, &block)
6
- name = field_name(compat_object_name, compat_method)
7
-
8
- case content_or_options
9
- when String
10
- text = content_or_options
11
- when Hash
12
- text = nil
13
- attrs.merge!(content_or_options)
14
- end
15
-
16
- render(Label.from_template(text, for: name, **attrs), &block)
17
- end
18
- end
19
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module PaginationHelper
5
- include Pagy::UrlHelpers if defined?(Pagy)
6
-
7
- def nk_pagination(**attrs, &block)
8
- render(Pagination.from_template(**attrs), &block)
9
- end
10
-
11
- def nk_pagy_nav(pagy, id: nil, aria_label: nil, **attrs)
12
- attrs[:aria] ||= { label: aria_label }
13
-
14
- nk_pagination(id:, **attrs) do |p|
15
- if prev_page = pagy.prev
16
- p.prev(href: pagy_url_for(pagy, prev_page))
17
- else
18
- p.prev(disabled: true)
19
- end
20
-
21
- pagy.series.each do |item|
22
- case item
23
- when Integer
24
- p.page(item.to_s, href: pagy_url_for(pagy, item))
25
- when String
26
- p.page(item, current: true)
27
- when :gap
28
- p.ellipsis
29
- else
30
- raise ArgumentError, "Unknown item type: #{item.class}"
31
- end
32
- end
33
-
34
- if next_page = pagy.next
35
- p.next(href: pagy_url_for(pagy, next_page))
36
- else
37
- p.next(disabled: true)
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module RadioButtonHelper
5
- def nk_radio_button(
6
- compat_object_name = nil,
7
- compat_method = nil,
8
- compat_tag_value = nil,
9
- compat_options = {},
10
- label: nil,
11
- **attrs
12
- )
13
- name = field_name(compat_object_name, compat_method)
14
- value = compat_tag_value || attrs[:value]
15
-
16
- render(RadioButton.from_template(label:, name:, value:, **attrs))
17
- end
18
-
19
- def nk_radio_button_group(**attrs, &block)
20
- render(RadioButtonGroup.from_template(**attrs), &block)
21
- end
22
- end
23
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module SelectHelper
5
- def nk_select(
6
- compat_object_name = nil,
7
- compat_method = nil,
8
- options = nil,
9
- compat_options = {},
10
- value: nil,
11
- include_blank: false,
12
- prompt: nil,
13
- index: nil,
14
- **attrs,
15
- &block
16
- )
17
- name = field_name(compat_object_name, compat_method)
18
-
19
- # TODO: support index
20
-
21
- render(Select.from_template(options, value:, include_blank:, prompt:, name:, **compat_options, **attrs), &block)
22
- end
23
- end
24
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module SwitchHelper
5
- def nk_switch(**attrs, &block)
6
- render(Switch.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module TableHelper
5
- def nk_table(**attrs, &block)
6
- render(Table.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module TabsHelper
5
- def nk_tabs(**attrs, &block)
6
- render(Tabs.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module TextareaHelper
5
- def nk_textarea(**attrs)
6
- render(Textarea.from_template(**attrs))
7
- end
8
- end
9
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module ToastHelper
5
- def nk_toast(**attrs, &block)
6
- render(Toast.from_template(**attrs), &block)
7
- end
8
-
9
- def nk_toast_action(title: nil, description: nil, event: nil)
10
- {
11
- action: "#{event ? "#{event}->" : ""}nk--toast#toast",
12
- nk__toast_title_param: title,
13
- nk__toast_description_param: description
14
- }
15
- end
16
-
17
- def nk_toast_flash_messages
18
- render(Toast::FlashMessages.from_template(flash))
19
- end
20
-
21
- def nk_toast_turbo_stream_refresh
22
- turbo_stream.append("nk--toast-sink", nk_toast_flash_messages)
23
- end
24
- end
25
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module TooltipHelper
5
- def nk_tooltip(**attrs, &block)
6
- render(Tooltip.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -1,18 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus";
2
-
3
- export default class extends Controller {
4
- static targets = ["trigger", "content"];
5
-
6
- toggle(event) {
7
- const trigger = event.target;
8
- const content = trigger.parentElement.querySelector(
9
- "[data-nk--accordion-target=content]",
10
- );
11
-
12
- const isExpanded = trigger.getAttribute("aria-expanded") === "true";
13
-
14
- // Toggle current item
15
- trigger.setAttribute("aria-expanded", (!isExpanded).toString());
16
- content.setAttribute("aria-hidden", isExpanded.toString());
17
- }
18
- }
@@ -1,5 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus";
2
-
3
- export default class extends Controller {
4
- static targets = ["input"];
5
- }
@@ -1,32 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus";
2
-
3
- export default class extends Controller {
4
- connect() {
5
- if (!this.element.hasAttribute("tabindex")) {
6
- this.element.setAttribute("tabindex", "0");
7
- }
8
- }
9
-
10
- click() {
11
- if (this.element.hasAttribute("disabled")) return;
12
-
13
- this.toggle();
14
- }
15
-
16
- keydown(event) {
17
- if (this.element.hasAttribute("disabled")) return;
18
-
19
- if (event.code === "Space" || event.code === "Enter") {
20
- event.preventDefault();
21
- this.toggle();
22
- }
23
- }
24
-
25
- get checked() {
26
- return this.element.getAttribute("aria-checked") === "true";
27
- }
28
-
29
- toggle() {
30
- this.element.setAttribute("aria-checked", (!this.checked).toString());
31
- }
32
- }
@@ -1,84 +0,0 @@
1
- module NitroKit
2
- class ComponentGenerator < Rails::Generators::Base
3
- argument :component_names, type: :array
4
-
5
- source_root File.expand_path("../../../", __dir__).tap { |path| puts path }
6
-
7
- def copy_base_component
8
- copy_file("app/components/nitro_kit/component.rb", "app/components/nitro_kit/component.rb")
9
- end
10
-
11
- def copy_component_files
12
- components.map(&:all_files).flatten.uniq.each do |path|
13
- copy_file(path, path)
14
- end
15
- end
16
-
17
- def add_gems
18
- gems = components.flat_map(&:all_gems)
19
-
20
- return unless gems.any?
21
-
22
- gems.each do |name|
23
- gem(name) unless has_gem?(name)
24
- end
25
-
26
- run("bundle install")
27
- end
28
-
29
- def install_modules
30
- modules = components.flat_map(&:all_modules).uniq
31
-
32
- return unless modules.any?
33
-
34
- case js_strategy
35
- when :importmaps
36
- run("bin/importmap pin #{modules.join(" ")}")
37
- when :yarn
38
- run("yarn add #{modules.join(" ")}")
39
- when :npm
40
- run("npm install --save #{modules.join(" ")}")
41
- when :bun
42
- run("bun add #{modules.join(" ")}")
43
- else
44
- say("Could not determine JS strategy. Please install one of: npm, yarn, bun, or importmaps")
45
- end
46
- end
47
-
48
- private
49
-
50
- def components
51
- return @components if @components
52
-
53
- if component_names == [ "all" ]
54
- return @components = SCHEMA.all
55
- end
56
-
57
- # Component names + their dependencies
58
- @components = component_names
59
- .flat_map do |name|
60
- component = SCHEMA.find(name)
61
- [ component ] + component.dependencies
62
- end
63
- end
64
-
65
- def js_strategy
66
- if File.exist?(File.expand_path("bin/importmap", Rails.root))
67
- :importmaps
68
- elsif File.exist?(File.expand_path("yarn.lock", Rails.root))
69
- :yarn
70
- elsif File.exist?(File.expand_path("package-lock.json", Rails.root))
71
- :npm
72
- elsif File.exist?(File.expand_path("bun.lockb", Rails.root))
73
- :bun
74
- else
75
- nil
76
- end
77
- end
78
-
79
- def has_gem?(name)
80
- gemfile = File.read(File.expand_path("Gemfile", Rails.root))
81
- gemfile.include?("gem '#{name}'") || gemfile.include?("gem \"#{name}\"")
82
- end
83
- end
84
- end
@@ -1,121 +0,0 @@
1
- module NitroKit
2
- module SchemaBuilder
3
- class Component
4
- def initialize(schema, name, dependencies:, files:, modules:, gems:)
5
- @schema = schema
6
- @name = name
7
- @unresolved_dependencies = dependencies
8
- @files = files
9
- @modules = modules
10
- @gems = gems
11
- @resolved = false
12
- end
13
-
14
- attr_reader :name, :files, :modules, :gems, :unresolved_dependencies
15
-
16
- def dependencies
17
- raise "Component not resolved" unless resolved?
18
- @dependencies
19
- end
20
-
21
- def resolve!
22
- raise "Component already resolved" if resolved?
23
-
24
- @dependencies = @unresolved_dependencies
25
- .each_with_object(Set.new) do |name, list|
26
- list.add(name)
27
- list.merge(@schema.find(name).unresolved_dependencies)
28
- end
29
- .map { |name| @schema.find(name) }
30
-
31
- @resolved = true
32
- end
33
-
34
- def resolved?
35
- @resolved
36
- end
37
-
38
- def all_files
39
- (files + dependencies.flat_map(&:files)).sort
40
- end
41
-
42
- def all_modules
43
- (modules + dependencies.flat_map(&:modules)).sort
44
- end
45
-
46
- def all_gems
47
- (gems + dependencies.flat_map(&:gems)).sort
48
- end
49
-
50
- def has_dependencies?
51
- return true if gems.any?
52
- return true if modules.any?
53
- false
54
- end
55
- end
56
-
57
- class Schema
58
- def initialize
59
- @schema = []
60
- yield self
61
- resolve!
62
- end
63
-
64
- def add(
65
- name,
66
- dependencies = [],
67
- components: nil,
68
- helpers: nil,
69
- js: [],
70
- modules: [],
71
- gems: []
72
- )
73
- # Default is one component, one helper with same name
74
- components ||= [ name ]
75
- helpers ||= [ name ]
76
-
77
- files = [
78
- components.map { |c| "app/components/nitro_kit/#{c}.rb" },
79
- helpers.map { |c| "app/helpers/nitro_kit/#{c}_helper.rb" },
80
- js.map { |c| "app/javascript/controllers/nk/#{c}_controller.js" }
81
- ].flatten
82
-
83
- component = Component.new(
84
- self,
85
- name,
86
- dependencies:,
87
- files:,
88
- modules:,
89
- gems:
90
- )
91
-
92
- @schema.push(component)
93
- end
94
-
95
- def all
96
- @schema
97
- end
98
-
99
- def find(name)
100
- component = @schema.find { |c| c.name == name.to_sym }
101
- raise "Component not found: #{name}" unless component
102
- component
103
- end
104
-
105
- def resolved?
106
- @resolved
107
- end
108
-
109
- private
110
-
111
- def resolve!
112
- all.each(&:resolve!)
113
- @resolved = true
114
- end
115
- end
116
-
117
- def build_schema(&block)
118
- Schema.new(&block)
119
- end
120
- end
121
- end
@@ -1,21 +0,0 @@
1
- module NitroKit
2
- module Variants
3
- module ClassMethods
4
- def automatic_variants(variants, method_name)
5
- _, prefix, original = method_name.match(/(nk_)(.+)/).to_a
6
-
7
- variants.each do |variant, class_name|
8
- variant_method_name = "#{prefix}#{variant}_#{original}"
9
-
10
- define_method(variant_method_name) do |*args, **kwargs, &block|
11
- send(method_name, *args, variant:, **kwargs, &block)
12
- end
13
- end
14
- end
15
- end
16
-
17
- def self.included(base)
18
- base.extend(ClassMethods)
19
- end
20
- end
21
- end