shadcn_phlexcomponents 0.1.5 → 0.1.9

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 (181) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -0
  3. data/app/javascript/controllers/accordion_controller.js +7 -16
  4. data/app/javascript/controllers/alert_dialog_controller.js +5 -141
  5. data/app/javascript/controllers/combobox_controller.js +20 -0
  6. data/app/javascript/controllers/date_picker_controller.js +199 -64
  7. data/app/javascript/controllers/date_range_picker_controller.js +289 -176
  8. data/app/javascript/controllers/dialog_controller.js +19 -64
  9. data/app/javascript/controllers/dropdown_menu_controller.js +15 -37
  10. data/app/javascript/controllers/form_field_controller.js +24 -0
  11. data/app/javascript/controllers/hover_card_controller.js +1 -22
  12. data/app/javascript/controllers/popover_controller.js +20 -31
  13. data/app/javascript/controllers/select_controller.js +32 -52
  14. data/app/javascript/controllers/sidebar_trigger_controller.js +1 -1
  15. data/app/javascript/controllers/toast_controller.js +2 -2
  16. data/app/javascript/controllers/tooltip_controller.js +1 -2
  17. data/app/javascript/shadcn_phlexcomponents.js +53 -0
  18. data/app/javascript/utils.js +184 -0
  19. data/app/stylesheets/date_picker.css +212 -0
  20. data/lib/install/install_shadcn_phlexcomponents.rb +7 -7
  21. data/lib/{components → shadcn_phlexcomponents/components/accordion}/accordion.rb +1 -1
  22. data/lib/{components → shadcn_phlexcomponents/components/accordion}/accordion_content.rb +1 -1
  23. data/lib/{components → shadcn_phlexcomponents/components/accordion}/accordion_item.rb +1 -1
  24. data/lib/{components → shadcn_phlexcomponents/components/accordion}/accordion_trigger.rb +5 -4
  25. data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog.rb +1 -1
  26. data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_action.rb +1 -1
  27. data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_action_to.rb +1 -1
  28. data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_cancel.rb +1 -1
  29. data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_content.rb +2 -2
  30. data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_trigger.rb +2 -2
  31. data/lib/{components → shadcn_phlexcomponents/components/avatar}/avatar.rb +1 -1
  32. data/lib/{components → shadcn_phlexcomponents/components/avatar}/avatar_fallback.rb +1 -1
  33. data/lib/{components → shadcn_phlexcomponents/components/avatar}/avatar_image.rb +1 -1
  34. data/lib/{components → shadcn_phlexcomponents/components/badge}/badge.rb +1 -1
  35. data/lib/{components → shadcn_phlexcomponents/components}/base.rb +10 -0
  36. data/lib/{components → shadcn_phlexcomponents/components/breadcrumb}/breadcrumb.rb +2 -0
  37. data/lib/{components → shadcn_phlexcomponents/components/button}/button.rb +5 -5
  38. data/lib/{components → shadcn_phlexcomponents/components/checkbox}/checkbox.rb +5 -5
  39. data/lib/{components → shadcn_phlexcomponents/components/checkbox_group}/checkbox_group.rb +27 -15
  40. data/lib/{components → shadcn_phlexcomponents/components/collapsible}/collapsible.rb +1 -1
  41. data/lib/{components → shadcn_phlexcomponents/components/collapsible}/collapsible_content.rb +1 -1
  42. data/lib/{components → shadcn_phlexcomponents/components/collapsible}/collapsible_trigger.rb +2 -2
  43. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker.rb +87 -0
  44. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_content.rb +45 -0
  45. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_trigger.rb +64 -0
  46. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker.rb +105 -0
  47. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_content.rb +9 -0
  48. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_trigger.rb +9 -0
  49. data/lib/{components → shadcn_phlexcomponents/components/dialog}/dialog.rb +8 -8
  50. data/lib/{components → shadcn_phlexcomponents/components/dialog}/dialog_close.rb +1 -1
  51. data/lib/{components → shadcn_phlexcomponents/components/dialog}/dialog_content.rb +3 -3
  52. data/lib/{components → shadcn_phlexcomponents/components/dialog}/dialog_trigger.rb +2 -2
  53. data/lib/{components → shadcn_phlexcomponents/components/dropdown_menu}/dropdown_menu.rb +1 -1
  54. data/lib/{components → shadcn_phlexcomponents/components/dropdown_menu}/dropdown_menu_content.rb +9 -9
  55. data/lib/{components → shadcn_phlexcomponents/components/dropdown_menu}/dropdown_menu_item.rb +8 -8
  56. data/lib/{components → shadcn_phlexcomponents/components/dropdown_menu}/dropdown_menu_trigger.rb +5 -5
  57. data/lib/shadcn_phlexcomponents/components/form/form.rb +139 -0
  58. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +83 -0
  59. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +116 -0
  60. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +47 -0
  61. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +96 -0
  62. data/lib/{components → shadcn_phlexcomponents/components/form}/form_error.rb +6 -2
  63. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +108 -0
  64. data/lib/{components → shadcn_phlexcomponents/components/form}/form_hint.rb +6 -2
  65. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +107 -0
  66. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +65 -0
  67. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +66 -0
  68. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +60 -0
  69. data/lib/{components → shadcn_phlexcomponents/components/hover_card}/hover_card.rb +1 -1
  70. data/lib/{components → shadcn_phlexcomponents/components/hover_card}/hover_card_content.rb +1 -1
  71. data/lib/{components → shadcn_phlexcomponents/components/hover_card}/hover_card_trigger.rb +1 -1
  72. data/lib/{components → shadcn_phlexcomponents/components/input}/input.rb +1 -1
  73. data/lib/{components → shadcn_phlexcomponents/components/loading_button}/loading_button.rb +1 -1
  74. data/lib/{components → shadcn_phlexcomponents/components/popover}/popover.rb +1 -1
  75. data/lib/{components → shadcn_phlexcomponents/components/popover}/popover_content.rb +6 -6
  76. data/lib/{components → shadcn_phlexcomponents/components/popover}/popover_trigger.rb +2 -3
  77. data/lib/{components → shadcn_phlexcomponents/components/progress}/progress.rb +3 -3
  78. data/lib/{components → shadcn_phlexcomponents/components/radio_group}/radio_group.rb +33 -7
  79. data/lib/{components → shadcn_phlexcomponents/components/radio_group}/radio_group_item.rb +7 -7
  80. data/lib/{components → shadcn_phlexcomponents/components/select}/select.rb +22 -12
  81. data/lib/{components → shadcn_phlexcomponents/components/select}/select_content.rb +6 -6
  82. data/lib/{components → shadcn_phlexcomponents/components/select}/select_group.rb +1 -1
  83. data/lib/{components → shadcn_phlexcomponents/components/select}/select_item.rb +8 -8
  84. data/lib/{components → shadcn_phlexcomponents/components/select}/select_label.rb +1 -1
  85. data/lib/{components → shadcn_phlexcomponents/components/select}/select_trigger.rb +10 -10
  86. data/lib/{components → shadcn_phlexcomponents/components/sheet}/sheet.rb +1 -1
  87. data/lib/{components → shadcn_phlexcomponents/components/sheet}/sheet_close.rb +1 -1
  88. data/lib/{components → shadcn_phlexcomponents/components/sheet}/sheet_content.rb +3 -3
  89. data/lib/{components → shadcn_phlexcomponents/components/sheet}/sheet_trigger.rb +2 -2
  90. data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar.rb +3 -3
  91. data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_trigger.rb +2 -2
  92. data/lib/{components → shadcn_phlexcomponents/components/switch}/switch.rb +4 -4
  93. data/lib/{components → shadcn_phlexcomponents/components/tabs}/tabs.rb +2 -2
  94. data/lib/{components → shadcn_phlexcomponents/components/tabs}/tabs_content.rb +1 -1
  95. data/lib/{components → shadcn_phlexcomponents/components/tabs}/tabs_trigger.rb +4 -4
  96. data/lib/{components → shadcn_phlexcomponents/components/textarea}/textarea.rb +3 -2
  97. data/lib/{components → shadcn_phlexcomponents/components/theme_switcher}/theme_switcher.rb +2 -2
  98. data/lib/{components → shadcn_phlexcomponents/components/toast}/toast.rb +7 -7
  99. data/lib/{components → shadcn_phlexcomponents/components/toast}/toast_container.rb +1 -1
  100. data/lib/{components → shadcn_phlexcomponents/components/tooltip}/tooltip.rb +3 -3
  101. data/lib/{components → shadcn_phlexcomponents/components/tooltip}/tooltip_content.rb +1 -1
  102. data/lib/{components → shadcn_phlexcomponents/components/tooltip}/tooltip_trigger.rb +1 -1
  103. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  104. metadata +157 -144
  105. data/app/assets/tailwind/vanilla-calendar-pro.css +0 -466
  106. data/app/javascript/controllers/sheet_controller.js +0 -159
  107. data/lib/components/combobox.rb +0 -57
  108. data/lib/components/combobox_item.rb +0 -9
  109. data/lib/components/date_picker.rb +0 -94
  110. data/lib/components/date_range_picker.rb +0 -113
  111. data/lib/components/form.rb +0 -59
  112. /data/app/{assets/tailwind → stylesheets}/choices.css +0 -0
  113. /data/app/{assets/tailwind → stylesheets}/tailwindcss-animate.css +0 -0
  114. /data/lib/{components → shadcn_phlexcomponents/components/alert}/alert.rb +0 -0
  115. /data/lib/{components → shadcn_phlexcomponents/components/alert}/alert_description.rb +0 -0
  116. /data/lib/{components → shadcn_phlexcomponents/components/alert}/alert_title.rb +0 -0
  117. /data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_description.rb +0 -0
  118. /data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_footer.rb +0 -0
  119. /data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_header.rb +0 -0
  120. /data/lib/{components → shadcn_phlexcomponents/components/alert_dialog}/alert_dialog_title.rb +0 -0
  121. /data/lib/{components → shadcn_phlexcomponents/components/aspect_ratio}/aspect_ratio.rb +0 -0
  122. /data/lib/{components → shadcn_phlexcomponents/components/breadcrumb}/breadcrumb_ellipsis.rb +0 -0
  123. /data/lib/{components → shadcn_phlexcomponents/components/breadcrumb}/breadcrumb_item.rb +0 -0
  124. /data/lib/{components → shadcn_phlexcomponents/components/breadcrumb}/breadcrumb_link.rb +0 -0
  125. /data/lib/{components → shadcn_phlexcomponents/components/breadcrumb}/breadcrumb_page.rb +0 -0
  126. /data/lib/{components → shadcn_phlexcomponents/components/breadcrumb}/breadcrumb_separator.rb +0 -0
  127. /data/lib/{components → shadcn_phlexcomponents/components/card}/card.rb +0 -0
  128. /data/lib/{components → shadcn_phlexcomponents/components/card}/card_content.rb +0 -0
  129. /data/lib/{components → shadcn_phlexcomponents/components/card}/card_description.rb +0 -0
  130. /data/lib/{components → shadcn_phlexcomponents/components/card}/card_footer.rb +0 -0
  131. /data/lib/{components → shadcn_phlexcomponents/components/card}/card_header.rb +0 -0
  132. /data/lib/{components → shadcn_phlexcomponents/components/card}/card_title.rb +0 -0
  133. /data/lib/{components → shadcn_phlexcomponents/components/dialog}/dialog_description.rb +0 -0
  134. /data/lib/{components → shadcn_phlexcomponents/components/dialog}/dialog_footer.rb +0 -0
  135. /data/lib/{components → shadcn_phlexcomponents/components/dialog}/dialog_header.rb +0 -0
  136. /data/lib/{components → shadcn_phlexcomponents/components/dialog}/dialog_title.rb +0 -0
  137. /data/lib/{components → shadcn_phlexcomponents/components/dropdown_menu}/dropdown_menu_item_to.rb +0 -0
  138. /data/lib/{components → shadcn_phlexcomponents/components/dropdown_menu}/dropdown_menu_label.rb +0 -0
  139. /data/lib/{components → shadcn_phlexcomponents/components/dropdown_menu}/dropdown_menu_separator.rb +0 -0
  140. /data/lib/{components → shadcn_phlexcomponents/components/form}/form_input.rb +0 -0
  141. /data/lib/{components → shadcn_phlexcomponents/components/label}/label.rb +0 -0
  142. /data/lib/{components → shadcn_phlexcomponents/components/link}/link.rb +0 -0
  143. /data/lib/{components → shadcn_phlexcomponents/components/pagination}/pagination.rb +0 -0
  144. /data/lib/{components → shadcn_phlexcomponents/components/pagination}/pagination_ellipsis.rb +0 -0
  145. /data/lib/{components → shadcn_phlexcomponents/components/pagination}/pagination_link.rb +0 -0
  146. /data/lib/{components → shadcn_phlexcomponents/components/pagination}/pagination_next.rb +0 -0
  147. /data/lib/{components → shadcn_phlexcomponents/components/pagination}/pagination_previous.rb +0 -0
  148. /data/lib/{components → shadcn_phlexcomponents/components/separator}/separator.rb +0 -0
  149. /data/lib/{components → shadcn_phlexcomponents/components/sheet}/sheet_description.rb +0 -0
  150. /data/lib/{components → shadcn_phlexcomponents/components/sheet}/sheet_footer.rb +0 -0
  151. /data/lib/{components → shadcn_phlexcomponents/components/sheet}/sheet_header.rb +0 -0
  152. /data/lib/{components → shadcn_phlexcomponents/components/sheet}/sheet_title.rb +0 -0
  153. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_container.rb +0 -0
  154. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_content.rb +0 -0
  155. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_footer.rb +0 -0
  156. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_group.rb +0 -0
  157. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_group_content.rb +0 -0
  158. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_group_label.rb +0 -0
  159. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_header.rb +0 -0
  160. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_inset.rb +0 -0
  161. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_menu.rb +0 -0
  162. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_menu_button.rb +0 -0
  163. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_menu_item.rb +0 -0
  164. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_menu_sub.rb +0 -0
  165. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_menu_sub_button.rb +0 -0
  166. /data/lib/{components → shadcn_phlexcomponents/components/sidebar}/sidebar_menu_sub_item.rb +0 -0
  167. /data/lib/{components → shadcn_phlexcomponents/components/skeleton}/skeleton.rb +0 -0
  168. /data/lib/{components → shadcn_phlexcomponents/components/table}/table.rb +0 -0
  169. /data/lib/{components → shadcn_phlexcomponents/components/table}/table_body.rb +0 -0
  170. /data/lib/{components → shadcn_phlexcomponents/components/table}/table_caption.rb +0 -0
  171. /data/lib/{components → shadcn_phlexcomponents/components/table}/table_cell.rb +0 -0
  172. /data/lib/{components → shadcn_phlexcomponents/components/table}/table_footer.rb +0 -0
  173. /data/lib/{components → shadcn_phlexcomponents/components/table}/table_head.rb +0 -0
  174. /data/lib/{components → shadcn_phlexcomponents/components/table}/table_header.rb +0 -0
  175. /data/lib/{components → shadcn_phlexcomponents/components/table}/table_row.rb +0 -0
  176. /data/lib/{components → shadcn_phlexcomponents/components/tabs}/tabs_list.rb +0 -0
  177. /data/lib/{components → shadcn_phlexcomponents/components/toast}/toast_action.rb +0 -0
  178. /data/lib/{components → shadcn_phlexcomponents/components/toast}/toast_action_to.rb +0 -0
  179. /data/lib/{components → shadcn_phlexcomponents/components/toast}/toast_content.rb +0 -0
  180. /data/lib/{components → shadcn_phlexcomponents/components/toast}/toast_description.rb +0 -0
  181. /data/lib/{components → shadcn_phlexcomponents/components/toast}/toast_title.rb +0 -0
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class FormSwitch < Base
5
+ include FormHelpers
6
+
7
+ def initialize(
8
+ method = nil,
9
+ model: false,
10
+ object_name: nil,
11
+ value: nil,
12
+ name: nil,
13
+ id: nil,
14
+ label: nil,
15
+ error: nil,
16
+ hint: nil,
17
+ **attributes
18
+ )
19
+ @method = method
20
+ @model = model
21
+ @object_name = object_name
22
+ @value = value
23
+ @model_value = model&.public_send(method)
24
+ @name = name
25
+ @id = id
26
+ @label = label
27
+ @error = error || (model ? model.errors.full_messages_for(method).first : nil)
28
+ @hint = hint
29
+ @aria_id = "form-field-#{SecureRandom.hex(5)}"
30
+ super(**attributes)
31
+ end
32
+
33
+ def label_attributes(use_label_styles: false, **attributes)
34
+ attributes[:class] = [
35
+ use_label_styles ? Label::STYLES : nil,
36
+ attributes[:class],
37
+ ].compact.join(" ")
38
+ attributes[:for] ||= @id
39
+ attributes
40
+ end
41
+
42
+ def view_template(&)
43
+ vanish(&)
44
+
45
+ @id ||= field_id(@object_name, @method)
46
+ @name ||= field_name(@object_name, @method)
47
+
48
+ div(class: "space-y-2", data: label_and_hint_container_attributes) do
49
+ div(class: "flex items-center gap-2") do
50
+ Switch(
51
+ id: @id,
52
+ name: @name,
53
+ value: @value || "1",
54
+ checked: !!@model_value,
55
+ aria: aria_attributes,
56
+ disabled: @disabled,
57
+ **@attributes,
58
+ )
59
+ render_label(&)
60
+ end
61
+ render_hint(&)
62
+ render_error
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class FormTextarea < Base
5
+ include FormHelpers
6
+
7
+ def initialize(
8
+ method = nil,
9
+ model: false,
10
+ object_name: nil,
11
+ value: nil,
12
+ name: nil,
13
+ id: nil,
14
+ label: nil,
15
+ error: nil,
16
+ hint: nil,
17
+ **attributes
18
+ )
19
+ @method = method
20
+ @model = model
21
+ @object_name = object_name
22
+ @value = value
23
+ @model_value = model&.public_send(method)
24
+ @name = name
25
+ @id = id
26
+ @label = label
27
+ @error = error || (model ? model.errors.full_messages_for(method).first : nil)
28
+ @hint = hint
29
+ @aria_id = "form-field-#{SecureRandom.hex(5)}"
30
+ super(**attributes)
31
+ end
32
+
33
+ def view_template(&)
34
+ vanish(&)
35
+
36
+ @id ||= field_id(@object_name, @method)
37
+ @name ||= field_name(@object_name, @method)
38
+
39
+ div(class: "space-y-2", data: label_and_hint_container_attributes) do
40
+ render_label(&)
41
+
42
+ # Wrap textarea in div to ensure spacing is correct as there were instances where certain browser extensions
43
+ # injecting html before/after the textarea causing the spacing to go weird.
44
+ div do
45
+ Textarea(
46
+ type: @type,
47
+ id: @id,
48
+ name: @name,
49
+ value: @value || @model_value,
50
+ aria: aria_attributes,
51
+ **@attributes,
52
+ )
53
+ end
54
+
55
+ render_hint(&)
56
+ render_error
57
+ end
58
+ end
59
+ end
60
+ end
@@ -20,7 +20,7 @@ module ShadcnPhlexcomponents
20
20
  def default_attributes
