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
@@ -0,0 +1,57 @@
1
+ import AccordionController from './controllers/accordion_controller'
2
+ import AvatarController from './controllers/avatar_controller'
3
+ import CheckboxController from './controllers/checkbox_controller'
4
+ import CollapsibleController from './controllers/collapsible_controller'
5
+ import ComboboxController from './controllers/combobox_controller'
6
+ import CommandController from './controllers/command_controller'
7
+ import DatePickerController from './controllers/date_picker_controller'
8
+ import DateRangePickerController from './controllers/date_range_picker_controller'
9
+ import DialogController from './controllers/dialog_controller'
10
+ import DropdownMenuController from './controllers/dropdown_menu_controller'
11
+ import DropdownMenuSubController from './controllers/dropdown_menu_sub_controller'
12
+ import FormFieldController from './controllers/form_field_controller'
13
+ import HoverCardController from './controllers/hover_card_controller'
14
+ import LoadingButtonController from './controllers/loading_button_controller'
15
+ import PopoverController from './controllers/popover_controller'
16
+ import ProgressController from './controllers/progress_controller'
17
+ import RadioGroupController from './controllers/radio_group_controller'
18
+ import SelectController from './controllers/select_controller'
19
+ import SidebarController from './controllers/sidebar_controller'
20
+ import SidebarTriggerController from './controllers/sidebar_trigger_controller'
21
+ import SliderController from './controllers/slider_controller'
22
+ import SwitchController from './controllers/switch_controller'
23
+ import TabsController from './controllers/tabs_controller'
24
+ import ThemeSwitcherController from './controllers/theme_switcher_controller'
25
+ import ToastContainerController from './controllers/toast_container_controller'
26
+ import ToastController from './controllers/toast_controller'
27
+ import TooltipController from './controllers/tooltip_controller'
28
+
29
+ export default {
30
+ accordion: AccordionController,
31
+ avatar: AvatarController,
32
+ checkbox: CheckboxController,
33
+ collapsible: CollapsibleController,
34
+ combobox: ComboboxController,
35
+ command: CommandController,
36
+ 'date-picker': DatePickerController,
37
+ 'date-range-picker': DateRangePickerController,
38
+ dialog: DialogController,
39
+ 'dropdown-menu': DropdownMenuController,
40
+ 'dropdown-menu-sub': DropdownMenuSubController,
41
+ 'form-field': FormFieldController,
42
+ 'hover-card': HoverCardController,
43
+ 'loading-button': LoadingButtonController,
44
+ popover: PopoverController,
45
+ progress: ProgressController,
46
+ 'radio-group': RadioGroupController,
47
+ select: SelectController,
48
+ sidebar: SidebarController,
49
+ 'sidebar-trigger': SidebarTriggerController,
50
+ slider: SliderController,
51
+ switch: SwitchController,
52
+ tabs: TabsController,
53
+ 'theme-switcher': ThemeSwitcherController,
54
+ 'toast-container': ToastContainerController,
55
+ toast: ToastController,
56
+ tooltip: TooltipController,
57
+ }
@@ -0,0 +1,437 @@
1
+ import {
2
+ computePosition,
3
+ flip,
4
+ shift,
5
+ offset,
6
+ autoUpdate,
7
+ size,
8
+ Placement,
9
+ Middleware,
10
+ arrow,
11
+ } from '@floating-ui/dom'
12
+
13
+ const ANIMATION_OUT_DELAY = 100
14
+ const ON_OPEN_FOCUS_DELAY = 100
15
+ const ON_CLOSE_FOCUS_DELAY = 50
16
+
17
+ const OPPOSITE_SIDE = {
18
+ top: 'bottom',
19
+ right: 'left',
20
+ bottom: 'top',
21
+ left: 'right',
22
+ }
23
+
24
+ const ARROW_TRANSFORM_ORIGIN = {
25
+ top: '',
26
+ right: '0 0',
27
+ bottom: 'center 0',
28
+ left: '100% 0',
29
+ }
30
+
31
+ const ARROW_TRANSFORM = {
32
+ top: 'translateY(100%)',
33
+ right: 'translateY(50%) rotate(90deg) translateX(-50%)',
34
+ bottom: `rotate(180deg)`,
35
+ left: 'translateY(50%) rotate(-90deg) translateX(50%)',
36
+ }
37
+
38
+ const getScrollbarWidth = () => {
39
+ // Create a temporary div container and append it into the body
40
+ const outer = document.createElement('div')
41
+ outer.style.visibility = 'hidden'
42
+ outer.style.overflow = 'scroll' // force scrollbars
43
+ outer.style.width = '100px'
44
+ outer.style.position = 'absolute'
45
+ outer.style.top = '-9999px'
46
+ document.body.appendChild(outer)
47
+
48
+ // Create an inner div and place it inside the outer div
49
+ const inner = document.createElement('div')
50
+ inner.style.width = '100%'
51
+ outer.appendChild(inner)
52
+
53
+ // Calculate the scrollbar width
54
+ const scrollbarWidth = outer.offsetWidth - inner.offsetWidth
55
+
56
+ // Clean up
57
+ outer.remove()
58
+
59
+ return scrollbarWidth
60
+ }
61
+
62
+ const showOverlay = ({
63
+ classNames = '',
64
+ elementId,
65
+ }: {
66
+ classNames?: string
67
+ elementId: string
68
+ }) => {
69
+ const element = document.createElement('div')
70
+
71
+ let defaultClassNames = [
72
+ 'data-[state=open]:animate-in',
73
+ 'data-[state=closed]:animate-out',
74
+ 'data-[state=closed]:fade-out-0',
75
+ 'data-[state=open]:fade-in-0',
76
+ 'fixed',
77
+ 'inset-0',
78
+ 'z-[48]',
79
+ 'bg-black/50',
80
+ 'pointer-events-auto',
81
+ ]
82
+
83
+ defaultClassNames = defaultClassNames.concat(
84
+ classNames.split(' ').filter((c) => !!c),
85
+ )
86
+
87
+ element.classList.add(...defaultClassNames)
88
+ element.dataset.state = 'open'
89
+ element.dataset.shadcnPhlexcomponentsOverlay = elementId
90
+ element.ariaHidden = 'true'
91
+
92
+ document.body.appendChild(element)
93
+ }
94
+
95
+ const hideOverlay = (elementId: string) => {
96
+ const element = document.querySelector(
97
+ `[data-shadcn-phlexcomponents-overlay=${elementId}]`,
98
+ )
99
+
100
+ if (element && element instanceof HTMLElement) {
101
+ element.dataset.state = 'closed'
102
+
103
+ setTimeout(() => {
104
+ element.remove()
105
+ }, ANIMATION_OUT_DELAY)
106
+ }
107
+ }
108
+
109
+ const lockScroll = () => {
110
+ if (window.innerHeight < document.documentElement.scrollHeight) {
111
+ document.body.dataset.scrollLocked = '1'
112
+ document.body.classList.add(
113
+ 'data-[scroll-locked]:pointer-events-none',
114
+ 'data-[scroll-locked]:!overflow-hidden',
115
+ 'data-[scroll-locked]:!relative',
116
+ 'data-[scroll-locked]:px-0',
117
+ 'data-[scroll-locked]:pt-0',
118
+ 'data-[scroll-locked]:ml-0',
119
+ 'data-[scroll-locked]:mt-0',
120
+ )
121
+ const style = getComputedStyle(document.body)
122
+ const originalMarginRight = style.marginRight
123
+ document.body.dataset.marginRight = originalMarginRight
124
+ document.body.style.marginRight = `${getScrollbarWidth()}px`
125
+ }
126
+ }
127
+
128
+ const unlockScroll = () => {
129
+ if (document.body.dataset.scrollLocked) {
130
+ delete document.body.dataset.scrollLocked
131
+ document.body.classList.remove(
132
+ 'data-[scroll-locked]:pointer-events-none',
133
+ 'data-[scroll-locked]:!overflow-hidden',
134
+ 'data-[scroll-locked]:!relative',
135
+ 'data-[scroll-locked]:px-0',
136
+ 'data-[scroll-locked]:pt-0',
137
+ 'data-[scroll-locked]:ml-0',
138
+ 'data-[scroll-locked]:mt-0',
139
+ )
140
+
141
+ const originalMarginRight = document.body.dataset.marginRight
142
+
143
+ if (originalMarginRight && parseInt(originalMarginRight) === 0) {
144
+ document.body.style.marginRight = ''
145
+ } else {
146
+ document.body.style.marginRight = `${originalMarginRight}`
147
+ }
148
+
149
+ delete document.body.dataset.marginRight
150
+ }
151
+ }
152
+
153
+ const openWithOverlay = (elementId: string) => {
154
+ showOverlay({ elementId })
155
+ lockScroll()
156
+ }
157
+
158
+ const closeWithOverlay = (elementId: string) => {
159
+ hideOverlay(elementId)
160
+ unlockScroll()
161
+ }
162
+
163
+ const initFloatingUi = ({
164
+ referenceElement,
165
+ floatingElement,
166
+ side = 'bottom',
167
+ align = 'center',
168
+ sideOffset = 0,
169
+ alignOffset = 0,
170
+ arrowElement,
171
+ }: {
172
+ referenceElement: HTMLElement
173
+ floatingElement: HTMLElement
174
+ side?: string
175
+ align?: string
176
+ sideOffset?: number
177
+ alignOffset?: number
178
+ offsetPx?: number
179
+ arrowElement?: HTMLElement
180
+ }) => {
181
+ let placement = `${side}-${align}`
182
+ placement = placement.replace(/-center/g, '')
183
+
184
+ let arrowHeight = 0,
185
+ arrowWidth = 0
186
+
187
+ if (arrowElement) {
188
+ const rect = arrowElement.getBoundingClientRect()
189
+ arrowWidth = rect.width
190
+ arrowHeight = rect.height
191
+ }
192
+
193
+ const middleware = [
194
+ transformOrigin({ arrowHeight, arrowWidth }),
195
+ offset({ mainAxis: sideOffset, alignmentAxis: alignOffset }),
196
+ size({
197
+ apply: ({ elements, rects, availableWidth, availableHeight }) => {
198
+ const { width: anchorWidth, height: anchorHeight } = rects.reference
199
+ const contentStyle = elements.floating.style
200
+ contentStyle.setProperty(
201
+ '--radix-popper-available-width',
202
+ `${availableWidth}px`,
203
+ )
204
+ contentStyle.setProperty(
205
+ '--radix-popper-available-height',
206
+ `${availableHeight}px`,
207
+ )
208
+ contentStyle.setProperty(
209
+ '--radix-popper-anchor-width',
210
+ `${anchorWidth}px`,
211
+ )
212
+ contentStyle.setProperty(
213
+ '--radix-popper-anchor-height',
214
+ `${anchorHeight}px`,
215
+ )
216
+ },
217
+ }),
218
+ ]
219
+
220
+ const flipMiddleware = flip({
221
+ // Ensure we flip to the perpendicular axis if it doesn't fit
222
+ // on narrow viewports.
223
+ crossAxis: 'alignment',
224
+ fallbackAxisSideDirection: 'end', // or 'start'
225
+ })
226
+ const shiftMiddleware = shift()
227
+
228
+ // Prioritize flip over shift for edge-aligned placements only.
229
+ if (placement.includes('-')) {
230
+ middleware.push(flipMiddleware, shiftMiddleware)
231
+ } else {
232
+ middleware.push(shiftMiddleware, flipMiddleware)
233
+ }
234
+
235
+ if (arrowElement) {
236
+ middleware.push(arrow({ element: arrowElement, padding: 0 }))
237
+ }
238
+
239
+ return autoUpdate(referenceElement, floatingElement, () => {
240
+ computePosition(referenceElement, floatingElement, {
241
+ placement: placement as Placement,
242
+ strategy: 'fixed',
243
+ middleware,
244
+ }).then(({ middlewareData, x, y }) => {
245
+ const arrowX = middlewareData.arrow?.x
246
+ const arrowY = middlewareData.arrow?.y
247
+ const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0
248
+
249
+ floatingElement.style.setProperty(
250
+ '--radix-popper-transform-origin',
251
+ `${middlewareData.transformOrigin?.x} ${middlewareData.transformOrigin?.y}`,
252
+ )
253
+ if (arrowElement) {
254
+ const baseSide = OPPOSITE_SIDE[side as keyof typeof OPPOSITE_SIDE]
255
+
256
+ const arrowStyle = {
257
+ position: 'absolute',
258
+ left: arrowX ? `${arrowX}px` : undefined,
259
+ top: arrowY ? `${arrowY}px` : undefined,
260
+ [baseSide]: 0,
261
+ transformOrigin:
262
+ ARROW_TRANSFORM_ORIGIN[side as keyof typeof ARROW_TRANSFORM_ORIGIN],
263
+ transform: ARROW_TRANSFORM[side as keyof typeof ARROW_TRANSFORM],
264
+ visibility: cannotCenterArrow ? 'hidden' : undefined,
265
+ }
266
+
267
+ Object.assign(arrowElement.style, arrowStyle)
268
+ }
269
+ Object.assign(floatingElement.style, {
270
+ left: `${x}px`,
271
+ top: `${y}px`,
272
+ })
273
+ })
274
+ })
275
+ }
276
+
277
+ const transformOrigin = (options: {
278
+ arrowWidth: number
279
+ arrowHeight: number
280
+ }): Middleware => {
281
+ return {
282
+ name: 'transformOrigin',
283
+ options,
284
+ fn(data) {
285
+ const { placement, rects, middlewareData } = data
286
+ const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0
287
+ const isArrowHidden = cannotCenterArrow
288
+ const arrowWidth = isArrowHidden ? 0 : options.arrowWidth
289
+ const arrowHeight = isArrowHidden ? 0 : options.arrowHeight
290
+
291
+ const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement)
292
+ const noArrowAlign = { start: '0%', center: '50%', end: '100%' }[
293
+ placedAlign
294
+ ] as string
295
+
296
+ const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2
297
+ const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2
298
+
299
+ let x = ''
300
+ let y = ''
301
+
302
+ if (placedSide === 'bottom') {
303
+ x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`
304
+ y = `${-arrowHeight}px`
305
+ } else if (placedSide === 'top') {
306
+ x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`
307
+ y = `${rects.floating.height + arrowHeight}px`
308
+ } else if (placedSide === 'right') {
309
+ x = `${-arrowHeight}px`
310
+ y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`
311
+ } else if (placedSide === 'left') {
312
+ x = `${rects.floating.width + arrowHeight}px`
313
+ y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`
314
+ }
315
+ return { data: { x, y } }
316
+ },
317
+ }
318
+ }
319
+
320
+ function getSideAndAlignFromPlacement(placement: Placement) {
321
+ const [side, align = 'center'] = placement.split('-')
322
+ return [side, align] as const
323
+ }
324
+
325
+ const focusTrigger = (triggerTarget: HTMLElement) => {
326
+ setTimeout(() => {
327
+ if (triggerTarget.dataset.asChild === 'false') {
328
+ const childElement = triggerTarget.firstElementChild as HTMLElement
329
+
330
+ if (childElement) {
331
+ childElement.focus()
332
+ }
333
+ } else {
334
+ triggerTarget.focus()
335
+ }
336
+ }, ON_CLOSE_FOCUS_DELAY)
337
+ }
338
+
339
+ const getFocusableElements = (container: HTMLElement) => {
340
+ return Array.from(
341
+ container.querySelectorAll(
342
+ 'button, [href], input:not([type="hidden"]), select:not([tabindex="-1"]), textarea, [tabindex]:not([tabindex="-1"])',
343
+ ),
344
+ ) as HTMLElement[]
345
+ }
346
+
347
+ const getSameLevelItems = ({
348
+ content,
349
+ items,
350
+ closestContentSelector,
351
+ }: {
352
+ content: HTMLElement
353
+ items: HTMLElement[]
354
+ closestContentSelector: string
355
+ }) => {
356
+ let sameLevelItems = [] as HTMLElement[]
357
+
358
+ items.forEach((i) => {
359
+ if (
360
+ i.closest(closestContentSelector) === content &&
361
+ i.dataset.disabled === undefined
362
+ ) {
363
+ sameLevelItems.push(i)
364
+ }
365
+ })
366
+
367
+ return sameLevelItems
368
+ }
369
+
370
+ const showContent = ({
371
+ trigger,
372
+ content,
373
+ contentContainer,
374
+ setEqualWidth,
375
+ }: {
376
+ trigger?: HTMLElement
377
+ content: HTMLElement
378
+ contentContainer: HTMLElement
379
+ setEqualWidth?: boolean
380
+ }) => {
381
+ contentContainer.classList.remove('hidden')
382
+
383
+ if (trigger) {
384
+ if (setEqualWidth) {
385
+ const triggerWidth = trigger.offsetWidth
386
+ const contentContainerWidth = contentContainer.offsetWidth
387
+
388
+ if (contentContainerWidth < triggerWidth) {
389
+ contentContainer.style.width = `${triggerWidth}px`
390
+ }
391
+ }
392
+
393
+ trigger.ariaExpanded = 'true'
394
+ trigger.dataset.state = 'open'
395
+ }
396
+
397
+ content.dataset.state = 'open'
398
+ }
399
+
400
+ const hideContent = ({
401
+ trigger,
402
+ content,
403
+ contentContainer,
404
+ }: {
405
+ trigger?: HTMLElement
406
+ content: HTMLElement
407
+ contentContainer: HTMLElement
408
+ }) => {
409
+ if (trigger) {
410
+ trigger.ariaExpanded = 'false'
411
+ trigger.dataset.state = 'closed'
412
+ }
413
+
414
+ content.dataset.state = 'closed'
415
+
416
+ setTimeout(() => {
417
+ contentContainer.classList.add('hidden')
418
+ }, ANIMATION_OUT_DELAY)
419
+ }
420
+
421
+ export {
422
+ ANIMATION_OUT_DELAY,
423
+ ON_CLOSE_FOCUS_DELAY,
424
+ ON_OPEN_FOCUS_DELAY,
425
+ showOverlay,
426
+ hideOverlay,
427
+ lockScroll,
428
+ unlockScroll,
429
+ openWithOverlay,
430
+ closeWithOverlay,
431
+ initFloatingUi,
432
+ focusTrigger,
433
+ getFocusableElements,
434
+ getSameLevelItems,
435
+ showContent,
436
+ hideContent,
437
+ }
@@ -0,0 +1,74 @@
1
+ [data-vc-arrow='next']:before {
2
+ @apply bg-current size-4 mask-size-[auto_16px] mask-center mask-no-repeat absolute content-[''];
3
+ mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right-icon lucide-chevron-right"><path d="m9 18 6-6-6-6"/></svg>');
4
+ }
5
+
6
+ [data-vc-arrow='prev']:before {
7
+ @apply bg-current size-4 mask-size-[auto_16px] mask-center mask-no-repeat absolute content-[''];
8
+ mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-left-icon lucide-chevron-left"><path d="m15 18-6-6 6-6"/></svg>');
9
+ }
10
+
11
+ [data-vc='grid'][data-vc-grid='hidden'] [data-vc='column'] {
12
+ pointer-events: none;
13
+ opacity: 0.3;
14
+ }
15
+
16
+ [data-vc='grid'][data-vc-grid='hidden'] [data-vc='column'] * {
17
+ pointer-events: none;
18
+ }
19
+
20
+ [data-vc='grid'][data-vc-grid='hidden']
21
+ [data-vc='column'][data-vc-column='month'],
22
+ [data-vc='grid'][data-vc-grid='hidden']
23
+ [data-vc='column'][data-vc-column='month']
24
+ *,
25
+ [data-vc='grid'][data-vc-grid='hidden']
26
+ [data-vc='column'][data-vc-column='year'],
27
+ [data-vc='grid'][data-vc-grid='hidden']
28
+ [data-vc='column'][data-vc-column='year']
29
+ * {
30
+ pointer-events: auto;
31
+ opacity: 1;
32
+ }
33
+
34
+ [data-vc-date][data-vc-date-hover] [data-vc-date-btn] {
35
+ @apply rounded-none;
36
+ }
37
+
38
+ [data-vc-date][data-vc-date-hover='first'] [data-vc-date-btn] {
39
+ @apply rounded-r-none rounded-l-md;
40
+ }
41
+
42
+ [data-vc-date][data-vc-date-hover='last'] [data-vc-date-btn] {
43
+ @apply rounded-l-none rounded-r-md;
44
+ }
45
+
46
+ [data-vc-date][data-vc-date-hover='first-and-last'] [data-vc-date-btn] {
47
+ @apply rounded-md;
48
+ }
49
+
50
+ [data-vc-date][data-vc-date-hover='first'][data-vc-date-selected]
51
+ [data-vc-date-btn] {
52
+ @apply rounded-l-md;
53
+ }
54
+
55
+ [data-vc-date][data-vc-date-hover='last'][data-vc-date-selected]
56
+ [data-vc-date-btn] {
57
+ @apply rounded-r-md;
58
+ }
59
+
60
+ [data-vc-date][data-vc-date-selected='first'] [data-vc-date-btn] {
61
+ @apply rounded-r-none rounded-l-md;
62
+ }
63
+
64
+ [data-vc-date][data-vc-date-selected='last'] [data-vc-date-btn] {
65
+ @apply rounded-l-none rounded-r-md;
66
+ }
67
+
68
+ [data-vc-date][data-vc-date-selected='first-and-last'] [data-vc-date-btn] {
69
+ @apply rounded-l-md rounded-r-md;
70
+ }
71
+
72
+ [data-vc-date][data-vc-date-selected='middle'] [data-vc-date-btn] {
73
+ @apply rounded-none;
74
+ }