@giddaa-housing/ui 0.1.0 → 1.0.0

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 (334) hide show
  1. package/README.md +18 -6
  2. package/css/base.css +37 -0
  3. package/css/components.css +135 -0
  4. package/css/generated/shared.css +1 -0
  5. package/css/giddaa.css +402 -0
  6. package/css/preset.css +77 -0
  7. package/css/styles.css +2 -0
  8. package/css/theme.css +255 -0
  9. package/dist/accordion.js +5 -35
  10. package/dist/accordion.js.map +1 -1
  11. package/dist/activity-timeline.d.ts +33 -0
  12. package/dist/activity-timeline.js +212 -0
  13. package/dist/activity-timeline.js.map +1 -0
  14. package/dist/alert.js +5 -35
  15. package/dist/alert.js.map +1 -1
  16. package/dist/auth-layout.d.ts +23 -0
  17. package/dist/auth-layout.js +304 -0
  18. package/dist/auth-layout.js.map +1 -0
  19. package/dist/avatar.js +10 -142
  20. package/dist/avatar.js.map +1 -1
  21. package/dist/badge.d.ts +3 -2
  22. package/dist/badge.js +6 -114
  23. package/dist/badge.js.map +1 -1
  24. package/dist/bar-chart.d.ts +101 -77
  25. package/dist/bar-chart.js +142 -220
  26. package/dist/bar-chart.js.map +1 -1
  27. package/dist/breadcrumb.js +5 -35
  28. package/dist/breadcrumb.js.map +1 -1
  29. package/dist/bullet-chart.js +15 -48
  30. package/dist/bullet-chart.js.map +1 -1
  31. package/dist/button-group.js +14 -90
  32. package/dist/button-group.js.map +1 -1
  33. package/dist/button.d.ts +5 -5
  34. package/dist/button.js +7 -140
  35. package/dist/button.js.map +1 -1
  36. package/dist/calendar.js +12 -287
  37. package/dist/calendar.js.map +1 -1
  38. package/dist/card.js +5 -35
  39. package/dist/card.js.map +1 -1
  40. package/dist/carousel.js +12 -386
  41. package/dist/carousel.js.map +1 -1
  42. package/dist/chart.js +16 -480
  43. package/dist/chart.js.map +1 -1
  44. package/dist/checkbox.d.ts +1 -1
  45. package/dist/checkbox.js +13 -48
  46. package/dist/checkbox.js.map +1 -1
  47. package/dist/chunk-322YCNVL.js +278 -0
  48. package/dist/chunk-322YCNVL.js.map +1 -0
  49. package/dist/chunk-3ACQVT7A.js +25 -0
  50. package/dist/chunk-3ACQVT7A.js.map +1 -0
  51. package/dist/chunk-3T65TLJX.js +334 -0
  52. package/dist/chunk-3T65TLJX.js.map +1 -0
  53. package/dist/chunk-6ZSGQHH2.js +192 -0
  54. package/dist/chunk-6ZSGQHH2.js.map +1 -0
  55. package/dist/chunk-7TBMLFGW.js +41 -0
  56. package/dist/chunk-7TBMLFGW.js.map +1 -0
  57. package/dist/chunk-B4H6RNDH.js +135 -0
  58. package/dist/chunk-B4H6RNDH.js.map +1 -0
  59. package/dist/chunk-BUXCGZ6X.js +219 -0
  60. package/dist/chunk-BUXCGZ6X.js.map +1 -0
  61. package/dist/chunk-CHII2QHH.js +58 -0
  62. package/dist/chunk-CHII2QHH.js.map +1 -0
  63. package/dist/chunk-DMNOXRRW.js +147 -0
  64. package/dist/chunk-DMNOXRRW.js.map +1 -0
  65. package/dist/chunk-EFSOSSIC.js +130 -0
  66. package/dist/chunk-EFSOSSIC.js.map +1 -0
  67. package/dist/chunk-FZDSVMKY.js +363 -0
  68. package/dist/chunk-FZDSVMKY.js.map +1 -0
  69. package/dist/chunk-GJOFIJS3.js +246 -0
  70. package/dist/chunk-GJOFIJS3.js.map +1 -0
  71. package/dist/chunk-HL3ZSYES.js +23 -0
  72. package/dist/chunk-HL3ZSYES.js.map +1 -0
  73. package/dist/chunk-JVLUBAPB.js +129 -0
  74. package/dist/chunk-JVLUBAPB.js.map +1 -0
  75. package/dist/chunk-KDPYSOYZ.js +64 -0
  76. package/dist/chunk-KDPYSOYZ.js.map +1 -0
  77. package/dist/chunk-KSMDANKI.js +43 -0
  78. package/dist/chunk-KSMDANKI.js.map +1 -0
  79. package/dist/chunk-MEKCCOP5.js +46 -0
  80. package/dist/chunk-MEKCCOP5.js.map +1 -0
  81. package/dist/chunk-NOFXVRWL.js +451 -0
  82. package/dist/chunk-NOFXVRWL.js.map +1 -0
  83. package/dist/chunk-PC5MHNVA.js +171 -0
  84. package/dist/chunk-PC5MHNVA.js.map +1 -0
  85. package/dist/chunk-QKAQZ2GU.js +122 -0
  86. package/dist/chunk-QKAQZ2GU.js.map +1 -0
  87. package/dist/chunk-QZHSHSVV.js +26 -0
  88. package/dist/chunk-QZHSHSVV.js.map +1 -0
  89. package/dist/chunk-RBMK26XD.js +19 -0
  90. package/dist/chunk-RBMK26XD.js.map +1 -0
  91. package/dist/chunk-SFNJGF6M.js +262 -0
  92. package/dist/chunk-SFNJGF6M.js.map +1 -0
  93. package/dist/chunk-UJJNLGTM.js +112 -0
  94. package/dist/chunk-UJJNLGTM.js.map +1 -0
  95. package/dist/chunk-VGR4ZWJ3.js +418 -0
  96. package/dist/chunk-VGR4ZWJ3.js.map +1 -0
  97. package/dist/chunk-XG47P6D4.js +99 -0
  98. package/dist/chunk-XG47P6D4.js.map +1 -0
  99. package/dist/chunk-XZZAHNVM.js +21 -0
  100. package/dist/chunk-XZZAHNVM.js.map +1 -0
  101. package/dist/chunk-Y4TTYVNE.js +36 -0
  102. package/dist/chunk-Y4TTYVNE.js.map +1 -0
  103. package/dist/chunk-YDWIHW6Q.js +69 -0
  104. package/dist/chunk-YDWIHW6Q.js.map +1 -0
  105. package/dist/collapsible.js +6 -35
  106. package/dist/collapsible.js.map +1 -1
  107. package/dist/combobox.js +26 -694
  108. package/dist/combobox.js.map +1 -1
  109. package/dist/cta.d.ts +66 -0
  110. package/dist/cta.js +358 -0
  111. package/dist/cta.js.map +1 -0
  112. package/dist/currency-selector.d.ts +42 -0
  113. package/dist/currency-selector.js +192 -0
  114. package/dist/currency-selector.js.map +1 -0
  115. package/dist/date-picker.d.ts +18 -10
  116. package/dist/date-picker.js +105 -430
  117. package/dist/date-picker.js.map +1 -1
  118. package/dist/details-card.d.ts +19 -0
  119. package/dist/details-card.js +267 -0
  120. package/dist/details-card.js.map +1 -0
  121. package/dist/dialog.js +36 -146
  122. package/dist/dialog.js.map +1 -1
  123. package/dist/dropdown-menu.d.ts +1 -1
  124. package/dist/dropdown-menu.js +20 -358
  125. package/dist/dropdown-menu.js.map +1 -1
  126. package/dist/dropzone.js +13 -40
  127. package/dist/dropzone.js.map +1 -1
  128. package/dist/editorial-card.d.ts +29 -0
  129. package/dist/editorial-card.js +311 -0
  130. package/dist/editorial-card.js.map +1 -0
  131. package/dist/empty-state.js +5 -35
  132. package/dist/empty-state.js.map +1 -1
  133. package/dist/field.js +30 -135
  134. package/dist/field.js.map +1 -1
  135. package/dist/footer.d.ts +47 -0
  136. package/dist/footer.js +430 -0
  137. package/dist/footer.js.map +1 -0
  138. package/dist/funnel-chart.js +42 -415
  139. package/dist/funnel-chart.js.map +1 -1
  140. package/dist/gallery-indicator.d.ts +18 -0
  141. package/dist/gallery-indicator.js +12 -0
  142. package/dist/gallery-indicator.js.map +1 -0
  143. package/dist/heatmap-chart.d.ts +98 -0
  144. package/dist/heatmap-chart.js +248 -0
  145. package/dist/heatmap-chart.js.map +1 -0
  146. package/dist/infotip.d.ts +11 -0
  147. package/dist/infotip.js +66 -0
  148. package/dist/infotip.js.map +1 -0
  149. package/dist/input-group.d.ts +2 -1
  150. package/dist/input-group.js +15 -371
  151. package/dist/input-group.js.map +1 -1
  152. package/dist/input-size-context.js +5 -19
  153. package/dist/input-size-context.js.map +1 -1
  154. package/dist/input.js +6 -78
  155. package/dist/input.js.map +1 -1
  156. package/dist/item.js +5 -35
  157. package/dist/item.js.map +1 -1
  158. package/dist/kpi-card.js +12 -52
  159. package/dist/kpi-card.js.map +1 -1
  160. package/dist/label.js +5 -64
  161. package/dist/label.js.map +1 -1
  162. package/dist/line-chart.js +9 -166
  163. package/dist/line-chart.js.map +1 -1
  164. package/dist/logo.js +4 -141
  165. package/dist/logo.js.map +1 -1
  166. package/dist/map-indicator.d.ts +13 -0
  167. package/dist/map-indicator.js +109 -0
  168. package/dist/map-indicator.js.map +1 -0
  169. package/dist/match.d.ts +16 -0
  170. package/dist/match.js +113 -0
  171. package/dist/match.js.map +1 -0
  172. package/dist/media-gallery-hero.d.ts +60 -0
  173. package/dist/media-gallery-hero.js +362 -0
  174. package/dist/media-gallery-hero.js.map +1 -0
  175. package/dist/media-player.d.ts +60 -0
  176. package/dist/media-player.js +1394 -0
  177. package/dist/media-player.js.map +1 -0
  178. package/dist/number-input.js +30 -325
  179. package/dist/number-input.js.map +1 -1
  180. package/dist/page-header.js +4 -32
  181. package/dist/page-header.js.map +1 -1
  182. package/dist/pagination.d.ts +1 -0
  183. package/dist/pagination.js +27 -161
  184. package/dist/pagination.js.map +1 -1
  185. package/dist/password-input.d.ts +1 -0
  186. package/dist/password-input.js +21 -319
  187. package/dist/password-input.js.map +1 -1
  188. package/dist/phone-input.d.ts +2 -1
  189. package/dist/phone-input.js +148 -359
  190. package/dist/phone-input.js.map +1 -1
  191. package/dist/photo-gallery.d.ts +1 -1
  192. package/dist/photo-gallery.js +97 -393
  193. package/dist/photo-gallery.js.map +1 -1
  194. package/dist/pie-chart.js +17 -52
  195. package/dist/pie-chart.js.map +1 -1
  196. package/dist/popover.js +13 -158
  197. package/dist/popover.js.map +1 -1
  198. package/dist/price-tag.d.ts +35 -0
  199. package/dist/price-tag.js +178 -0
  200. package/dist/price-tag.js.map +1 -0
  201. package/dist/progress.d.ts +5 -2
  202. package/dist/progress.js +14 -303
  203. package/dist/progress.js.map +1 -1
  204. package/dist/property-listing-card.d.ts +32 -0
  205. package/dist/property-listing-card.js +235 -0
  206. package/dist/property-listing-card.js.map +1 -0
  207. package/dist/radar-chart.d.ts +110 -0
  208. package/dist/radar-chart.js +147 -0
  209. package/dist/radar-chart.js.map +1 -0
  210. package/dist/radio-group.js +15 -50
  211. package/dist/radio-group.js.map +1 -1
  212. package/dist/review-block.d.ts +20 -0
  213. package/dist/review-block.js +10 -0
  214. package/dist/review-block.js.map +1 -0
  215. package/dist/rich-text-editor.js +172 -433
  216. package/dist/rich-text-editor.js.map +1 -1
  217. package/dist/scatter-chart.d.ts +142 -0
  218. package/dist/scatter-chart.js +252 -0
  219. package/dist/scatter-chart.js.map +1 -0
  220. package/dist/search-input.d.ts +1 -0
  221. package/dist/search-input.js +22 -320
  222. package/dist/search-input.js.map +1 -1
  223. package/dist/select.js +15 -292
  224. package/dist/select.js.map +1 -1
  225. package/dist/separator.js +5 -68
  226. package/dist/separator.js.map +1 -1
  227. package/dist/sheet.js +14 -271
  228. package/dist/sheet.js.map +1 -1
  229. package/dist/sidebar.d.ts +1 -1
  230. package/dist/sidebar.js +89 -494
  231. package/dist/sidebar.js.map +1 -1
  232. package/dist/size-context.js +5 -17
  233. package/dist/size-context.js.map +1 -1
  234. package/dist/skeleton.js +4 -44
  235. package/dist/skeleton.js.map +1 -1
  236. package/dist/slider.d.ts +28 -0
  237. package/dist/slider.js +152 -0
  238. package/dist/slider.js.map +1 -0
  239. package/dist/sparkline.js +33 -341
  240. package/dist/sparkline.js.map +1 -1
  241. package/dist/stepper.js +5 -35
  242. package/dist/stepper.js.map +1 -1
  243. package/dist/styles.css +9593 -2
  244. package/dist/switch.js +13 -48
  245. package/dist/switch.js.map +1 -1
  246. package/dist/tab-list.js +35 -306
  247. package/dist/tab-list.js.map +1 -1
  248. package/dist/table.js +5 -32
  249. package/dist/table.js.map +1 -1
  250. package/dist/tabs.js +10 -150
  251. package/dist/tabs.js.map +1 -1
  252. package/dist/tag.d.ts +7 -6
  253. package/dist/tag.js +101 -97
  254. package/dist/tag.js.map +1 -1
  255. package/dist/testimonial-block.d.ts +34 -0
  256. package/dist/testimonial-block.js +377 -0
  257. package/dist/testimonial-block.js.map +1 -0
  258. package/dist/textarea.js +6 -73
  259. package/dist/textarea.js.map +1 -1
  260. package/dist/time-picker.js +119 -279
  261. package/dist/time-picker.js.map +1 -1
  262. package/dist/toast.js +27 -132
  263. package/dist/toast.js.map +1 -1
  264. package/dist/tooltip.d.ts +5 -5
  265. package/dist/tooltip.js +7 -90
  266. package/dist/tooltip.js.map +1 -1
  267. package/dist/tree-map.js +41 -414
  268. package/dist/tree-map.js.map +1 -1
  269. package/dist/waterfall-chart.d.ts +129 -0
  270. package/dist/waterfall-chart.js +577 -0
  271. package/dist/waterfall-chart.js.map +1 -0
  272. package/package.json +98 -28
  273. package/dist/base.css +0 -32
  274. package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
  275. package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
  276. package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
  277. package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
  278. package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
  279. package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
  280. package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
  281. package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
  282. package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
  283. package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
  284. package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
  285. package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
  286. package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
  287. package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
  288. package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
  289. package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
  290. package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
  291. package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
  292. package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
  293. package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
  294. package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
  295. package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
  296. package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
  297. package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
  298. package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
  299. package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
  300. package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
  301. package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
  302. package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
  303. package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
  304. package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
  305. package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
  306. package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
  307. package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
  308. package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
  309. package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
  310. package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
  311. package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
  312. package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
  313. package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
  314. package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
  315. package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
  316. package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
  317. package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
  318. package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
  319. package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
  320. package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
  321. package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
  322. package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
  323. package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
  324. package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
  325. package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
  326. package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
  327. package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
  328. package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
  329. package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
  330. package/dist/index.d.ts +0 -87
  331. package/dist/index.js +0 -10448
  332. package/dist/index.js.map +0 -1
  333. package/dist/red-hat-display.css +0 -2
  334. package/dist/theme/giddaa.css +0 -2