21
21
  {
22
22
  data: {
23
- controller: "shadcn-phlexcomponents--hover-card",
23
+ controller: "hover-card",
24
24
  side: @side,
25
25
  },
26
26
  }
@@ -15,7 +15,7 @@ module ShadcnPhlexcomponents
15
15
  end
16
16
 
17
17
  def view_template(&)
18
- div(class: "hidden", data: { "shadcn-phlexcomponents--hover-card-target": "content" }) do
18
+ div(class: "hidden", data: { "hover-card-target": "content" }) do
19
19
  div(**@attributes, &)
20
20
  end
21
21
  end
@@ -36,7 +36,7 @@ module ShadcnPhlexcomponents
36
36
  role: "button",
37
37
  data: {
38
38
  as_child: @as_child.to_s,
39
- "shadcn-phlexcomponents--hover-card-target": "trigger",
39
+ "hover-card-target": "trigger",
40
40
  },
41
41
  }
42
42
  end
@@ -4,7 +4,7 @@ module ShadcnPhlexcomponents
4
4
  class Input < Base
5
5
  STYLES = <<~HEREDOC
6
6
  flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1
7
- text-base shadow-sm transition-colors file:border-0 file:bg-transparent
7
+ text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:pt-1
8
8
  file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground
9
9
  focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring
