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,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DialogContent < Base
5
- STYLES = <<~HEREDOC
6
- fixed left-[50%] top-[50%] z-51 grid w-full max-w-lg translate-x-[-50%]
7
- translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200
8
- data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0
9
- data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95
10
- data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]
11
- data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg
12
- HEREDOC
13
-
14
- CLOSE_BUTTON_STYLES = <<~HEREDOC
15
- absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background
16
- transition-opacity hover:opacity-100 focus:outline-none focus:ring-2
17
- focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none
18
- cursor-pointer
19
- HEREDOC
20
-
21
- def initialize(aria_id: nil, **attributes)
22
- @aria_id = aria_id
23
- super(**attributes)
24
- end
25
-
26
- def default_attributes
27
- {
28
- id: "#{@aria_id}-content",
29
- tabindex: -1,
30
- role: "dialog",
31
- aria: {
32
- describedby: "#{@aria_id}-description",
33
- labelledby: "#{@aria_id}-title",
34
- },
35
- data: {
36
- "shadcn-phlexcomponents--dialog-target": "content",
37
- state: "closed",
38
- },
39
- }
40
- end
41
-
42
- def view_template(&)
43
- @class = @attributes.delete(:class)
44
- div(class: "#{@class} hidden", **@attributes) do
45
- yield
46
-
47
- button(class: CLOSE_BUTTON_STYLES, data: { action: "click->shadcn-phlexcomponents--dialog#close" }) do
48
- icon("x", class: "size-4")
49
- span(class: "sr-only") { "close" }
50
- end
51
- end
52
- end
53
- end
54
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DialogDescription < Base
5
- STYLES = "text-sm text-muted-foreground"
6
-
7
- def initialize(aria_id: nil, **attributes)
8
- @aria_id = aria_id
9
- super(**attributes)
10
- end
11
-
12
- def default_attributes
13
- {
14
- id: "#{@aria_id}-description",
15
- }
16
- end
17
-
18
- def view_template(&)
19
- p(**@attributes, &)
20
- end
21
- end
22
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DialogFooter < Base
5
- STYLES = "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2"
6
-
7
- def view_template(&)
8
- div(**@attributes, &)
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DialogHeader < Base
5
- STYLES = "flex flex-col space-y-1.5 text-center sm:text-left"
6
-
7
- def view_template(&)
8
- div(**@attributes, &)
9
- end
10
- end
11
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DialogTitle < Base
5
- STYLES = "text-lg font-semibold leading-none tracking-tight"
6
-
7
- def initialize(aria_id: nil, **attributes)
8
- @aria_id = aria_id
9
- super(**attributes)
10
- end
11
-
12
- def default_attributes
13
- {
14
- id: "#{@aria_id}-title",
15
- }
16
- end
17
-
18
- def view_template(&)
19
- h2(**@attributes, &)
20
- end
21
- end
22
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DialogTrigger < 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 default_attributes
12
- {
13
- role: "button",
14
- aria: {
15
- haspopup: "dialog",
16
- expanded: "false",
17
- controls: "#{@aria_id}-content",
18
- },
19
- data: {
20
- action: "click->shadcn-phlexcomponents--dialog#open",
21
- "shadcn-phlexcomponents--dialog-target": "trigger",
22
- as_child: @as_child.to_s,
23
- },
24
- }
25
- end
26
-
27
- def view_template(&)
28
- if @as_child
29
- content = capture(&)
30
- element = find_as_child(content.to_s)
31
-
32
- vanish(&)
33
- element_attributes = nokogiri_attributes_to_hash(element)
34
- styles = TAILWIND_MERGER.merge("#{@attributes[:class]} #{element_attributes[:class]}")
35
- merged_attributes = mix(@attributes, element_attributes)
36
- merged_attributes[:class] = styles
37
-
38
- if element.name == "button"
39
- merged_attributes.delete(:role)
40
- end
41
-
42
- send(element.name, **merged_attributes) do
43
- sanitize_as_child(element.children.to_s)
44
- end
45
- else
46
- div(**@attributes, &)
47
- end
48
- end
49
- end
50
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DropdownMenu < Base
5
- STYLES = "inline-block"
6
-
7
- def initialize(side: :bottom, aria_id: "dropdown-menu-#{SecureRandom.hex(5)}", **attributes)
8
- @side = side
9
- @aria_id = aria_id
10
- super(**attributes)
11
- end
12
-
13
- def trigger(**attributes, &)
14
- DropdownMenuTrigger(aria_id: @aria_id, **attributes, &)
15
- end
16
-
17
- def content(**attributes, &)
18
- DropdownMenuContent(aria_id: @aria_id, side: @side, **attributes, &)
19
- end
20
-
21
- def label(**attributes, &)
22
- DropdownMenuLabel(**attributes, &)
23
- end
24
-
25
- def item(**attributes, &)
26
- DropdownMenuItem(**attributes, &)
27
- end
28
-
29
- def item_to(name = nil, options = nil, html_options = nil, &block)
30
- DropdownMenuItemTo(name, options, html_options, &block)
31
- end
32
-
33
- def separator(**attributes, &)
34
- DropdownMenuSeparator(**attributes, &)
35
- end
36
-
37
- def default_attributes
38
- {
39
- data: {
40
- controller: "shadcn-phlexcomponents--dropdown-menu",
41
- side: @side,
42
- },
43
- }
44
- end
45
-
46
- def view_template(&)
47
- div(**@attributes, &)
48
- end
49
- end
50
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DropdownMenuContent < Base
5
- STYLES = <<~HEREDOC
6
- z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1
7
- text-popover-foreground shadow-md outline-none
8
- data-[state=open]:animate-in
9
- data-[state=closed]:animate-out data-[state=closed]:fade-out-0#{" "}
10
- data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95#{" "}
11
- data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2#{" "}
12
- data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2#{" "}
13
- data-[side=top]:slide-in-from-bottom-2
14
- HEREDOC
15
-
16
- def initialize(side: :bottom, aria_id: nil, **attributes)
17
- @side = side
18
- @aria_id = aria_id
19
- super(**attributes)
20
- end
21
-
22
- def view_template(&)
23
- div(
24
- class: "hidden fixed top-0 left-0 w-max z-50",
25
- data: { "shadcn-phlexcomponents--dropdown-menu-target": "contentWrapper" },
26
- ) do
27
- div(**@attributes, &)
28
- end
29
- end
30
-
31
- def default_attributes
32
- {
33
- id: "#{@aria_id}-content",
34
- tabindex: -1,
35
- role: "menu",
36
- aria: {
37
- labelledby: "#{@aria_id}-trigger",
38
- orientation: "vertical",
39
- },
40
- data: {
41
- state: "closed",
42
- side: @side,
43
- "shadcn-phlexcomponents--dropdown-menu-target": "content",
44
- action: <<~HEREDOC,
45
- keydown.up->shadcn-phlexcomponents--dropdown-menu#focusLastItem:prevent
46
- keydown.down->shadcn-phlexcomponents--dropdown-menu#focusFirstItem:prevent
47
- HEREDOC
48
- },
49
- }
50
- end
51
- end
52
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DropdownMenuItem < Base
5
- STYLES = <<~HEREDOC
6
- relative flex cursor-default select-none items-center gap-2 rounded-sm px-2
7
- py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground
8
- data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0
9
- HEREDOC
10
-
11
- def initialize(as_child: false, disabled: false, **attributes)
12
- @as_child = as_child
13
- @disabled = disabled
14
- super(**attributes)
15
- end
16
-
17
- def view_template(&)
18
- if @as_child
19
- content = capture(&)
20
- element = find_as_child(content.to_s)
21
-
22
- vanish(&)
23
- element_attributes = nokogiri_attributes_to_hash(element)
24
- styles = TAILWIND_MERGER.merge("#{@attributes[:class]} #{element_attributes[:class]}")
25
- merged_attributes = mix(@attributes, element_attributes)
26
- merged_attributes[:class] = styles
27
-
28
- send(element.name, **merged_attributes) do
29
- sanitize_as_child(element.children.to_s)
30
- end
31
- else
32
- div(**@attributes, &)
33
- end
34
- end
35
-
36
- def default_attributes
37
- {
38
- role: "menuitem",
39
- tabindex: -1,
40
- data: {
41
- disabled: @disabled,
42
- action: <<~HEREDOC,
43
- click->shadcn-phlexcomponents--dropdown-menu#selectItem
44
- keydown.up->shadcn-phlexcomponents--dropdown-menu#focusPrevItem:stop
45
- keydown.down->shadcn-phlexcomponents--dropdown-menu#focusNextItem:stop
46
- keydown.enter->shadcn-phlexcomponents--dropdown-menu#selectItem:prevent
47
- keydown.space->shadcn-phlexcomponents--dropdown-menu#selectItem:prevent
48
- mouseover->shadcn-phlexcomponents--dropdown-menu#focusItem
49
- mouseout->shadcn-phlexcomponents--dropdown-menu#focusContent
50
- HEREDOC
51
- "shadcn-phlexcomponents--dropdown-menu-target": "item",
52
- },
53
- }
54
- end
55
- end
56
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DropdownMenuItemTo < DropdownMenuItem
5
- def initialize(name = nil, options = nil, html_options = nil)
6
- @name = name
7
- @options = options
8
- @html_options = html_options
9
- end
10
-
11
- def view_template(&)
12
- if block_given?
13
- @html_options = @options
14
- @options = @name
15
- end
16
- @html_options ||= {}
17
- @disabled = @html_options[:disabled]
18
- @html_options = mix(default_attributes, @html_options)
19
- @html_options[:class] = TAILWIND_MERGER.merge("w-full #{default_styles} #{@html_options[:class]}")
20
-
21
- if block_given?
22
- button_to(@options, @html_options, &)
23
- else
24
- button_to(@name, @options, @html_options)
25
- end
26
- end
27
- end
28
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DropdownMenuLabel < Base
5
- STYLES = "px-2 py-1.5 text-sm font-semibold"
6
-
7
- def view_template(&)
8
- div(**@attributes, &)
9
- end
10
- end
11
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DropdownMenuSeparator < Base
5
- STYLES = "-mx-1 my-1 h-px bg-muted"
6
-
7
- def view_template(&)
8
- div(**@attributes, &)
9
- end
10
-
11
- def default_attributes
12
- {
13
- role: "separator",
14
- aria: {
15
- orientation: "horizontal",
16
- },
17
- }
18
- end
19
- end
20
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class DropdownMenuTrigger < 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: "#{@aria_id}-trigger",
37
- role: "button",
38
- aria: {
39
- haspopup: "menu",
40
- expanded: false,
41
- controls: "#{@aria_id}-content",
42
- },
43
- data: {
44
- state: "closed",
45
- as_child: @as_child.to_s,
46
- action: <<~HEREDOC,
47
- click->shadcn-phlexcomponents--dropdown-menu#toggle
48
- keydown.space->shadcn-phlexcomponents--dropdown-menu#toggle
49
- keydown.enter->shadcn-phlexcomponents--dropdown-menu#toggle
50
- keydown.down->shadcn-phlexcomponents--dropdown-menu#toggle:prevent
51
- HEREDOC
52
- "shadcn-phlexcomponents--dropdown-menu-target": "trigger",
53
- },
54
- }
55
- end
56
- end
57
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class Form < Base
5
- include Phlex::Rails::Helpers::FormWith
6
-
7
- def initialize(model: false, scope: nil, url: nil, format: nil, **options)
8
- @model = model
9
- @scope = scope
10
- @url = url
11
- @format = format
12
- @options = options
13
- @object_name = model ? model.to_model.model_name.param_key : nil
14
- end
15
-
16
- def field(method = nil, **attributes, &)
17
- FormField(method, model: @model, object_name: @object_name, **attributes, &)
18
- end
19
-
20
- def submit(variant: :primary, **attributes, &)
21
- Button(variant: variant, type: :submit, **attributes) do
22
- if block_given?
23
- yield
24
- else
25
- submit_default_value
26
- end
27
- end
28
- end
29
-
30
- def view_template(&)
31
- form_with(model: @model, scope: @scope, url: @url, format: @format, **@options) do
32
- yield
33
- end
34
- end
35
-
36
- def submit_default_value
37
- object = @model ? @model.to_model : nil
38
- key = object ? (object.persisted? ? :update : :create) : :submit
39
-
40
- model = if object.respond_to?(:model_name)
41
- object.model_name.human
42
- else
43
- @object_name.to_s.humanize
44
- end
45
-
46
- defaults = []
47
- # Object is a model and it is not overwritten by as and scope option.
48
- if object.respond_to?(:model_name) && @object_name.to_s == model.downcase
49
- defaults << :"helpers.submit.#{object.model_name.i18n_key}.#{key}"
50
- else
51
- defaults << :"helpers.submit.#{@object_name}.#{key}"
52
- end
53
- defaults << :"helpers.submit.#{key}"
54
- defaults << "#{key.to_s.humanize} #{model}"
55
-
56
- I18n.t(defaults.shift, model: model, default: defaults)
57
- end
58
- end
59
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class FormHint < Base
5
- STYLES = "text-[0.8rem] text-muted-foreground"
6
-
7
- def initialize(message: nil, aria_id: nil, **attributes)
8
- @message = message
9
- @id = aria_id ? "#{aria_id}-description" : nil
10
- super(**attributes)
11
- end
12
-
13
- def view_template(&)
14
- p(id: @id, **@attributes) { @message }
15
- end
16
- end
17
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class HoverCard < Base
5
- STYLES = "inline-block"
6
-
7
- def initialize(side: :bottom, **attributes)
8
- @side = side
9
- super(**attributes)
10
- end
11
-
12
- def content(**attributes, &)
13
- HoverCardContent(**attributes, &)
14
- end
15
-
16
- def trigger(**attributes, &)
17
- HoverCardTrigger(side: @side, **attributes, &)
18
- end
19
-
20
- def default_attributes
21
- {
22
- data: {
23
- controller: "shadcn-phlexcomponents--hover-card",
24
- side: @side,
25
- },
26
- }
27
- end
28
-
29
- def view_template(&)
30
- div(**@attributes, &)
31
- end
32
- end
33
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class HoverCardContent < Base
5
- STYLES = <<~HEREDOC
6
- rounded-md border w-64 bg-popover p-4 text-popover-foreground shadow-md outline-none#{" "}
7
- animate-in fade-in-0 zoom-in-95
8
- data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2
9
- data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2#{" "}
10
- HEREDOC
11
-
12
- def initialize(side: :bottom, **attributes)
13
- @side = side
14
- super(**attributes)
15
- end
16
-
17
- def view_template(&)
18
- div(class: "hidden", data: { "shadcn-phlexcomponents--hover-card-target": "content" }) do
19
- div(**@attributes, &)
20
- end
21
- end
22
-
23
- def default_attributes
24
- {
25
- tabindex: -1,
26
- data: {
27
- side: @side,
28
- },
29
- }
30
- end
31
- end
32
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class HoverCardTrigger < Base
5
- def initialize(as_child: false, **attributes)
6
- @as_child = as_child
7
- super(**attributes)
8
- end
9
-
10
- def view_template(&)
11
- if @as_child
12
- content = capture(&)
13
- element = find_as_child(content.to_s)
14
-
15
- vanish(&)
16
- element_attributes = nokogiri_attributes_to_hash(element)
17
- styles = TAILWIND_MERGER.merge("#{@attributes[:class]} #{element_attributes[:class]}")
18
- merged_attributes = mix(@attributes, element_attributes)
19
- merged_attributes[:class] = styles
20
-
21
- if element.name == "button"
22
- merged_attributes.delete(:role)
23
- end
24
-
25
- send(element.name, **merged_attributes) do
26
- sanitize_as_child(element.children.to_s)
27
- end
28
- else
29
- div(**@attributes, &)
30
- end
31
- end
32
-
33
- def default_attributes
34
- {
35
- id: @id,
36
- role: "button",
37
- data: {
38
- as_child: @as_child.to_s,
39
- "shadcn-phlexcomponents--hover-card-target": "trigger",
40
- },
41
- }
42
- end
43
- end
44
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class Input < Base
5
- STYLES = <<~HEREDOC
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
8
- file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground
9
- focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring
10
- disabled:cursor-not-allowed disabled:opacity-50 md:text-sm
11
- HEREDOC
12
-
13
- def initialize(type: :text, name: nil, id: nil, **attributes)
14
- @type = type
15
- @name = name
16
- @id = id || @name
17
- super(**attributes)
18
- end
19
-
20
- def default_attributes
21
- {
22
- type: @type,
23
- name: @name,
24
- id: @id,
25
- }
26
- end
27
-
28
- def view_template(&)
29
- input(**@attributes, &)
30
- end
31
- end
32
- end