@@ -1,176 +1,22 @@
1
- // src/components/ui/time-picker.tsx
1
+ "use client";
2
+ import {
3
+ PickerFooter,
4
+ PickerTrigger
5
+ } from "./chunk-YDWIHW6Q.js";
6
+ import {
7
+ Popover,
8
+ PopoverContent
9
+ } from "./chunk-JVLUBAPB.js";
10
+ import "./chunk-B4H6RNDH.js";
11
+ import "./chunk-HL3ZSYES.js";
12
+ import {
13
+ cn
14
+ } from "./chunk-Y4TTYVNE.js";
15
+
16
+ // src/time-picker.tsx
2
17
  import { ClockIcon } from "lucide-react";
3
18
  import * as React from "react";
4
-
5
- // src/lib/cn.ts
6
- import { clsx } from "clsx";
7
- import { extendTailwindMerge } from "tailwind-merge";
8
- var twMerge = extendTailwindMerge({
9
- extend: {
10
- classGroups: {
11
- "font-size": [
12
- {
13
- text: [
14
- "gdt-display",
15
- "gdt-h1",
16
- "gdt-h2",
17
- "gdt-h3",
18
- "gdt-h4",
19
- "gdt-h5",
20
- "gdt-xl",
21
- "gdt-lg",
22
- "gdt-md",
23
- "gdt-sm",
24
- "gdt-xs",
25
- "gdt-subtext",
26
- "gdt-capitalized"
27
- ]
28
- }
29
- ]
30
- }
31
- }
32
- });
33
- function cn(...inputs) {
34
- return twMerge(clsx(inputs));
35
- }
36
-
37
- // src/components/ui/button.tsx
38
- import { Button as ButtonPrimitive } from "@base-ui/react/button";
39
- import { cva } from "class-variance-authority";
40
- import { Loader } from "lucide-react";
41
-
42
- // src/components/ui/size-context.tsx
43
- import { createContext, useContext } from "react";
44
- import { Fragment, jsx } from "react/jsx-runtime";
45
- var SizeContext = createContext(void 0);
46
- function SizeProvider({
47
- children,
48
- size
49
- }) {
50
- if (!size) {
51
- return /* @__PURE__ */ jsx(Fragment, { children });
52
- }
53
- return /* @__PURE__ */ jsx(SizeContext.Provider, { value: size, children });
54
- }
55
- function useComponentSize(size, fallback = "md") {
56
- const inheritedSize = useContext(SizeContext);
57
- return size ?? inheritedSize ?? fallback;
58
- }
59
-
60
- // src/components/ui/button.tsx
61
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
62
- var buttonVariants = cva(
63
- "group/button inline-flex shrink-0 items-center justify-center rounded-full bg-clip-padding whitespace-nowrap font-bold transition-[background-color,color,border-color,box-shadow,transform] outline-none select-none focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-invalid:border-line-danger aria-invalid:ring-3 aria-invalid:ring-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
64
- {
65
- variants: {
66
- variant: {
67
- primary: "bg-action-primary text-fg-on-brand hover:bg-action-primary-hover active:bg-action-primary-pressed",
68
- "primary-outline": "border-2 border-action-primary bg-transparent text-fg-brand hover:bg-surface-brand-subtle active:bg-surface-brand-subtle data-focused:bg-surface-brand-subtle data-pressed:bg-surface-brand-subtle",
69
- secondary: "bg-surface-brand-subtle text-fg-brand hover:bg-action-primary-hover hover:text-fg-on-brand active:bg-action-primary-pressed active:text-fg-on-brand data-focused:bg-action-primary-hover data-pressed:bg-action-primary-pressed data-focused:text-fg-on-brand data-pressed:text-fg-on-brand",
70
- "secondary-outline": "border-2 border-action-secondary bg-transparent text-fg-brand hover:bg-surface-brand-subtle active:bg-surface-brand-subtle data-focused:bg-surface-brand-subtle data-pressed:bg-surface-brand-subtle",
71
- tertiary: "bg-action-tertiary text-fg-primary hover:bg-action-tertiary-hover active:bg-action-tertiary-pressed data-focused:bg-action-tertiary-hover data-pressed:bg-action-tertiary-pressed",
72
- "tertiary-outline": "border border-line-strong bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised data-focused:bg-surface data-pressed:bg-surface-raised",
73
- ghost: "bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised data-focused:bg-surface data-pressed:bg-surface-raised",
74
- danger: "bg-action-danger text-fg-on-brand hover:bg-action-danger-hover active:bg-action-danger-pressed data-focused:bg-action-danger-hover data-pressed:bg-action-danger-pressed",
75
- "glass-overlay": "bg-surface-glass-overlay-button text-fg-on-brand",
76
- "link-brand": "border-transparent bg-transparent px-0 text-fg-brand hover:underline active:underline active:opacity-70",
77
- "link-neutral": "border-transparent bg-transparent px-0 text-fg-secondary hover:underline active:underline active:opacity-70"
78
- },
79
- size: {
80
- sm: "h-8 gap-2 px-3.5 text-gdt-xs has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3 [&_svg:not([class*='size-'])]:size-3.5",
81
- md: "h-10 gap-2 px-4.5 text-gdt-sm has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4",
82
- lg: "h-12.5 gap-2.5 px-5.5 text-gdt-md has-data-[icon=inline-end]:pr-5 has-data-[icon=inline-start]:pl-5 [&_svg:not([class*='size-'])]:size-4.5",
83
- xl: "h-14 gap-3 px-6.5 text-gdt-lg has-data-[icon=inline-end]:pr-6 has-data-[icon=inline-start]:pl-6 [&_svg:not([class*='size-'])]:size-5",
84
- icon: "size-10",
85
- "icon-xs": "size-6 text-gdt-xs [&_svg:not([class*='size-'])]:size-3",
86
- "icon-sm": "size-8 text-gdt-sm [&_svg:not([class*='size-'])]:size-3.5",
87
- "icon-lg": "size-12.5 text-gdt-md [&_svg:not([class*='size-'])]:size-4.5",
88
- "icon-xl": "size-14 text-gdt-lg [&_svg:not([class*='size-'])]:size-5"
89
- }
90
- },
91
- defaultVariants: {
92
- variant: "primary",
93
- size: "md"
94
- }
95
- }
96
- );
97
- function Button({
98
- className,
99
- variant = "primary",
100
- size,
101
- isLoading = false,
102
- children,
103
- disabled = false,
104
- ...props
105
- }) {
106
- const inheritedSize = useComponentSize();
107
- const resolvedSize = size ?? inheritedSize;
108
- const _disabled = disabled || isLoading;
109
- return /* @__PURE__ */ jsxs(
110
- ButtonPrimitive,
111
- {
112
- "data-slot": "button",
113
- className: cn(buttonVariants({ variant, size: resolvedSize, className })),
114
- disabled: _disabled,
115
- ...props,
116
- children: [
117
- isLoading && /* @__PURE__ */ jsx2(Loader, { className: "size-4 animate-spin" }),
118
- " ",
119
- children
120
- ]
121
- }
122
- );
123
- }
124
-
125
- // src/components/ui/popover.tsx
126
- import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
127
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
128
- function Popover({ ...props }) {
129
- return /* @__PURE__ */ jsx3(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
130
- }
131
- function PopoverTrigger({ ...props }) {
132
- return /* @__PURE__ */ jsx3(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
133
- }
134
- function PopoverContent({
135
- className,
136
- align = "center",
137
- alignOffset = 0,
138
- side = "bottom",
139
- sideOffset = 6,
140
- showArrow = true,
141
- size = "md",
142
- children,
143
- ...props
144
- }) {
145
- return /* @__PURE__ */ jsx3(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx3(
146
- PopoverPrimitive.Positioner,
147
- {
148
- align,
149
- alignOffset,
150
- side,
151
- sideOffset,
152
- className: "isolate z-50",
153
- children: /* @__PURE__ */ jsxs2(
154
- PopoverPrimitive.Popup,
155
- {
156
- "data-slot": "popover-content",
157
- className: cn(
158
- "z-50 relative flex w-72 max-w-[calc(100vw-2rem)] origin-(--transform-origin) flex-col rounded-lg border-0 bg-surface-overlay py-4 text-gdt-sm text-fg-primary shadow-2 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 has-[&_[data-slot=popover-footer]]:pb-0",
159
- className
160
- ),
161
- ...props,
162
- children: [
163
- /* @__PURE__ */ jsx3(SizeProvider, { size, children }),
164
- showArrow ? /* @__PURE__ */ jsx3(PopoverPrimitive.Arrow, { className: "relative block w-3 h-1.5 overflow-clip data-[side=bottom]:top-[-6px] data-[side=left]:right-[-9px] data-[side=left]:rotate-90 data-[side=right]:left-[-9px] data-[side=right]:-rotate-90 data-[side=top]:bottom-[-6px] data-[side=top]:rotate-180 before:content-[''] before:absolute before:bottom-0 before:left-1/2 before:w-[calc(6px*sqrt(2))] before:h-[calc(6px*sqrt(2))] before:bg-surface-overlay before:border before:border-line before:[transform:translate(-50%,50%)_rotate(45deg)]" }) : null
165
- ]
166
- }
167
- )
168
- }
169
- ) });
170
- }
171
-
172
- // src/components/ui/time-picker.tsx
173
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
19
+ import { jsx, jsxs } from "react/jsx-runtime";
174
20
  var ITEM_HEIGHT = 40;
175
21
  var VISIBLE_COUNT = 5;
176
22
  var SCROLL_PADDING = Math.floor(VISIBLE_COUNT / 2) * ITEM_HEIGHT;
@@ -225,14 +71,13 @@ function formatTimeValue(tv, format) {
225
71
  if (format === "12h") return `${tv.hour}:${tv.minute} ${tv.period}`;
226
72
  return `${tv.hour}:${tv.minute}`;
227
73
  }
228
- function TimeColumn({ items, value, onChange }) {
74
+ function TimeColumn({ label, items, value, onChange }) {
229
75
  const scrollRef = React.useRef(null);
230
76
  const itemRefs = React.useRef([]);
231
77
  const [centerIndex, setCenterIndex] = React.useState(
232
78
  () => Math.max(0, items.indexOf(value))
233
79
  );
234
80
  const isProgrammatic = React.useRef(false);
235
- const settleRef = React.useRef(null);
236
81
  const onChangeRef = React.useRef(onChange);
237
82
  onChangeRef.current = onChange;
238
83
  const paintCurve = React.useCallback(() => {
@@ -271,6 +116,17 @@ function TimeColumn({ items, value, onChange }) {
271
116
  paintCurve();
272
117
  }, 320);
273
118
  }, [value]);
119
+ function selectIndex(index) {
120
+ const el = scrollRef.current;
121
+ if (!el) return;
122
+ isProgrammatic.current = true;
123
+ setCenterIndex(index);
124
+ onChangeRef.current(items[index]);
125
+ el.scrollTo({ top: index * ITEM_HEIGHT, behavior: "smooth" });
126
+ setTimeout(() => {
127
+ isProgrammatic.current = false;
128
+ }, 350);
129
+ }
274
130
  function handleScroll() {
275
131
  paintCurve();
276
132
  if (isProgrammatic.current) return;
@@ -280,57 +136,70 @@ function TimeColumn({ items, value, onChange }) {
280
136
  0,
281
137
  Math.min(Math.round(el.scrollTop / ITEM_HEIGHT), items.length - 1)
282
138
  );
283
- if (idx !== centerIndex) setCenterIndex(idx);
284
- if (settleRef.current) clearTimeout(settleRef.current);
285
- settleRef.current = setTimeout(() => onChangeRef.current(items[idx]), 120);
139
+ if (idx !== centerIndex) {
140
+ setCenterIndex(idx);
141
+ onChangeRef.current(items[idx]);
142
+ }
286
143
  }
287
- return /* @__PURE__ */ jsx4(
288
- "div",
289
- {
290
- ref: scrollRef,
291
- onScroll: handleScroll,
292
- style: { height: `${VISIBLE_COUNT * ITEM_HEIGHT}px` },
293
- className: "overflow-y-scroll [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
294
- children: /* @__PURE__ */ jsx4(
295
- "div",
296
- {
297
- style: {
298
- paddingTop: `${SCROLL_PADDING}px`,
299
- paddingBottom: `${SCROLL_PADDING}px`
300
- },
301
- children: items.map((item, index) => {
302
- const dist = Math.abs(index - centerIndex);
303
- return /* @__PURE__ */ jsx4(
304
- "button",
305
- {
306
- type: "button",
307
- ref: (node) => {
308
- itemRefs.current[index] = node;
144
+ return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
145
+ /* @__PURE__ */ jsx(
146
+ "div",
147
+ {
148
+ "aria-hidden": true,
149
+ style: { height: `${ITEM_HEIGHT - 4}px` },
150
+ className: "pointer-events-none absolute inset-x-0.5 top-1/2 -translate-y-1/2 rounded-full bg-action-primary"
151
+ }
152
+ ),
153
+ /* @__PURE__ */ jsx(
154
+ "div",
155
+ {
156
+ ref: scrollRef,
157
+ onScroll: handleScroll,
158
+ role: "listbox",
159
+ "aria-label": label,
160
+ style: { height: `${VISIBLE_COUNT * ITEM_HEIGHT}px` },
161
+ className: "relative snap-y snap-mandatory overflow-y-scroll overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
162
+ children: /* @__PURE__ */ jsx(
163
+ "div",
164
+ {
165
+ style: {
166
+ paddingTop: `${SCROLL_PADDING}px`,
167
+ paddingBottom: `${SCROLL_PADDING}px`
168
+ },
169
+ children: items.map((item, index) => {
170
+ const dist = Math.abs(index - centerIndex);
171
+ return /* @__PURE__ */ jsx(
172
+ "button",
173
+ {
174
+ type: "button",
175
+ role: "option",
176
+ "aria-selected": index === centerIndex,
177
+ tabIndex: index === centerIndex ? 0 : -1,
178
+ ref: (node) => {
179
+ itemRefs.current[index] = node;
180
+ },
181
+ onClick: () => selectIndex(index),
182
+ style: { height: `${ITEM_HEIGHT}px` },
183
+ className: "flex w-full cursor-pointer snap-center items-center justify-center select-none will-change-transform",
184
+ children: /* @__PURE__ */ jsx(
185
+ "span",
186
+ {
187
+ className: cn(
188
+ "text-gdt-sm font-medium transition-colors",
189
+ dist === 0 ? "text-fg-on-brand" : dist === 1 ? "text-fg-secondary" : "text-fg-caption-placeholder"
190
+ ),
191
+ children: item
192
+ }
193
+ )
309
194
  },
310
- onClick: () => scrollRef.current?.scrollTo({
311
- top: index * ITEM_HEIGHT,
312
- behavior: "smooth"
313
- }),
314
- style: { height: `${ITEM_HEIGHT}px` },
315
- className: "flex w-full cursor-pointer items-center justify-center select-none will-change-transform",
316
- children: /* @__PURE__ */ jsx4(
317
- "span",
318
- {
319
- className: cn(
320
- "rounded-full px-4 py-1.5 text-gdt-sm font-medium transition-colors",
321
- dist === 0 ? "bg-action-primary text-fg-on-brand" : dist === 1 ? "text-fg-secondary" : "text-fg-caption-placeholder"
322
- ),
323
- children: item
324
- }
325
- )
326
- },
327
- item
328
- );
329
- })
330
- }
331
- )
332
- }
333
- );
195
+ item
196
+ );
197
+ })
198
+ }
199
+ )
200
+ }
201
+ )
202
+ ] });
334
203
  }