10
10
  disabled:cursor-not-allowed disabled:opacity-50 md:text-sm
@@ -6,7 +6,7 @@ module ShadcnPhlexcomponents
6
6
  {
7
7
  type: @type,
8
8
  data: {
9
- controller: "shadcn-phlexcomponents--loading-button",
9
+ controller: "loading-button",
10
10
  },
11
11
  }
12
12
  end
@@ -21,7 +21,7 @@ module ShadcnPhlexcomponents
21
21
  def default_attributes
22
22
  {
23
23
  data: {
24
- controller: "shadcn-phlexcomponents--popover",
24
+ controller: "popover",
25
25
  side: @side,
26
26
  },
27
27
  }
@@ -3,11 +3,11 @@
3
3
  module ShadcnPhlexcomponents
4
4
  class PopoverContent < Base
5
5
  STYLES = <<~HEREDOC
6
- z-50 rounded-md border w-72 bg-popover p-4 text-popover-foreground shadow-md outline-none#{" "}
7
- data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0#{" "}
8
- data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95#{" "}
6
+ z-50 rounded-md border w-72 bg-popover p-4 text-popover-foreground shadow-md outline-none
7
+ data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0
8
+ data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95
9
9
  data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2
10
- data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2#{" "}
10
+ data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2
11
11
  HEREDOC
