@clubmed/trident-ui 2.0.0-beta.7 → 2.0.0-beta.74

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 (476) hide show
  1. package/README.md +8 -0
  2. package/assets/trident-ui.css +3 -0
  3. package/chunks/Backdrop.js +1 -1
  4. package/chunks/Backdrop.js.map +1 -1
  5. package/chunks/Birthdate.js +27 -0
  6. package/chunks/Birthdate.js.map +1 -0
  7. package/chunks/Carousel.context.js +1548 -0
  8. package/chunks/Carousel.context.js.map +1 -0
  9. package/chunks/ChatMessage.js +14395 -0
  10. package/chunks/ChatMessage.js.map +1 -0
  11. package/chunks/CriteriaParticipants.js +415 -0
  12. package/chunks/CriteriaParticipants.js.map +1 -0
  13. package/chunks/DateField.js +189 -128
  14. package/chunks/DateField.js.map +1 -1
  15. package/chunks/Datepicker.js +2039 -0
  16. package/chunks/Datepicker.js.map +1 -0
  17. package/chunks/Day.js +88 -0
  18. package/chunks/Day.js.map +1 -0
  19. package/chunks/Range.js +2 -2
  20. package/chunks/Range.js.map +1 -1
  21. package/chunks/Tooltip.js +4461 -0
  22. package/chunks/Tooltip.js.map +1 -0
  23. package/chunks/addLeadingZeros.js +33 -0
  24. package/chunks/addLeadingZeros.js.map +1 -0
  25. package/chunks/addYears.js +18 -0
  26. package/chunks/addYears.js.map +1 -0
  27. package/chunks/chunk.js +11 -4
  28. package/chunks/client.js +18953 -0
  29. package/chunks/client.js.map +1 -0
  30. package/chunks/endOfMonth.js +17 -0
  31. package/chunks/endOfMonth.js.map +1 -0
  32. package/chunks/format.js +1113 -0
  33. package/chunks/format.js.map +1 -0
  34. package/chunks/formatISO.js +29 -0
  35. package/chunks/formatISO.js.map +1 -0
  36. package/chunks/isAfter.js +9 -0
  37. package/chunks/isAfter.js.map +1 -0
  38. package/chunks/isBefore.js +15 -0
  39. package/chunks/isBefore.js.map +1 -0
  40. package/chunks/normalizeDates.js +10 -0
  41. package/chunks/normalizeDates.js.map +1 -0
  42. package/chunks/subYears.js +9 -0
  43. package/chunks/subYears.js.map +1 -0
  44. package/examples/accordion-demo.d.ts +1 -0
  45. package/examples/accordion-demo.js +79 -0
  46. package/examples/accordion-demo.js.map +1 -0
  47. package/examples/accordion-multiple-demo.d.ts +1 -0
  48. package/examples/accordion-multiple-demo.js +79 -0
  49. package/examples/accordion-multiple-demo.js.map +1 -0
  50. package/examples/accordion-trigger-wrapper-demo.d.ts +1 -0
  51. package/examples/accordion-trigger-wrapper-demo.js +80 -0
  52. package/examples/accordion-trigger-wrapper-demo.js.map +1 -0
  53. package/examples/advanced-toast-demo.js +2 -2
  54. package/examples/advanced-toast-demo.js.map +1 -1
  55. package/examples/advanced-toast-green-demo.js +1 -1
  56. package/examples/advanced-toast-green-demo.js.map +1 -1
  57. package/examples/advanced-toast-no-dismiss-demo.js +1 -1
  58. package/examples/advanced-toast-no-dismiss-demo.js.map +1 -1
  59. package/examples/advanced-toast-red-demo.js +1 -1
  60. package/examples/advanced-toast-red-demo.js.map +1 -1
  61. package/examples/advanced-toast-with-details-demo.js +2 -2
  62. package/examples/advanced-toast-with-details-demo.js.map +1 -1
  63. package/examples/arrow-button-demo.js +2 -1
  64. package/examples/arrow-button-demo.js.map +1 -1
  65. package/examples/arrow-button-disabled-demo.js +2 -1
  66. package/examples/arrow-button-disabled-demo.js.map +1 -1
  67. package/examples/arrow-button-left-demo.js +2 -1
  68. package/examples/arrow-button-left-demo.js.map +1 -1
  69. package/examples/arrow-button-outline-demo.js +2 -1
  70. package/examples/arrow-button-outline-demo.js.map +1 -1
  71. package/examples/arrow-button-tail-demo.js +2 -1
  72. package/examples/arrow-button-tail-demo.js.map +1 -1
  73. package/examples/avatar-demo.js +7 -7
  74. package/examples/button-demo.js +2 -2
  75. package/examples/button-demo.js.map +1 -1
  76. package/examples/card-list-demo.js +10 -10
  77. package/examples/card-no-border-demo.js +7 -7
  78. package/examples/chat-button-demo.js +1 -1
  79. package/examples/chat-button-demo.js.map +1 -1
  80. package/examples/chat-button-offset-demo.js +4 -1
  81. package/examples/chat-button-offset-demo.js.map +1 -1
  82. package/examples/chat-input-demo.d.ts +1 -0
  83. package/examples/chat-input-demo.js +22 -0
  84. package/examples/chat-input-demo.js.map +1 -0
  85. package/examples/chat-message-demo.d.ts +1 -0
  86. package/examples/chat-message-demo.js +20 -0
  87. package/examples/chat-message-demo.js.map +1 -0
  88. package/examples/chat-typing-indicator-demo.d.ts +1 -0
  89. package/examples/chat-typing-indicator-demo.js +14 -0
  90. package/examples/chat-typing-indicator-demo.js.map +1 -0
  91. package/examples/chat-window-csat-demo.d.ts +1 -0
  92. package/examples/chat-window-csat-demo.js +69 -0
  93. package/examples/chat-window-csat-demo.js.map +1 -0
  94. package/examples/chat-window-csat-prompt-demo.d.ts +1 -0
  95. package/examples/chat-window-csat-prompt-demo.js +40 -0
  96. package/examples/chat-window-csat-prompt-demo.js.map +1 -0
  97. package/examples/chat-window-demo.d.ts +1 -0
  98. package/examples/chat-window-demo.js +70 -0
  99. package/examples/chat-window-demo.js.map +1 -0
  100. package/examples/chat-window-quote-demo.d.ts +1 -0
  101. package/examples/chat-window-quote-demo.js +47 -0
  102. package/examples/chat-window-quote-demo.js.map +1 -0
  103. package/examples/chat-window-quotes-demo.d.ts +1 -0
  104. package/examples/chat-window-quotes-demo.js +68 -0
  105. package/examples/chat-window-quotes-demo.js.map +1 -0
  106. package/examples/checkbox-demo.js +17 -15
  107. package/examples/checkbox-demo.js.map +1 -1
  108. package/examples/checkbox-disabled-demo.js +12 -15
  109. package/examples/checkbox-disabled-demo.js.map +1 -1
  110. package/examples/checkbox-select-demo.d.ts +1 -0
  111. package/examples/checkbox-select-demo.js +101 -0
  112. package/examples/checkbox-select-demo.js.map +1 -0
  113. package/examples/checkboxes-demo.js +2 -1
  114. package/examples/checkboxes-demo.js.map +1 -1
  115. package/examples/checkboxes-with-form-control-demo.js +8 -8
  116. package/examples/checkboxes-with-form-control-demo.js.map +1 -1
  117. package/examples/chip-demo.js +4 -4
  118. package/examples/choice-expander-demo.js +5 -67
  119. package/examples/choice-expander-demo.js.map +1 -1
  120. package/examples/countdown-demo.d.ts +1 -0
  121. package/examples/countdown-demo.js +39 -0
  122. package/examples/countdown-demo.js.map +1 -0
  123. package/examples/criteria-dates-demo.d.ts +1 -0
  124. package/examples/criteria-dates-demo.js +41 -0
  125. package/examples/criteria-dates-demo.js.map +1 -0
  126. package/examples/criteria-participants-demo.d.ts +1 -0
  127. package/examples/criteria-participants-demo.js +77 -0
  128. package/examples/criteria-participants-demo.js.map +1 -0
  129. package/examples/criteria-participants-flow1-demo.d.ts +1 -0
  130. package/examples/criteria-participants-flow1-demo.js +53 -0
  131. package/examples/criteria-participants-flow1-demo.js.map +1 -0
  132. package/examples/criteria-participants-flow2-demo.d.ts +1 -0
  133. package/examples/criteria-participants-flow2-demo.js +61 -0
  134. package/examples/criteria-participants-flow2-demo.js.map +1 -0
  135. package/examples/criteria-participants-flow3-demo.d.ts +1 -0
  136. package/examples/criteria-participants-flow3-demo.js +72 -0
  137. package/examples/criteria-participants-flow3-demo.js.map +1 -0
  138. package/examples/criteria-transports-b2b-demo.d.ts +1 -0
  139. package/examples/criteria-transports-b2b-demo.js +51 -0
  140. package/examples/criteria-transports-b2b-demo.js.map +1 -0
  141. package/examples/criteria-transports-b2c-demo.d.ts +1 -0
  142. package/examples/criteria-transports-b2c-demo.js +37 -0
  143. package/examples/criteria-transports-b2c-demo.js.map +1 -0
  144. package/examples/criteria-transports-data.d.ts +7 -0
  145. package/examples/criteria-transports-data.js +151 -0
  146. package/examples/criteria-transports-data.js.map +1 -0
  147. package/examples/criteria-transports-demo.d.ts +1 -0
  148. package/examples/criteria-transports-demo.js +34 -0
  149. package/examples/criteria-transports-demo.js.map +1 -0
  150. package/examples/criteria-transports-error-demo.d.ts +1 -0
  151. package/examples/criteria-transports-error-demo.js +29 -0
  152. package/examples/criteria-transports-error-demo.js.map +1 -0
  153. package/examples/datepicker-demo.d.ts +1 -0
  154. package/examples/datepicker-demo.js +51 -0
  155. package/examples/datepicker-demo.js.map +1 -0
  156. package/examples/datepicker-disabled-days-demo.d.ts +1 -0
  157. package/examples/datepicker-disabled-days-demo.js +42 -0
  158. package/examples/datepicker-disabled-days-demo.js.map +1 -0
  159. package/examples/datepicker-duration-tooltip-demo.d.ts +1 -0
  160. package/examples/datepicker-duration-tooltip-demo.js +68 -0
  161. package/examples/datepicker-duration-tooltip-demo.js.map +1 -0
  162. package/examples/datepicker-no-prices-demo.d.ts +1 -0
  163. package/examples/datepicker-no-prices-demo.js +42 -0
  164. package/examples/datepicker-no-prices-demo.js.map +1 -0
  165. package/examples/datepicker-preselected-demo.d.ts +1 -0
  166. package/examples/datepicker-preselected-demo.js +77 -0
  167. package/examples/datepicker-preselected-demo.js.map +1 -0
  168. package/examples/dropdown-demo.js +9 -1
  169. package/examples/dropdown-demo.js.map +1 -1
  170. package/examples/elastic-height-demo.js +2 -1
  171. package/examples/elastic-height-demo.js.map +1 -1
  172. package/examples/expandable-text-demo.d.ts +1 -0
  173. package/examples/expandable-text-demo.js +22 -0
  174. package/examples/expandable-text-demo.js.map +1 -0
  175. package/examples/filter-demo.js +5 -5
  176. package/examples/floating-label-text-field-demo.d.ts +1 -0
  177. package/examples/floating-label-text-field-demo.js +32 -0
  178. package/examples/floating-label-text-field-demo.js.map +1 -0
  179. package/examples/frame-demo.d.ts +1 -0
  180. package/examples/frame-demo.js +36 -0
  181. package/examples/frame-demo.js.map +1 -0
  182. package/examples/frame-horizontal-demo.d.ts +1 -0
  183. package/examples/frame-horizontal-demo.js +44 -0
  184. package/examples/frame-horizontal-demo.js.map +1 -0
  185. package/examples/frame-no-image-demo.d.ts +1 -0
  186. package/examples/frame-no-image-demo.js +47 -0
  187. package/examples/frame-no-image-demo.js.map +1 -0
  188. package/examples/frame-vertical-demo.d.ts +1 -0
  189. package/examples/frame-vertical-demo.js +44 -0
  190. package/examples/frame-vertical-demo.js.map +1 -0
  191. package/examples/frame-with-tag-demo.d.ts +1 -0
  192. package/examples/frame-with-tag-demo.js +48 -0
  193. package/examples/frame-with-tag-demo.js.map +1 -0
  194. package/examples/journey-card-compact-demo.d.ts +1 -0
  195. package/examples/journey-card-compact-demo.js +71 -0
  196. package/examples/journey-card-compact-demo.js.map +1 -0
  197. package/examples/journey-card-demo.d.ts +1 -0
  198. package/examples/journey-card-demo.js +123 -0
  199. package/examples/journey-card-demo.js.map +1 -0
  200. package/examples/page-navigation-demo.d.ts +1 -0
  201. package/examples/page-navigation-demo.js +53 -0
  202. package/examples/page-navigation-demo.js.map +1 -0
  203. package/examples/password-demo.js +1 -0
  204. package/examples/password-demo.js.map +1 -1
  205. package/examples/phone-field-demo.js +6 -2
  206. package/examples/phone-field-demo.js.map +1 -1
  207. package/examples/radio-demo.js +3 -3
  208. package/examples/radio-demo.js.map +1 -1
  209. package/examples/radio-select-demo.d.ts +1 -0
  210. package/examples/radio-select-demo.js +100 -0
  211. package/examples/radio-select-demo.js.map +1 -0
  212. package/examples/scrollbar-demo.d.ts +1 -0
  213. package/examples/scrollbar-demo.js +42 -0
  214. package/examples/scrollbar-demo.js.map +1 -0
  215. package/examples/select-demo.js +1 -0
  216. package/examples/select-demo.js.map +1 -1
  217. package/examples/slider-frame-demo.d.ts +1 -0
  218. package/examples/slider-frame-demo.js +39 -0
  219. package/examples/slider-frame-demo.js.map +1 -0
  220. package/examples/slider-frame-with-button-demo.d.ts +1 -0
  221. package/examples/slider-frame-with-button-demo.js +47 -0
  222. package/examples/slider-frame-with-button-demo.js.map +1 -0
  223. package/examples/slider-frame-with-tag-demo.d.ts +1 -0
  224. package/examples/slider-frame-with-tag-demo.js +51 -0
  225. package/examples/slider-frame-with-tag-demo.js.map +1 -0
  226. package/examples/switch-demo.js +3 -2
  227. package/examples/switch-demo.js.map +1 -1
  228. package/examples/tabs-demo.js +2 -5
  229. package/examples/tabs-demo.js.map +1 -1
  230. package/examples/tabs-notification-demo.d.ts +1 -0
  231. package/examples/tabs-notification-demo.js +64 -0
  232. package/examples/tabs-notification-demo.js.map +1 -0
  233. package/examples/tabs-with-select-demo.js +1 -0
  234. package/examples/tabs-with-select-demo.js.map +1 -1
  235. package/examples/text-field-demo.js +6 -0
  236. package/examples/text-field-demo.js.map +1 -1
  237. package/examples/toggle-demo.d.ts +1 -0
  238. package/examples/toggle-demo.js +44 -0
  239. package/examples/toggle-demo.js.map +1 -0
  240. package/examples/toggle-small-demo.d.ts +1 -0
  241. package/examples/toggle-small-demo.js +33 -0
  242. package/examples/toggle-small-demo.js.map +1 -0
  243. package/examples/tooltip-demo.d.ts +1 -0
  244. package/examples/tooltip-demo.js +103 -0
  245. package/examples/tooltip-demo.js.map +1 -0
  246. package/package.json +10 -3
  247. package/styles/components.css +99 -0
  248. package/styles/index.css +0 -1
  249. package/styles/theme.css +5 -2
  250. package/styles/ui/button.css +1 -1
  251. package/styles/ui/chat-button.css +68 -1
  252. package/styles/ui/controls.css +11 -58
  253. package/styles/ui/range.css +6 -1
  254. package/styles/ui/tabs.css +0 -19
  255. package/ui/Accordion.d.ts +30 -0
  256. package/ui/Accordion.js +71 -0
  257. package/ui/Accordion.js.map +1 -0
  258. package/ui/AdvancedToast.js +31 -28
  259. package/ui/AdvancedToast.js.map +1 -1
  260. package/ui/Avatar.js +1 -1
  261. package/ui/Avatar.js.map +1 -1
  262. package/ui/BasicToast.js +13 -13
  263. package/ui/BasicToast.js.map +1 -1
  264. package/ui/Breadcrumb.js +7 -6
  265. package/ui/Breadcrumb.js.map +1 -1
  266. package/ui/ChatButton.js +9 -9
  267. package/ui/ChatButton.js.map +1 -1
  268. package/ui/ChatInput.d.ts +10 -0
  269. package/ui/ChatInput.js +149 -0
  270. package/ui/ChatInput.js.map +1 -0
  271. package/ui/ChatMessage.d.ts +6 -0
  272. package/ui/ChatMessage.js +2 -0
  273. package/ui/ChatTypingIndicator.d.ts +2 -0
  274. package/ui/ChatTypingIndicator.js +30 -0
  275. package/ui/ChatTypingIndicator.js.map +1 -0
  276. package/ui/ChatWindow.d.ts +34 -0
  277. package/ui/ChatWindow.js +142 -0
  278. package/ui/ChatWindow.js.map +1 -0
  279. package/ui/ChatWindowCsatPrompt.d.ts +15 -0
  280. package/ui/ChatWindowCsatPrompt.js +71 -0
  281. package/ui/ChatWindowCsatPrompt.js.map +1 -0
  282. package/ui/ChatWindowCsatThankYou.d.ts +9 -0
  283. package/ui/ChatWindowCsatThankYou.js +29 -0
  284. package/ui/ChatWindowCsatThankYou.js.map +1 -0
  285. package/ui/ChatWindowQuote.d.ts +22 -0
  286. package/ui/ChatWindowQuote.js +141 -0
  287. package/ui/ChatWindowQuote.js.map +1 -0
  288. package/ui/Chip.js +4 -4
  289. package/ui/ChoiceExpander.js +18 -18
  290. package/ui/ChoiceExpander.js.map +1 -1
  291. package/ui/Countdown.d.ts +16 -0
  292. package/ui/Countdown.js +61 -0
  293. package/ui/Countdown.js.map +1 -0
  294. package/ui/Datepicker.d.ts +26 -0
  295. package/ui/Datepicker.js +2 -0
  296. package/ui/Day.d.ts +25 -0
  297. package/ui/Day.js +2 -0
  298. package/ui/Dropdown.d.ts +20 -3
  299. package/ui/Dropdown.js +61 -27
  300. package/ui/Dropdown.js.map +1 -1
  301. package/ui/ElasticHeight.d.ts +0 -1
  302. package/ui/ElasticHeight.js +14 -23
  303. package/ui/ElasticHeight.js.map +1 -1
  304. package/ui/ExpandableText.d.ts +14 -0
  305. package/ui/ExpandableText.js +40 -0
  306. package/ui/ExpandableText.js.map +1 -0
  307. package/ui/FlipCard.d.ts +7 -0
  308. package/ui/FlipCard.js +59 -0
  309. package/ui/FlipCard.js.map +1 -0
  310. package/ui/HamburgerIcon.js +1 -1
  311. package/ui/HamburgerIcon.js.map +1 -1
  312. package/ui/Link.js +8 -8
  313. package/ui/Link.js.map +1 -1
  314. package/ui/PageNavigation.d.ts +13 -0
  315. package/ui/PageNavigation.js +71 -0
  316. package/ui/PageNavigation.js.map +1 -0
  317. package/ui/Pagination.js +23 -23
  318. package/ui/Pagination.js.map +1 -1
  319. package/ui/Scrollbar.d.ts +14 -0
  320. package/ui/Scrollbar.js +68 -0
  321. package/ui/Scrollbar.js.map +1 -0
  322. package/ui/SidebarLayout.d.ts +3 -1
  323. package/ui/SidebarLayout.js +67 -59
  324. package/ui/SidebarLayout.js.map +1 -1
  325. package/ui/Tag.js +6 -6
  326. package/ui/Toggle.d.ts +15 -0
  327. package/ui/Toggle.js +42 -0
  328. package/ui/Toggle.js.map +1 -0
  329. package/ui/Tooltip.d.ts +8 -0
  330. package/ui/Tooltip.js +2 -0
  331. package/ui/buttons/Button.type.d.ts +1 -1
  332. package/ui/buttons/Button.type.js +1 -1
  333. package/ui/buttons/Button.type.js.map +1 -1
  334. package/ui/buttons/ButtonContent.js +3 -3
  335. package/ui/carousel/Carousel.context.d.ts +27 -0
  336. package/ui/carousel/Carousel.context.js +2 -0
  337. package/ui/carousel/Carousel.d.ts +3 -0
  338. package/ui/carousel/Carousel.js +12 -0
  339. package/ui/carousel/Carousel.js.map +1 -0
  340. package/ui/carousel/CarouselBody.d.ts +6 -0
  341. package/ui/carousel/CarouselBody.js +21 -0
  342. package/ui/carousel/CarouselBody.js.map +1 -0
  343. package/ui/carousel/CarouselItem.d.ts +6 -0
  344. package/ui/carousel/CarouselItem.js +21 -0
  345. package/ui/carousel/CarouselItem.js.map +1 -0
  346. package/ui/carousel/CarouselNext.d.ts +8 -0
  347. package/ui/carousel/CarouselNext.js +23 -0
  348. package/ui/carousel/CarouselNext.js.map +1 -0
  349. package/ui/carousel/CarouselPrevious.d.ts +8 -0
  350. package/ui/carousel/CarouselPrevious.js +23 -0
  351. package/ui/carousel/CarouselPrevious.js.map +1 -0
  352. package/ui/contexts/TridentUIConfig.js +1 -1
  353. package/ui/criteria/Birthdate.d.ts +13 -0
  354. package/ui/criteria/Birthdate.js +2 -0
  355. package/ui/criteria/CriteriaDates.d.ts +32 -0
  356. package/ui/criteria/CriteriaDates.js +76 -0
  357. package/ui/criteria/CriteriaDates.js.map +1 -0
  358. package/ui/criteria/CriteriaParticipants.d.ts +106 -0
  359. package/ui/criteria/CriteriaParticipants.js +2 -0
  360. package/ui/criteria/CriteriaSection.d.ts +6 -0
  361. package/ui/criteria/CriteriaSection.js +15 -0
  362. package/ui/criteria/CriteriaSection.js.map +1 -0
  363. package/ui/criteria/CriteriaTransports.d.ts +72 -0
  364. package/ui/criteria/CriteriaTransports.js +224 -0
  365. package/ui/criteria/CriteriaTransports.js.map +1 -0
  366. package/ui/forms/CheckboxSelect.d.ts +31 -0
  367. package/ui/forms/CheckboxSelect.js +119 -0
  368. package/ui/forms/CheckboxSelect.js.map +1 -0
  369. package/ui/forms/Filter.d.ts +10 -4
  370. package/ui/forms/Filter.js +26 -44
  371. package/ui/forms/Filter.js.map +1 -1
  372. package/ui/forms/FloatingLabelTextField.d.ts +12 -0
  373. package/ui/forms/FloatingLabelTextField.js +132 -0
  374. package/ui/forms/FloatingLabelTextField.js.map +1 -0
  375. package/ui/forms/FormControl.d.ts +1 -1
  376. package/ui/forms/FormControl.js +4 -4
  377. package/ui/forms/FormControl.js.map +1 -1
  378. package/ui/forms/FormControlError.js +4 -4
  379. package/ui/forms/NumberField.d.ts +27 -26
  380. package/ui/forms/NumberField.js +24 -25
  381. package/ui/forms/NumberField.js.map +1 -1
  382. package/ui/forms/PhoneField.d.ts +5 -10
  383. package/ui/forms/PhoneField.js +31 -211
  384. package/ui/forms/PhoneField.js.map +1 -1
  385. package/ui/forms/PhoneFieldFullInput.d.ts +16 -0
  386. package/ui/forms/PhoneFieldFullInput.js +110 -0
  387. package/ui/forms/PhoneFieldFullInput.js.map +1 -0
  388. package/ui/forms/PhoneFieldSplitInput.d.ts +19 -0
  389. package/ui/forms/PhoneFieldSplitInput.js +158 -0
  390. package/ui/forms/PhoneFieldSplitInput.js.map +1 -0
  391. package/ui/forms/RadioSelect.d.ts +31 -0
  392. package/ui/forms/RadioSelect.js +117 -0
  393. package/ui/forms/RadioSelect.js.map +1 -0
  394. package/ui/forms/Range.d.ts +1 -1
  395. package/ui/forms/Select.js +18 -19
  396. package/ui/forms/Select.js.map +1 -1
  397. package/ui/forms/Switch.d.ts +5 -3
  398. package/ui/forms/Switch.js +54 -34
  399. package/ui/forms/Switch.js.map +1 -1
  400. package/ui/forms/TextField.js +35 -26
  401. package/ui/forms/TextField.js.map +1 -1
  402. package/ui/forms/checkboxes/Checkbox.d.ts +9 -4
  403. package/ui/forms/checkboxes/Checkbox.js +36 -16
  404. package/ui/forms/checkboxes/Checkbox.js.map +1 -1
  405. package/ui/forms/checkboxes/Checkboxes.d.ts +5 -0
  406. package/ui/forms/checkboxes/Checkboxes.js +8 -8
  407. package/ui/forms/checkboxes/Checkboxes.js.map +1 -1
  408. package/ui/forms/checkboxes/index.d.ts +0 -1
  409. package/ui/forms/checkboxes/index.js +1 -2
  410. package/ui/forms/password/Password.js +21 -22
  411. package/ui/forms/password/Password.js.map +1 -1
  412. package/ui/forms/password/ValidationMessage.js +5 -5
  413. package/ui/forms/radios/Radio.d.ts +2 -1
  414. package/ui/forms/radios/Radio.js +6 -3
  415. package/ui/forms/radios/Radio.js.map +1 -1
  416. package/ui/forms/radios/RadioGroup.js +13 -14
  417. package/ui/forms/radios/RadioGroup.js.map +1 -1
  418. package/ui/frame/Frame.d.ts +8 -0
  419. package/ui/frame/Frame.js +16 -0
  420. package/ui/frame/Frame.js.map +1 -0
  421. package/ui/frame/FrameLabelsWrapper.d.ts +5 -0
  422. package/ui/frame/FrameLabelsWrapper.js +12 -0
  423. package/ui/frame/FrameLabelsWrapper.js.map +1 -0
  424. package/ui/frame/FrameTitle.d.ts +7 -0
  425. package/ui/frame/FrameTitle.js +25 -0
  426. package/ui/frame/FrameTitle.js.map +1 -0
  427. package/ui/frame/FrameWrapper.d.ts +6 -0
  428. package/ui/frame/FrameWrapper.js +14 -0
  429. package/ui/frame/FrameWrapper.js.map +1 -0
  430. package/ui/frame/SliderFrame.d.ts +14 -0
  431. package/ui/frame/SliderFrame.js +50 -0
  432. package/ui/frame/SliderFrame.js.map +1 -0
  433. package/ui/helpers/cn.d.ts +2 -0
  434. package/ui/helpers/cn.js +10 -0
  435. package/ui/helpers/cn.js.map +1 -0
  436. package/ui/helpers/phone/defaultPrefixes.d.ts +1 -0
  437. package/ui/helpers/phone/defaultPrefixes.js +52 -28
  438. package/ui/helpers/phone/defaultPrefixes.js.map +1 -1
  439. package/ui/helpers/phone/formatters.d.ts +11 -0
  440. package/ui/helpers/phone/formatters.js +32 -1
  441. package/ui/helpers/phone/formatters.js.map +1 -1
  442. package/ui/helpers/phone/index.d.ts +1 -1
  443. package/ui/helpers/phone/index.js +3 -3
  444. package/ui/hooks/useIsClient.d.ts +1 -0
  445. package/ui/hooks/useIsClient.js +12 -0
  446. package/ui/hooks/useIsClient.js.map +1 -0
  447. package/ui/hooks/useValue.d.ts +3 -4
  448. package/ui/hooks/useValue.js +11 -11
  449. package/ui/hooks/useValue.js.map +1 -1
  450. package/ui/journey-card/FlightSegmentCard.d.ts +15 -0
  451. package/ui/journey-card/FlightSegmentCard.js +73 -0
  452. package/ui/journey-card/FlightSegmentCard.js.map +1 -0
  453. package/ui/journey-card/FlightTimeline.d.ts +5 -0
  454. package/ui/journey-card/FlightTimeline.js +27 -0
  455. package/ui/journey-card/FlightTimeline.js.map +1 -0
  456. package/ui/journey-card/ItineraryDetails.d.ts +9 -0
  457. package/ui/journey-card/ItineraryDetails.js +40 -0
  458. package/ui/journey-card/ItineraryDetails.js.map +1 -0
  459. package/ui/journey-card/JourneyCard.d.ts +17 -0
  460. package/ui/journey-card/JourneyCard.js +34 -0
  461. package/ui/journey-card/JourneyCard.js.map +1 -0
  462. package/ui/journey-card/JourneyDetails.d.ts +47 -0
  463. package/ui/journey-card/JourneyDetails.js +183 -0
  464. package/ui/journey-card/JourneyDetails.js.map +1 -0
  465. package/ui/tabs/Tabs.d.ts +5 -1
  466. package/ui/tabs/Tabs.js +208 -124
  467. package/ui/tabs/Tabs.js.map +1 -1
  468. package/examples/form-checkbox-demo.d.ts +0 -1
  469. package/examples/form-checkbox-demo.js +0 -30
  470. package/examples/form-checkbox-demo.js.map +0 -1
  471. package/examples/form-checkbox-disabled-demo.d.ts +0 -1
  472. package/examples/form-checkbox-disabled-demo.js +0 -25
  473. package/examples/form-checkbox-disabled-demo.js.map +0 -1
  474. package/ui/forms/checkboxes/FormCheckbox.d.ts +0 -12
  475. package/ui/forms/checkboxes/FormCheckbox.js +0 -38
  476. package/ui/forms/checkboxes/FormCheckbox.js.map +0 -1
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { t as e } from "../chunks/clsx.js";
3
+ import { useCallback as t, useRef as n } from "react";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region lib/ui/Scrollbar.tsx
6
+ function a({ children: a, timelineName: o = "--scroller", scrollbarWidth: s = "60%", variant: c = "light", className: l, scrollerClassName: u, scrollbarClassName: d, "aria-label": f = "Scrollable content" }) {
7
+ let p = n(null), m = n(null), h = n(null), g = t((e) => {
8
+ e.preventDefault();
9
+ let t = p.current, n = m.current, r = h.current;
10
+ if (!t || !n || !r) return;
11
+ n.setPointerCapture(e.pointerId);
12
+ let i = n.getBoundingClientRect(), a = n.clientWidth - r.offsetWidth - 2, o = t.scrollWidth - t.clientWidth;
13
+ if (e.target !== r) {
14
+ let n = e.clientX - i.left - 1;
15
+ t.scrollLeft = Math.max(0, Math.min(a, n - r.offsetWidth / 2)) / a * o;
16
+ }
17
+ let s = e.clientX, c = t.scrollLeft, l = (e) => {
18
+ let n = (e.clientX - s) / a * o;
19
+ t.scrollLeft = Math.max(0, Math.min(o, c + n));
20
+ }, u = () => {
21
+ n.removeEventListener("pointermove", l), n.removeEventListener("pointerup", u);
22
+ };
23
+ n.addEventListener("pointermove", l), n.addEventListener("pointerup", u);
24
+ }, []);
25
+ return /* @__PURE__ */ i("div", {
26
+ className: e(l),
27
+ style: { timelineScope: o },
28
+ children: [/* @__PURE__ */ r("div", {
29
+ ref: p,
30
+ "data-scroller": c,
31
+ className: u,
32
+ style: { scrollTimeline: `${o} x` },
33
+ role: "region",
34
+ "aria-label": f,
35
+ tabIndex: 0,
36
+ children: a
37
+ }), /* @__PURE__ */ r("div", {
38
+ ref: m,
39
+ "data-scrollbar": !0,
40
+ className: d,
41
+ style: {
42
+ "--scrollbar-width": s,
43
+ pointerEvents: "auto",
44
+ cursor: "pointer"
45
+ },
46
+ role: "scrollbar",
47
+ "aria-controls": "scrollable-content",
48
+ "aria-orientation": "horizontal",
49
+ "aria-valuemin": 0,
50
+ "aria-valuemax": 100,
51
+ "aria-valuenow": 0,
52
+ onPointerDown: g,
53
+ children: /* @__PURE__ */ r("div", {
54
+ ref: h,
55
+ "data-scrollprogress": !0,
56
+ style: {
57
+ animationTimeline: o,
58
+ pointerEvents: "auto"
59
+ },
60
+ role: "presentation"
61
+ })
62
+ })]
63
+ });
64
+ }
65
+ //#endregion
66
+ export { a as Scrollbar };
67
+
68
+ //# sourceMappingURL=Scrollbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scrollbar.js","names":[],"sources":["../../lib/ui/Scrollbar.tsx"],"sourcesContent":["'use client';\n\nimport { clsx } from 'clsx';\nimport React, { useCallback, useRef } from 'react';\n\ninterface ScrollbarProps {\n children: React.ReactNode;\n timelineName?: string;\n scrollbarWidth?: string;\n variant?: 'light' | 'dark';\n className?: string;\n scrollerClassName?: string;\n scrollbarClassName?: string;\n 'aria-label'?: string;\n}\n\nfunction Scrollbar({\n children,\n timelineName = '--scroller',\n scrollbarWidth = '60%',\n variant = 'light',\n className,\n scrollerClassName,\n scrollbarClassName,\n 'aria-label': ariaLabel = 'Scrollable content',\n}: ScrollbarProps) {\n const scrollerRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const nubRef = useRef<HTMLDivElement>(null);\n\n const handleTrackPointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n const scroller = scrollerRef.current;\n const track = trackRef.current;\n const nub = nubRef.current;\n if (!scroller || !track || !nub) return;\n\n track.setPointerCapture(e.pointerId);\n\n const rect = track.getBoundingClientRect();\n const maxNubOffset = track.clientWidth - nub.offsetWidth - 2;\n const maxScrollLeft = scroller.scrollWidth - scroller.clientWidth;\n\n if (e.target !== nub) {\n const clickX = e.clientX - rect.left - 1;\n const targetNubLeft = Math.max(0, Math.min(maxNubOffset, clickX - nub.offsetWidth / 2));\n scroller.scrollLeft = (targetNubLeft / maxNubOffset) * maxScrollLeft;\n }\n\n const startX = e.clientX;\n const startScrollLeft = scroller.scrollLeft;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const scrollDelta = ((moveEvent.clientX - startX) / maxNubOffset) * maxScrollLeft;\n scroller.scrollLeft = Math.max(0, Math.min(maxScrollLeft, startScrollLeft + scrollDelta));\n };\n\n const onPointerUp = () => {\n track.removeEventListener('pointermove', onPointerMove);\n track.removeEventListener('pointerup', onPointerUp);\n };\n\n track.addEventListener('pointermove', onPointerMove);\n track.addEventListener('pointerup', onPointerUp);\n }, []);\n\n return (\n <div className={clsx(className)} style={{ timelineScope: timelineName } as React.CSSProperties}>\n <div\n ref={scrollerRef}\n data-scroller={variant}\n className={scrollerClassName}\n style={{ scrollTimeline: `${timelineName} x` } as React.CSSProperties}\n role=\"region\"\n aria-label={ariaLabel}\n tabIndex={0}\n >\n {children}\n </div>\n <div\n ref={trackRef}\n data-scrollbar\n className={scrollbarClassName}\n style={\n {\n '--scrollbar-width': scrollbarWidth,\n pointerEvents: 'auto',\n cursor: 'pointer',\n } as React.CSSProperties\n }\n role=\"scrollbar\"\n aria-controls=\"scrollable-content\"\n aria-orientation=\"horizontal\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={0}\n onPointerDown={handleTrackPointerDown}\n >\n <div\n ref={nubRef}\n data-scrollprogress\n style={{ animationTimeline: timelineName, pointerEvents: 'auto' } as React.CSSProperties}\n role=\"presentation\"\n />\n </div>\n </div>\n );\n}\n\nexport { Scrollbar };\nexport type { ScrollbarProps };\n"],"mappings":";;;;;AAgBA,SAAS,EAAU,EACjB,aACA,kBAAe,cACf,oBAAiB,OACjB,aAAU,SACV,cACA,sBACA,uBACA,cAAc,IAAY,wBACT;CACjB,IAAM,IAAc,EAAuB,KAAK,EAC1C,IAAW,EAAuB,KAAK,EACvC,IAAS,EAAuB,KAAK,EAErC,IAAyB,GAAa,MAA0C;AACpF,IAAE,gBAAgB;EAClB,IAAM,IAAW,EAAY,SACvB,IAAQ,EAAS,SACjB,IAAM,EAAO;AACnB,MAAI,CAAC,KAAY,CAAC,KAAS,CAAC,EAAK;AAEjC,IAAM,kBAAkB,EAAE,UAAU;EAEpC,IAAM,IAAO,EAAM,uBAAuB,EACpC,IAAe,EAAM,cAAc,EAAI,cAAc,GACrD,IAAgB,EAAS,cAAc,EAAS;AAEtD,MAAI,EAAE,WAAW,GAAK;GACpB,IAAM,IAAS,EAAE,UAAU,EAAK,OAAO;AAEvC,KAAS,aADa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAc,IAAS,EAAI,cAAc,EAAE,CAAC,GAChD,IAAgB;;EAGzD,IAAM,IAAS,EAAE,SACX,IAAkB,EAAS,YAE3B,KAAiB,MAA4B;GACjD,IAAM,KAAgB,EAAU,UAAU,KAAU,IAAgB;AACpE,KAAS,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAe,IAAkB,EAAY,CAAC;KAGrF,UAAoB;AAExB,GADA,EAAM,oBAAoB,eAAe,EAAc,EACvD,EAAM,oBAAoB,aAAa,EAAY;;AAIrD,EADA,EAAM,iBAAiB,eAAe,EAAc,EACpD,EAAM,iBAAiB,aAAa,EAAY;IAC/C,EAAE,CAAC;AAEN,QACE,kBAAC,OAAD;EAAK,WAAW,EAAK,EAAU;EAAE,OAAO,EAAE,eAAe,GAAc;YAAvE,CACE,kBAAC,OAAD;GACE,KAAK;GACL,iBAAe;GACf,WAAW;GACX,OAAO,EAAE,gBAAgB,GAAG,EAAa,KAAK;GAC9C,MAAK;GACL,cAAY;GACZ,UAAU;GAET;GACG,CAAA,EACN,kBAAC,OAAD;GACE,KAAK;GACL,kBAAA;GACA,WAAW;GACX,OACE;IACE,qBAAqB;IACrB,eAAe;IACf,QAAQ;IACT;GAEH,MAAK;GACL,iBAAc;GACd,oBAAiB;GACjB,iBAAe;GACf,iBAAe;GACf,iBAAe;GACf,eAAe;aAEf,kBAAC,OAAD;IACE,KAAK;IACL,uBAAA;IACA,OAAO;KAAE,mBAAmB;KAAc,eAAe;KAAQ;IACjE,MAAK;IACL,CAAA;GACE,CAAA,CAAA"}
@@ -26,6 +26,8 @@ export interface SidebarLayoutProps extends ComponentPropsWithoutRef<'div'> {
26
26
  items: SidebarItem[];
27
27
  children: ReactNode;
28
28
  activeIndex?: number;
29
+ isCollapsed?: boolean;
30
+ onCollapsedChange?: (isCollapsed: boolean) => void;
29
31
  }
