nitro_kit 0.9.0 → 2.0.0.alpha.2

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 +172 -0
  4. data/LICENSE +28 -0
  5. data/README.md +22 -15
  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 +7239 -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 +131 -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 +335 -122
  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 +107 -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/initialization_prompt.md +36 -0
  95. data/docs/migration_1_to_2.md +318 -0
  96. data/docs/new_app_strategy.md +22 -0
  97. data/docs/patterns/application_foundation.md +136 -0
  98. data/docs/patterns/crud_resource.md +144 -0
  99. data/docs/patterns/destructive_action.md +105 -0
  100. data/docs/patterns/flash_and_toast.md +57 -0
  101. data/docs/patterns/inline_edit.md +59 -0
  102. data/docs/patterns/queryable_collection.md +187 -0
  103. data/docs/patterns/resource_form.md +126 -0
  104. data/docs/rails_conventions.md +95 -0
  105. data/docs/rails_integration.md +514 -0
  106. data/lib/generators/nitro_kit/install_generator.rb +48 -0
  107. data/lib/generators/nitro_kit/upgrade_smoke_tests_generator.rb +67 -0
  108. data/lib/nitro_kit/engine.rb +20 -0
  109. data/lib/nitro_kit/installation.rb +671 -0
  110. data/lib/nitro_kit/migration_inventory.rb +345 -0
  111. data/lib/nitro_kit/upgrade_smoke_test.rb +403 -0
  112. data/lib/nitro_kit/version.rb +1 -1
  113. data/lib/nitro_kit.rb +5 -42
  114. data/lib/rails/commands/nitro_kit/nitro_kit_command.rb +42 -0
  115. data/lib/tasks/nitro_kit_tasks.rake +79 -4
  116. data/plugins/nitro-kit/.codex-plugin/plugin.json +28 -0
  117. data/plugins/nitro-kit/skills/nitro-kit-hotwire/SKILL.md +67 -0
  118. data/plugins/nitro-kit/skills/nitro-kit-hotwire/agents/openai.yaml +4 -0
  119. data/plugins/nitro-kit/skills/nitro-kit-rails/SKILL.md +60 -0
  120. data/plugins/nitro-kit/skills/nitro-kit-rails/agents/openai.yaml +4 -0
  121. data/plugins/nitro-kit/skills/nitro-kit-ui/SKILL.md +62 -0
  122. data/plugins/nitro-kit/skills/nitro-kit-ui/agents/openai.yaml +4 -0
  123. data/src/stylesheets/nitro_kit/components/accordion.css +119 -0
  124. data/src/stylesheets/nitro_kit/components/alert.css +82 -0
  125. data/src/stylesheets/nitro_kit/components/app_navigation.css +156 -0
  126. data/src/stylesheets/nitro_kit/components/app_shell.css +605 -0
  127. data/src/stylesheets/nitro_kit/components/appearance_picker.css +117 -0
  128. data/src/stylesheets/nitro_kit/components/auth_shell.css +8 -0
  129. data/src/stylesheets/nitro_kit/components/avatar.css +81 -0
  130. data/src/stylesheets/nitro_kit/components/avatar_stack.css +80 -0
  131. data/src/stylesheets/nitro_kit/components/badge.css +76 -0
  132. data/src/stylesheets/nitro_kit/components/button.css +283 -0
  133. data/src/stylesheets/nitro_kit/components/button_group.css +53 -0
  134. data/src/stylesheets/nitro_kit/components/button_to.css +6 -0
  135. data/src/stylesheets/nitro_kit/components/card.css +70 -0
  136. data/src/stylesheets/nitro_kit/components/checkbox.css +160 -0
  137. data/src/stylesheets/nitro_kit/components/checkbox_group.css +61 -0
  138. data/src/stylesheets/nitro_kit/components/combobox.css +148 -0
  139. data/src/stylesheets/nitro_kit/components/command_palette.css +255 -0
  140. data/src/stylesheets/nitro_kit/components/container.css +25 -0
  141. data/src/stylesheets/nitro_kit/components/control_group.css +149 -0
  142. data/src/stylesheets/nitro_kit/components/danger_zone.css +54 -0
  143. data/src/stylesheets/nitro_kit/components/data_section.css +40 -0
  144. data/src/stylesheets/nitro_kit/components/details_table.css +53 -0
  145. data/src/stylesheets/nitro_kit/components/dialog.css +80 -0
  146. data/src/stylesheets/nitro_kit/components/dropdown.css +152 -0
  147. data/src/stylesheets/nitro_kit/components/dropzone.css +198 -0
  148. data/src/stylesheets/nitro_kit/components/empty_state.css +53 -0
  149. data/src/stylesheets/nitro_kit/components/field.css +79 -0
  150. data/src/stylesheets/nitro_kit/components/field_group.css +6 -0
  151. data/src/stylesheets/nitro_kit/components/fieldset.css +28 -0
  152. data/src/stylesheets/nitro_kit/components/flex.css +455 -0
  153. data/src/stylesheets/nitro_kit/components/form_section.css +71 -0
  154. data/src/stylesheets/nitro_kit/components/grid.css +308 -0
  155. data/src/stylesheets/nitro_kit/components/icon.css +26 -0
  156. data/src/stylesheets/nitro_kit/components/input.css +80 -0
  157. data/src/stylesheets/nitro_kit/components/label.css +9 -0
  158. data/src/stylesheets/nitro_kit/components/layout.css +440 -0
  159. data/src/stylesheets/nitro_kit/components/page_header.css +61 -0
  160. data/src/stylesheets/nitro_kit/components/pagination.css +119 -0
  161. data/src/stylesheets/nitro_kit/components/pagination_bar.css +41 -0
  162. data/src/stylesheets/nitro_kit/components/palette.css +113 -0
  163. data/src/stylesheets/nitro_kit/components/progressive_image.css +139 -0
  164. data/src/stylesheets/nitro_kit/components/radio_button.css +127 -0
  165. data/src/stylesheets/nitro_kit/components/radio_button_group.css +143 -0
  166. data/src/stylesheets/nitro_kit/components/rich_text_area.css +21 -0
  167. data/src/stylesheets/nitro_kit/components/select.css +70 -0
  168. data/src/stylesheets/nitro_kit/components/settings_layout.css +100 -0
  169. data/src/stylesheets/nitro_kit/components/sheet.css +100 -0
  170. data/src/stylesheets/nitro_kit/components/stat_grid.css +51 -0
  171. data/src/stylesheets/nitro_kit/components/switch.css +152 -0
  172. data/src/stylesheets/nitro_kit/components/table.css +116 -0
  173. data/src/stylesheets/nitro_kit/components/tabs.css +138 -0
  174. data/src/stylesheets/nitro_kit/components/textarea.css +39 -0
  175. data/src/stylesheets/nitro_kit/components/toast.css +131 -0
  176. data/src/stylesheets/nitro_kit/components/toolbar.css +78 -0
  177. data/src/stylesheets/nitro_kit/components/tooltip.css +124 -0
  178. data/src/stylesheets/nitro_kit/components/typeset.css +191 -0
  179. data/src/stylesheets/nitro_kit/layers.css +7 -0
  180. data/src/stylesheets/nitro_kit/reset.css +192 -0
  181. data/src/stylesheets/nitro_kit/tokens.css +198 -0
  182. metadata +182 -51
  183. data/Rakefile +0 -8
  184. data/app/assets/tailwind/application.css +0 -49
  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 -46
  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 -129
  219. data/lib/nitro_kit/variants.rb +0 -21
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module ButtonHelper
5
- include Variants
6
-
7
- def nk_button(text = nil, **attrs, &block)
8
- render(NitroKit::Button.from_template(text, **attrs), &block)
9
- end
10
-
11
- automatic_variants(Button::VARIANTS, :nk_button)
12
-
13
- # Matches the API of UrlHelper#button_to
14
- def nk_button_to(name = nil, url_for_options = nil, **attrs, &block)
15
- url_for_options = name if block_given?
16
-
17
- form_options = attrs.delete(:form) || {}
18
- form_options.merge!(attrs.slice(:multipart, :data, :method, :authenticity_token, :remote, :enforce_utf8))
19
-
20
- form_tag(url_for_options, form_options) do
21
- nk_button(name, type: "submit", **attrs, &block)
22
- end
23
- end
24
-
25
- automatic_variants(Button::VARIANTS, :nk_button_to)
26
-
27
- # Matches the API of UrlHelper#link_to
28
- def nk_button_link_to(*args, **attrs, &block)
29
- case args.length
30
- when 1
31
- options, text = args
32
- when 2
33
- text, options = args
34
- else
35
- raise ArgumentError, "1..2 arguments expected, got #{args.length}"
36
- end
37
-
38
- href = attrs[:href] || url_target(text, options)
39
-
40
- render(NitroKit::Button.from_template(text, **attrs, href:), &block)
41
- end
42
-
43
- automatic_variants(Button::VARIANTS, :nk_button_link_to)
44
-
45
- def nk_button_group(**attrs, &block)
46
- render(ButtonGroup.from_template(**attrs), &block)
47
- end
48
- end
49
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NitroKit
4
- module CardHelper
5
- def nk_card(**attrs, &block)
6
- render(Card.from_template(**attrs), &block)
7
- end
8
- end
9
- end
@@ -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,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- begin
4
- require "pagy/toolbox/helpers/support/series"
5
- rescue LoadError
6
- # Pagy isn't around
7
- end
8
-
9
- module NitroKit
10
- module PaginationHelper
11
- def nk_pagination(**attrs, &block)
12
- render(Pagination.from_template(**attrs), &block)
13
- end
14
-
15
- def nk_pagy_nav(pagy, id: nil, aria_label: nil, **attrs)
16
- attrs[:aria] ||= { label: aria_label }
17
-
18
- nk_pagination(id:, **attrs) do |p|
19
- if prev_page = pagy.previous
20
- p.prev(href: pagy.page_url(prev_page))
21
- else
22
- p.prev(disabled: true)
23
- end
24
-
25
- pagy.send(:series).each do |item|
26
- case item
27
- when Integer
28
- p.page(item.to_s, href: pagy.page_url(item))
29
- when String
30
- p.page(item, current: true)
31
- when :gap
32
- p.ellipsis
33
- else
34
- raise ArgumentError, "Unknown item type: #{item.class}"
35
- end
36
- end
37
-
38
- if next_page = pagy.next
39
- p.next(href: pagy.page_url(next_page))
40
- else
41
- p.next(disabled: true)
42
- end
43
- end
44
- end
45
- end
46
- 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