12
12
 
13
13
  def initialize(side: :bottom, aria_id: nil, **attributes)
@@ -19,7 +19,7 @@ module ShadcnPhlexcomponents
19
19
  def view_template(&)
20
20
  div(
21
21
  class: "hidden fixed top-0 left-0 w-max z-50",
22
- data: { "shadcn-phlexcomponents--popover-target": "contentWrapper" },
22
+ data: { "popover-target": "contentWrapper" },
23
23
  ) do
24
24
  div(**@attributes, &)
25
25
  end
@@ -32,7 +32,7 @@ module ShadcnPhlexcomponents
32
32
  role: "dialog",
33
33
  data: {
34
34
  side: @side,
35
- "shadcn-phlexcomponents--popover-target": "content",
35
+ "popover-target": "content",
36
36
  },
37
37
  }
38
38
  end
@@ -33,7 +33,6 @@ module ShadcnPhlexcomponents
33
33
 
34
34
  def default_attributes
35
35
  {
36
- id: @id,
37
36
  role: "button",
38
37
  aria: {
39
38
  haspopup: "dialog",
@@ -42,8 +41,8 @@ module ShadcnPhlexcomponents
42
41
  },
43
42
  data: {
44
43
  as_child: @as_child.to_s,
45
- action: "click->shadcn-phlexcomponents--popover#toggle",
46
- "shadcn-phlexcomponents--popover-target": "trigger",
44
+ action: "click->popover#toggle",
45
+ "popover-target": "trigger",
47
46
  },
48
47
  }
