shadcn_phlexcomponents 0.1.5 → 0.1.11

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 (249) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -0
  3. data/app/javascript/controllers/accordion_controller.ts +133 -0
  4. data/app/javascript/controllers/{avatar_controller.js → avatar_controller.ts} +4 -0
  5. data/app/javascript/controllers/checkbox_controller.ts +34 -0
  6. data/app/javascript/controllers/collapsible_controller.ts +45 -0
  7. data/app/javascript/controllers/combobox_controller.ts +145 -0
  8. data/app/javascript/controllers/command_controller.ts +129 -0
  9. data/app/javascript/controllers/command_root_controller.ts +355 -0
  10. data/app/javascript/controllers/date_picker_controller.ts +274 -0
  11. data/app/javascript/controllers/date_range_picker_controller.ts +243 -0
  12. data/app/javascript/controllers/dialog_controller.ts +113 -0
  13. data/app/javascript/controllers/dropdown_menu_controller.ts +133 -0
  14. data/app/javascript/controllers/dropdown_menu_root_controller.ts +234 -0
  15. data/app/javascript/controllers/dropdown_menu_sub_controller.ts +150 -0
  16. data/app/javascript/controllers/form_field_controller.ts +22 -0
  17. data/app/javascript/controllers/hover_card_controller.ts +93 -0
  18. data/app/javascript/controllers/{loading_button_controller.js → loading_button_controller.ts} +2 -2
  19. data/app/javascript/controllers/popover_controller.ts +141 -0
  20. data/app/javascript/controllers/progress_controller.ts +17 -0
  21. data/app/javascript/controllers/radio_group_controller.ts +106 -0
  22. data/app/javascript/controllers/select_controller.ts +200 -0
  23. data/app/javascript/controllers/{sidebar_controller.js → sidebar_controller.ts} +6 -2
  24. data/app/javascript/controllers/sidebar_trigger_controller.ts +21 -0
  25. data/app/javascript/controllers/slider_controller.ts +107 -0
  26. data/app/javascript/controllers/switch_controller.ts +30 -0
  27. data/app/javascript/controllers/tabs_controller.ts +79 -0
  28. data/app/javascript/controllers/{theme_switcher_controller.js → theme_switcher_controller.ts} +12 -9
  29. data/app/javascript/controllers/toast_container_controller.ts +62 -0
  30. data/app/javascript/controllers/toast_controller.ts +28 -0
  31. data/app/javascript/controllers/tooltip_controller.ts +98 -0
  32. data/app/javascript/shadcn_phlexcomponents.ts +57 -0
  33. data/app/javascript/utils.ts +437 -0
  34. data/app/stylesheets/date_picker.css +74 -0
  35. data/app/stylesheets/nouislider.css +173 -0
  36. data/app/stylesheets/tw-animate.css +486 -0
  37. data/lib/install/install_shadcn_phlexcomponents.rb +22 -9
  38. data/lib/shadcn_phlexcomponents/alias.rb +3 -1
  39. data/lib/shadcn_phlexcomponents/components/accordion.rb +129 -0
  40. data/lib/shadcn_phlexcomponents/components/alert.rb +59 -0
  41. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +276 -0
  42. data/lib/{components → shadcn_phlexcomponents/components}/aspect_ratio.rb +2 -2
  43. data/lib/shadcn_phlexcomponents/components/avatar.rb +63 -0
  44. data/lib/shadcn_phlexcomponents/components/badge.rb +35 -0
  45. data/lib/{components → shadcn_phlexcomponents/components}/base.rb +44 -7
  46. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +150 -0
  47. data/lib/shadcn_phlexcomponents/components/button.rb +49 -0
  48. data/lib/shadcn_phlexcomponents/components/card.rb +88 -0
  49. data/lib/{components → shadcn_phlexcomponents/components}/checkbox.rb +21 -17
  50. data/lib/{components → shadcn_phlexcomponents/components}/checkbox_group.rb +27 -16
  51. data/lib/shadcn_phlexcomponents/components/collapsible.rb +91 -0
  52. data/lib/shadcn_phlexcomponents/components/combobox.rb +398 -0
  53. data/lib/shadcn_phlexcomponents/components/command.rb +351 -0
  54. data/lib/shadcn_phlexcomponents/components/date_picker.rb +264 -0
  55. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +126 -0
  56. data/lib/shadcn_phlexcomponents/components/dialog.rb +234 -0
  57. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +282 -0
  58. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +135 -0
  59. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +82 -0
  60. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +116 -0
  61. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +46 -0
  62. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +82 -0
  63. data/lib/{components → shadcn_phlexcomponents/components/form}/form_error.rb +7 -3
  64. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +143 -0
  65. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +21 -0
  66. data/lib/{components → shadcn_phlexcomponents/components/form}/form_input.rb +3 -4
  67. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +106 -0
  68. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +64 -0
  69. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +91 -0
  70. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +67 -0
  71. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +59 -0
  72. data/lib/shadcn_phlexcomponents/components/form.rb +157 -0
  73. data/lib/shadcn_phlexcomponents/components/hover_card.rb +110 -0
  74. data/lib/shadcn_phlexcomponents/components/input.rb +31 -0
  75. data/lib/shadcn_phlexcomponents/components/label.rb +16 -0
  76. data/lib/{components → shadcn_phlexcomponents/components}/link.rb +10 -3
  77. data/lib/shadcn_phlexcomponents/components/loading_button.rb +28 -0
  78. data/lib/shadcn_phlexcomponents/components/pagination.rb +166 -0
  79. data/lib/shadcn_phlexcomponents/components/popover.rb +116 -0
  80. data/lib/{components → shadcn_phlexcomponents/components}/progress.rb +5 -5
  81. data/lib/shadcn_phlexcomponents/components/radio_group.rb +155 -0
  82. data/lib/shadcn_phlexcomponents/components/select.rb +421 -0
  83. data/lib/{components → shadcn_phlexcomponents/components}/separator.rb +9 -8
  84. data/lib/shadcn_phlexcomponents/components/sheet.rb +239 -0
  85. data/lib/{components → shadcn_phlexcomponents/components}/skeleton.rb +1 -1
  86. data/lib/shadcn_phlexcomponents/components/slider.rb +72 -0
  87. data/lib/shadcn_phlexcomponents/components/switch.rb +75 -0
  88. data/lib/shadcn_phlexcomponents/components/table.rb +140 -0
  89. data/lib/shadcn_phlexcomponents/components/tabs.rb +135 -0
  90. data/lib/shadcn_phlexcomponents/components/textarea.rb +24 -0
  91. data/lib/{components → shadcn_phlexcomponents/components}/theme_switcher.rb +2 -2
  92. data/lib/shadcn_phlexcomponents/components/toast.rb +153 -0
  93. data/lib/{components → shadcn_phlexcomponents/components}/toast_container.rb +24 -5
  94. data/lib/shadcn_phlexcomponents/components/tooltip.rb +131 -0
  95. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +25 -0
  96. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  97. data/lib/tasks/install.rake +1 -1
  98. metadata +92 -168
  99. data/app/assets/tailwind/choices.css +0 -324
  100. data/app/assets/tailwind/tailwindcss-animate.css +0 -318
  101. data/app/assets/tailwind/vanilla-calendar-pro.css +0 -466
  102. data/app/javascript/controllers/accordion_controller.js +0 -133
  103. data/app/javascript/controllers/alert_dialog_controller.js +0 -157
  104. data/app/javascript/controllers/checkbox_controller.js +0 -28
  105. data/app/javascript/controllers/collapsible_controller.js +0 -35
  106. data/app/javascript/controllers/combobox_controller.js +0 -34
  107. data/app/javascript/controllers/date_picker_controller.js +0 -118
  108. data/app/javascript/controllers/date_range_picker_controller.js +0 -231
  109. data/app/javascript/controllers/dialog_controller.js +0 -159
  110. data/app/javascript/controllers/dropdown_menu_controller.js +0 -193
  111. data/app/javascript/controllers/hover_card_controller.js +0 -42
  112. data/app/javascript/controllers/popover_controller.js +0 -124
  113. data/app/javascript/controllers/progress_controller.js +0 -14
  114. data/app/javascript/controllers/radio_group_controller.js +0 -90
  115. data/app/javascript/controllers/select_controller.js +0 -294
  116. data/app/javascript/controllers/sheet_controller.js +0 -159
  117. data/app/javascript/controllers/sidebar_trigger_controller.js +0 -15
  118. data/app/javascript/controllers/switch_controller.js +0 -24
  119. data/app/javascript/controllers/tabs_controller.js +0 -73
  120. data/app/javascript/controllers/toast_container_controller.js +0 -22
  121. data/app/javascript/controllers/toast_controller.js +0 -45
  122. data/app/javascript/controllers/tooltip_controller.js +0 -41
  123. data/lib/components/accordion.rb +0 -38
  124. data/lib/components/accordion_content.rb +0 -30
  125. data/lib/components/accordion_item.rb +0 -26
  126. data/lib/components/accordion_trigger.rb +0 -45
  127. data/lib/components/alert.rb +0 -40
  128. data/lib/components/alert_description.rb +0 -11
  129. data/lib/components/alert_dialog.rb +0 -60
  130. data/lib/components/alert_dialog_action.rb +0 -22
  131. data/lib/components/alert_dialog_action_to.rb +0 -40
  132. data/lib/components/alert_dialog_cancel.rb +0 -22
  133. data/lib/components/alert_dialog_content.rb +0 -40
  134. data/lib/components/alert_dialog_description.rb +0 -22
  135. data/lib/components/alert_dialog_footer.rb +0 -11
  136. data/lib/components/alert_dialog_header.rb +0 -11
  137. data/lib/components/alert_dialog_title.rb +0 -22
  138. data/lib/components/alert_dialog_trigger.rb +0 -50
  139. data/lib/components/alert_title.rb +0 -11
  140. data/lib/components/avatar.rb +0 -31
  141. data/lib/components/avatar_fallback.rb +0 -21
  142. data/lib/components/avatar_image.rb +0 -19
  143. data/lib/components/badge.rb +0 -30
  144. data/lib/components/breadcrumb.rb +0 -51
  145. data/lib/components/breadcrumb_ellipsis.rb +0 -23
  146. data/lib/components/breadcrumb_item.rb +0 -11
  147. data/lib/components/breadcrumb_link.rb +0 -7
  148. data/lib/components/breadcrumb_page.rb +0 -21
  149. data/lib/components/breadcrumb_separator.rb +0 -26
  150. data/lib/components/button.rb +0 -53
  151. data/lib/components/card.rb +0 -31
  152. data/lib/components/card_content.rb +0 -11
  153. data/lib/components/card_description.rb +0 -11
  154. data/lib/components/card_footer.rb +0 -11
  155. data/lib/components/card_header.rb +0 -11
  156. data/lib/components/card_title.rb +0 -11
  157. data/lib/components/collapsible.rb +0 -31
  158. data/lib/components/collapsible_content.rb +0 -24
  159. data/lib/components/collapsible_trigger.rb +0 -50
  160. data/lib/components/combobox.rb +0 -57
  161. data/lib/components/combobox_item.rb +0 -9
  162. data/lib/components/date_picker.rb +0 -94
  163. data/lib/components/date_range_picker.rb +0 -113
  164. data/lib/components/dialog.rb +0 -52
  165. data/lib/components/dialog_close.rb +0 -42
  166. data/lib/components/dialog_content.rb +0 -54
  167. data/lib/components/dialog_description.rb +0 -22
  168. data/lib/components/dialog_footer.rb +0 -11
  169. data/lib/components/dialog_header.rb +0 -11
  170. data/lib/components/dialog_title.rb +0 -22
  171. data/lib/components/dialog_trigger.rb +0 -50
  172. data/lib/components/dropdown_menu.rb +0 -50
  173. data/lib/components/dropdown_menu_content.rb +0 -52
  174. data/lib/components/dropdown_menu_item.rb +0 -56
  175. data/lib/components/dropdown_menu_item_to.rb +0 -28
  176. data/lib/components/dropdown_menu_label.rb +0 -11
  177. data/lib/components/dropdown_menu_separator.rb +0 -20
  178. data/lib/components/dropdown_menu_trigger.rb +0 -57
  179. data/lib/components/form.rb +0 -59
  180. data/lib/components/form_hint.rb +0 -17
  181. data/lib/components/hover_card.rb +0 -33
  182. data/lib/components/hover_card_content.rb +0 -32
  183. data/lib/components/hover_card_trigger.rb +0 -44
  184. data/lib/components/input.rb +0 -32
  185. data/lib/components/label.rb +0 -14
  186. data/lib/components/loading_button.rb +0 -21
  187. data/lib/components/pagination.rb +0 -38
  188. data/lib/components/pagination_ellipsis.rb +0 -24
  189. data/lib/components/pagination_link.rb +0 -34
  190. data/lib/components/pagination_next.rb +0 -32
  191. data/lib/components/pagination_previous.rb +0 -32
  192. data/lib/components/popover.rb +0 -34
  193. data/lib/components/popover_content.rb +0 -40
  194. data/lib/components/popover_trigger.rb +0 -51
  195. data/lib/components/radio_group.rb +0 -62
  196. data/lib/components/radio_group_item.rb +0 -66
  197. data/lib/components/select.rb +0 -184
  198. data/lib/components/select_content.rb +0 -64
  199. data/lib/components/select_group.rb +0 -23
  200. data/lib/components/select_item.rb +0 -59
  201. data/lib/components/select_label.rb +0 -24
  202. data/lib/components/select_trigger.rb +0 -56
  203. data/lib/components/sheet.rb +0 -53
  204. data/lib/components/sheet_close.rb +0 -42
  205. data/lib/components/sheet_content.rb +0 -65
  206. data/lib/components/sheet_description.rb +0 -22
  207. data/lib/components/sheet_footer.rb +0 -11
  208. data/lib/components/sheet_header.rb +0 -11
  209. data/lib/components/sheet_title.rb +0 -22
  210. data/lib/components/sheet_trigger.rb +0 -50
  211. data/lib/components/sidebar.rb +0 -108
  212. data/lib/components/sidebar_container.rb +0 -11
  213. data/lib/components/sidebar_content.rb +0 -11
  214. data/lib/components/sidebar_footer.rb +0 -11
  215. data/lib/components/sidebar_group.rb +0 -11
  216. data/lib/components/sidebar_group_content.rb +0 -11
  217. data/lib/components/sidebar_group_label.rb +0 -16
  218. data/lib/components/sidebar_header.rb +0 -11
  219. data/lib/components/sidebar_inset.rb +0 -15
  220. data/lib/components/sidebar_menu.rb +0 -11
  221. data/lib/components/sidebar_menu_button.rb +0 -61
  222. data/lib/components/sidebar_menu_item.rb +0 -9
  223. data/lib/components/sidebar_menu_sub.rb +0 -14
  224. data/lib/components/sidebar_menu_sub_button.rb +0 -48
  225. data/lib/components/sidebar_menu_sub_item.rb +0 -9
  226. data/lib/components/sidebar_trigger.rb +0 -40
  227. data/lib/components/switch.rb +0 -66
  228. data/lib/components/table.rb +0 -75
  229. data/lib/components/table_body.rb +0 -11
  230. data/lib/components/table_caption.rb +0 -11
  231. data/lib/components/table_cell.rb +0 -11
  232. data/lib/components/table_footer.rb +0 -11
  233. data/lib/components/table_head.rb +0 -14
  234. data/lib/components/table_header.rb +0 -11
  235. data/lib/components/table_row.rb +0 -11
  236. data/lib/components/tabs.rb +0 -38
  237. data/lib/components/tabs_content.rb +0 -35
  238. data/lib/components/tabs_list.rb +0 -23
  239. data/lib/components/tabs_trigger.rb +0 -45
  240. data/lib/components/textarea.rb +0 -28
  241. data/lib/components/toast.rb +0 -101
  242. data/lib/components/toast_action.rb +0 -39
  243. data/lib/components/toast_action_to.rb +0 -28
  244. data/lib/components/toast_content.rb +0 -11
  245. data/lib/components/toast_description.rb +0 -11
  246. data/lib/components/toast_title.rb +0 -11
  247. data/lib/components/tooltip.rb +0 -34
  248. data/lib/components/tooltip_content.rb +0 -39
  249. data/lib/components/tooltip_trigger.rb +0 -48
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class Label < Base
5
- STYLES = <<~HEREDOC
6
- text-sm font-medium leading-none peer-disabled:cursor-not-allowed
7
- peer-disabled:opacity-70 block
8
- HEREDOC
9
-
10
- def view_template(&)
11
- label(**@attributes, &)
12
- end
13
- end
14
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class LoadingButton < Button
5
- def default_attributes
6
- {
7
- type: @type,
8
- data: {
9
- controller: "shadcn-phlexcomponents--loading-button",
10
- },
11
- }
12
- end
13
-
14
- def view_template(&)
15
- button(**@attributes) do
16
- icon("loader-circle", class: "animate-spin hidden group-aria-busy:inline")
17
- yield
18
- end
19
- end
20
- end
21
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class Pagination < Base
5
- STYLES = "mx-auto flex w-full justify-center"
6
-
7
- def link(**attributes, &)
8
- PaginationLink(**attributes, &)
9
- end
10
-
11
- def previous(**attributes, &)
12
- PaginationPrevious(**attributes, &)
13
- end
14
-
15
- def next(**attributes, &)
16
- PaginationNext(**attributes, &)
17
- end
18
-
19
- def ellipsis(**attributes, &)
20
- PaginationEllipsis(**attributes, &)
21
- end
22
-
23
- def default_attributes
24
- {
25
- role: "navigation",
26
- aria: {
27
- label: "navigation",
28
- },
29
- }
30
- end
31
-
32
- def view_template(&)
33
- div(**@attributes) do
34
- ul(class: "flex flex-row items-center gap-1", &)
35
- end
36
- end
37
- end
38
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class PaginationEllipsis < Base
5
- STYLES = "flex h-9 w-9 items-center justify-center"
6
-
7
- def default_attributes
8
- {
9
- aria: {
10
- hidden: "true",
11
- },
12
- }
13
- end
14
-
15
- def view_template
16
- li do
17
- span(**@attributes) do
18
- icon("ellipsis", class: "size-4")
19
- span(class: "sr-only") { "More pages" }
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class PaginationLink < Base
5
- def initialize(href: nil, active: false, **attributes)
6
- @href = href
7
- @active = active
8
- super(**attributes)
9
- end
10
-
11
- def default_styles
12
- if @active
13
- Button.default_styles(variant: :outline, size: :icon)
14
- else
15
- Button.default_styles(variant: :ghost, size: :icon)
16
- end
17
- end
18
-
19
- def default_attributes
20
- {
21
- href: @href,
22
- aria: {
23
- current: @active ? "page" : nil,
24
- },
25
- }
26
- end
27
-
28
- def view_template(&)
29
- li do
30
- a(**@attributes, &)
31
- end
32
- end
33
- end
34
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class PaginationNext < Base
5
- def initialize(href: nil, **attributes)
6
- @href = href
7
- super(**attributes)
8
- end
9
-
10
- def default_styles
11
- "#{Button.default_styles(variant: :ghost, size: :default)} gap-1 pr-2.5"
12
- end
13
-
14
- def default_attributes
15
- {
16
- href: @href,
17
- aria: {
18
- label: "Go to next page",
19
- },
20
- }
21
- end
22
-
23
- def view_template(&)
24
- li do
25
- a(**@attributes) do
26
- span { "Next" }
27
- icon("chevron-right", class: "size-4")
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class PaginationPrevious < Base
5
- def initialize(href: nil, **attributes)
6
- @href = href
7
- super(**attributes)
8
- end
9
-
10
- def default_attributes
11
- {
12
- href: @href,
13
- aria: {
14
- label: "Go to previous page",
15
- },
16
- }
17
- end
18
-
19
- def default_styles
20
- "#{Button.default_styles(variant: :ghost, size: :default)} gap-1 pl-2.5"
21
- end
22
-
23
- def view_template(&)
24
- li do
25
- a(**@attributes) do
26
- icon("chevron-left", class: "size-4")
27
- span { "Previous" }
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class Popover < Base
5
- STYLES = "inline-block"
6
-
7
- def initialize(side: :bottom, aria_id: "popover-#{SecureRandom.hex(5)}", **attributes)
8
- @side = side
9
- @aria_id = aria_id
10
- super(**attributes)
11
- end
12
-
13
- def content(**attributes, &)
14
- PopoverContent(side: @side, aria_id: @aria_id, **attributes, &)
15
- end
16
-
17
- def trigger(**attributes, &)
18
- PopoverTrigger(aria_id: @aria_id, **attributes, &)
19
- end
20
-
21
- def default_attributes
22
- {
23
- data: {
24
- controller: "shadcn-phlexcomponents--popover",
25
- side: @side,
26
- },
27
- }
28
- end
29
-
30
- def view_template(&)
31
- div(**@attributes, &)
32
- end
33
- end
34
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class PopoverContent < Base
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#{" "}
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#{" "}
11
- HEREDOC
12
-
13
- def initialize(side: :bottom, aria_id: nil, **attributes)
14
- @side = side
15
- @aria_id = aria_id
16
- super(**attributes)
17
- end
18
-
19
- def view_template(&)
20
- div(
21
- class: "hidden fixed top-0 left-0 w-max z-50",
22
- data: { "shadcn-phlexcomponents--popover-target": "contentWrapper" },
23
- ) do
24
- div(**@attributes, &)
25
- end
26
- end
27
-
28
- def default_attributes
29
- {
30
- id: "#{@aria_id}-content",
31
- tabindex: -1,
32
- role: "dialog",
33
- data: {
34
- side: @side,
35
- "shadcn-phlexcomponents--popover-target": "content",
36
- },
37
- }
38
- end
39
- end
40
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class PopoverTrigger < Base
5
- def initialize(as_child: false, aria_id: nil, **attributes)
6
- @as_child = as_child
7
- @aria_id = aria_id
8
- super(**attributes)
9
- end
10
-
11
- def view_template(&)
12
- if @as_child
13
- content = capture(&)
14
- element = find_as_child(content.to_s)
15
-
16
- vanish(&)
17
- element_attributes = nokogiri_attributes_to_hash(element)
18
- styles = TAILWIND_MERGER.merge("#{@attributes[:class]} #{element_attributes[:class]}")
19
- merged_attributes = mix(@attributes, element_attributes)
20
- merged_attributes[:class] = styles
21
-
22
- if element.name == "button"
23
- merged_attributes.delete(:role)
24
- end
25
-
26
- send(element.name, **merged_attributes) do
27
- sanitize_as_child(element.children.to_s)
28
- end
29
- else
30
- div(**@attributes, &)
31
- end
32
- end
33
-
34
- def default_attributes
35
- {
36
- id: @id,
37
- role: "button",
38
- aria: {
39
- haspopup: "dialog",
40
- expanded: false,
41
- controls: "#{@aria_id}-content",
42
- },
43
- data: {
44
- as_child: @as_child.to_s,
45
- action: "click->shadcn-phlexcomponents--popover#toggle",
46
- "shadcn-phlexcomponents--popover-target": "trigger",
47
- },
48
- }
49
- end
50
- end
51
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class RadioGroup < Base
5
- STYLES = "grid gap-2 outline-none"
6
-
7
- def initialize(name: nil, value: nil, dir: "ltr", include_hidden: true, **attributes)
8
- @name = name
9
- @value = value
10
- @dir = dir
11
- @include_hidden = include_hidden
12
- super(**attributes)
13
- end
14
-
15
- def item(name: nil, value: nil, **attributes)
16
- RadioGroupItem(name: name || @name, value: value, checked: @value == value, **attributes)
17
- end
18
-
19
- def items(collection, value_method:, text_method:, wrapper_class: nil)
20
- wrapper_class = TAILWIND_MERGER.merge("flex items-center space-x-2 #{wrapper_class}")
21
-
22
- if collection.first&.is_a?(Hash)
23
- collection = convert_collection_hash_to_struct(collection, value_method: value_method, text_method: text_method)
24
- end
25
-
26
- collection.each do |item|
27
- value = item.public_send(value_method)
28
- text = item.public_send(text_method)
29
- id = "#{@name.parameterize.underscore}_#{value}"
30
-
31
- div(class: wrapper_class) do
32
- RadioGroupItem(name: @name, value: value, checked: @value == value, id: id)
33
- Label(for: id) { text }
34
- end
35
- end
36
- end
37
-
38
- def view_template(&)
39
- div(**@attributes) do
40
- if @include_hidden
41
- input(type: "hidden", name: @name, autocomplete: "off")
42
- end
43
-
44
- yield
45
- end
46
- end
47
-
48
- def default_attributes
49
- {
50
- role: "radiogroup",
51
- dir: @dir,
52
- aria: {
53
- required: false,
54
- },
55
- data: {
56
- controller: "shadcn-phlexcomponents--radio-group",
57
- "shadcn-phlexcomponents--radio-group-selected-value": @value,
58
- },
59
- }
60
- end
61
- end
62
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class RadioGroupItem < Base
5
- STYLES = <<~HEREDOC
6
- aspect-square h-4 w-4 rounded-full border border-primary text-primary shadow
7
- focus:outline-none focus-visible:ring-1 focus-visible:ring-ring
8
- disabled:cursor-not-allowed disabled:opacity-50 relative cursor-pointer
9
- group/radio
10
- HEREDOC
11
-
12
- def initialize(name: nil, value: nil, checked: false, id: nil, **attributes)
13
- @value = value
14
- @name = name
15
- @checked = checked
16
- @id = id || name
17
- super(**attributes)
18
- end
19
-
20
- def view_template(&)
21
- button(**@attributes) do
22
- span(
23
- class: "items-center justify-center hidden group-data-[checked=true]/radio:flex",
24
- ) do
25
- icon("circle", class: "size-2.5 fill-primary")
26
- end
27
-
28
- input(
29
- type: "radio",
30
- value: @value,
31
- class: "-translate-x-full pointer-events-none absolute top-0 left-0 size-4 opacity-0",
32
- name: @name,
33
- tabindex: -1,
34
- checked: @checked,
35
- aria: { hidden: true },
36
- data: { input: "" },
37
- )
38
- end
39
- end
40
-
41
- def default_attributes
42
- {
43
- id: @id,
44
- type: "button",
45
- tabindex: -1,
46
- role: "radio",
47
- aria: {
48
- checked: @checked.to_s,
49
- },
50
- data: {
51
- checked: @checked.to_s,
52
- value: @value,
53
- "shadcn-phlexcomponents--radio-group-target": "item",
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
61
- HEREDOC
62
- },
63
- }
64
- end
65
- end
66
- end
@@ -1,184 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class Select < Base
5
- STYLES = "w-full"
6
-
7
- NATIVE_STYLES = <<~HEREDOC
8
- flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-2 pr-8
9
- text-base shadow-sm transition-colors placeholder:text-muted-foreground
10
- focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring
11
- disabled:cursor-not-allowed disabled:opacity-50 md:text-sm appearance-none
12
- relative#{" "}
13
- HEREDOC
14
-
15
- NATIVE_OPTION_STYLES = "bg-popover text-popover-foreground"
16
-
17
- def initialize(id: nil,
18
- name: nil,
19
- value: nil,
20
- placeholder: nil,
21
- side: :bottom,
22
- native: false,
23
- dir: "ltr",
24
- include_blank: false,
25
- disabled: false,
26
- aria_id: "select-#{SecureRandom.hex(5)}",
27
- **attributes)
28
- @id = id || name
29
- @name = name
30
- @value = value
31
- @placeholder = placeholder
32
- @side = side
33
- @native = native
34
- @dir = dir
35
- @include_blank = include_blank
36
- @disabled = disabled
37
- @aria_id = aria_id
38
- super(**attributes)
39
- end
40
-
41
- def trigger(**attributes)
42
- SelectTrigger(
43
- id: @id,
44
- aria_id: @aria_id,
45
- dir: @dir,
46
- value: @value,
47
- placeholder: @placeholder,
48
- disabled: @disabled,
49
- **attributes,
50
- )
51
- end
52
-
53
- def content(**attributes, &)
54
- SelectContent(
55
- side: @side, aria_id: @aria_id, dir: @dir, include_blank: @include_blank, native: @native, **attributes, &
56
- )
57
- end
58
-
59
- def item(**attributes, &)
60
- SelectItem(aria_id: @aria_id, **attributes, &)
61
- end
62
-
63
- def label(**attributes, &)
64
- SelectLabel(aria_id: @aria_id, **attributes, &)
65
- end
66
-
67
- def group(**attributes, &)
68
- SelectGroup(aria_id: @aria_id, **attributes, &)
69
- end
70
-
71
- def items(collection)
72
- SelectTrigger(
73
- id: @id,
74
- aria_id: @aria_id,
75
- dir: @dir,
76
- value: @value,
77
- placeholder: @placeholder,
78
- disabled: @disabled,
79
- )
80
-
81
- 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] }
84
- end
85
- end
86
- end
87
-
88
- def view_template(&)
89
- content = capture(&)
90
- element = Nokogiri::HTML.fragment(content.to_s)
91
- content_element = element.css('[data-shadcn-phlexcomponents--select-target="content"]')
92
-
93
- if @native
94
- div(class: "relative") do
95
- select(**@attributes) do
96
- if @placeholder || @include_blank
97
- option(value: "", class: NATIVE_OPTION_STYLES) { @placeholder }
98
- end
99
-
100
- build_native_options(content_element)
101
- end
102
-
103
- icon("chevron-down", class: "size-4 absolute opacity-50 top-1/2 -translate-y-1/2 right-3 pointer-events-none")
104
- end
105
- else
106
- div(**@attributes) do
107
- yield
108
-
109
- select(
110
- name: @name,
111
- disabled: @disabled,
112
- class: "sr-only",
113
- data: {
114
- "shadcn-phlexcomponents--select-target": "select",
115
- },
116
- ) do
117
- option(value: "")
118
- build_native_options(content_element)
119
- end
120
- end
121
- end
122
- end
123
-
124
- def default_styles
125
- if @native
126
- NATIVE_STYLES
127
- else
128
- STYLES
129
- end
130
- end
131
-
132
- def default_attributes
133
- if @native
134
- {
135
- id: @id,
136
- name: @name,
137
- disabled: @disabled,
138
- }
139
- else
140
- {
141
- data: {
142
- side: @side,
143
- aria_id: @aria_id,
144
- controller: "shadcn-phlexcomponents--select",
145
- "shadcn-phlexcomponents--select-selected-value": @value,
146
- },
147
- }
148
- end
149
- end
150
-
151
- def build_native_options(content_element)
152
- content_element.children.each do |content_child|
153
- next if content_child.is_a?(Nokogiri::XML::Text) || content_child.is_a?(Nokogiri::XML::Comment)
154
-
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
157
-
158
- optgroup(label: group_label, class: NATIVE_OPTION_STYLES) do
159
- content_child.css('[data-shadcn-phlexcomponents--select-target="item"]').each do |i|
160
- option(
161
- value: i.attributes["data-value"].value,
162
- class: NATIVE_OPTION_STYLES,
163
- selected: i.attributes["data-value"].value == @value,
164
- disabled: i.attributes["data-disabled"]&.value == "",
165
- ) do
166
- i.text
167
- end
168
- end
169
- end
170
- elsif content_child.attributes["data-shadcn-phlexcomponents--select-target"]&.value == "item"
171
-
172
- option(
173
- value: content_child.attributes["data-value"].value,
174
- class: NATIVE_OPTION_STYLES,
175
- selected: content_child.attributes["data-value"].value == @value,
176
- disabled: content_child.attributes["data-disabled"]&.value == "",
177
- ) do
178
- content_child.text
179
- end
180
- end
181
- end
182
- end
183
- end
184
- end