shadcn_phlexcomponents 0.1.9 → 0.1.14

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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/app/javascript/controllers/accordion_controller.ts +136 -0
  3. data/app/javascript/controllers/alert_dialog_controller.ts +12 -0
  4. data/app/javascript/controllers/avatar_controller.ts +24 -0
  5. data/app/javascript/controllers/checkbox_controller.ts +41 -0
  6. data/app/javascript/controllers/collapsible_controller.ts +52 -0
  7. data/app/javascript/controllers/combobox_controller.ts +376 -0
  8. data/app/javascript/controllers/command_controller.ts +301 -0
  9. data/app/javascript/controllers/date_picker_controller.ts +334 -0
  10. data/app/javascript/controllers/date_range_picker_controller.ts +253 -0
  11. data/app/javascript/controllers/dialog_controller.ts +115 -0
  12. data/app/javascript/controllers/dropdown_menu_controller.ts +309 -0
  13. data/app/javascript/controllers/dropdown_menu_sub_controller.ts +152 -0
  14. data/app/javascript/controllers/form_field_controller.ts +27 -0
  15. data/app/javascript/controllers/hover_card_controller.ts +103 -0
  16. data/app/javascript/controllers/{loading_button_controller.js → loading_button_controller.ts} +7 -2
  17. data/app/javascript/controllers/popover_controller.ts +118 -0
  18. data/app/javascript/controllers/progress_controller.ts +23 -0
  19. data/app/javascript/controllers/radio_group_controller.ts +113 -0
  20. data/app/javascript/controllers/select_controller.ts +341 -0
  21. data/app/javascript/controllers/{sidebar_controller.js → sidebar_controller.ts} +6 -2
  22. data/app/javascript/controllers/sidebar_trigger_controller.ts +21 -0
  23. data/app/javascript/controllers/slider_controller.ts +114 -0
  24. data/app/javascript/controllers/switch_controller.ts +37 -0
  25. data/app/javascript/controllers/tabs_controller.ts +87 -0
  26. data/app/javascript/controllers/theme_switcher_controller.ts +40 -0
  27. data/app/javascript/controllers/toast_container_controller.ts +67 -0
  28. data/app/javascript/controllers/toast_controller.ts +34 -0
  29. data/app/javascript/controllers/toggle_controller.ts +28 -0
  30. data/app/javascript/controllers/toggle_group_controller.ts +28 -0
  31. data/app/javascript/controllers/tooltip_controller.ts +110 -0
  32. data/app/javascript/shadcn_phlexcomponents.ts +61 -0
  33. data/app/javascript/utils/command.ts +544 -0
  34. data/app/javascript/utils/floating_ui.ts +196 -0
  35. data/app/javascript/utils/index.ts +417 -0
  36. data/app/stylesheets/date_picker.css +81 -101
  37. data/app/stylesheets/nouislider.css +173 -0
  38. data/app/stylesheets/tw-animate.css +486 -0
  39. data/lib/install/install_shadcn_phlexcomponents.rb +16 -3
  40. data/lib/shadcn_phlexcomponents/alias.rb +6 -1
  41. data/lib/shadcn_phlexcomponents/components/accordion.rb +130 -0
  42. data/lib/shadcn_phlexcomponents/components/alert.rb +59 -0
  43. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +279 -0
  44. data/lib/shadcn_phlexcomponents/components/{aspect_ratio/aspect_ratio.rb → aspect_ratio.rb} +2 -2
  45. data/lib/shadcn_phlexcomponents/components/avatar.rb +63 -0
  46. data/lib/shadcn_phlexcomponents/components/badge.rb +35 -0
  47. data/lib/shadcn_phlexcomponents/components/base.rb +48 -7
  48. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +150 -0
  49. data/lib/shadcn_phlexcomponents/components/button.rb +49 -0
  50. data/lib/shadcn_phlexcomponents/components/card.rb +88 -0
  51. data/lib/shadcn_phlexcomponents/components/{checkbox/checkbox.rb → checkbox.rb} +18 -14
  52. data/lib/shadcn_phlexcomponents/components/{checkbox_group/checkbox_group.rb → checkbox_group.rb} +7 -8
  53. data/lib/shadcn_phlexcomponents/components/collapsible.rb +90 -0
  54. data/lib/shadcn_phlexcomponents/components/combobox.rb +428 -0
  55. data/lib/shadcn_phlexcomponents/components/command.rb +381 -0
  56. data/lib/shadcn_phlexcomponents/components/date_picker.rb +208 -0
  57. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +143 -0
  58. data/lib/shadcn_phlexcomponents/components/dialog.rb +236 -0
  59. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +283 -0
  60. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +136 -0
  61. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +6 -7
  62. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +2 -2
  63. data/lib/shadcn_phlexcomponents/components/form/form_combobox.rb +64 -0
  64. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +3 -4
  65. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +27 -41
  66. data/lib/shadcn_phlexcomponents/components/form/form_error.rb +1 -1
  67. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +43 -8
  68. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +1 -1
  69. data/lib/shadcn_phlexcomponents/components/form/form_input.rb +3 -4
  70. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +4 -5
  71. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +3 -4
  72. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +91 -0
  73. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +7 -6
  74. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +3 -4
  75. data/lib/shadcn_phlexcomponents/components/{form/form.rb → form.rb} +36 -4
  76. data/lib/shadcn_phlexcomponents/components/hover_card.rb +111 -0
  77. data/lib/shadcn_phlexcomponents/components/input.rb +31 -0
  78. data/lib/shadcn_phlexcomponents/components/label.rb +16 -0
  79. data/lib/shadcn_phlexcomponents/components/{link/link.rb → link.rb} +10 -3
  80. data/lib/shadcn_phlexcomponents/components/{loading_button/loading_button.rb → loading_button.rb} +9 -2
  81. data/lib/shadcn_phlexcomponents/components/pagination.rb +166 -0
  82. data/lib/shadcn_phlexcomponents/components/popover.rb +116 -0
  83. data/lib/shadcn_phlexcomponents/components/{progress/progress.rb → progress.rb} +4 -4
  84. data/lib/shadcn_phlexcomponents/components/radio_group.rb +155 -0
  85. data/lib/shadcn_phlexcomponents/components/select.rb +406 -0
  86. data/lib/shadcn_phlexcomponents/components/{separator/separator.rb → separator.rb} +9 -8
  87. data/lib/shadcn_phlexcomponents/components/sheet.rb +243 -0
  88. data/lib/shadcn_phlexcomponents/components/{skeleton/skeleton.rb → skeleton.rb} +1 -1
  89. data/lib/shadcn_phlexcomponents/components/slider.rb +72 -0
  90. data/lib/shadcn_phlexcomponents/components/switch.rb +75 -0
  91. data/lib/shadcn_phlexcomponents/components/table.rb +140 -0
  92. data/lib/shadcn_phlexcomponents/components/tabs.rb +135 -0
  93. data/lib/shadcn_phlexcomponents/components/textarea.rb +24 -0
  94. data/lib/shadcn_phlexcomponents/components/toast.rb +153 -0
  95. data/lib/shadcn_phlexcomponents/components/{toast/toast_container.rb → toast_container.rb} +23 -4
  96. data/lib/shadcn_phlexcomponents/components/toggle.rb +54 -0
  97. data/lib/shadcn_phlexcomponents/components/tooltip.rb +132 -0
  98. data/lib/shadcn_phlexcomponents/engine.rb +1 -5
  99. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +25 -0
  100. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  101. data/lib/tasks/install.rake +1 -1
  102. metadata +83 -167
  103. data/app/javascript/controllers/accordion_controller.js +0 -124
  104. data/app/javascript/controllers/alert_dialog_controller.js +0 -21
  105. data/app/javascript/controllers/avatar_controller.js +0 -15
  106. data/app/javascript/controllers/checkbox_controller.js +0 -28
  107. data/app/javascript/controllers/collapsible_controller.js +0 -35
  108. data/app/javascript/controllers/combobox_controller.js +0 -54
  109. data/app/javascript/controllers/date_picker_controller.js +0 -253
  110. data/app/javascript/controllers/date_range_picker_controller.js +0 -344
  111. data/app/javascript/controllers/dialog_controller.js +0 -114
  112. data/app/javascript/controllers/dropdown_menu_controller.js +0 -171
  113. data/app/javascript/controllers/form_field_controller.js +0 -24
  114. data/app/javascript/controllers/hover_card_controller.js +0 -21
  115. data/app/javascript/controllers/popover_controller.js +0 -113
  116. data/app/javascript/controllers/progress_controller.js +0 -14
  117. data/app/javascript/controllers/radio_group_controller.js +0 -90
  118. data/app/javascript/controllers/select_controller.js +0 -274
  119. data/app/javascript/controllers/sidebar_trigger_controller.js +0 -15
  120. data/app/javascript/controllers/switch_controller.js +0 -24
  121. data/app/javascript/controllers/tabs_controller.js +0 -73
  122. data/app/javascript/controllers/theme_switcher_controller.js +0 -32
  123. data/app/javascript/controllers/toast_container_controller.js +0 -22
  124. data/app/javascript/controllers/toast_controller.js +0 -45
  125. data/app/javascript/controllers/tooltip_controller.js +0 -40
  126. data/app/javascript/shadcn_phlexcomponents.js +0 -53
  127. data/app/javascript/utils.js +0 -184
  128. data/app/stylesheets/choices.css +0 -324
  129. data/app/stylesheets/tailwindcss-animate.css +0 -318
  130. data/lib/shadcn_phlexcomponents/components/accordion/accordion.rb +0 -38
  131. data/lib/shadcn_phlexcomponents/components/accordion/accordion_content.rb +0 -30
  132. data/lib/shadcn_phlexcomponents/components/accordion/accordion_item.rb +0 -26
  133. data/lib/shadcn_phlexcomponents/components/accordion/accordion_trigger.rb +0 -46
  134. data/lib/shadcn_phlexcomponents/components/alert/alert.rb +0 -40
  135. data/lib/shadcn_phlexcomponents/components/alert/alert_description.rb +0 -11
  136. data/lib/shadcn_phlexcomponents/components/alert/alert_title.rb +0 -11
  137. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog.rb +0 -60
  138. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_action.rb +0 -22
  139. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_action_to.rb +0 -40
  140. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_cancel.rb +0 -22
  141. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_content.rb +0 -40
  142. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_description.rb +0 -22
  143. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_footer.rb +0 -11
  144. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_header.rb +0 -11
  145. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_title.rb +0 -22
  146. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_trigger.rb +0 -50
  147. data/lib/shadcn_phlexcomponents/components/avatar/avatar.rb +0 -31
  148. data/lib/shadcn_phlexcomponents/components/avatar/avatar_fallback.rb +0 -21
  149. data/lib/shadcn_phlexcomponents/components/avatar/avatar_image.rb +0 -19
  150. data/lib/shadcn_phlexcomponents/components/badge/badge.rb +0 -30
  151. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb.rb +0 -53
  152. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_ellipsis.rb +0 -23
  153. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_item.rb +0 -11
  154. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_link.rb +0 -7
  155. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_page.rb +0 -21
  156. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_separator.rb +0 -26
  157. data/lib/shadcn_phlexcomponents/components/button/button.rb +0 -53
  158. data/lib/shadcn_phlexcomponents/components/card/card.rb +0 -31
  159. data/lib/shadcn_phlexcomponents/components/card/card_content.rb +0 -11
  160. data/lib/shadcn_phlexcomponents/components/card/card_description.rb +0 -11
  161. data/lib/shadcn_phlexcomponents/components/card/card_footer.rb +0 -11
  162. data/lib/shadcn_phlexcomponents/components/card/card_header.rb +0 -11
  163. data/lib/shadcn_phlexcomponents/components/card/card_title.rb +0 -11
  164. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible.rb +0 -31
  165. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible_content.rb +0 -24
  166. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible_trigger.rb +0 -50
  167. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker.rb +0 -87
  168. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_content.rb +0 -45
  169. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_trigger.rb +0 -64
  170. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker.rb +0 -105
  171. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_content.rb +0 -9
  172. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_trigger.rb +0 -9
  173. data/lib/shadcn_phlexcomponents/components/dialog/dialog.rb +0 -52
  174. data/lib/shadcn_phlexcomponents/components/dialog/dialog_close.rb +0 -42
  175. data/lib/shadcn_phlexcomponents/components/dialog/dialog_content.rb +0 -54
  176. data/lib/shadcn_phlexcomponents/components/dialog/dialog_description.rb +0 -22
  177. data/lib/shadcn_phlexcomponents/components/dialog/dialog_footer.rb +0 -11
  178. data/lib/shadcn_phlexcomponents/components/dialog/dialog_header.rb +0 -11
  179. data/lib/shadcn_phlexcomponents/components/dialog/dialog_title.rb +0 -22
  180. data/lib/shadcn_phlexcomponents/components/dialog/dialog_trigger.rb +0 -50
  181. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu.rb +0 -50
  182. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_content.rb +0 -52
  183. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_item.rb +0 -56
  184. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_item_to.rb +0 -28
  185. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_label.rb +0 -11
  186. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_separator.rb +0 -20
  187. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_trigger.rb +0 -57
  188. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card.rb +0 -33
  189. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card_content.rb +0 -32
  190. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card_trigger.rb +0 -44
  191. data/lib/shadcn_phlexcomponents/components/input/input.rb +0 -32
  192. data/lib/shadcn_phlexcomponents/components/label/label.rb +0 -14
  193. data/lib/shadcn_phlexcomponents/components/pagination/pagination.rb +0 -38
  194. data/lib/shadcn_phlexcomponents/components/pagination/pagination_ellipsis.rb +0 -24
  195. data/lib/shadcn_phlexcomponents/components/pagination/pagination_link.rb +0 -34
  196. data/lib/shadcn_phlexcomponents/components/pagination/pagination_next.rb +0 -32
  197. data/lib/shadcn_phlexcomponents/components/pagination/pagination_previous.rb +0 -32
  198. data/lib/shadcn_phlexcomponents/components/popover/popover.rb +0 -34
  199. data/lib/shadcn_phlexcomponents/components/popover/popover_content.rb +0 -40
  200. data/lib/shadcn_phlexcomponents/components/popover/popover_trigger.rb +0 -50
  201. data/lib/shadcn_phlexcomponents/components/radio_group/radio_group.rb +0 -88
  202. data/lib/shadcn_phlexcomponents/components/radio_group/radio_group_item.rb +0 -66
  203. data/lib/shadcn_phlexcomponents/components/select/select.rb +0 -194
  204. data/lib/shadcn_phlexcomponents/components/select/select_content.rb +0 -64
  205. data/lib/shadcn_phlexcomponents/components/select/select_group.rb +0 -23
  206. data/lib/shadcn_phlexcomponents/components/select/select_item.rb +0 -59
  207. data/lib/shadcn_phlexcomponents/components/select/select_label.rb +0 -24
  208. data/lib/shadcn_phlexcomponents/components/select/select_trigger.rb +0 -56
  209. data/lib/shadcn_phlexcomponents/components/sheet/sheet.rb +0 -53
  210. data/lib/shadcn_phlexcomponents/components/sheet/sheet_close.rb +0 -42
  211. data/lib/shadcn_phlexcomponents/components/sheet/sheet_content.rb +0 -65
  212. data/lib/shadcn_phlexcomponents/components/sheet/sheet_description.rb +0 -22
  213. data/lib/shadcn_phlexcomponents/components/sheet/sheet_footer.rb +0 -11
  214. data/lib/shadcn_phlexcomponents/components/sheet/sheet_header.rb +0 -11
  215. data/lib/shadcn_phlexcomponents/components/sheet/sheet_title.rb +0 -22
  216. data/lib/shadcn_phlexcomponents/components/sheet/sheet_trigger.rb +0 -50
  217. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar.rb +0 -108
  218. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_container.rb +0 -11
  219. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_content.rb +0 -11
  220. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_footer.rb +0 -11
  221. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group.rb +0 -11
  222. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group_content.rb +0 -11
  223. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group_label.rb +0 -16
  224. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_header.rb +0 -11
  225. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_inset.rb +0 -15
  226. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu.rb +0 -11
  227. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_button.rb +0 -61
  228. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_item.rb +0 -9
  229. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub.rb +0 -14
  230. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub_button.rb +0 -48
  231. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub_item.rb +0 -9
  232. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_trigger.rb +0 -40
  233. data/lib/shadcn_phlexcomponents/components/switch/switch.rb +0 -66
  234. data/lib/shadcn_phlexcomponents/components/table/table.rb +0 -75
  235. data/lib/shadcn_phlexcomponents/components/table/table_body.rb +0 -11
  236. data/lib/shadcn_phlexcomponents/components/table/table_caption.rb +0 -11
  237. data/lib/shadcn_phlexcomponents/components/table/table_cell.rb +0 -11
  238. data/lib/shadcn_phlexcomponents/components/table/table_footer.rb +0 -11
  239. data/lib/shadcn_phlexcomponents/components/table/table_head.rb +0 -14
  240. data/lib/shadcn_phlexcomponents/components/table/table_header.rb +0 -11
  241. data/lib/shadcn_phlexcomponents/components/table/table_row.rb +0 -11
  242. data/lib/shadcn_phlexcomponents/components/tabs/tabs.rb +0 -38
  243. data/lib/shadcn_phlexcomponents/components/tabs/tabs_content.rb +0 -35
  244. data/lib/shadcn_phlexcomponents/components/tabs/tabs_list.rb +0 -23
  245. data/lib/shadcn_phlexcomponents/components/tabs/tabs_trigger.rb +0 -45
  246. data/lib/shadcn_phlexcomponents/components/textarea/textarea.rb +0 -29
  247. data/lib/shadcn_phlexcomponents/components/toast/toast.rb +0 -101
  248. data/lib/shadcn_phlexcomponents/components/toast/toast_action.rb +0 -39
  249. data/lib/shadcn_phlexcomponents/components/toast/toast_action_to.rb +0 -28
  250. data/lib/shadcn_phlexcomponents/components/toast/toast_content.rb +0 -11
  251. data/lib/shadcn_phlexcomponents/components/toast/toast_description.rb +0 -11
  252. data/lib/shadcn_phlexcomponents/components/toast/toast_title.rb +0 -11
  253. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip.rb +0 -34
  254. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip_content.rb +0 -39
  255. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip_trigger.rb +0 -48
  256. /data/lib/shadcn_phlexcomponents/components/{theme_switcher/theme_switcher.rb → theme_switcher.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f01a8b6d7fd3e2f4727726449999ee8e1df8f4385399a045de46390713886e7a
4
- data.tar.gz: 1fc407c7488a6bba53a23e77a1e912e294dec1c0407fba97abf5ea2d2cf02820
3
+ metadata.gz: e6ead95ebdeef8eac55b2ee6101b2fbdb7fb90c7d12f8f489bdb2f45ad507915
4
+ data.tar.gz: 6f067373fd86d04f7e2478b639c3d5021a265931b648a6729869d1c9bb472bee
5
5
  SHA512:
6
- metadata.gz: 532c2cddc7f12c798babf37d1e1248ac0034a44b2c359e7fb60e2e481a6be4f83655cff30adc93633f00b3b2bda4df853b1189e097ee65de5335f1016331ad09
7
- data.tar.gz: 74d475a2b3e633f38db546d8ee820ae788a9abf2becd4699ac1c6b3ff5f5557635a3838791d9cba75764b5184a08794c1107d01a913eb996d2aa3dc238a53b21
6
+ metadata.gz: c9ca6aacc79c59cc008ca03043616c4483dcc65c9858b0134d61ab0d53497fda9e8f2be85f05e9b1d030fc74af0524f725524d3a6830f79333fd14894188cb89
7
+ data.tar.gz: e1d3d10691bef9568c16af2e2f23f1a7bccce7b512e72a6ef1a53e6db3ce85a95fdefaadbf86bcd9ecbe07f9f61a423cda24aa412ad60d849a99d4efc3501653
@@ -0,0 +1,136 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+ import {
3
+ showContent,
4
+ hideContent,
5
+ getNextEnabledIndex,
6
+ getPreviousEnabledIndex,
7
+ } from '../utils'
8
+
9
+ const AccordionController = class extends Controller<HTMLElement> {
10
+ // targets
11
+ static targets = ['item', 'trigger', 'content']
12
+ declare itemTargets: HTMLElement[]
13
+ declare triggerTargets: HTMLButtonElement[]
14
+ declare contentTargets: HTMLElement[]
15
+
16
+ // values
17
+ static values = { openItems: Array }
18
+ declare openItemsValue: string[]
19
+
20
+ // custom properties
21
+ declare multiple: boolean
22
+
23
+ connect() {
24
+ this.multiple = this.element.dataset.multiple === 'true'
25
+ }
26
+
27
+ contentTargetConnected(content: HTMLElement) {
28
+ setTimeout(() => {
29
+ this.setContentHeight(content)
30
+ }, 100)
31
+ }
32
+
33
+ toggle(event: MouseEvent) {
34
+ const trigger = event.currentTarget as HTMLElement
35
+
36
+ const item = this.itemTargets.find((item) => {
37
+ return item.contains(trigger)
38
+ })
39
+
40
+ if (!item) return
41
+
42
+ const value = item.dataset.value as string
43
+ const isOpen = this.openItemsValue.includes(value)
44
+
45
+ if (isOpen) {
46
+ this.openItemsValue = this.openItemsValue.filter((v) => v !== value)
47
+ } else {
48
+ if (this.multiple) {
49
+ this.openItemsValue = [...this.openItemsValue, value]
50
+ } else {
51
+ this.openItemsValue = [value]
52
+ }
53
+ }
54
+ }
55
+
56
+ focusTrigger(event: KeyboardEvent) {
57
+ const trigger = event.currentTarget as HTMLButtonElement
58
+ const key = event.key
59
+
60
+ const focusableTriggers = this.triggerTargets.filter(
61
+ (trigger) => !trigger.disabled,
62
+ )
63
+
64
+ const index = focusableTriggers.indexOf(trigger)
65
+ let newIndex = 0
66
+
67
+ if (key === 'ArrowUp') {
68
+ newIndex = getPreviousEnabledIndex({
69
+ items: focusableTriggers,
70
+ currentIndex: index,
71
+ wrapAround: true,
72
+ })
73
+ } else {
74
+ newIndex = getNextEnabledIndex({
75
+ items: focusableTriggers,
76
+ currentIndex: index,
77
+ wrapAround: true,
78
+ })
79
+ }
80
+
81
+ focusableTriggers[newIndex].focus()
82
+ }
83
+
84
+ openItemsValueChanged(openItems: string[]) {
85
+ this.itemTargets.forEach((item) => {
86
+ const itemValue = item.dataset.value as string
87
+
88
+ const trigger = this.triggerTargets.find((trigger) =>
89
+ item.contains(trigger),
90
+ ) as HTMLElement
91
+ const content = this.contentTargets.find((content) =>
92
+ item.contains(content),
93
+ ) as HTMLElement
94
+
95
+ if (openItems.includes(itemValue)) {
96
+ showContent({
97
+ trigger,
98
+ content: content,
99
+ contentContainer: content,
100
+ })
101
+ } else {
102
+ hideContent({
103
+ trigger,
104
+ content: content,
105
+ contentContainer: content,
106
+ })
107
+ }
108
+ })
109
+ }
110
+
111
+ protected setContentHeight(element: HTMLElement) {
112
+ const height =
113
+ this.getContentHeight(element) || element.getBoundingClientRect().height
114
+ element.style.setProperty('--radix-accordion-content-height', `${height}px`)
115
+ }
116
+
117
+ getContentHeight(el: HTMLElement) {
118
+ const clone = el.cloneNode(true) as HTMLElement
119
+ Object.assign(clone.style, {
120
+ display: 'block',
121
+ position: 'absolute',
122
+ visibility: 'hidden',
123
+ })
124
+
125
+ document.body.appendChild(clone)
126
+ const height = clone.getBoundingClientRect().height
127
+ document.body.removeChild(clone)
128
+
129
+ return height
130
+ }
131
+ }
132
+
133
+ type Accordion = InstanceType<typeof AccordionController>
134
+
135
+ export { AccordionController }
136
+ export type { Accordion }
@@ -0,0 +1,12 @@
1
+ import { DialogController } from './dialog_controller'
2
+
3
+ const AlertDialogController = class extends DialogController {
4
+ protected onDOMClick() {
5
+ return
6
+ }
7
+ }
8
+
9
+ type AlertDialog = InstanceType<typeof AlertDialogController>
10
+
11
+ export { AlertDialogController }
12
+ export type { AlertDialog }
@@ -0,0 +1,24 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ const AvatarController = class extends Controller {
4
+ // targets
5
+ static targets = ['image', 'fallback']
6
+ declare readonly imageTarget: HTMLElement
7
+ declare readonly fallbackTarget: HTMLElement
8
+ declare readonly hasFallbackTarget: boolean
9
+
10
+ connect() {
11
+ this.imageTarget.onerror = () => {
12
+ if (this.hasFallbackTarget) {
13
+ this.fallbackTarget.classList.remove('hidden')
14
+ }
15
+
16
+ this.imageTarget.classList.add('hidden')
17
+ }
18
+ }
19
+ }
20
+
21
+ type Avatar = InstanceType<typeof AvatarController>
22
+
23
+ export { AvatarController }
24
+ export type { Avatar }
@@ -0,0 +1,41 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ const CheckboxController = class extends Controller<HTMLElement> {
4
+ // targets
5
+ static targets = ['input', 'indicator']
6
+ declare readonly inputTarget: HTMLInputElement
7
+ declare readonly indicatorTarget: HTMLInputElement
8
+
9
+ // values
10
+ static values = {
11
+ isChecked: Boolean,
12
+ }
13
+ declare isCheckedValue: boolean
14
+
15
+ toggle() {
16
+ this.isCheckedValue = !this.isCheckedValue
17
+ }
18
+
19
+ preventDefault(event: KeyboardEvent) {
20
+ event.preventDefault()
21
+ }
22
+
23
+ isCheckedValueChanged(isChecked: boolean) {
24
+ if (isChecked) {
25
+ this.element.ariaChecked = 'true'
26
+ this.element.dataset.state = 'checked'
27
+ this.inputTarget.checked = true
28
+ this.indicatorTarget.classList.remove('hidden')
29
+ } else {
30
+ this.element.ariaChecked = 'false'
31
+ this.element.dataset.state = 'unchecked'
32
+ this.inputTarget.checked = false
33
+ this.indicatorTarget.classList.add('hidden')
34
+ }
35
+ }
36
+ }
37
+
38
+ type Checkbox = InstanceType<typeof CheckboxController>
39
+
40
+ export { CheckboxController }
41
+ export type { Checkbox }
@@ -0,0 +1,52 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+ import { hideContent, showContent } from '../utils'
3
+
4
+ const CollapsibleController = class extends Controller {
5
+ // targets
6
+ static targets = ['trigger', 'content']
7
+ declare readonly triggerTarget: HTMLElement
8
+ declare readonly contentTarget: HTMLElement
9
+
10
+ // values
11
+ static values = {
12
+ isOpen: Boolean,
13
+ }
14
+ declare isOpenValue: boolean
15
+
16
+ toggle() {
17
+ if (this.isOpenValue) {
18
+ this.close()
19
+ } else {
20
+ this.open()
21
+ }
22
+ }
23
+
24
+ open() {
25
+ this.isOpenValue = true
26
+ }
27
+
28
+ close() {
29
+ this.isOpenValue = false
30
+ }
31
+
32
+ isOpenValueChanged(isOpen: boolean) {
33
+ if (isOpen) {
34
+ showContent({
35
+ trigger: this.triggerTarget,
36
+ content: this.contentTarget,
37
+ contentContainer: this.contentTarget,
38
+ })
39
+ } else {
40
+ hideContent({
41
+ trigger: this.triggerTarget,
42
+ content: this.contentTarget,
43
+ contentContainer: this.contentTarget,
44
+ })
45
+ }
46
+ }
47
+ }
48
+
49
+ type Collapsible = InstanceType<typeof CollapsibleController>
50
+
51
+ export { CollapsibleController }
52
+ export type { Collapsible }
@@ -0,0 +1,376 @@
1
+ import {
2
+ ON_OPEN_FOCUS_DELAY,
3
+ lockScroll,
4
+ showContent,
5
+ unlockScroll,
6
+ hideContent,
7
+ focusTrigger,
8
+ setGroupLabelsId,
9
+ onClickOutside,
10
+ } from '../utils'
11
+ import { initFloatingUi } from '../utils/floating_ui'
12
+ import { Controller } from '@hotwired/stimulus'
13
+ import Fuse from 'fuse.js'
14
+ import {
15
+ scrollToItem,
16
+ highlightItem,
17
+ highlightItemByIndex,
18
+ filteredItemsChanged,
19
+ setItemsGroupId,
20
+ search,
21
+ clearRemoteResults,
22
+ resetState,
23
+ } from '../utils/command'
24
+
25
+ import { useClickOutside, useDebounce } from 'stimulus-use'
26
+
27
+ const ComboboxController = class extends Controller<HTMLElement> {
28
+ // targets
29
+ static targets = [
30
+ 'trigger',
31
+ 'triggerText',
32
+ 'contentContainer',
33
+ 'content',
34
+ 'item',
35
+ 'group',
36
+ 'hiddenInput',
37
+ 'searchInput',
38
+ 'list',
39
+ 'listContainer',
40
+ 'empty',
41
+ 'loading',
42
+ 'error',
43
+ ]
44
+ declare readonly triggerTarget: HTMLElement
45
+ declare readonly triggerTextTarget: HTMLElement
46
+ declare readonly contentContainerTarget: HTMLElement
47
+ declare readonly contentTarget: HTMLElement
48
+ declare readonly itemTargets: HTMLElement[]
49
+ declare readonly groupTargets: HTMLElement[]
50
+ declare readonly hiddenInputTarget: HTMLInputElement
51
+ declare readonly searchInputTarget: HTMLInputElement
52
+ declare readonly listTarget: HTMLElement
53
+ declare readonly listContainerTarget: HTMLElement
54
+ declare readonly emptyTarget: HTMLElement
55
+ declare readonly loadingTarget: HTMLElement
56
+ declare readonly errorTarget: HTMLElement
57
+
58
+ // values
59
+ static values = {
60
+ isOpen: Boolean,
61
+ selected: String,
62
+ filteredItemIndexes: Array,
63
+ }
64
+ declare isOpenValue: boolean
65
+ declare selectedValue: string
66
+ declare filteredItemIndexesValue: number[]
67
+
68
+ // custom properties
69
+ declare orderedItems: HTMLElement[]
70
+ declare itemsInnerText: string[]
71
+ declare filteredItems: HTMLElement[]
72
+ declare fuse: Fuse<string>
73
+ declare scrollingViaKeyboard: boolean
74
+ declare keyboardScrollTimeout: number
75
+ declare abortController?: AbortController
76
+ declare searchPath?: string
77
+ declare isDirty: boolean
78
+ declare isLoading: boolean
79
+ declare DOMKeydownListener: (event: KeyboardEvent) => void
80
+ declare cleanup: () => void
81
+
82
+ static debounces = ['search']
83
+
84
+ connect() {
85
+ this.orderedItems = [...this.itemTargets]
86
+ this.itemsInnerText = this.itemTargets.map((i) => i.innerText.trim())
87
+ this.fuse = new Fuse(this.itemsInnerText)
88
+ this.filteredItemIndexesValue = Array.from(
89
+ { length: this.itemTargets.length },
90
+ (_, i) => i,
91
+ )
92
+ this.isLoading = false
93
+ this.filteredItems = this.itemTargets
94
+ this.isDirty = false
95
+ this.searchPath = this.element.dataset.searchPath
96
+ setGroupLabelsId(this)
97
+ setItemsGroupId(this)
98
+ useDebounce(this)
99
+ useClickOutside(this, { element: this.contentTarget, dispatchEvent: false })
100
+ this.DOMKeydownListener = this.onDOMKeydown.bind(this)
101
+ }
102
+
103
+ toggle() {
104
+ if (this.isOpenValue) {
105
+ this.close()
106
+ } else {
107
+ this.open()
108
+ }
109
+ }
110
+
111
+ open() {
112
+ this.isOpenValue = true
113
+
114
+ setTimeout(() => {
115
+ this.searchInputTarget.focus()
116
+
117
+ let index = 0
118
+ console.log('this.selectedValue', this.selectedValue)
119
+ if (this.selectedValue) {
120
+ const item = this.filteredItems.find(
121
+ (i) => i.dataset.value === this.selectedValue,
122
+ )
123
+
124
+ if (item && !item.dataset.disabled) {
125
+ index = this.filteredItems.indexOf(item)
126
+ }
127
+ }
128
+
129
+ this.highlightItemByIndex(index)
130
+ }, ON_OPEN_FOCUS_DELAY)
131
+ }
132
+
133
+ close() {
134
+ this.isOpenValue = false
135
+ resetState(this)
136
+ }
137
+
138
+ scrollToItem(index: number) {
139
+ scrollToItem(this, index)
140
+ }
141
+
142
+ highlightItem(
143
+ event: MouseEvent | KeyboardEvent | null = null,
144
+ index: number | null = null,
145
+ ) {
146
+ highlightItem(this, event, index)
147
+ }
148
+
149
+ highlightItemByIndex(index: number) {
150
+ highlightItemByIndex(this, index)
151
+ }
152
+
153
+ select(event: MouseEvent | KeyboardEvent) {
154
+ let item = undefined as HTMLElement | undefined
155
+
156
+ if (event instanceof KeyboardEvent) {
157
+ item = this.filteredItems.find((i) => i.dataset.highlighted === 'true')
158
+ } else {
159
+ // mouse event
160
+ item = event.currentTarget as HTMLElement
161
+ }
162
+
163
+ if (item) {
164
+ this.selectedValue = item.dataset.value as string
165
+
166
+ // setTimeout is needed for selectedValueChanged to finish executing
167
+ setTimeout(() => {
168
+ this.close()
169
+ }, 100)
170
+ }
171
+ }
172
+
173
+ inputKeydown(event: KeyboardEvent) {
174
+ if (event.key === ' ' && this.searchInputTarget.value.length === 0) {
175
+ event.preventDefault()
176
+ }
177
+
178
+ this.hideError()
179
+ this.showList()
180
+ }
181
+
182
+ search(event: InputEvent) {
183
+ this.isDirty = true
184
+ clearRemoteResults(this)
185
+ search(this, event)
186
+ }
187
+
188
+ clickOutside(event: MouseEvent) {
189
+ onClickOutside(this, event)
190
+ }
191
+
192
+ selectedValueChanged(value: string) {
193
+ const item = this.itemTargets.find((i) => i.dataset.value === value)
194
+
195
+ if (item) {
196
+ this.triggerTextTarget.textContent = item.textContent
197
+
198
+ this.itemTargets.forEach((i) => {
199
+ if (i.dataset.value === value) {
200
+ i.setAttribute('aria-selected', 'true')
201
+ } else {
202
+ i.setAttribute('aria-selected', 'false')
203
+ }
204
+ })
205
+
206
+ this.hiddenInputTarget.value = value
207
+ }
208
+
209
+ this.triggerTarget.dataset.hasValue = `${!!value && value.length > 0}`
210
+
211
+ const placeholder = this.triggerTarget.dataset.placeholder
212
+
213
+ if (placeholder && this.triggerTarget.dataset.hasValue === 'false') {
214
+ this.triggerTextTarget.textContent = placeholder
215
+ }
216
+ }
217
+
218
+ isOpenValueChanged(isOpen: boolean, previousIsOpen: boolean) {
219
+ if (isOpen) {
220
+ lockScroll(this.contentTarget.id)
221
+
222
+ showContent({
223
+ trigger: this.triggerTarget,
224
+ content: this.contentTarget,
225
+ contentContainer: this.contentContainerTarget,
226
+ setEqualWidth: true,
227
+ })
228
+
229
+ this.cleanup = initFloatingUi({
230
+ referenceElement: this.triggerTarget,
231
+ floatingElement: this.contentContainerTarget,
232
+ side: this.contentTarget.dataset.side,
233
+ align: this.contentTarget.dataset.align,
234
+ sideOffset: 4,
235
+ })
236
+
237
+ this.setupEventListeners()
238
+ } else {
239
+ unlockScroll(this.contentTarget.id)
240
+
241
+ hideContent({
242
+ trigger: this.triggerTarget,
243
+ content: this.contentTarget,
244
+ contentContainer: this.contentContainerTarget,
245
+ })
246
+
247
+ if (previousIsOpen) {
248
+ focusTrigger(this.triggerTarget)
249
+ }
250
+
251
+ this.cleanupEventListeners()
252
+ }
253
+ }
254
+
255
+ filteredItemIndexesValueChanged(filteredItemIndexes: number[]) {
256
+ filteredItemsChanged(this, filteredItemIndexes)
257
+ }
258
+
259
+ disconnect() {
260
+ this.cleanupEventListeners()
261
+ resetState(this)
262
+ }
263
+
264
+ showLoading() {
265
+ this.isLoading = true
266
+ this.loadingTarget.classList.remove('hidden')
267
+ }
268
+
269
+ hideLoading() {
270
+ this.isLoading = false
271
+ this.loadingTarget.classList.add('hidden')
272
+ }
273
+
274
+ showList() {
275
+ this.listTarget.classList.remove('hidden')
276
+ }
277
+
278
+ hideList() {
279
+ this.listTarget.classList.add('hidden')
280
+ }
281
+
282
+ showError() {
283
+ this.errorTarget.classList.remove('hidden')
284
+ }
285
+
286
+ hideError() {
287
+ this.errorTarget.classList.add('hidden')
288
+ }
289
+
290
+ showEmpty() {
291
+ this.emptyTarget.classList.remove('hidden')
292
+ }
293
+
294
+ hideEmpty() {
295
+ this.emptyTarget.classList.add('hidden')
296
+ }
297
+
298
+ showSelectedRemoteItems() {
299
+ const remoteItems = Array.from(
300
+ this.element.querySelectorAll(
301
+ `[data-shadcn-phlexcomponents="${this.identifier}-item"][data-remote='true']`,
302
+ ),
303
+ )
304
+
305
+ remoteItems.forEach((i) => {
306
+ const isInsideGroup =
307
+ i.parentElement?.dataset?.shadcnPhlexcomponents ===
308
+ `${this.identifier}-group`
309
+
310
+ if (isInsideGroup) {
311
+ const isRemoteGroup = i.parentElement.dataset.remote === 'true'
312
+
313
+ if (isRemoteGroup) {
314
+ i.parentElement.classList.remove('hidden')
315
+ }
316
+ }
317
+
318
+ i.ariaHidden = 'false'
319
+ i.classList.remove('hidden')
320
+ })
321
+ }
322
+
323
+ hideSelectedRemoteItems() {
324
+ const remoteItems = Array.from(
325
+ this.element.querySelectorAll(
326
+ `[data-shadcn-phlexcomponents="${this.identifier}-item"][data-remote='true']`,
327
+ ),
328
+ )
329
+
330
+ remoteItems.forEach((i) => {
331
+ const isInsideGroup =
332
+ i.parentElement?.dataset?.shadcnPhlexcomponents ===
333
+ `${this.identifier}-group`
334
+
335
+ if (isInsideGroup) {
336
+ const isRemoteGroup = i.parentElement.dataset.remote === 'true'
337
+
338
+ if (isRemoteGroup) {
339
+ i.parentElement.classList.add('hidden')
340
+ }
341
+ }
342
+
343
+ i.ariaHidden = 'true'
344
+ i.classList.add('hidden')
345
+ })
346
+ }
347
+
348
+ protected setupEventListeners() {
349
+ document.addEventListener('keydown', this.DOMKeydownListener)
350
+ }
351
+
352
+ protected cleanupEventListeners() {
353
+ document.removeEventListener('keydown', this.DOMKeydownListener)
354
+
355
+ if (this.abortController) {
356
+ this.abortController.abort()
357
+ }
358
+ }
359
+
360
+ protected onDOMKeydown(event: KeyboardEvent) {
361
+ if (!this.isOpenValue) return
362
+
363
+ const key = event.key
364
+
365
+ if (['Tab', 'Enter'].includes(key)) event.preventDefault()
366
+
367
+ if (key === 'Escape') {
368
+ this.close()
369
+ }
370
+ }
371
+ }
372
+
373
+ type Combobox = InstanceType<typeof ComboboxController>
374
+
375
+ export { ComboboxController }
376
+ export type { Combobox }