49
48
  end
@@ -18,8 +18,8 @@ module ShadcnPhlexcomponents
18
18
  valuenow: @value,
19
19
  },
20
20
  data: {
21
- controller: "shadcn-phlexcomponents--progress",
22
- "shadcn-phlexcomponents--progress-progress-value": @value,
21
+ controller: "progress",
22
+ "progress-progress-value": @value,
23
23
  },
24
24
  }
25
25
  end
@@ -29,7 +29,7 @@ module ShadcnPhlexcomponents
29
29
  div(
30
30
  class: "h-full w-full flex-1 bg-primary transition-all",
31
31
  style: "transform: translateX(-#{100 - @value}%)",
32
- data: { "shadcn-phlexcomponents--progress-target": "bar" },
32
+ data: { "progress-target": "bar" },
33
33
  )
34
34
  end
35
35
  end
@@ -4,19 +4,32 @@ module ShadcnPhlexcomponents
4
4
  class RadioGroup < Base
5
5
  STYLES = "grid gap-2 outline-none"
6
6
 
7
- def initialize(name: nil, value: nil, dir: "ltr", include_hidden: true, **attributes)
7
+ def initialize(name: nil, value: nil, dir: "ltr", include_hidden: true, item_id_prefix: nil, **attributes)
8
8
  @name = name
9
9
  @value = value
10
10
  @dir = dir
11
11
  @include_hidden = include_hidden
12
+ @item_id_prefix = item_id_prefix
12
13
  super(**attributes)
13
14
  end
14
15
 
16
+ def label(**attributes)
17
+ @label_attributes = attributes
18
+ nil
19
+ end
20
+
21
+ def radio(**attributes)
22
+ @radio_attributes = attributes
23
+ nil
24
+ end
25
+
15
26
  def item(name: nil, value: nil, **attributes)
16
27
  RadioGroupItem(name: name || @name, value: value, checked: @value == value, **attributes)
17
28
  end
18
29
 
19
- def items(collection, value_method:, text_method:, wrapper_class: nil)
30
+ def items(collection, value_method:, text_method:, wrapper_class: nil, disabled_items: nil, &)
31
+ vanish(&)
32
+
20
33
  wrapper_class = TAILWIND_MERGER.merge("flex items-center space-x-2 #{wrapper_class}")