30
- export declare const SidebarLayout: ({ items, children: initialChildren, className, activeIndex, ...attrs }: SidebarLayoutProps) => import("react/jsx-runtime").JSX.Element;
32
+ export declare const SidebarLayout: ({ items, children: initialChildren, className, activeIndex, isCollapsed: initialCollapsedValue, onCollapsedChange, ...attrs }: SidebarLayoutProps) => import("react/jsx-runtime").JSX.Element;
31
33
  export {};
@@ -3,65 +3,65 @@ import { n as t } from "../chunks/bundle-mjs.js";
3
3
  import { useSlots as n } from "./hooks/useSlots.js";
4
4
  import { HamburgerIcon as r } from "./HamburgerIcon.js";
5
5
  import { useCallback as i, useRef as a, useState as o } from "react";
6
- import { Icon as s } from "@clubmed/trident-icons";
7
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
+ import { Icon as l } from "@clubmed/trident-icons";
8
8
  //#region lib/ui/SidebarLayout.tsx
9
9
  function u(e) {
10
10
  if ("href" in e) {
11
11
  let { children: t, icon: n, label: r, ...i } = e;
12
- return /* @__PURE__ */ c("a", {
12
+ return /* @__PURE__ */ s("a", {
13
13
  ...i,
14
14
  className: "flex whitespace-nowrap items-center text-white hover:text-saffron transition-colors outline-none focus-visible:bg-white/20 rounded-pill relative group/sidebar-item",
15
15
  children: t
16
16
  });
17
17
  }
18
18
  let { children: t, icon: n, label: r, ...i } = e;
19
- return /* @__PURE__ */ c("button", {
19
+ return /* @__PURE__ */ s("button", {
20
20
  ...i,
21
- className: "flex whitespace-nowrap items-center text-white outline-none rounded-pill relative group/sidebar-item",
21
+ className: "flex whitespace-nowrap items-center text-white outline-none focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2 rounded-pill relative group/sidebar-item",
22
22
  children: t
23
23
  });
24
24
  }
25
25
  var d = ({ item: e, isActive: n = !1, isCollapsed: r = !1, anchorName: i, onItemClick: a }) => {
26
26
  let o = e.items && e.items.length > 0;
27
- return /* @__PURE__ */ l("div", {
27
+ return /* @__PURE__ */ c("div", {
28
28
  className: "col-start-1 col-end-3",
29
- children: [/* @__PURE__ */ l(u, {
29
+ children: [/* @__PURE__ */ c(u, {
30
30
  ...e,
31
31
  onClick: (e) => {
32
32
  o && a && (e.preventDefault(), a());
33
33
  },
34
34
  style: { anchorName: `--${i}` },
35
- children: [/* @__PURE__ */ l("div", {
35
+ children: [/* @__PURE__ */ c("div", {
36
36
  className: "relative",
37
- children: [/* @__PURE__ */ c("div", {
37
+ children: [/* @__PURE__ */ s("div", {
38
38
  className: t("aspect-square w-48 rounded-full flex items-center justify-center"),
39
- children: /* @__PURE__ */ c(s, {
39
+ children: /* @__PURE__ */ s(l, {
40
40
  name: e.icon,
41
41
  className: "w-24 text-white"
42
42
  })
43
- }), /* @__PURE__ */ c("div", {
43
+ }), /* @__PURE__ */ s("div", {
44
44
  className: "absolute inset-0 pointer-events-none",
45
45
  "aria-hidden": "true",
46
46
  inert: !0,
47
- children: /* @__PURE__ */ c("div", {
48
- className: t("max-md:hidden aspect-square w-48 rounded-full flex items-center justify-center bg-lightSand text-black", "[clip-path:circle(var(--sidebarItem_clipCircle))] transition-all duration-200 delay-100 ease-in-out group-focus-visible/sidebar-item:ring-8 group-focus-visible/sidebar-item:ring-lavender/20", n ? "[--sidebarItem_clipCircle:100%]" : "[--sidebarItem_clipCircle:0%]", "group-hover/sidebar-item:[--sidebarItem_clipCircle:100%] group-focus-within/sidebar-item:[--sidebarItem_clipCircle:100%]", !n && "group-hover/sidebar-item:bg-lightSand/80 group-focus-within/sidebar-item:bg-lightSand/80"),
49
- children: /* @__PURE__ */ c(s, {
47
+ children: /* @__PURE__ */ s("div", {
48
+ className: t("max-md:hidden aspect-square w-48 rounded-full flex items-center justify-center bg-lightSand text-black", "[clip-path:circle(var(--sidebarItem_clipCircle))] transition-all duration-200 delay-100 ease-in-out group-focus-visible/sidebar-item:ring-4 group-focus-visible/sidebar-item:ring-black group-focus-visible/sidebar-item:ring-offset-2", n ? "[--sidebarItem_clipCircle:100%]" : "[--sidebarItem_clipCircle:0%]", "group-hover/sidebar-item:[--sidebarItem_clipCircle:100%] group-focus-within/sidebar-item:[--sidebarItem_clipCircle:100%]", !n && "group-hover/sidebar-item:bg-lightSand/80 group-focus-within/sidebar-item:bg-lightSand/80"),
49
+ children: /* @__PURE__ */ s(l, {
50
50
  name: e.icon,
51
51
  className: "w-24"
52
52
  })
53
53
  })
54
54
  })]
55
- }), /* @__PURE__ */ c("span", {
55
+ }), /* @__PURE__ */ s("span", {
56
56
  className: t("transition-all duration-300 ease-in-out whitespace-nowrap ps-8 pe-12 truncate md:max-w-240", r ? "opacity-0" : "opacity-100"),
57
57
  children: e.label
58
58
  })]
59
- }), o && /* @__PURE__ */ c("div", {
59
+ }), o && /* @__PURE__ */ s("div", {
60
60
  className: t("grid transition-[grid-template-rows,opacity] duration-300 ease-in-out overflow-hidden max-md:grid-rows-[1fr] max-md:opacity-100", r ? "grid-rows-[0fr] opacity-0" : "grid-rows-[1fr] opacity-100 pb-12"),
61
61
  inert: r,
62
- children: /* @__PURE__ */ c("div", {
62
+ children: /* @__PURE__ */ s("div", {
63
63
  className: "outline-none relative overflow-hidden flex flex-col gap-8 ps-48 font-normal",
64
- children: e.items.map((e, t) => /* @__PURE__ */ c("a", {
64
+ children: e.items.map((e, t) => /* @__PURE__ */ s("a", {
65
65
  href: e.href,
66
66
  className: "text-white hover:text-saffron transition-colors text-b4 whitespace-nowrap outline-none focus-visible:bg-white/20 ps-8 pe-16 rounded-pill",
67
67
  children: e.label
@@ -69,84 +69,92 @@ var d = ({ item: e, isActive: n = !1, isCollapsed: r = !1, anchorName: i, onItem
69
69
  })
70
70
  })]
71
71
  });
72
- }, f = ({ isCollapsed: e }) => /* @__PURE__ */ c("svg", {
72
+ }, f = ({ isCollapsed: e }) => /* @__PURE__ */ s("svg", {
73
73
  xmlns: "http://www.w3.org/2000/svg",
74
74
  width: "33",
75
75
  height: "48",
76
- children: /* @__PURE__ */ l("g", {
76
+ children: /* @__PURE__ */ c("g", {
77
77
  fill: "none",
78
78
  fillRule: "nonzero",
79
- children: [/* @__PURE__ */ c("path", {
79
+ children: [/* @__PURE__ */ s("path", {
80
80
  fill: "#FFF",
81
81
  d: "M10.008 48v-1.829c0-4.116-1.722-8.045-4.75-10.835-6.331-5.837-6.331-15.835 0-21.672a14.736 14.736 0 0 0 4.75-10.835V0h27.417v48H10.008Z"
82
- }), /* @__PURE__ */ c("g", {
82
+ }), /* @__PURE__ */ s("g", {
83
83
  className: t("transition-transform duration-500 ease-in-out origin-center [transform-box:fill-box]", e ? "rotate-180" : "rotate-0"),
84
- children: /* @__PURE__ */ c("path", {
84
+ children: /* @__PURE__ */ s("path", {
85
85
  fill: "#1E2643",
86
86
  d: "M19.686 12.547c6.617 0 12 5.383 12 12s-5.383 12-12 12-12-5.383-12-12 5.383-12 12-12Zm0 1.986c-5.522 0-10.015 4.492-10.015 10.014 0 5.523 4.493 10.015 10.016 10.015 5.52 0 10.012-4.492 10.012-10.015 0-5.522-4.492-10.014-10.012-10.014Zm-2.097 4.382c.376-.366 1.032-.366 1.409 0l5.037 4.895a.948.948 0 0 1 0 1.37l-5.037 4.894a1.002 1.002 0 0 1-.705.285 1 1 0 0 1-.704-.285.947.947 0 0 1 0-1.369l4.332-4.21-4.332-4.21a.95.95 0 0 1 0-1.37Z"
87
87
  })
88
88
  })]
89
89
  })
90
90
  });
91
- function p() {
92
- let [e, t] = o(!0);
91
+ function p({ isCollapsed: e, onCollapsedChange: t }) {
92
+ let [n, r] = o(() => e ?? !0), s = a(null), c = i((e) => {
93
+ r((n) => {
94
+ let r = typeof e == "function" ? e(n) : e;
95
+ return r !== n && t?.(r), r;
96
+ });
97
+ }, [t]);
93
98
  return {
94
- isCollapsed: e,
95
- setIsCollapsed: t,
96
- overlayRef: a(null),
99
+ isCollapsed: n,
100
+ setIsCollapsed: c,
101
+ overlayRef: s,
97
102
  handleToggleCollapse: i(() => {
98
- t((e) => !e);
99
- }, [])
103
+ c((e) => !e);
104
+ }, [c])
100
105
  };
101
106
  }
102
- var m = ({ items: i, children: a, className: o, activeIndex: s = 0, ...u }) => {
103
- let { isCollapsed: m, setIsCollapsed: h, handleToggleCollapse: g } = p(), { "header-logo": _, header: v, "header-actions": y, children: b } = n(a, [
107
+ var m = ({ items: i, children: a, className: o, activeIndex: l = 0, isCollapsed: u, onCollapsedChange: m, ...h }) => {
108
+ let { isCollapsed: g, setIsCollapsed: _, handleToggleCollapse: v } = p({
109
+ isCollapsed: u,
110
+ onCollapsedChange: m
111
+ }), { "header-logo": y, header: b, "header-actions": x, children: S } = n(a, [
104
112
  "header-logo",
105
113
  "header",
106
114
  "header-actions"
107
115
  ]);
108
- return /* @__PURE__ */ l("div", {
116
+ return /* @__PURE__ */ c("div", {
109
117
  "data-name": "SidebarLayout",
110
118
  className: e("h-screen overflow-clip flex flex-col bg-ultramarine", o),
111
- ...u,
112
- children: [/* @__PURE__ */ l("header", {
119
+ ...h,
120
+ children: [/* @__PURE__ */ c("header", {
113
121
  className: "bg-ultramarine h-64 flex items-center justify-between gap-8 p-8 ps-20 md:px-24 text-white shrink-0",
114
122
  children: [
115
- _,
116
- v,
117
123
  y,
118
- /* @__PURE__ */ c("button", {
119
- className: "md:hidden w-48 h-48 focus-visible:ring-8 focus-visible:ring-lavender/20 rounded-full flex items-center justify-center text-white transition-opacity outline-none",
120
- "aria-label": m ? "Open the navigation menu" : "Close the navigation menu",
121
- onClick: g,
122
- children: /* @__PURE__ */ c(r, { isActive: !m })
124
+ b,
125
+ x,
126
+ /* @__PURE__ */ s("button", {
127
+ className: "md:hidden w-48 h-48 focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2 rounded-full flex items-center justify-center text-white transition-opacity outline-none",
128
+ "aria-label": g ? "Open the navigation menu" : "Close the navigation menu",
129
+ onClick: v,
130
+ children: /* @__PURE__ */ s(r, { isActive: !g })
123
131
  })
124
132
  ]
125
- }), /* @__PURE__ */ l("div", {
133
+ }), /* @__PURE__ */ c("div", {
126
134
  className: "flex h-full overflow-x-clip overflow-y-hidden",
127
- children: [/* @__PURE__ */ l("aside", {
128
- className: t("max-md:absolute max-md:top-64 max-md:h-[calc(100dvh-64px)] max-md:w-screen flex bg-ultramarine px-8 md:py-16 md:ps-28 md:pe-16 text-white flex-col gap-24 transition-all duration-300 ease-in-out relative h-full shrink-0", m ? "max-md:-translate-x-full" : "md:pe-24"),
129
- children: [/* @__PURE__ */ c("button", {
130
- className: "hidden md:block absolute transition-top duration-300 ease-in-out rounded-pill outline-none focus-visible:ring-8 focus-visible:ring-lavender/20 [--indicatorYPos:anchor(top)] top-[max(var(--indicatorYPos,24px),24px)] left-[max(calc(100%_-_10px),86px)]",
131
- onClick: g,
132
- "aria-label": m ? "Expand sidebar" : "Collapse sidebar",
133
- style: { positionAnchor: `--sidebar-item-${s}` },
134
- children: /* @__PURE__ */ c(f, { isCollapsed: m })
135
- }), /* @__PURE__ */ c("nav", {
136
- className: t("max-md:divide-y-1 p-8 max-md:h-full max-md:overflow-auto md:gap-y-20 grid overflow-hidden text-b3 font-semibold relative transition-grid-template-columns duration-300 ease-in-out", m ? "grid-cols-[48px_0fr]" : "grid-cols-[48px_1fr]"),
137
- children: i.map((e, t) => /* @__PURE__ */ c(d, {
135
+ children: [/* @__PURE__ */ c("aside", {
136
+ className: t("z-10 max-md:absolute max-md:top-64 max-md:h-[calc(100dvh-64px)] max-md:w-screen flex bg-ultramarine px-8 md:py-16 md:ps-28 md:pe-16 text-white flex-col gap-24 transition-all duration-300 ease-in-out relative h-full shrink-0", g ? "max-md:-translate-x-full" : "md:pe-24"),
137
+ children: [/* @__PURE__ */ s("button", {
138
+ className: "hidden md:block absolute transition-top duration-300 ease-in-out rounded-pill outline-none focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2 [--indicatorYPos:anchor(top)] top-[max(var(--indicatorYPos,24px),24px)] left-[max(calc(100%_-_10px),86px)]",
139
+ onClick: v,
140
+ "aria-label": g ? "Expand sidebar" : "Collapse sidebar",
141
+ style: { positionAnchor: `--sidebar-item-${l}` },
142
+ children: /* @__PURE__ */ s(f, { isCollapsed: g })
143
+ }), /* @__PURE__ */ s("nav", {
144
+ className: t("max-md:divide-y-1 p-8 max-md:h-full max-md:overflow-auto md:gap-y-20 grid overflow-hidden text-b3 font-semibold relative transition-grid-template-columns duration-300 ease-in-out", g ? "grid-cols-[48px_0fr]" : "grid-cols-[48px_1fr]"),
145
+ children: i.map((e, t) => /* @__PURE__ */ s(d, {
138
146
  item: e,
139
- isActive: t === s,
140
- isCollapsed: m,
147
+ isActive: t === l,
148
+ isCollapsed: g,
141
149
  anchorName: `sidebar-item-${t}`,
142
150
  onItemClick: () => {
143
- e.items && e.items.length > 0 && h((e) => e && !1);
151
+ e.items && e.items.length > 0 && _((e) => e && !1);
144
152
  }
145
153
  }, t))
146
154
  })]
147
- }), /* @__PURE__ */ c("main", {
155
+ }), /* @__PURE__ */ s("main", {
148
156
  className: "w-full md:min-w-0 md:w-[calc(100%-108px)] bg-white p-24 overflow-auto md:rounded-ss-16 h-full shrink-0",
149
- children: b
157
+ children: S
150
158
  })]
151
159
  })]
152
160
  });
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarLayout.js","names":[],"sources":["../../lib/ui/SidebarLayout.tsx"],"sourcesContent":["import { Icon, type IconicNames } from '@clubmed/trident-icons';\nimport clsx from 'clsx';\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type PropsWithChildren,\n type ReactNode,\n type MouseEvent,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { HamburgerIcon } from './HamburgerIcon';\nimport { useSlots } from '@/ui/hooks/useSlots';\n\ntype SidebarSubItem = {\n label: string;\n href: string;\n} & ComponentPropsWithoutRef<'a'>;\n\ntype SidebarItem = {\n label: string;\n icon: IconicNames;\n items?: SidebarSubItem[];\n} & ((ComponentPropsWithoutRef<'a'> & { href: string }) | ComponentPropsWithoutRef<'button'>);\n\ninterface SidebarItemProps {\n item: SidebarItem;\n isActive?: boolean;\n isCollapsed?: boolean;\n anchorName: string;\n onItemClick?: () => void;\n}\n\nfunction Cta(item: PropsWithChildren<SidebarItem>) {\n if ('href' in item) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { children, icon, label, ...attrs } = item;\n\n return (\n <a\n {...attrs}\n className=\"flex whitespace-nowrap items-center text-white hover:text-saffron transition-colors outline-none focus-visible:bg-white/20 rounded-pill relative group/sidebar-item\"\n >\n {children}\n </a>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { children, icon, label, ...attrs } = item;\n\n return (\n <button\n {...attrs}\n className=\"flex whitespace-nowrap items-center text-white outline-none rounded-pill relative group/sidebar-item\"\n >\n {children}\n </button>\n );\n}\n\nconst SidebarItem = ({\n item,\n isActive = false,\n isCollapsed = false,\n anchorName,\n onItemClick,\n}: SidebarItemProps) => {\n const hasSubItems = item.items && item.items.length > 0;\n\n return (\n <div className=\"col-start-1 col-end-3\">\n <Cta\n {...item}\n onClick={(e: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n if (hasSubItems && onItemClick) {\n e.preventDefault();\n onItemClick();\n }\n }}\n style={{ anchorName: `--${anchorName}` } as CSSProperties}\n >\n <div className=\"relative\">\n <div\n className={twMerge('aspect-square w-48 rounded-full flex items-center justify-center')}\n >\n <Icon name={item.icon} className=\"w-24 text-white\" />\n </div>\n <div className=\"absolute inset-0 pointer-events-none\" aria-hidden=\"true\" inert>\n <div\n className={twMerge(\n 'max-md:hidden aspect-square w-48 rounded-full flex items-center justify-center bg-lightSand text-black',\n '[clip-path:circle(var(--sidebarItem_clipCircle))] transition-all duration-200 delay-100 ease-in-out group-focus-visible/sidebar-item:ring-8 group-focus-visible/sidebar-item:ring-lavender/20',\n isActive ? '[--sidebarItem_clipCircle:100%]' : '[--sidebarItem_clipCircle:0%]',\n 'group-hover/sidebar-item:[--sidebarItem_clipCircle:100%] group-focus-within/sidebar-item:[--sidebarItem_clipCircle:100%]',\n !isActive &&\n 'group-hover/sidebar-item:bg-lightSand/80 group-focus-within/sidebar-item:bg-lightSand/80',\n )}\n >\n <Icon name={item.icon} className=\"w-24\" />\n </div>\n </div>\n </div>\n <span\n className={twMerge(\n 'transition-all duration-300 ease-in-out whitespace-nowrap ps-8 pe-12 truncate md:max-w-240',\n isCollapsed ? 'opacity-0' : 'opacity-100',\n )}\n >\n {item.label}\n </span>\n </Cta>\n {hasSubItems && (\n <div\n className={twMerge(\n 'grid transition-[grid-template-rows,opacity] duration-300 ease-in-out overflow-hidden max-md:grid-rows-[1fr] max-md:opacity-100',\n isCollapsed ? 'grid-rows-[0fr] opacity-0' : 'grid-rows-[1fr] opacity-100 pb-12',\n )}\n inert={isCollapsed}\n >\n <div className=\"outline-none relative overflow-hidden flex flex-col gap-8 ps-48 font-normal\">\n {item.items!.map((subItem, subIndex) => (\n <a\n key={subIndex}\n href={subItem.href}\n className=\"text-white hover:text-saffron transition-colors text-b4 whitespace-nowrap outline-none focus-visible:bg-white/20 ps-8 pe-16 rounded-pill\"\n >\n {subItem.label}\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport const CollapseIndicatorSVG = ({ isCollapsed }: { isCollapsed: boolean }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"33\" height=\"48\">\n <g fill=\"none\" fillRule=\"nonzero\">\n <path\n fill=\"#FFF\"\n d=\"M10.008 48v-1.829c0-4.116-1.722-8.045-4.75-10.835-6.331-5.837-6.331-15.835 0-21.672a14.736 14.736 0 0 0 4.75-10.835V0h27.417v48H10.008Z\"\n />\n <g\n className={twMerge(\n 'transition-transform duration-500 ease-in-out origin-center [transform-box:fill-box]',\n isCollapsed ? 'rotate-180' : 'rotate-0',\n )}\n >\n <path\n fill=\"#1E2643\"\n d=\"M19.686 12.547c6.617 0 12 5.383 12 12s-5.383 12-12 12-12-5.383-12-12 5.383-12 12-12Zm0 1.986c-5.522 0-10.015 4.492-10.015 10.014 0 5.523 4.493 10.015 10.016 10.015 5.52 0 10.012-4.492 10.012-10.015 0-5.522-4.492-10.014-10.012-10.014Zm-2.097 4.382c.376-.366 1.032-.366 1.409 0l5.037 4.895a.948.948 0 0 1 0 1.37l-5.037 4.894a1.002 1.002 0 0 1-.705.285 1 1 0 0 1-.704-.285.947.947 0 0 1 0-1.369l4.332-4.21-4.332-4.21a.95.95 0 0 1 0-1.37Z\"\n />\n </g>\n </g>\n </svg>\n);\n\nexport interface SidebarLayoutProps extends ComponentPropsWithoutRef<'div'> {\n items: SidebarItem[];\n children: ReactNode;\n activeIndex?: number;\n}\n\nfunction useSidebarLayout() {\n const [isCollapsed, setIsCollapsed] = useState(true);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n const handleToggleCollapse = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n return {\n isCollapsed,\n setIsCollapsed,\n overlayRef,\n handleToggleCollapse,\n };\n}\n\nexport const SidebarLayout = ({\n items,\n children: initialChildren,\n className,\n activeIndex = 0,\n ...attrs\n}: SidebarLayoutProps) => {\n const { isCollapsed, setIsCollapsed, handleToggleCollapse } = useSidebarLayout();\n const {\n 'header-logo': headerLogo,\n header,\n ['header-actions']: headerActions,\n children,\n } = useSlots(initialChildren, ['header-logo', 'header', 'header-actions']);\n\n return (\n <div\n data-name=\"SidebarLayout\"\n className={clsx('h-screen overflow-clip flex flex-col bg-ultramarine', className)}\n {...attrs}\n >\n {/* Header */}\n <header className=\"bg-ultramarine h-64 flex items-center justify-between gap-8 p-8 ps-20 md:px-24 text-white shrink-0\">\n {headerLogo}\n {header}\n {headerActions}\n <button\n className=\"md:hidden w-48 h-48 focus-visible:ring-8 focus-visible:ring-lavender/20 rounded-full flex items-center justify-center text-white transition-opacity outline-none\"\n aria-label={isCollapsed ? 'Open the navigation menu' : 'Close the navigation menu'}\n onClick={handleToggleCollapse}\n >\n <HamburgerIcon isActive={!isCollapsed} />\n </button>\n </header>\n\n {/* Main container with sidebar and content */}\n <div className=\"flex h-full overflow-x-clip overflow-y-hidden\">\n {/* Sidebar */}\n <aside\n className={twMerge(\n 'max-md:absolute max-md:top-64 max-md:h-[calc(100dvh-64px)] max-md:w-screen flex bg-ultramarine px-8 md:py-16 md:ps-28 md:pe-16 text-white flex-col gap-24 transition-all duration-300 ease-in-out relative h-full shrink-0',\n isCollapsed ? 'max-md:-translate-x-full' : 'md:pe-24',\n )}\n >\n {/* Indicator */}\n <button\n className=\"hidden md:block absolute transition-top duration-300 ease-in-out rounded-pill outline-none focus-visible:ring-8 focus-visible:ring-lavender/20 [--indicatorYPos:anchor(top)] top-[max(var(--indicatorYPos,24px),24px)] left-[max(calc(100%_-_10px),86px)]\"\n onClick={handleToggleCollapse}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n style={\n {\n positionAnchor: `--sidebar-item-${activeIndex}`,\n } as CSSProperties\n }\n >\n <CollapseIndicatorSVG isCollapsed={isCollapsed} />\n </button>\n\n <nav\n className={twMerge(\n 'max-md:divide-y-1 p-8 max-md:h-full max-md:overflow-auto md:gap-y-20 grid overflow-hidden text-b3 font-semibold relative transition-grid-template-columns duration-300 ease-in-out',\n isCollapsed ? 'grid-cols-[48px_0fr]' : 'grid-cols-[48px_1fr]',\n )}\n >\n {items.map((item, index) => (\n <SidebarItem\n key={index}\n item={item}\n isActive={index === activeIndex}\n isCollapsed={isCollapsed}\n anchorName={`sidebar-item-${index}`}\n onItemClick={() => {\n if (item.items && item.items.length > 0) {\n setIsCollapsed((prev) => (prev ? false : prev));\n }\n }}\n />\n ))}\n </nav>\n </aside>\n\n <main className=\"w-full md:min-w-0 md:w-[calc(100%-108px)] bg-white p-24 overflow-auto md:rounded-ss-16 h-full shrink-0\">\n {children}\n </main>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"SidebarLayout.js","names":[],"sources":["../../lib/ui/SidebarLayout.tsx"],"sourcesContent":["import { Icon, type IconicNames } from '@clubmed/trident-icons';\nimport clsx from 'clsx';\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type Dispatch,\n type PropsWithChildren,\n type ReactNode,\n type SetStateAction,\n type MouseEvent,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { HamburgerIcon } from './HamburgerIcon';\nimport { useSlots } from '@/ui/hooks/useSlots';\n\ntype SidebarSubItem = {\n label: string;\n href: string;\n} & ComponentPropsWithoutRef<'a'>;\n\ntype SidebarItem = {\n label: string;\n icon: IconicNames;\n items?: SidebarSubItem[];\n} & ((ComponentPropsWithoutRef<'a'> & { href: string }) | ComponentPropsWithoutRef<'button'>);\n\ninterface SidebarItemProps {\n item: SidebarItem;\n isActive?: boolean;\n isCollapsed?: boolean;\n anchorName: string;\n onItemClick?: () => void;\n}\n\nfunction Cta(item: PropsWithChildren<SidebarItem>) {\n if ('href' in item) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { children, icon, label, ...attrs } = item;\n\n return (\n <a\n {...attrs}\n className=\"flex whitespace-nowrap items-center text-white hover:text-saffron transition-colors outline-none focus-visible:bg-white/20 rounded-pill relative group/sidebar-item\"\n >\n {children}\n </a>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { children, icon, label, ...attrs } = item;\n\n return (\n <button\n {...attrs}\n className=\"flex whitespace-nowrap items-center text-white outline-none focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2 rounded-pill relative group/sidebar-item\"\n >\n {children}\n </button>\n );\n}\n\nconst SidebarItem = ({\n item,\n isActive = false,\n isCollapsed = false,\n anchorName,\n onItemClick,\n}: SidebarItemProps) => {\n const hasSubItems = item.items && item.items.length > 0;\n\n return (\n <div className=\"col-start-1 col-end-3\">\n <Cta\n {...item}\n onClick={(e: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n if (hasSubItems && onItemClick) {\n e.preventDefault();\n onItemClick();\n }\n }}\n style={{ anchorName: `--${anchorName}` } as CSSProperties}\n >\n <div className=\"relative\">\n <div\n className={twMerge('aspect-square w-48 rounded-full flex items-center justify-center')}\n >\n <Icon name={item.icon} className=\"w-24 text-white\" />\n </div>\n <div className=\"absolute inset-0 pointer-events-none\" aria-hidden=\"true\" inert>\n <div\n className={twMerge(\n 'max-md:hidden aspect-square w-48 rounded-full flex items-center justify-center bg-lightSand text-black',\n '[clip-path:circle(var(--sidebarItem_clipCircle))] transition-all duration-200 delay-100 ease-in-out group-focus-visible/sidebar-item:ring-4 group-focus-visible/sidebar-item:ring-black group-focus-visible/sidebar-item:ring-offset-2',\n isActive ? '[--sidebarItem_clipCircle:100%]' : '[--sidebarItem_clipCircle:0%]',\n 'group-hover/sidebar-item:[--sidebarItem_clipCircle:100%] group-focus-within/sidebar-item:[--sidebarItem_clipCircle:100%]',\n !isActive &&\n 'group-hover/sidebar-item:bg-lightSand/80 group-focus-within/sidebar-item:bg-lightSand/80',\n )}\n >\n <Icon name={item.icon} className=\"w-24\" />\n </div>\n </div>\n </div>\n <span\n className={twMerge(\n 'transition-all duration-300 ease-in-out whitespace-nowrap ps-8 pe-12 truncate md:max-w-240',\n isCollapsed ? 'opacity-0' : 'opacity-100',\n )}\n >\n {item.label}\n </span>\n </Cta>\n {hasSubItems && (\n <div\n className={twMerge(\n 'grid transition-[grid-template-rows,opacity] duration-300 ease-in-out overflow-hidden max-md:grid-rows-[1fr] max-md:opacity-100',\n isCollapsed ? 'grid-rows-[0fr] opacity-0' : 'grid-rows-[1fr] opacity-100 pb-12',\n )}\n inert={isCollapsed}\n >\n <div className=\"outline-none relative overflow-hidden flex flex-col gap-8 ps-48 font-normal\">\n {item.items!.map((subItem, subIndex) => (\n <a\n key={subIndex}\n href={subItem.href}\n className=\"text-white hover:text-saffron transition-colors text-b4 whitespace-nowrap outline-none focus-visible:bg-white/20 ps-8 pe-16 rounded-pill\"\n >\n {subItem.label}\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport const CollapseIndicatorSVG = ({ isCollapsed }: { isCollapsed: boolean }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"33\" height=\"48\">\n <g fill=\"none\" fillRule=\"nonzero\">\n <path\n fill=\"#FFF\"\n d=\"M10.008 48v-1.829c0-4.116-1.722-8.045-4.75-10.835-6.331-5.837-6.331-15.835 0-21.672a14.736 14.736 0 0 0 4.75-10.835V0h27.417v48H10.008Z\"\n />\n <g\n className={twMerge(\n 'transition-transform duration-500 ease-in-out origin-center [transform-box:fill-box]',\n isCollapsed ? 'rotate-180' : 'rotate-0',\n )}\n >\n <path\n fill=\"#1E2643\"\n d=\"M19.686 12.547c6.617 0 12 5.383 12 12s-5.383 12-12 12-12-5.383-12-12 5.383-12 12-12Zm0 1.986c-5.522 0-10.015 4.492-10.015 10.014 0 5.523 4.493 10.015 10.016 10.015 5.52 0 10.012-4.492 10.012-10.015 0-5.522-4.492-10.014-10.012-10.014Zm-2.097 4.382c.376-.366 1.032-.366 1.409 0l5.037 4.895a.948.948 0 0 1 0 1.37l-5.037 4.894a1.002 1.002 0 0 1-.705.285 1 1 0 0 1-.704-.285.947.947 0 0 1 0-1.369l4.332-4.21-4.332-4.21a.95.95 0 0 1 0-1.37Z\"\n />\n </g>\n </g>\n </svg>\n);\n\nexport interface SidebarLayoutProps extends ComponentPropsWithoutRef<'div'> {\n items: SidebarItem[];\n children: ReactNode;\n activeIndex?: number;\n isCollapsed?: boolean;\n onCollapsedChange?: (isCollapsed: boolean) => void;\n}\n\nfunction useSidebarLayout({\n isCollapsed: initialCollapsedValue,\n onCollapsedChange,\n}: {\n isCollapsed?: boolean;\n onCollapsedChange?: (isCollapsed: boolean) => void;\n}) {\n const [isCollapsed, setIsCollapsedState] = useState(() => initialCollapsedValue ?? true);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n const setIsCollapsed = useCallback<Dispatch<SetStateAction<boolean>>>(\n (value) => {\n setIsCollapsedState((previousState) => {\n const nextState = typeof value === 'function' ? value(previousState) : value;\n if (nextState !== previousState) {\n onCollapsedChange?.(nextState);\n }\n return nextState;\n });\n },\n [onCollapsedChange],\n );\n\n const handleToggleCollapse = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, [setIsCollapsed]);\n\n return {\n isCollapsed,\n setIsCollapsed,\n overlayRef,\n handleToggleCollapse,\n };\n}\n\nexport const SidebarLayout = ({\n items,\n children: initialChildren,\n className,\n activeIndex = 0,\n isCollapsed: initialCollapsedValue,\n onCollapsedChange,\n ...attrs\n}: SidebarLayoutProps) => {\n const { isCollapsed, setIsCollapsed, handleToggleCollapse } = useSidebarLayout({\n isCollapsed: initialCollapsedValue,\n onCollapsedChange,\n });\n const {\n 'header-logo': headerLogo,\n header,\n ['header-actions']: headerActions,\n children,\n } = useSlots(initialChildren, ['header-logo', 'header', 'header-actions']);\n\n return (\n <div\n data-name=\"SidebarLayout\"\n className={clsx('h-screen overflow-clip flex flex-col bg-ultramarine', className)}\n {...attrs}\n >\n {/* Header */}\n <header className=\"bg-ultramarine h-64 flex items-center justify-between gap-8 p-8 ps-20 md:px-24 text-white shrink-0\">\n {headerLogo}\n {header}\n {headerActions}\n <button\n className=\"md:hidden w-48 h-48 focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2 rounded-full flex items-center justify-center text-white transition-opacity outline-none\"\n aria-label={isCollapsed ? 'Open the navigation menu' : 'Close the navigation menu'}\n onClick={handleToggleCollapse}\n >\n <HamburgerIcon isActive={!isCollapsed} />\n </button>\n </header>\n\n {/* Main container with sidebar and content */}\n <div className=\"flex h-full overflow-x-clip overflow-y-hidden\">\n {/* Sidebar */}\n <aside\n className={twMerge(\n 'z-10 max-md:absolute max-md:top-64 max-md:h-[calc(100dvh-64px)] max-md:w-screen flex bg-ultramarine px-8 md:py-16 md:ps-28 md:pe-16 text-white flex-col gap-24 transition-all duration-300 ease-in-out relative h-full shrink-0',\n isCollapsed ? 'max-md:-translate-x-full' : 'md:pe-24',\n )}\n >\n {/* Indicator */}\n <button\n className=\"hidden md:block absolute transition-top duration-300 ease-in-out rounded-pill outline-none focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2 [--indicatorYPos:anchor(top)] top-[max(var(--indicatorYPos,24px),24px)] left-[max(calc(100%_-_10px),86px)]\"\n onClick={handleToggleCollapse}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n style={\n {\n positionAnchor: `--sidebar-item-${activeIndex}`,\n } as CSSProperties\n }\n >\n <CollapseIndicatorSVG isCollapsed={isCollapsed} />\n </button>\n\n <nav\n className={twMerge(\n 'max-md:divide-y-1 p-8 max-md:h-full max-md:overflow-auto md:gap-y-20 grid overflow-hidden text-b3 font-semibold relative transition-grid-template-columns duration-300 ease-in-out',\n isCollapsed ? 'grid-cols-[48px_0fr]' : 'grid-cols-[48px_1fr]',\n )}\n >\n {items.map((item, index) => (\n <SidebarItem\n key={index}\n item={item}\n isActive={index === activeIndex}\n isCollapsed={isCollapsed}\n anchorName={`sidebar-item-${index}`}\n onItemClick={() => {\n if (item.items && item.items.length > 0) {\n setIsCollapsed((prev) => (prev ? false : prev));\n }\n }}\n />\n ))}\n </nav>\n </aside>\n\n <main className=\"w-full md:min-w-0 md:w-[calc(100%-108px)] bg-white p-24 overflow-auto md:rounded-ss-16 h-full shrink-0\">\n {children}\n </main>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
package/ui/Tag.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import { t as e } from "../chunks/clsx.js";
2
2
  import { getBgColor as t, getBorderColor as n, getTextColor as r } from "./helpers/colors/colors.js";
3
3
  import { twMerge as i } from "./helpers/twMerge.js";
4
- import { Icon as a } from "@clubmed/trident-icons";
5
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ import { Icon as s } from "@clubmed/trident-icons";
6
6
  //#region lib/ui/Tag.tsx
7
7
  var c = ({ className: c, backgroundColor: l = "saffron", border: u = l, color: d = "black", icon: f, label: p = "", theme: m = "both", iconClassName: h, labelClassName: g, iconWidth: _, ...v }) => {
8
8
  if (!p && !f) return null;
9
9
  let y = n(u), b = t(l), x = r(d), S = !!f, C = m === "both" && !S ? "label" : m, w = C === "both" || C === "swap" || C === "unfold" || C === "none", T = S && (C === "icon" || w), E = C === "label" || C === "pill" || w;
10
- return /* @__PURE__ */ s("span", {
10
+ return /* @__PURE__ */ o("span", {
11
11
  role: "note",
12
12
  ...v,
13
13
  "data-name": "Tag",
@@ -24,16 +24,16 @@ var c = ({ className: c, backgroundColor: l = "saffron", border: u = l, color: d
24
24
  }, y, b, x), c),
25
25
  title: p,
26
26
  children: [
27
- C === "monogram" && /* @__PURE__ */ o("span", {
27
+ C === "monogram" && /* @__PURE__ */ a("span", {
28
28
  className: "size-24 text-center leading-[1.5rem]",
29
29
  children: p
30
30
  }),
31
- T && /* @__PURE__ */ o(a, {
31
+ T && /* @__PURE__ */ a(s, {
32
32
  width: _ ?? "1.5rem",
33
33
  name: f,
34
34
  className: e({ "sm:hidden": C === "swap" }, h)
35
35
  }),
36
- E && /* @__PURE__ */ o("span", {
36
+ E && /* @__PURE__ */ a("span", {
37
37
  className: e({ "hidden sm:block": C === "swap" || C === "unfold" }, g),
38
38
  children: p
39
39
  })
package/ui/Toggle.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { ComponentPropsWithoutRef, FunctionComponent, ReactNode } from 'react';
2
+ import { Colors } from './types/Colors';
3
+ interface Item extends Omit<ComponentPropsWithoutRef<'button'>, 'children'> {
4
+ color: Colors;
5
+ id: string;
6
+ label: ReactNode;
7
+ }
8
+ export interface ToggleProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'onClick'> {
9
+ index?: number;
10
+ items: Item[];
11
+ onClick?: (index: number) => void;
12
+ size?: 'default' | 'small';
13
+ }
14
+ export declare const Toggle: FunctionComponent<ToggleProps>;
15
+ export {};
package/ui/Toggle.js ADDED
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { t as e } from "../chunks/clsx.js";
3
+ import { getComplementaryTextColor as t } from "./helpers/colors/colors.js";
4
+ import { createElement as n, useEffect as r, useState as i } from "react";
5
+ import { jsx as a } from "react/jsx-runtime";
6
+ //#region lib/ui/Toggle.tsx
7
+ var o = ({ className: o, index: s = 0, items: c = [], onClick: l, size: u = "default", ...d }) => {
8
+ let [f, p] = i(s);
9
+ if (r(() => {
10
+ p(s);
11
+ }, [s]), !c.length) return null;
12
+ let m = { "--toggle-color": `var(--color-${c[f].color || "black"})` };
13
+ return /* @__PURE__ */ a("div", {
14
+ ...d,
15
+ className: e(`rounded-pill ${u === "small" ? "text-b4" : "text-b3"} border p-4 font-bold`, o),
16
+ role: "group",
17
+ children: /* @__PURE__ */ a("div", {
18
+ className: e("toggle relative isolate flex", "before:rounded-pill before:absolute before:z-0 before:bg-(--toggle-color) before:transition-all before:duration-300 before:ease-out"),
19
+ style: m,
20
+ children: c.map(({ color: r, label: i, ...a }, o) => {
21
+ let s = f === o;
22
+ return /* @__PURE__ */ n("button", {
23
+ ...a,
24
+ "aria-pressed": s,
25
+ className: e(a.className, `rounded-pill relative cursor-pointer overflow-hidden ${u === "small" ? "px-12 py-4" : "px-20 py-8"} transition-colors`, {
26
+ active: s,
27
+ [t(r)]: s
28
+ }, "before:absolute before:inset-0 before:-z-1 before:transition-colors hover:before:bg-pearl outline-none focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2"),
29
+ key: a.id,
30
+ onClick: () => {
31
+ p(o), l?.(o);
32
+ },
33
+ type: "button"
34
+ }, i);
35
+ })
36
+ })
37
+ });
38
+ };
39
+ //#endregion
40
+ export { o as Toggle };
41
+
42
+ //# sourceMappingURL=Toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toggle.js","names":[],"sources":["../../lib/ui/Toggle.tsx"],"sourcesContent":["'use client';\nimport clsx from 'clsx';\nimport type { ComponentPropsWithoutRef, CSSProperties, FunctionComponent, ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { getComplementaryTextColor } from './helpers/colors/colors';\nimport type { Colors } from './types/Colors';\n\ninterface Item extends Omit<ComponentPropsWithoutRef<'button'>, 'children'> {\n color: Colors;\n id: string;\n label: ReactNode;\n}\n\nexport interface ToggleProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'onClick'> {\n index?: number;\n items: Item[];\n onClick?: (index: number) => void;\n size?: 'default' | 'small';\n}\n\nexport const Toggle: FunctionComponent<ToggleProps> = ({\n className,\n index = 0,\n items = [],\n onClick,\n size = 'default',\n ...attrs\n}) => {\n const [active, setActive] = useState(index);\n\n useEffect(() => {\n setActive(index);\n }, [index]);\n\n if (!items.length) {\n return null;\n }\n\n const style = {\n '--toggle-color': `var(--color-${items[active].color || 'black'})`,\n } as CSSProperties;\n\n return (\n <div\n {...attrs}\n className={clsx(\n `rounded-pill ${size === 'small' ? 'text-b4' : 'text-b3'} border p-4 font-bold`,\n className,\n )}\n role=\"group\"\n >\n <div\n className={clsx(\n 'toggle relative isolate flex',\n 'before:rounded-pill before:absolute before:z-0 before:bg-(--toggle-color) before:transition-all before:duration-300 before:ease-out',\n )}\n style={style}\n >\n {items.map(({ color, label, ...item }, i) => {\n const isActive = active === i;\n\n return (\n <button\n {...item}\n aria-pressed={isActive}\n className={clsx(\n item.className,\n `rounded-pill relative cursor-pointer overflow-hidden ${size === 'small' ? 'px-12 py-4' : 'px-20 py-8'} transition-colors`,\n { active: isActive, [getComplementaryTextColor(color)]: isActive },\n 'before:absolute before:inset-0 before:-z-1 before:transition-colors hover:before:bg-pearl outline-none focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2',\n )}\n key={item.id}\n onClick={() => {\n setActive(i);\n onClick?.(i);\n }}\n type=\"button\"\n >\n {label}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;AAqBA,IAAa,KAA0C,EACrD,cACA,WAAQ,GACR,WAAQ,EAAE,EACV,YACA,UAAO,WACP,GAAG,QACC;CACJ,IAAM,CAAC,GAAQ,KAAa,EAAS,EAAM;AAM3C,KAJA,QAAgB;AACd,IAAU,EAAM;IACf,CAAC,EAAM,CAAC,EAEP,CAAC,EAAM,OACT,QAAO;CAGT,IAAM,IAAQ,EACZ,kBAAkB,eAAe,EAAM,GAAQ,SAAS,QAAQ,IACjE;AAED,QACE,kBAAC,OAAD;EACE,GAAI;EACJ,WAAW,EACT,gBAAgB,MAAS,UAAU,YAAY,UAAU,wBACzD,EACD;EACD,MAAK;YAEL,kBAAC,OAAD;GACE,WAAW,EACT,gCACA,sIACD;GACM;aAEN,EAAM,KAAK,EAAE,UAAO,UAAO,GAAG,KAAQ,MAAM;IAC3C,IAAM,IAAW,MAAW;AAE5B,WACE,kBAAC,UAAD;KACE,GAAI;KACJ,gBAAc;KACd,WAAW,EACT,EAAK,WACL,wDAAwD,MAAS,UAAU,eAAe,aAAa,qBACvG;MAAE,QAAQ;OAAW,EAA0B,EAAM,GAAG;MAAU,EAClE,mLACD;KACD,KAAK,EAAK;KACV,eAAe;AAEb,MADA,EAAU,EAAE,EACZ,IAAU,EAAE;;KAEd,MAAK;KAGE,EADN,EACM;;GAGT,CAAA;EACF,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';
2
+ declare function TooltipProvider({ delay, ...props }: TooltipPrimitive.Provider.Props): import("react/jsx-runtime").JSX.Element;
3
+ declare function Tooltip({ ...props }: TooltipPrimitive.Root.Props): import("react/jsx-runtime").JSX.Element;
4
+ declare function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props): import("react/jsx-runtime").JSX.Element;
5
+ declare function TooltipContent({ className, side, sideOffset, align, alignOffset, theme, children, ...props }: TooltipPrimitive.Popup.Props & Pick<TooltipPrimitive.Positioner.Props, 'align' | 'alignOffset' | 'side' | 'sideOffset'> & {
6
+ theme?: 'dark' | 'light';
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
package/ui/Tooltip.js ADDED
@@ -0,0 +1,2 @@
1
+ import { i as e, n as t, r as n, t as r } from "../chunks/Tooltip.js";
2
+ export { r as Tooltip, t as TooltipContent, n as TooltipProvider, e as TooltipTrigger };
@@ -5,7 +5,7 @@ export interface ButtonProps extends PropsWithChildren {
5
5
  color?: Colors;
6
6
  icon?: IconicNames;
7
7
  iconWidth?: string;
8
- size?: 'small' | 'medium' | 'large';
8
+ size?: 'small' | 'medium' | 'large' | 'primary' | 'secondary' | 'tertiary';
9
9
  theme?: 'outline' | 'solid';
10
10
  variant?: 'circle' | 'pill';
11
11
  }
@@ -29,7 +29,7 @@ var t = {
29
29
  primary: "button-medium",
30
30
  secondary: "button-secondary",
31
31
  tertiary: "button-tertiary"
32
- }, d = (e) => e != null && e in u, f = (e) => d(e) ? u[e] : u.medium, p = ({ color: t, size: n, theme: i, variant: a }) => e("flex", "button", o(i), r(t), l(a), f(n));
32
+ }, d = (e) => e != null && e in u, f = (e) => d(e) ? u[e] : u.medium, p = ({ color: t, size: n, theme: i, variant: a }) => e("flex", "button", "outline-none focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2", o(i), r(t), l(a), f(n));
33
33
  //#endregion
34
34
  export { t as BUTTON_COLORS, u as BUTTON_SIZES, i as BUTTON_THEMES, s as BUTTON_VARIANTS, p as getButtonClasses };
35
35
 
@@ -1 +1 @@
1
- {"version":3,"file":"Button.type.js","names":[],"sources":["../../../lib/ui/buttons/Button.type.ts"],"sourcesContent":["import clsx from 'clsx';\n\nimport type { IconicNames } from '@clubmed/trident-icons';\nimport type { Colors } from '../types/Colors';\nimport type { PropsWithChildren } from 'react';\n\nexport interface ButtonProps extends PropsWithChildren {\n color?: Colors;\n icon?: IconicNames;\n iconWidth?: string;\n size?: 'small' | 'medium' | 'large';\n theme?: 'outline' | 'solid';\n variant?: 'circle' | 'pill';\n}\n\ntype Params = {\n color: ButtonProps['color'];\n size: ButtonProps['size'];\n theme: ButtonProps['theme'];\n variant: ButtonProps['variant'];\n};\n\nexport const BUTTON_COLORS = {\n black: 'button-black',\n green: 'button-green',\n lavender: 'button-lavender',\n lightSand: 'button-lightSand',\n marygold: 'button-marygold',\n pearl: 'button-pearl',\n orange: 'button-orange',\n red: 'button-red',\n saffron: 'button-saffron',\n sand: 'button-sand',\n sienna: 'button-sienna',\n ultramarine: 'button-ultramarine',\n verdigris: 'button-verdigris',\n wave: 'button-wave',\n white: 'button-white',\n} as const satisfies Record<string, `button-${string}`>;\n\nconst colorGuard = (color: string | undefined): color is keyof typeof BUTTON_COLORS => {\n return color != undefined && color in BUTTON_COLORS;\n};\n\nconst getButtonColor = (color: string | undefined) => {\n if (colorGuard(color)) {\n return BUTTON_COLORS[color];\n }\n\n return BUTTON_COLORS.saffron;\n};\n\nexport const BUTTON_THEMES = {\n outline: 'button-outline',\n solid: 'button-solid',\n} as const satisfies Record<string, `button-${string}`>;\n\nconst themeGuard = (color: string | undefined): color is keyof typeof BUTTON_THEMES => {\n return color != undefined && color in BUTTON_THEMES;\n};\n\nconst getButtonTheme = (theme: string | undefined) => {\n if (themeGuard(theme)) {\n return BUTTON_THEMES[theme];\n }\n\n return BUTTON_THEMES.solid;\n};\n\nexport const BUTTON_VARIANTS = {\n circle: 'button-circle',\n pill: 'button-pill',\n} as const satisfies Record<string, `button-${string}`>;\n\nconst variantGuard = (color: string | undefined): color is keyof typeof BUTTON_VARIANTS => {\n return color != undefined && color in BUTTON_VARIANTS;\n};\n\nconst getButtonVariant = (variant: string | undefined) => {\n if (variantGuard(variant)) {\n return BUTTON_VARIANTS[variant];\n }\n\n return BUTTON_VARIANTS.pill;\n};\n\nexport const BUTTON_SIZES = {\n small: 'button-small',\n medium: 'button-medium',\n large: 'button-large',\n primary: 'button-medium',\n secondary: 'button-secondary',\n tertiary: 'button-tertiary',\n} as const satisfies Record<string, `button-${string}`>;\n\nconst sizeGuard = (color: string | undefined): color is keyof typeof BUTTON_SIZES => {\n return color != undefined && color in BUTTON_SIZES;\n};\n\nconst getButtonSize = (size: ButtonProps['size']) => {\n if (sizeGuard(size)) {\n return BUTTON_SIZES[size];\n }\n\n return BUTTON_SIZES.medium;\n};\n\nexport const getButtonClasses = ({ color, size, theme, variant }: Params) => {\n /* keep the \"flex\" class outside of \"button-*\" so that it can be overridden in responsive */\n return clsx(\n 'flex',\n 'button',\n getButtonTheme(theme),\n getButtonColor(color),\n getButtonVariant(variant),\n getButtonSize(size),\n );\n};\n"],"mappings":";;AAsBA,IAAa,IAAgB;CAC3B,OAAO;CACP,OAAO;CACP,UAAU;CACV,WAAW;CACX,UAAU;CACV,OAAO;CACP,QAAQ;CACR,KAAK;CACL,SAAS;CACT,MAAM;CACN,QAAQ;CACR,aAAa;CACb,WAAW;CACX,MAAM;CACN,OAAO;CACR,EAEK,KAAc,MACX,KAAS,QAAa,KAAS,GAGlC,KAAkB,MAClB,EAAW,EAAM,GACZ,EAAc,KAGhB,EAAc,SAGV,IAAgB;CAC3B,SAAS;CACT,OAAO;CACR,EAEK,KAAc,MACX,KAAS,QAAa,KAAS,GAGlC,KAAkB,MAClB,EAAW,EAAM,GACZ,EAAc,KAGhB,EAAc,OAGV,IAAkB;CAC7B,QAAQ;CACR,MAAM;CACP,EAEK,KAAgB,MACb,KAAS,QAAa,KAAS,GAGlC,KAAoB,MACpB,EAAa,EAAQ,GAChB,EAAgB,KAGlB,EAAgB,MAGZ,IAAe;CAC1B,OAAO;CACP,QAAQ;CACR,OAAO;CACP,SAAS;CACT,WAAW;CACX,UAAU;CACX,EAEK,KAAa,MACV,KAAS,QAAa,KAAS,GAGlC,KAAiB,MACjB,EAAU,EAAK,GACV,EAAa,KAGf,EAAa,QAGT,KAAoB,EAAE,UAAO,SAAM,UAAO,iBAE9C,EACL,QACA,UACA,EAAe,EAAM,EACrB,EAAe,EAAM,EACrB,EAAiB,EAAQ,EACzB,EAAc,EAAK,CACpB"}
1
+ {"version":3,"file":"Button.type.js","names":[],"sources":["../../../lib/ui/buttons/Button.type.ts"],"sourcesContent":["import clsx from 'clsx';\n\nimport type { IconicNames } from '@clubmed/trident-icons';\nimport type { Colors } from '../types/Colors';\nimport type { PropsWithChildren } from 'react';\n\nexport interface ButtonProps extends PropsWithChildren {\n color?: Colors;\n icon?: IconicNames;\n iconWidth?: string;\n size?: 'small' | 'medium' | 'large' | 'primary' | 'secondary' | 'tertiary';\n theme?: 'outline' | 'solid';\n variant?: 'circle' | 'pill';\n}\n\ntype Params = {\n color: ButtonProps['color'];\n size: ButtonProps['size'];\n theme: ButtonProps['theme'];\n variant: ButtonProps['variant'];\n};\n\nexport const BUTTON_COLORS = {\n black: 'button-black',\n green: 'button-green',\n lavender: 'button-lavender',\n lightSand: 'button-lightSand',\n marygold: 'button-marygold',\n pearl: 'button-pearl',\n orange: 'button-orange',\n red: 'button-red',\n saffron: 'button-saffron',\n sand: 'button-sand',\n sienna: 'button-sienna',\n ultramarine: 'button-ultramarine',\n verdigris: 'button-verdigris',\n wave: 'button-wave',\n white: 'button-white',\n} as const satisfies Record<string, `button-${string}`>;\n\nconst colorGuard = (color: string | undefined): color is keyof typeof BUTTON_COLORS => {\n return color != undefined && color in BUTTON_COLORS;\n};\n\nconst getButtonColor = (color: string | undefined) => {\n if (colorGuard(color)) {\n return BUTTON_COLORS[color];\n }\n\n return BUTTON_COLORS.saffron;\n};\n\nexport const BUTTON_THEMES = {\n outline: 'button-outline',\n solid: 'button-solid',\n} as const satisfies Record<string, `button-${string}`>;\n\nconst themeGuard = (color: string | undefined): color is keyof typeof BUTTON_THEMES => {\n return color != undefined && color in BUTTON_THEMES;\n};\n\nconst getButtonTheme = (theme: string | undefined) => {\n if (themeGuard(theme)) {\n return BUTTON_THEMES[theme];\n }\n\n return BUTTON_THEMES.solid;\n};\n\nexport const BUTTON_VARIANTS = {\n circle: 'button-circle',\n pill: 'button-pill',\n} as const satisfies Record<string, `button-${string}`>;\n\nconst variantGuard = (color: string | undefined): color is keyof typeof BUTTON_VARIANTS => {\n return color != undefined && color in BUTTON_VARIANTS;\n};\n\nconst getButtonVariant = (variant: string | undefined) => {\n if (variantGuard(variant)) {\n return BUTTON_VARIANTS[variant];\n }\n\n return BUTTON_VARIANTS.pill;\n};\n\nexport const BUTTON_SIZES = {\n small: 'button-small',\n medium: 'button-medium',\n large: 'button-large',\n primary: 'button-medium',\n secondary: 'button-secondary',\n tertiary: 'button-tertiary',\n} as const satisfies Record<string, `button-${string}`>;\n\nconst sizeGuard = (color: string | undefined): color is keyof typeof BUTTON_SIZES => {\n return color != undefined && color in BUTTON_SIZES;\n};\n\nconst getButtonSize = (size: ButtonProps['size']) => {\n if (sizeGuard(size)) {\n return BUTTON_SIZES[size];\n }\n\n return BUTTON_SIZES.medium;\n};\n\nexport const getButtonClasses = ({ color, size, theme, variant }: Params) => {\n /* keep the \"flex\" class outside of \"button-*\" so that it can be overridden in responsive */\n return clsx(\n 'flex',\n 'button',\n 'outline-none focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2',\n getButtonTheme(theme),\n getButtonColor(color),\n getButtonVariant(variant),\n getButtonSize(size),\n );\n};\n"],"mappings":";;AAsBA,IAAa,IAAgB;CAC3B,OAAO;CACP,OAAO;CACP,UAAU;CACV,WAAW;CACX,UAAU;CACV,OAAO;CACP,QAAQ;CACR,KAAK;CACL,SAAS;CACT,MAAM;CACN,QAAQ;CACR,aAAa;CACb,WAAW;CACX,MAAM;CACN,OAAO;CACR,EAEK,KAAc,MACX,KAAS,QAAa,KAAS,GAGlC,KAAkB,MAClB,EAAW,EAAM,GACZ,EAAc,KAGhB,EAAc,SAGV,IAAgB;CAC3B,SAAS;CACT,OAAO;CACR,EAEK,KAAc,MACX,KAAS,QAAa,KAAS,GAGlC,KAAkB,MAClB,EAAW,EAAM,GACZ,EAAc,KAGhB,EAAc,OAGV,IAAkB;CAC7B,QAAQ;CACR,MAAM;CACP,EAEK,KAAgB,MACb,KAAS,QAAa,KAAS,GAGlC,KAAoB,MACpB,EAAa,EAAQ,GAChB,EAAgB,KAGlB,EAAgB,MAGZ,IAAe;CAC1B,OAAO;CACP,QAAQ;CACR,OAAO;CACP,SAAS;CACT,WAAW;CACX,UAAU;CACX,EAEK,KAAa,MACV,KAAS,QAAa,KAAS,GAGlC,KAAiB,MACjB,EAAU,EAAK,GACV,EAAa,KAGf,EAAa,QAGT,KAAoB,EAAE,UAAO,SAAM,UAAO,iBAE9C,EACL,QACA,UACA,0FACA,EAAe,EAAM,EACrB,EAAe,EAAM,EACrB,EAAiB,EAAQ,EACzB,EAAc,EAAK,CACpB"}
@@ -1,7 +1,7 @@
1
- import { Icon as e } from "@clubmed/trident-icons";
2
- import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
1
+ import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
2
+ import { Icon as r } from "@clubmed/trident-icons";
3
3
  //#region lib/ui/buttons/ButtonContent.tsx
4
- var i = ({ children: i, icon: a, iconType: o, iconWidth: s }) => /* @__PURE__ */ r(t, { children: [i, a && /* @__PURE__ */ n(e, {
4
+ var i = ({ children: i, icon: a, iconType: o, iconWidth: s }) => /* @__PURE__ */ n(e, { children: [i, a && /* @__PURE__ */ t(r, {
5
5
  name: a,
6
6
  width: s ?? "24px",
7
7
  type: o
@@ -0,0 +1,27 @@
1
+ import { default as useEmblaCarousel } from 'embla-carousel-react';
2
+ import { ComponentPropsWithoutRef, FunctionComponent } from 'react';
3
+ type UseCarouselParameters = Parameters<typeof useEmblaCarousel>;
4
+ type CarouselOptions = UseCarouselParameters[0];
5
+ type CarouselPlugins = UseCarouselParameters[1];
6
+ interface CarouselContextProps {
7
+ api: ReturnType<typeof useEmblaCarousel>[1];
8
+ canScrollNext: boolean;
9
+ canScrollPrev: boolean;
10
+ carouselRef: ReturnType<typeof useEmblaCarousel>[0];
11
+ inViews: number[];
12
+ isRTL: boolean;
13
+ items: number;
14
+ options?: CarouselOptions;
15
+ scrollNext: () => void;
16
+ scrollPrev: () => void;
17
+ scrollProgress: number;
18
+ snapped: number[];
19
+ }
20
+ interface CarouselProviderProps extends ComponentPropsWithoutRef<'div'> {
21
+ options?: CarouselOptions;
22
+ plugins?: CarouselPlugins;
23
+ scrollValue?: number;
24
+ }
25
+ export declare const CarouselProvider: FunctionComponent<CarouselProviderProps>;
26
+ export declare const useCarousel: () => CarouselContextProps;
27
+ export {};
@@ -0,0 +1,2 @@
1
+ import { n as e, t } from "../../chunks/Carousel.context.js";
2
+ export { t as CarouselProvider, e as useCarousel };
@@ -0,0 +1,3 @@
1
+ import { ComponentProps, FunctionComponent } from 'react';
2
+ import { CarouselProvider } from './Carousel.context';
3
+ export declare const Carousel: FunctionComponent<ComponentProps<typeof CarouselProvider>>;
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { t as e } from "../../chunks/Carousel.context.js";
3
+ import { jsx as t } from "react/jsx-runtime";
4
+ //#region lib/ui/carousel/Carousel.tsx
5
+ var n = ({ children: n, ...r }) => /* @__PURE__ */ t(e, {
6
+ ...r,
7
+ children: n
8
+ });
9
+ //#endregion
10
+ export { n as Carousel };
11
+
12
+ //# sourceMappingURL=Carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Carousel.js","names":[],"sources":["../../../lib/ui/carousel/Carousel.tsx"],"sourcesContent":["'use client';\nimport type { ComponentProps, FunctionComponent } from 'react';\n\nimport { CarouselProvider } from './Carousel.context';\n\nexport const Carousel: FunctionComponent<ComponentProps<typeof CarouselProvider>> = ({\n children,\n ...props\n}) => {\n return <CarouselProvider {...props}>{children}</CarouselProvider>;\n};\n"],"mappings":";;;;AAKA,IAAa,KAAwE,EACnF,aACA,GAAG,QAEI,kBAAC,GAAD;CAAkB,GAAI;CAAQ;CAA4B,CAAA"}