335
204
  function TimePicker({
336
205
  value,
@@ -353,47 +222,26 @@ function TimePicker({
353
222
  { key: "Minute", show: true },
354
223
  { key: "Period", show: format === "12h" }
355
224
  ].filter((c) => c.show);
356
- return /* @__PURE__ */ jsxs3(Popover, { open, onOpenChange: handleOpenChange, children: [
357
- /* @__PURE__ */ jsxs3(
358
- PopoverTrigger,
225
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
226
+ /* @__PURE__ */ jsx(
227
+ PickerTrigger,
359
228
  {
229
+ icon: ClockIcon,
230
+ displayValue: value ?? "",
231
+ placeholder,
360
232
  disabled,
361
- className: cn(
362
- "flex h-10 w-full items-center justify-between rounded-full border px-3.5 text-gdt-sm transition-[border-color,box-shadow] outline-none",
363
- disabled ? "cursor-not-allowed border-line-subtle bg-surface text-fg-caption-placeholder" : open ? "border-line-focus bg-canvas text-fg-primary inset-ring-1 inset-ring-line-focus" : "border-line bg-canvas text-fg-primary hover:border-line-strong",
364
- className
365
- ),
366
- children: [
367
- /* @__PURE__ */ jsx4(
368
- "span",
369
- {
370
- className: cn(
371
- "min-w-0 truncate",
372
- !value && "text-fg-caption-placeholder"
373
- ),
374
- children: value || placeholder
375
- }
376
- ),
377
- /* @__PURE__ */ jsx4(
378
- ClockIcon,
379
- {
380
- className: cn(
381
- "ml-2 size-4 shrink-0",
382
- disabled ? "text-fg-caption-placeholder" : "text-fg-secondary"
383
- )
384
- }
385
- )
386
- ]
233
+ open,
234
+ className
387
235
  }
388
236
  ),
389
- /* @__PURE__ */ jsxs3(
237
+ /* @__PURE__ */ jsxs(
390
238
  PopoverContent,
391
239
  {
392
240
  showArrow: false,
393
241
  align: "start",
394
242
  className: "min-w-(--anchor-width) gap-0 overflow-hidden rounded-2xl p-0",
395
243
  children: [
396
- /* @__PURE__ */ jsx4("div", { className: "w-full flex gap-2 items-center justify-center border-b border-line-subtle", children: columns.map((column) => /* @__PURE__ */ jsx4(
244
+ /* @__PURE__ */ jsx("div", { className: "flex w-full items-center justify-center gap-2 border-b border-line-subtle", children: columns.map((column) => /* @__PURE__ */ jsx(
397
245
  "p",
398
246
  {
399
247
  className: cn(
@@ -404,33 +252,36 @@ function TimePicker({
404
252
  },
405
253
  column.key
406
254
  )) }),
407
- /* @__PURE__ */ jsxs3(
255
+ /* @__PURE__ */ jsxs(
408
256
  "div",
409
257
  {
410
258
  className: cn(
411
- "flex gap-2 justify-center px-3 pt-2",
259
+ "flex justify-center gap-2 px-3 pt-2",
412
260
  format === "12h" ? "*:w-20.5" : "*:w-31"
413
261
  ),
414
262
  children: [
415
- /* @__PURE__ */ jsx4(
263
+ /* @__PURE__ */ jsx(
416
264
  TimeColumn,
417
265
  {
266
+ label: "Hour",
418
267
  items: format === "12h" ? HOURS_12 : HOURS_24,
419
268
  value: pending.hour,
420
269
  onChange: (hour) => setPending((prev) => ({ ...prev, hour }))
421
270
  }
422
271
  ),
423
- /* @__PURE__ */ jsx4(
272
+ /* @__PURE__ */ jsx(
424
273
  TimeColumn,
425
274
  {
275
+ label: "Minute",
426
276
  items: MINUTES,
427
277
  value: pending.minute,
428
278
  onChange: (minute) => setPending((prev) => ({ ...prev, minute }))
429
279
  }
430
280
  ),
431
- format === "12h" && /* @__PURE__ */ jsx4(
281
+ format === "12h" && /* @__PURE__ */ jsx(
432
282
  TimeColumn,
433
283
  {
284
+ label: "Period",
434
285
  items: PERIODS,
435
286
  value: pending.period,
436
287
  onChange: (period) => setPending((prev) => ({ ...prev, period }))
@@ -439,28 +290,17 @@ function TimePicker({
439
290
  ]
440
291
  }
441
292
  ),
442
- /* @__PURE__ */ jsxs3("div", { className: "mt-2 flex items-center justify-between border-t border-line-subtle px-4 py-3", children: [
443
- /* @__PURE__ */ jsx4(
444
- Button,
445
- {
446
- variant: "tertiary-outline",
447
- size: "sm",
448
- onClick: () => setOpen(false),
449
- children: "Cancel"
450
- }
451
- ),
452
- /* @__PURE__ */ jsx4(
453
- Button,
454
- {
455
- size: "sm",
456
- onClick: () => {
457
- onChange?.(formatTimeValue(pending, format));
458
- setOpen(false);
459
- },
460
- children: "Apply"
293
+ /* @__PURE__ */ jsx("div", { className: "mt-2 w-full", children: /* @__PURE__ */ jsx(
294
+ PickerFooter,
295
+ {
296
+ secondaryLabel: "Cancel",
297
+ onSecondary: () => setOpen(false),
298
+ onApply: () => {
299
+ onChange?.(formatTimeValue(pending, format));
300
+ setOpen(false);
461
301
  }
462
- )
463
- ] })
302
+ }
303
+ ) })
464
304
  ]
465
305
  }
466
306
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/time-picker.tsx","../src/lib/cn.ts","../src/components/ui/button.tsx","../src/components/ui/size-context.tsx","../src/components/ui/popover.tsx"],"sourcesContent":["\"use client\";\n\nimport { ClockIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { Button } from \"./button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nconst ITEM_HEIGHT = 40;\nconst VISIBLE_COUNT = 5;\nconst SCROLL_PADDING = Math.floor(VISIBLE_COUNT / 2) * ITEM_HEIGHT;\n// Tilt off-center items so the column reads as a scrollable wheel — a gentle\n// dome, not the full iOS cylinder. Clamped to this many items each side.\nconst CURVE_CLAMP = 3;\n\nconst HOURS_12 = Array.from({ length: 12 }, (_, i) =>\n\tString(i + 1).padStart(2, \"0\"),\n);\nconst HOURS_24 = Array.from({ length: 24 }, (_, i) =>\n\tString(i).padStart(2, \"0\"),\n);\nconst MINUTES = Array.from({ length: 60 }, (_, i) =>\n\tString(i).padStart(2, \"0\"),\n);\nconst PERIODS = [\"AM\", \"PM\"] as const;\n\ntype Period = \"AM\" | \"PM\";\n\ninterface TimeValue {\n\thour: string;\n\tminute: string;\n\tperiod: Period | \"\";\n}\n\nfunction parseTimeString(\n\tvalue: string | undefined,\n\tformat: \"12h\" | \"24h\",\n): TimeValue {\n\tif (value) {\n\t\tif (format === \"12h\") {\n\t\t\tconst m = value.match(/^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i);\n\t\t\tif (m) {\n\t\t\t\treturn {\n\t\t\t\t\thour: m[1].padStart(2, \"0\"),\n\t\t\t\t\tminute: m[2],\n\t\t\t\t\tperiod: m[3].toUpperCase() as Period,\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\tconst m = value.match(/^(\\d{1,2}):(\\d{2})$/);\n\t\t\tif (m) {\n\t\t\t\treturn { hour: m[1].padStart(2, \"0\"), minute: m[2], period: \"\" };\n\t\t\t}\n\t\t}\n\t}\n\tconst now = new Date();\n\tif (format === \"12h\") {\n\t\tconst h = now.getHours();\n\t\treturn {\n\t\t\thour: String(h % 12 || 12).padStart(2, \"0\"),\n\t\t\tminute: String(now.getMinutes()).padStart(2, \"0\"),\n\t\t\tperiod: h >= 12 ? \"PM\" : \"AM\",\n\t\t};\n\t}\n\treturn {\n\t\thour: String(now.getHours()).padStart(2, \"0\"),\n\t\tminute: String(now.getMinutes()).padStart(2, \"0\"),\n\t\tperiod: \"\",\n\t};\n}\n\nfunction formatTimeValue(tv: TimeValue, format: \"12h\" | \"24h\"): string {\n\tif (format === \"12h\") return `${tv.hour}:${tv.minute} ${tv.period}`;\n\treturn `${tv.hour}:${tv.minute}`;\n}\n\n// ─── TimeColumn ────────────────────────────────────────────────────────────────\n\ninterface TimeColumnProps {\n\titems: readonly string[];\n\tvalue: string;\n\tonChange: (v: string) => void;\n}\n\nfunction TimeColumn({ items, value, onChange }: TimeColumnProps) {\n\tconst scrollRef = React.useRef<HTMLDivElement>(null);\n\tconst itemRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\tconst [centerIndex, setCenterIndex] = React.useState(() =>\n\t\tMath.max(0, items.indexOf(value)),\n\t);\n\tconst isProgrammatic = React.useRef(false);\n\tconst settleRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst onChangeRef = React.useRef(onChange);\n\tonChangeRef.current = onChange;\n\n\t// Tilt + fade each item by its distance from the viewport centre. Derived\n\t// purely from scrollTop (offset in item units), so it never fights layout.\n\tconst paintCurve = React.useCallback(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tconst offset = el.scrollTop / ITEM_HEIGHT;\n\t\titemRefs.current.forEach((node, index) => {\n\t\t\tif (!node) return;\n\t\t\tconst distance = index - offset;\n\t\t\tconst abs = Math.min(Math.abs(distance), CURVE_CLAMP);\n\t\t\tconst tilt = Math.max(Math.min(distance, CURVE_CLAMP), -CURVE_CLAMP);\n\t\t\tnode.style.opacity = String(Math.max(1 - abs * 0.28, 0.2));\n\t\t\tnode.style.transform = `perspective(280px) rotateX(${tilt * -20}deg) scale(${1 - abs * 0.04})`;\n\t\t});\n\t}, []);\n\n\t// Seed scroll position on mount (runs while the panel is visible, so the\n\t// layout-based scrollTop sticks even mid open-animation).\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: mount-only seed from the initial index.\n\tReact.useEffect(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tisProgrammatic.current = true;\n\t\tel.scrollTop = centerIndex * ITEM_HEIGHT;\n\t\tpaintCurve();\n\t\trequestAnimationFrame(() => {\n\t\t\tisProgrammatic.current = false;\n\t\t});\n\t}, []);\n\n\t// Re-centre when the value prop changes from outside (not our own scroll).\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: only re-sync on external value changes.\n\tReact.useEffect(() => {\n\t\tconst idx = items.indexOf(value);\n\t\tif (idx === -1 || idx === centerIndex) return;\n\t\tsetCenterIndex(idx);\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tisProgrammatic.current = true;\n\t\tel.scrollTo({ top: idx * ITEM_HEIGHT, behavior: \"smooth\" });\n\t\tsetTimeout(() => {\n\t\t\tisProgrammatic.current = false;\n\t\t\tpaintCurve();\n\t\t}, 320);\n\t}, [value]);\n\n\tfunction handleScroll() {\n\t\tpaintCurve();\n\t\tif (isProgrammatic.current) return;\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tconst idx = Math.max(\n\t\t\t0,\n\t\t\tMath.min(Math.round(el.scrollTop / ITEM_HEIGHT), items.length - 1),\n\t\t);\n\t\tif (idx !== centerIndex) setCenterIndex(idx);\n\t\tif (settleRef.current) clearTimeout(settleRef.current);\n\t\tsettleRef.current = setTimeout(() => onChangeRef.current(items[idx]), 120);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRef}\n\t\t\tonScroll={handleScroll}\n\t\t\tstyle={{ height: `${VISIBLE_COUNT * ITEM_HEIGHT}px` }}\n\t\t\tclassName=\"overflow-y-scroll [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n\t\t>\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tpaddingTop: `${SCROLL_PADDING}px`,\n\t\t\t\t\tpaddingBottom: `${SCROLL_PADDING}px`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\tconst dist = Math.abs(index - centerIndex);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\titemRefs.current[index] = node;\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tscrollRef.current?.scrollTo({\n\t\t\t\t\t\t\t\t\ttop: index * ITEM_HEIGHT,\n\t\t\t\t\t\t\t\t\tbehavior: \"smooth\",\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstyle={{ height: `${ITEM_HEIGHT}px` }}\n\t\t\t\t\t\t\tclassName=\"flex w-full cursor-pointer items-center justify-center select-none will-change-transform\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"rounded-full px-4 py-1.5 text-gdt-sm font-medium transition-colors\",\n\t\t\t\t\t\t\t\t\tdist === 0\n\t\t\t\t\t\t\t\t\t\t? \"bg-action-primary text-fg-on-brand\"\n\t\t\t\t\t\t\t\t\t\t: dist === 1\n\t\t\t\t\t\t\t\t\t\t\t? \"text-fg-secondary\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-fg-caption-placeholder\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// ─── TimePicker ───────────────────────────────────────────────────────────────\n\ninterface TimePickerProps {\n\tvalue?: string;\n\tonChange?: (time: string | undefined) => void;\n\tformat?: \"12h\" | \"24h\";\n\tdisabled?: boolean;\n\tplaceholder?: string;\n\tclassName?: string;\n}\n\nfunction TimePicker({\n\tvalue,\n\tonChange,\n\tformat = \"12h\",\n\tdisabled = false,\n\tplaceholder = \"Select time\",\n\tclassName,\n}: TimePickerProps) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [pending, setPending] = React.useState<TimeValue>(() =>\n\t\tparseTimeString(value, format),\n\t);\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tif (next) setPending(parseTimeString(value, format));\n\t\tsetOpen(next);\n\t}\n\n\tconst columns = [\n\t\t{ key: \"Hour\", show: true },\n\t\t{ key: \"Minute\", show: true },\n\t\t{ key: \"Period\", show: format === \"12h\" },\n\t].filter((c) => c.show);\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex h-10 w-full items-center justify-between rounded-full border px-3.5 text-gdt-sm transition-[border-color,box-shadow] outline-none\",\n\t\t\t\t\tdisabled\n\t\t\t\t\t\t? \"cursor-not-allowed border-line-subtle bg-surface text-fg-caption-placeholder\"\n\t\t\t\t\t\t: open\n\t\t\t\t\t\t\t? \"border-line-focus bg-canvas text-fg-primary inset-ring-1 inset-ring-line-focus\"\n\t\t\t\t\t\t\t: \"border-line bg-canvas text-fg-primary hover:border-line-strong\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"min-w-0 truncate\",\n\t\t\t\t\t\t!value && \"text-fg-caption-placeholder\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{value || placeholder}\n\t\t\t\t</span>\n\t\t\t\t<ClockIcon\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"ml-2 size-4 shrink-0\",\n\t\t\t\t\t\tdisabled ? \"text-fg-caption-placeholder\" : \"text-fg-secondary\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\tclassName=\"min-w-(--anchor-width) gap-0 overflow-hidden rounded-2xl p-0\"\n\t\t\t>\n\t\t\t\t<div className=\"w-full flex gap-2 items-center justify-center border-b border-line-subtle\">\n\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"py-3 text-center text-gdt-xs text-fg-caption-placeholder\",\n\t\t\t\t\t\t\t\tformat === \"12h\" ? \"w-20.5\" : \"w-31\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{column.key}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex gap-2 justify-center px-3 pt-2\",\n\t\t\t\t\t\tformat === \"12h\" ? \"*:w-20.5\" : \"*:w-31\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\titems={format === \"12h\" ? HOURS_12 : HOURS_24}\n\t\t\t\t\t\tvalue={pending.hour}\n\t\t\t\t\t\tonChange={(hour) => setPending((prev) => ({ ...prev, hour }))}\n\t\t\t\t\t/>\n\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\titems={MINUTES}\n\t\t\t\t\t\tvalue={pending.minute}\n\t\t\t\t\t\tonChange={(minute) => setPending((prev) => ({ ...prev, minute }))}\n\t\t\t\t\t/>\n\t\t\t\t\t{format === \"12h\" && (\n\t\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\t\titems={PERIODS}\n\t\t\t\t\t\t\tvalue={pending.period}\n\t\t\t\t\t\t\tonChange={(period) =>\n\t\t\t\t\t\t\t\tsetPending((prev) => ({ ...prev, period: period as Period }))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-2 flex items-center justify-between border-t border-line-subtle px-4 py-3\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"tertiary-outline\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={() => setOpen(false)}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tonChange?.(formatTimeValue(pending, format));\n\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tApply\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\nexport { TimePicker };\nexport type { TimePickerProps };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [\n\t\t\t\t{\n\t\t\t\t\ttext: [\n\t\t\t\t\t\t\"gdt-display\",\n\t\t\t\t\t\t\"gdt-h1\",\n\t\t\t\t\t\t\"gdt-h2\",\n\t\t\t\t\t\t\"gdt-h3\",\n\t\t\t\t\t\t\"gdt-h4\",\n\t\t\t\t\t\t\"gdt-h5\",\n\t\t\t\t\t\t\"gdt-xl\",\n\t\t\t\t\t\t\"gdt-lg\",\n\t\t\t\t\t\t\"gdt-md\",\n\t\t\t\t\t\t\"gdt-sm\",\n\t\t\t\t\t\t\"gdt-xs\",\n\t\t\t\t\t\t\"gdt-subtext\",\n\t\t\t\t\t\t\"gdt-capitalized\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n});\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","import { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Loader } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useComponentSize } from \"./size-context\";\n\nconst buttonVariants = cva(\n\t\"group/button inline-flex shrink-0 items-center justify-center rounded-full bg-clip-padding whitespace-nowrap font-bold transition-[background-color,color,border-color,box-shadow,transform] outline-none select-none focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-invalid:border-line-danger aria-invalid:ring-3 aria-invalid:ring-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tprimary:\n\t\t\t\t\t\"bg-action-primary text-fg-on-brand hover:bg-action-primary-hover active:bg-action-primary-pressed\",\n\t\t\t\t\"primary-outline\":\n\t\t\t\t\t\"border-2 border-action-primary bg-transparent text-fg-brand hover:bg-surface-brand-subtle active:bg-surface-brand-subtle data-focused:bg-surface-brand-subtle data-pressed:bg-surface-brand-subtle\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"bg-surface-brand-subtle text-fg-brand hover:bg-action-primary-hover hover:text-fg-on-brand active:bg-action-primary-pressed active:text-fg-on-brand data-focused:bg-action-primary-hover data-pressed:bg-action-primary-pressed data-focused:text-fg-on-brand data-pressed:text-fg-on-brand\",\n\t\t\t\t\"secondary-outline\":\n\t\t\t\t\t\"border-2 border-action-secondary bg-transparent text-fg-brand hover:bg-surface-brand-subtle active:bg-surface-brand-subtle data-focused:bg-surface-brand-subtle data-pressed:bg-surface-brand-subtle\",\n\t\t\t\ttertiary:\n\t\t\t\t\t\"bg-action-tertiary text-fg-primary hover:bg-action-tertiary-hover active:bg-action-tertiary-pressed data-focused:bg-action-tertiary-hover data-pressed:bg-action-tertiary-pressed\",\n\t\t\t\t\"tertiary-outline\":\n\t\t\t\t\t\"border border-line-strong bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised data-focused:bg-surface data-pressed:bg-surface-raised\",\n\t\t\t\tghost:\n\t\t\t\t\t\"bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised data-focused:bg-surface data-pressed:bg-surface-raised\",\n\t\t\t\tdanger:\n\t\t\t\t\t\"bg-action-danger text-fg-on-brand hover:bg-action-danger-hover active:bg-action-danger-pressed data-focused:bg-action-danger-hover data-pressed:bg-action-danger-pressed\",\n\t\t\t\t\"glass-overlay\": \"bg-surface-glass-overlay-button text-fg-on-brand\",\n\t\t\t\t\"link-brand\":\n\t\t\t\t\t\"border-transparent bg-transparent px-0 text-fg-brand hover:underline active:underline active:opacity-70\",\n\t\t\t\t\"link-neutral\":\n\t\t\t\t\t\"border-transparent bg-transparent px-0 text-fg-secondary hover:underline active:underline active:opacity-70\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tsm: \"h-8 gap-2 px-3.5 text-gdt-xs has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3 [&_svg:not([class*='size-'])]:size-3.5\",\n\t\t\t\tmd: \"h-10 gap-2 px-4.5 text-gdt-sm has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4\",\n\t\t\t\tlg: \"h-12.5 gap-2.5 px-5.5 text-gdt-md has-data-[icon=inline-end]:pr-5 has-data-[icon=inline-start]:pl-5 [&_svg:not([class*='size-'])]:size-4.5\",\n\t\t\t\txl: \"h-14 gap-3 px-6.5 text-gdt-lg has-data-[icon=inline-end]:pr-6 has-data-[icon=inline-start]:pl-6 [&_svg:not([class*='size-'])]:size-5\",\n\t\t\t\ticon: \"size-10\",\n\t\t\t\t\"icon-xs\": \"size-6 text-gdt-xs [&_svg:not([class*='size-'])]:size-3\",\n\t\t\t\t\"icon-sm\": \"size-8 text-gdt-sm [&_svg:not([class*='size-'])]:size-3.5\",\n\t\t\t\t\"icon-lg\":\n\t\t\t\t\t\"size-12.5 text-gdt-md [&_svg:not([class*='size-'])]:size-4.5\",\n\t\t\t\t\"icon-xl\": \"size-14 text-gdt-lg [&_svg:not([class*='size-'])]:size-5\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"primary\",\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\ntype ButtonSize = NonNullable<VariantProps<typeof buttonVariants>[\"size\"]>;\n\nfunction Button({\n\tclassName,\n\tvariant = \"primary\",\n\tsize,\n\tisLoading = false,\n\tchildren,\n\tdisabled = false,\n\t...props\n}: ButtonPrimitive.Props &\n\tVariantProps<typeof buttonVariants> & { isLoading?: boolean }) {\n\tconst inheritedSize = useComponentSize();\n\tconst resolvedSize = size ?? inheritedSize;\n\tconst _disabled = disabled || isLoading;\n\treturn (\n\t\t<ButtonPrimitive\n\t\t\tdata-slot=\"button\"\n\t\t\tclassName={cn(buttonVariants({ variant, size: resolvedSize, className }))}\n\t\t\tdisabled={_disabled}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isLoading && <Loader className=\"size-4 animate-spin\" />} {children}\n\t\t</ButtonPrimitive>\n\t);\n}\n\ntype ButtonLinkProps = Omit<React.ComponentProps<\"a\">, \"href\"> &\n\tVariantProps<typeof buttonVariants> & {\n\t\tdisabled?: boolean;\n\t\thref: string;\n\t};\n\nfunction ButtonLink({\n\tclassName,\n\thref,\n\tvariant = \"primary\",\n\tsize,\n\tdisabled = false,\n\tonClick,\n\t...props\n}: ButtonLinkProps) {\n\tconst inheritedSize = useComponentSize();\n\tconst resolvedSize: ButtonSize = size ?? inheritedSize;\n\n\treturn (\n\t\t<a\n\t\t\tdata-slot=\"button-link\"\n\t\t\thref={href}\n\t\t\taria-disabled={disabled}\n\t\t\ttabIndex={disabled ? -1 : props.tabIndex}\n\t\t\tclassName={cn(buttonVariants({ variant, size: resolvedSize, className }))}\n\t\t\tonClick={(event) => {\n\t\t\t\tif (disabled) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tonClick?.(event);\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Button, ButtonLink, buttonVariants };\n","\"use client\";\n\nimport { createContext, type ReactNode, useContext } from \"react\";\n\ntype ComponentSize = \"sm\" | \"md\" | \"lg\";\n\nconst SizeContext = createContext<ComponentSize | undefined>(undefined);\n\nfunction SizeProvider({\n\tchildren,\n\tsize,\n}: {\n\tchildren: ReactNode;\n\tsize?: ComponentSize | null;\n}) {\n\tif (!size) {\n\t\treturn <>{children}</>;\n\t}\n\n\treturn <SizeContext.Provider value={size}>{children}</SizeContext.Provider>;\n}\n\nfunction useComponentSize(\n\tsize?: ComponentSize | null,\n\tfallback: ComponentSize = \"md\",\n) {\n\tconst inheritedSize = useContext(SizeContext);\n\treturn size ?? inheritedSize ?? fallback;\n}\n\nexport { SizeProvider, useComponentSize, type ComponentSize };\n","\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { type ComponentSize, SizeProvider } from \"./size-context\";\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n\treturn <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n\treturn <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\ntype PopoverContentProps = PopoverPrimitive.Popup.Props &\n\tPick<\n\t\tPopoverPrimitive.Positioner.Props,\n\t\t\"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n\t> & {\n\t\tshowArrow?: boolean;\n\t\tsize?: ComponentSize;\n\t};\n\nfunction PopoverContent({\n\tclassName,\n\talign = \"center\",\n\talignOffset = 0,\n\tside = \"bottom\",\n\tsideOffset = 6,\n\tshowArrow = true,\n\tsize = \"md\",\n\tchildren,\n\t...props\n}: PopoverContentProps) {\n\treturn (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Positioner\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName=\"isolate z-50\"\n\t\t\t>\n\t\t\t\t<PopoverPrimitive.Popup\n\t\t\t\t\tdata-slot=\"popover-content\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"z-50 relative flex w-72 max-w-[calc(100vw-2rem)] origin-(--transform-origin) flex-col rounded-lg border-0 bg-surface-overlay py-4 text-gdt-sm text-fg-primary shadow-2 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 has-[&_[data-slot=popover-footer]]:pb-0\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<SizeProvider size={size}>{children}</SizeProvider>\n\t\t\t\t\t{showArrow ? (\n\t\t\t\t\t\t<PopoverPrimitive.Arrow className=\"relative block w-3 h-1.5 overflow-clip data-[side=bottom]:top-[-6px] data-[side=left]:right-[-9px] data-[side=left]:rotate-90 data-[side=right]:left-[-9px] data-[side=right]:-rotate-90 data-[side=top]:bottom-[-6px] data-[side=top]:rotate-180 before:content-[''] before:absolute before:bottom-0 before:left-1/2 before:w-[calc(6px*sqrt(2))] before:h-[calc(6px*sqrt(2))] before:bg-surface-overlay before:border before:border-line before:[transform:translate(-50%,50%)_rotate(45deg)]\" />\n\t\t\t\t\t) : null}\n\t\t\t\t</PopoverPrimitive.Popup>\n\t\t\t</PopoverPrimitive.Positioner>\n\t\t</PopoverPrimitive.Portal>\n\t);\n}\n\nfunction PopoverHeader({\n\tclassName,\n\tborder,\n\t...props\n}: React.ComponentProps<\"div\"> & { border?: boolean }) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-0.5 px-4\",\n\t\t\t\tborder && \"border-b border-line-subtle pb-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverBody({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-body\"\n\t\t\tclassName={cn(\"px-4 py-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-row items-center gap-2 px-4 border-t border-line-subtle pt-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n\treturn (\n\t\t<PopoverPrimitive.Title\n\t\t\tdata-slot=\"popover-title\"\n\t\t\tclassName={cn(\"text-gdt-sm font-semibold text-fg-primary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverDescription({\n\tclassName,\n\t...props\n}: PopoverPrimitive.Description.Props) {\n\treturn (\n\t\t<PopoverPrimitive.Description\n\t\t\tdata-slot=\"popover-description\"\n\t\t\tclassName={cn(\"text-gdt-xs font-normal text-fg-secondary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tPopover,\n\tPopoverContent,\n\tPopoverDescription,\n\tPopoverHeader,\n\tPopoverTitle,\n\tPopoverTrigger,\n\tPopoverBody,\n\tPopoverFooter,\n};\n"],"mappings":"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","names":["jsx","jsx","jsxs","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/time-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport { ClockIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"./lib/cn\";\nimport { PickerFooter, PickerTrigger } from \"./lib/picker\";\nimport { Popover, PopoverContent } from \"./popover\";\n\nconst ITEM_HEIGHT = 40;\nconst VISIBLE_COUNT = 5;\nconst SCROLL_PADDING = Math.floor(VISIBLE_COUNT / 2) * ITEM_HEIGHT;\n// Tilt off-center items so the column reads as a scrollable wheel — a gentle\n// dome, not the full iOS cylinder. Clamped to this many items each side.\nconst CURVE_CLAMP = 3;\n\nconst HOURS_12 = Array.from({ length: 12 }, (_, i) =>\n\tString(i + 1).padStart(2, \"0\"),\n);\nconst HOURS_24 = Array.from({ length: 24 }, (_, i) =>\n\tString(i).padStart(2, \"0\"),\n);\nconst MINUTES = Array.from({ length: 60 }, (_, i) =>\n\tString(i).padStart(2, \"0\"),\n);\nconst PERIODS = [\"AM\", \"PM\"] as const;\n\ntype Period = \"AM\" | \"PM\";\n\ninterface TimeValue {\n\thour: string;\n\tminute: string;\n\tperiod: Period | \"\";\n}\n\nfunction parseTimeString(\n\tvalue: string | undefined,\n\tformat: \"12h\" | \"24h\",\n): TimeValue {\n\tif (value) {\n\t\tif (format === \"12h\") {\n\t\t\tconst m = value.match(/^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i);\n\t\t\tif (m) {\n\t\t\t\treturn {\n\t\t\t\t\thour: m[1].padStart(2, \"0\"),\n\t\t\t\t\tminute: m[2],\n\t\t\t\t\tperiod: m[3].toUpperCase() as Period,\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\tconst m = value.match(/^(\\d{1,2}):(\\d{2})$/);\n\t\t\tif (m) {\n\t\t\t\treturn { hour: m[1].padStart(2, \"0\"), minute: m[2], period: \"\" };\n\t\t\t}\n\t\t}\n\t}\n\tconst now = new Date();\n\tif (format === \"12h\") {\n\t\tconst h = now.getHours();\n\t\treturn {\n\t\t\thour: String(h % 12 || 12).padStart(2, \"0\"),\n\t\t\tminute: String(now.getMinutes()).padStart(2, \"0\"),\n\t\t\tperiod: h >= 12 ? \"PM\" : \"AM\",\n\t\t};\n\t}\n\treturn {\n\t\thour: String(now.getHours()).padStart(2, \"0\"),\n\t\tminute: String(now.getMinutes()).padStart(2, \"0\"),\n\t\tperiod: \"\",\n\t};\n}\n\nfunction formatTimeValue(tv: TimeValue, format: \"12h\" | \"24h\"): string {\n\tif (format === \"12h\") return `${tv.hour}:${tv.minute} ${tv.period}`;\n\treturn `${tv.hour}:${tv.minute}`;\n}\n\n// ─── TimeColumn ────────────────────────────────────────────────────────────────\n\ninterface TimeColumnProps {\n\tlabel: string;\n\titems: readonly string[];\n\tvalue: string;\n\tonChange: (v: string) => void;\n}\n\nfunction TimeColumn({ label, items, value, onChange }: TimeColumnProps) {\n\tconst scrollRef = React.useRef<HTMLDivElement>(null);\n\tconst itemRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\tconst [centerIndex, setCenterIndex] = React.useState(() =>\n\t\tMath.max(0, items.indexOf(value)),\n\t);\n\tconst isProgrammatic = React.useRef(false);\n\tconst onChangeRef = React.useRef(onChange);\n\tonChangeRef.current = onChange;\n\n\t// Tilt + fade each item by its distance from the viewport centre. Derived\n\t// purely from scrollTop (offset in item units), so it never fights layout.\n\tconst paintCurve = React.useCallback(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tconst offset = el.scrollTop / ITEM_HEIGHT;\n\t\titemRefs.current.forEach((node, index) => {\n\t\t\tif (!node) return;\n\t\t\tconst distance = index - offset;\n\t\t\tconst abs = Math.min(Math.abs(distance), CURVE_CLAMP);\n\t\t\tconst tilt = Math.max(Math.min(distance, CURVE_CLAMP), -CURVE_CLAMP);\n\t\t\tnode.style.opacity = String(Math.max(1 - abs * 0.28, 0.2));\n\t\t\tnode.style.transform = `perspective(280px) rotateX(${tilt * -20}deg) scale(${1 - abs * 0.04})`;\n\t\t});\n\t}, []);\n\n\t// Seed scroll position on mount (runs while the panel is visible, so the\n\t// layout-based scrollTop sticks even mid open-animation).\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: mount-only seed from the initial index.\n\tReact.useEffect(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tisProgrammatic.current = true;\n\t\tel.scrollTop = centerIndex * ITEM_HEIGHT;\n\t\tpaintCurve();\n\t\trequestAnimationFrame(() => {\n\t\t\tisProgrammatic.current = false;\n\t\t});\n\t}, []);\n\n\t// Re-centre when the value prop changes from outside (not our own scroll).\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: only re-sync on external value changes.\n\tReact.useEffect(() => {\n\t\tconst idx = items.indexOf(value);\n\t\tif (idx === -1 || idx === centerIndex) return;\n\t\tsetCenterIndex(idx);\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tisProgrammatic.current = true;\n\t\tel.scrollTo({ top: idx * ITEM_HEIGHT, behavior: \"smooth\" });\n\t\tsetTimeout(() => {\n\t\t\tisProgrammatic.current = false;\n\t\t\tpaintCurve();\n\t\t}, 320);\n\t}, [value]);\n\n\t// Clicking an item commits immediately; the smooth scroll that follows is\n\t// cosmetic, so an Apply click mid-animation still reads the chosen value.\n\tfunction selectIndex(index: number) {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tisProgrammatic.current = true;\n\t\tsetCenterIndex(index);\n\t\tonChangeRef.current(items[index]);\n\t\tel.scrollTo({ top: index * ITEM_HEIGHT, behavior: \"smooth\" });\n\t\tsetTimeout(() => {\n\t\t\tisProgrammatic.current = false;\n\t\t}, 350);\n\t}\n\n\t// Commit as soon as the centred item changes — no settle debounce, so an\n\t// Apply click mid-scroll can never read a stale value. Scroll-snap on the\n\t// container guarantees the wheel always rests exactly on an item.\n\tfunction handleScroll() {\n\t\tpaintCurve();\n\t\tif (isProgrammatic.current) return;\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tconst idx = Math.max(\n\t\t\t0,\n\t\t\tMath.min(Math.round(el.scrollTop / ITEM_HEIGHT), items.length - 1),\n\t\t);\n\t\tif (idx !== centerIndex) {\n\t\t\tsetCenterIndex(idx);\n\t\t\tonChangeRef.current(items[idx]);\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"relative\">\n\t\t\t{/* iOS-style fixed highlight: the pill never moves, items scroll into it. */}\n\t\t\t<div\n\t\t\t\taria-hidden\n\t\t\t\tstyle={{ height: `${ITEM_HEIGHT - 4}px` }}\n\t\t\t\tclassName=\"pointer-events-none absolute inset-x-0.5 top-1/2 -translate-y-1/2 rounded-full bg-action-primary\"\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tref={scrollRef}\n\t\t\t\tonScroll={handleScroll}\n\t\t\t\trole=\"listbox\"\n\t\t\t\taria-label={label}\n\t\t\t\tstyle={{ height: `${VISIBLE_COUNT * ITEM_HEIGHT}px` }}\n\t\t\t\tclassName=\"relative snap-y snap-mandatory overflow-y-scroll overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tpaddingTop: `${SCROLL_PADDING}px`,\n\t\t\t\t\t\tpaddingBottom: `${SCROLL_PADDING}px`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\tconst dist = Math.abs(index - centerIndex);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\taria-selected={index === centerIndex}\n\t\t\t\t\t\t\t\t// Roving tabindex: only the centred item is tabbable, so the\n\t\t\t\t\t\t\t\t// popover's initial focus lands on an already-visible button\n\t\t\t\t\t\t\t\t// instead of scrolling the wheel to its first item.\n\t\t\t\t\t\t\t\ttabIndex={index === centerIndex ? 0 : -1}\n\t\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\titemRefs.current[index] = node;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonClick={() => selectIndex(index)}\n\t\t\t\t\t\t\t\tstyle={{ height: `${ITEM_HEIGHT}px` }}\n\t\t\t\t\t\t\t\tclassName=\"flex w-full cursor-pointer snap-center items-center justify-center select-none will-change-transform\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"text-gdt-sm font-medium transition-colors\",\n\t\t\t\t\t\t\t\t\t\tdist === 0\n\t\t\t\t\t\t\t\t\t\t\t? \"text-fg-on-brand\"\n\t\t\t\t\t\t\t\t\t\t\t: dist === 1\n\t\t\t\t\t\t\t\t\t\t\t\t? \"text-fg-secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"text-fg-caption-placeholder\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{item}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// ─── TimePicker ───────────────────────────────────────────────────────────────\n\ninterface TimePickerProps {\n\tvalue?: string;\n\tonChange?: (time: string | undefined) => void;\n\tformat?: \"12h\" | \"24h\";\n\tdisabled?: boolean;\n\tplaceholder?: string;\n\tclassName?: string;\n}\n\nfunction TimePicker({\n\tvalue,\n\tonChange,\n\tformat = \"12h\",\n\tdisabled = false,\n\tplaceholder = \"Select time\",\n\tclassName,\n}: TimePickerProps) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [pending, setPending] = React.useState<TimeValue>(() =>\n\t\tparseTimeString(value, format),\n\t);\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tif (next) setPending(parseTimeString(value, format));\n\t\tsetOpen(next);\n\t}\n\n\tconst columns = [\n\t\t{ key: \"Hour\", show: true },\n\t\t{ key: \"Minute\", show: true },\n\t\t{ key: \"Period\", show: format === \"12h\" },\n\t].filter((c) => c.show);\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PickerTrigger\n\t\t\t\ticon={ClockIcon}\n\t\t\t\tdisplayValue={value ?? \"\"}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\topen={open}\n\t\t\t\tclassName={className}\n\t\t\t/>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\tclassName=\"min-w-(--anchor-width) gap-0 overflow-hidden rounded-2xl p-0\"\n\t\t\t>\n\t\t\t\t<div className=\"flex w-full items-center justify-center gap-2 border-b border-line-subtle\">\n\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"py-3 text-center text-gdt-xs text-fg-caption-placeholder\",\n\t\t\t\t\t\t\t\tformat === \"12h\" ? \"w-20.5\" : \"w-31\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{column.key}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex justify-center gap-2 px-3 pt-2\",\n\t\t\t\t\t\tformat === \"12h\" ? \"*:w-20.5\" : \"*:w-31\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\tlabel=\"Hour\"\n\t\t\t\t\t\titems={format === \"12h\" ? HOURS_12 : HOURS_24}\n\t\t\t\t\t\tvalue={pending.hour}\n\t\t\t\t\t\tonChange={(hour) => setPending((prev) => ({ ...prev, hour }))}\n\t\t\t\t\t/>\n\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\tlabel=\"Minute\"\n\t\t\t\t\t\titems={MINUTES}\n\t\t\t\t\t\tvalue={pending.minute}\n\t\t\t\t\t\tonChange={(minute) => setPending((prev) => ({ ...prev, minute }))}\n\t\t\t\t\t/>\n\t\t\t\t\t{format === \"12h\" && (\n\t\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\t\tlabel=\"Period\"\n\t\t\t\t\t\t\titems={PERIODS}\n\t\t\t\t\t\t\tvalue={pending.period}\n\t\t\t\t\t\t\tonChange={(period) =>\n\t\t\t\t\t\t\t\tsetPending((prev) => ({ ...prev, period: period as Period }))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-2 w-full\">\n\t\t\t\t\t<PickerFooter\n\t\t\t\t\t\tsecondaryLabel=\"Cancel\"\n\t\t\t\t\t\tonSecondary={() => setOpen(false)}\n\t\t\t\t\t\tonApply={() => {\n\t\t\t\t\t\t\tonChange?.(formatTimeValue(pending, format));\n\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\nexport { TimePicker };\nexport type { TimePickerProps };\n"],"mappings":"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","names":[]}