21
34
 
22
35
  if collection.first&.is_a?(Hash)
@@ -26,13 +39,26 @@ module ShadcnPhlexcomponents
26
39
  collection.each do |item|
27
40
  value = item.public_send(value_method)
28
41
  text = item.public_send(text_method)
29
- id = "#{@name.parameterize.underscore}_#{value}"
42
+ id = if @item_id_prefix
43
+ "#{@item_id_prefix.parameterize.underscore}_#{value}"
44
+ else
45
+ "#{@name.parameterize.underscore}_#{value}"
46
+ end
30
47
 
31
48
  div(class: wrapper_class) do
32
- RadioGroupItem(name: @name, value: value, checked: @value == value, id: id)
33
- Label(for: id) { text }
49
+ RadioGroupItem(
50
+ name: @name,
51
+ value: value,
52
+ checked: @value == value,
53
+ id: id,
54
+ disabled: item_disabled?(disabled_items, value),
55
+ **@radio_attributes,
56
+ )
57
+ Label(for: id, **@label_attributes) { text }
34
58
  end
35
59
  end
60
+
61
+ nil
36
62
  end
37
63
 
38
64
  def view_template(&)
@@ -53,8 +79,8 @@ module ShadcnPhlexcomponents
53
79
  required: false,
54
80
  },
55
81
  data: {
56
- controller: "shadcn-phlexcomponents--radio-group",
57
- "shadcn-phlexcomponents--radio-group-selected-value": @value,
82
+ controller: "radio-group",
83
+ "radio-group-selected-value": @value,
58
84
  },
59
85
  }
60
86
  end
@@ -50,14 +50,14 @@ module ShadcnPhlexcomponents
50
50
  data: {
51
51
  checked: @checked.to_s,
52
52
  value: @value,
53
- "shadcn-phlexcomponents--radio-group-target": "item",
53
+ "radio-group-target": "item",
54
54
  action: <<~HEREDOC,
55
- click->shadcn-phlexcomponents--radio-group#setChecked
56
- keydown.right->shadcn-phlexcomponents--radio-group#setCheckedToNext:prevent
57
- keydown.down->shadcn-phlexcomponents--radio-group#setCheckedToNext:prevent
58
- keydown.up->shadcn-phlexcomponents--radio-group#setCheckedToPrev:prevent
59
- keydown.left->shadcn-phlexcomponents--radio-group#setCheckedToPrev:prevent
60
- keydown.enter->shadcn-phlexcomponents--radio-group#preventDefault
55
+ click->radio-group#setChecked
56
+ keydown.right->radio-group#setCheckedToNext:prevent
57
+ keydown.down->radio-group#setCheckedToNext:prevent
58
+ keydown.up->radio-group#setCheckedToPrev:prevent
59
+ keydown.left->radio-group#setCheckedToPrev:prevent
60
+ keydown.enter->radio-group#preventDefault
61
61
  HEREDOC
62
62
  },
63
63
  }
@@ -9,7 +9,7 @@ module ShadcnPhlexcomponents
9
9
  text-base shadow-sm transition-colors placeholder:text-muted-foreground
10
10
  focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring
11
11
  disabled:cursor-not-allowed disabled:opacity-50 md:text-sm appearance-none
12
- relative#{" "}
12
+ relative
13
13
  HEREDOC
14
14
 
15
15
  NATIVE_OPTION_STYLES = "bg-popover text-popover-foreground"
@@ -68,7 +68,13 @@ module ShadcnPhlexcomponents
68
68
  SelectGroup(aria_id: @aria_id, **attributes, &)
69
69
  end
70
70
 
71
- def items(collection)
71
+ def items(collection, value_method:, text_method:, disabled_items: nil, &)
72
+ vanish(&)
73
+
74
+ if collection.first&.is_a?(Hash)
75
+ collection = convert_collection_hash_to_struct(collection, value_method: value_method, text_method: text_method)
76
+ end
77
+
72
78
  SelectTrigger(
73
79
  id: @id,
74
80
  aria_id: @aria_id,
@@ -79,8 +85,11 @@ module ShadcnPhlexcomponents
79
85
  )
80
86
 
81
87
  SelectContent(aria_id: @aria_id, dir: @dir, include_blank: @include_blank, native: @native) do
82
- collection.each do |option|
83
- SelectItem(value: option[:value], aria_id: @aria_id, disabled: option[:disabled]) { option[:name] }
88
+ collection.each do |item|
89
+ value = item.public_send(value_method)
90
+ text = item.public_send(text_method)
91
+
92
+ SelectItem(value: value, aria_id: @aria_id, disabled: item_disabled?(disabled_items, value)) { text }
84
93
  end
85
94
  end
86
95
  end
@@ -88,7 +97,7 @@ module ShadcnPhlexcomponents
88
97
  def view_template(&)
89
98
  content = capture(&)
90
99
  element = Nokogiri::HTML.fragment(content.to_s)
91
- content_element = element.css('[data-shadcn-phlexcomponents--select-target="content"]')
100
+ content_element = element.css('[data-select-target="content"]')
92
101
 
93
102
  if @native
94
103
  div(class: "relative") do
@@ -110,8 +119,9 @@ module ShadcnPhlexcomponents
110
119
  name: @name,
111
120
  disabled: @disabled,
112
121
  class: "sr-only",
122
+ tabindex: -1,
113
123
  data: {
114
- "shadcn-phlexcomponents--select-target": "select",
124
+ "select-target": "select",
115
125
  },
116
126
  ) do
117
127
  option(value: "")
@@ -141,8 +151,8 @@ module ShadcnPhlexcomponents
141
151
  data: {
142
152
  side: @side,
143
153
  aria_id: @aria_id,
144
- controller: "shadcn-phlexcomponents--select",
145
- "shadcn-phlexcomponents--select-selected-value": @value,
154
+ controller: "select",
155
+ "select-selected-value": @value,
146
156
  },
147
157
  }
148
158
  end
@@ -152,11 +162,11 @@ module ShadcnPhlexcomponents
152
162
  content_element.children.each do |content_child|
153
163
  next if content_child.is_a?(Nokogiri::XML::Text) || content_child.is_a?(Nokogiri::XML::Comment)
154
164
 
155
- if content_child.attributes["data-shadcn-phlexcomponents--select-target"]&.value == "group"
156
- group_label = content_child.at_css('[data-shadcn-phlexcomponents--select-target="label"]')&.text
165
+ if content_child.attributes["data-select-target"]&.value == "group"
166
+ group_label = content_child.at_css('[data-select-target="label"]')&.text
157
167
 
158
168
  optgroup(label: group_label, class: NATIVE_OPTION_STYLES) do
159
- content_child.css('[data-shadcn-phlexcomponents--select-target="item"]').each do |i|
169
+ content_child.css('[data-select-target="item"]').each do |i|
160
170
  option(
161
171
  value: i.attributes["data-value"].value,
162
172
  class: NATIVE_OPTION_STYLES,
@@ -167,7 +177,7 @@ module ShadcnPhlexcomponents
167
177
  end
168
178
  end
169
179
  end
170
- elsif content_child.attributes["data-shadcn-phlexcomponents--select-target"]&.value == "item"
180
+ elsif content_child.attributes["data-select-target"]&.value == "item"
171
181
 
172
182
  option(
173
183
  value: content_child.attributes["data-value"].value,
@@ -4,12 +4,12 @@ module ShadcnPhlexcomponents
4
4
  class SelectContent < Base
5
5
  STYLES = <<~HEREDOC
6
6
  relative z-50 min-w-[8rem] max-h-108 overflow-y-auto overflow-x-hidden rounded-md border
7
- bg-popover text-popover-foreground p-1 shadow-md outline-none
7
+ bg-popover text-popover-foreground p-1 shadow-md outline-none pointer-events-auto
8
8
  data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0
9
9
  data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95
10
10
  data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2
11
11
  data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2
12
- data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1#{" "}
12
+ data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1
13
13
  data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1
14
14
  HEREDOC
15
15
 
@@ -25,7 +25,7 @@ module ShadcnPhlexcomponents
25
25
  def view_template(&)
26
26
  div(
27
27
  class: "hidden fixed top-0 left-0 w-max z-50",
28
- data: { "shadcn-phlexcomponents--select-target": "contentWrapper" },
28
+ data: { "select-target": "contentWrapper" },
29
29
  ) do
30
30
  div(**@attributes) do
31
31
  if @include_blank && !@native
@@ -52,10 +52,10 @@ module ShadcnPhlexcomponents
52
52
  data: {
53
53
  state: "closed",
54
54
  side: @side,
55
- "shadcn-phlexcomponents--select-target": "content",
55
+ "select-target": "content",
56
56
  action: <<~HEREDOC,
57
- keydown.up->shadcn-phlexcomponents--select#focusLastItem:prevent
58
- keydown.down->shadcn-phlexcomponents--select#focusFirstItem:prevent
57
+ keydown.up->select#focusLastItem:prevent
58
+ keydown.down->select#focusFirstItem:prevent
59
59
  HEREDOC
60
60
  },
61
61
  }
@@ -15,7 +15,7 @@ module ShadcnPhlexcomponents
15
15
  {
16
16
  role: "group",
17
17
  data: {
18
- "shadcn-phlexcomponents--select-target": "group",
18
+ "select-target": "group",
19
19
  },
20
20
  }
21
21
  end
@@ -43,15 +43,15 @@ module ShadcnPhlexcomponents
43
43
  disabled: @disabled,
44
44
  value: @value,
45
45
  action: <<~HEREDOC,
46
- click->shadcn-phlexcomponents--select#selectItem
47
- keydown.up->shadcn-phlexcomponents--select#focusPrevItem:prevent:stop
48
- keydown.down->shadcn-phlexcomponents--select#focusNextItem:prevent:stop
49
- keydown.enter->shadcn-phlexcomponents--select#selectItem:prevent
50
- keydown.space->shadcn-phlexcomponents--select#selectItem:prevent
51
- mouseover->shadcn-phlexcomponents--select#focusItem
52
- mouseout->shadcn-phlexcomponents--select#focusContent
46
+ click->select#selectItem
47
+ keydown.up->select#focusPrevItem:prevent:stop
48
+ keydown.down->select#focusNextItem:prevent:stop
49
+ keydown.enter->select#selectItem:prevent
50
+ keydown.space->select#selectItem:prevent
51
+ mouseover->select#focusItem
52
+ mouseout->select#focusContent
53
53
  HEREDOC
54
- "shadcn-phlexcomponents--select-target": "item",
54
+ "select-target": "item",
55
55
  },
56
56
  }
57
57
  end
@@ -16,7 +16,7 @@ module ShadcnPhlexcomponents
16
16
  def default_attributes
17
17
  {
18
18
  data: {
19
- "shadcn-phlexcomponents--select-target": "label",
19
+ "select-target": "label",
20
20
  },
21
21
  }
22
22
  end
@@ -4,8 +4,8 @@ module ShadcnPhlexcomponents
4
4
  class SelectTrigger < Base
5
5
  STYLES = <<~HEREDOC
6
6
  flex h-9 items-center justify-between whitespace-nowrap rounded-md border
7
- border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background#{" "}
8
- data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1
7
+ border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background
8
+ data-[placeholder]:data-[has-value=false]:text-muted-foreground focus:outline-none focus:ring-1
9
9
  focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1
10
10
  w-full cursor-pointer
11
11
  HEREDOC
@@ -21,11 +21,11 @@ module ShadcnPhlexcomponents
21
21
 
22
22
  def view_template
23
23
  button(**@attributes) do
24
- span(class: "pointer-events-none", data: { "shadcn-phlexcomponents--select-target": "triggerText" }) do
24
+ span(class: "pointer-events-none", data: { "select-target": "triggerText" }) do
25
25
  @value || @placeholder
26
26
  end
27
27
 
28
- icon("chevron-down", class: "size-4 opacity-50")
28
+ icon("chevron-down", class: "size-4 opacity-50 text-foreground")
29
29
  end
30
30
  end
31
31
 
@@ -41,14 +41,14 @@ module ShadcnPhlexcomponents
41
41
  controls: "#{@aria_id}-content",
42
42
  },
43
43
  data: {
44
- placeholder: @placeholder.present?,
45
- placeholder_text: @placeholder,
44
+ placeholder: @placeholder,
45
+ has_value: @value.present?.to_s,
46
46
  action: <<~HEREDOC,
47
- click->shadcn-phlexcomponents--select#toggle
48
- keydown.down->shadcn-phlexcomponents--select#toggle:prevent
49
- keydown.up->shadcn-phlexcomponents--select#toggle:prevent
47
+ click->select#toggle
48
+ keydown.down->select#toggle:prevent
49
+ keydown.up->select#toggle:prevent
50
50
  HEREDOC
51
- "shadcn-phlexcomponents--select-target": "trigger",
51
+ "select-target": "trigger",
52
52
  },
53
53
  }
54
54
  end
@@ -45,7 +45,7 @@ module ShadcnPhlexcomponents
45
45
  def default_attributes
46
46
  {
47
47
  data: {
48
- controller: "shadcn-phlexcomponents--sheet",
48
+ controller: "dialog",
49
49
  },
50
50
  }
51
51
  end
@@ -34,7 +34,7 @@ module ShadcnPhlexcomponents
34
34
  {
35
35
  role: "button",
36
36
  data: {
37
- action: "click->shadcn-phlexcomponents--sheet#close",
37
+ action: "click->dialog#close",
38
38
  },
39
39
  }
40
40
  end
@@ -5,7 +5,7 @@ module ShadcnPhlexcomponents
5
5
  STYLES = <<~HEREDOC
6
6
  fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out
7
7
  data-[state=closed]:duration-300 data-[state=open]:duration-500
8
- data-[state=open]:animate-in data-[state=closed]:animate-out
8
+ data-[state=open]:animate-in data-[state=closed]:animate-out pointer-events-auto
9
9
  HEREDOC
10
10
 
11
11
  CLOSE_BUTTON_STYLES = <<~HEREDOC
@@ -36,7 +36,7 @@ module ShadcnPhlexcomponents
36
36
  div(class: "#{@class} hidden", **@attributes) do
37
37
  yield
38
38
 
39
- button(class: CLOSE_BUTTON_STYLES, data: { action: "click->shadcn-phlexcomponents--sheet#close" }) do
39
+ button(class: CLOSE_BUTTON_STYLES, data: { action: "click->dialog#close" }) do
40
40
  icon("x", class: "size-4")
41
41
  span(class: "sr-only") { "close" }
42
42
  end
@@ -53,7 +53,7 @@ module ShadcnPhlexcomponents
53
53
  labelledby: "#{@aria_id}-title",
54
54
  },
55
55
  data: {
56
- "shadcn-phlexcomponents--sheet-target": "content",
56
+ "dialog-target": "content",
57
57
  },
58
58
  }
59
59
  end
@@ -41,8 +41,8 @@ module ShadcnPhlexcomponents
41
41
  },
42
42
  data: {
43
43
  as_child: @as_child.to_s,
44
- action: "click->shadcn-phlexcomponents--sheet#open",
45
- "shadcn-phlexcomponents--sheet-target": "trigger",
44
+ action: "click->dialog#open",
45
+ "dialog-target": "trigger",
46
46
  },
47
47
  }
48
48
  end