@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.
- package/README.md +18 -6
- package/css/base.css +37 -0
- package/css/components.css +135 -0
- package/css/generated/shared.css +1 -0
- package/css/giddaa.css +402 -0
- package/css/preset.css +77 -0
- package/css/styles.css +2 -0
- package/css/theme.css +255 -0
- package/dist/accordion.js +5 -35
- package/dist/accordion.js.map +1 -1
- package/dist/activity-timeline.d.ts +33 -0
- package/dist/activity-timeline.js +212 -0
- package/dist/activity-timeline.js.map +1 -0
- package/dist/alert.js +5 -35
- package/dist/alert.js.map +1 -1
- package/dist/auth-layout.d.ts +23 -0
- package/dist/auth-layout.js +304 -0
- package/dist/auth-layout.js.map +1 -0
- package/dist/avatar.js +10 -142
- package/dist/avatar.js.map +1 -1
- package/dist/badge.d.ts +3 -2
- package/dist/badge.js +6 -114
- package/dist/badge.js.map +1 -1
- package/dist/bar-chart.d.ts +101 -77
- package/dist/bar-chart.js +142 -220
- package/dist/bar-chart.js.map +1 -1
- package/dist/breadcrumb.js +5 -35
- package/dist/breadcrumb.js.map +1 -1
- package/dist/bullet-chart.js +15 -48
- package/dist/bullet-chart.js.map +1 -1
- package/dist/button-group.js +14 -90
- package/dist/button-group.js.map +1 -1
- package/dist/button.d.ts +5 -5
- package/dist/button.js +7 -140
- package/dist/button.js.map +1 -1
- package/dist/calendar.js +12 -287
- package/dist/calendar.js.map +1 -1
- package/dist/card.js +5 -35
- package/dist/card.js.map +1 -1
- package/dist/carousel.js +12 -386
- package/dist/carousel.js.map +1 -1
- package/dist/chart.js +16 -480
- package/dist/chart.js.map +1 -1
- package/dist/checkbox.d.ts +1 -1
- package/dist/checkbox.js +13 -48
- package/dist/checkbox.js.map +1 -1
- package/dist/chunk-322YCNVL.js +278 -0
- package/dist/chunk-322YCNVL.js.map +1 -0
- package/dist/chunk-3ACQVT7A.js +25 -0
- package/dist/chunk-3ACQVT7A.js.map +1 -0
- package/dist/chunk-3T65TLJX.js +334 -0
- package/dist/chunk-3T65TLJX.js.map +1 -0
- package/dist/chunk-6ZSGQHH2.js +192 -0
- package/dist/chunk-6ZSGQHH2.js.map +1 -0
- package/dist/chunk-7TBMLFGW.js +41 -0
- package/dist/chunk-7TBMLFGW.js.map +1 -0
- package/dist/chunk-B4H6RNDH.js +135 -0
- package/dist/chunk-B4H6RNDH.js.map +1 -0
- package/dist/chunk-BUXCGZ6X.js +219 -0
- package/dist/chunk-BUXCGZ6X.js.map +1 -0
- package/dist/chunk-CHII2QHH.js +58 -0
- package/dist/chunk-CHII2QHH.js.map +1 -0
- package/dist/chunk-DMNOXRRW.js +147 -0
- package/dist/chunk-DMNOXRRW.js.map +1 -0
- package/dist/chunk-EFSOSSIC.js +130 -0
- package/dist/chunk-EFSOSSIC.js.map +1 -0
- package/dist/chunk-FZDSVMKY.js +363 -0
- package/dist/chunk-FZDSVMKY.js.map +1 -0
- package/dist/chunk-GJOFIJS3.js +246 -0
- package/dist/chunk-GJOFIJS3.js.map +1 -0
- package/dist/chunk-HL3ZSYES.js +23 -0
- package/dist/chunk-HL3ZSYES.js.map +1 -0
- package/dist/chunk-JVLUBAPB.js +129 -0
- package/dist/chunk-JVLUBAPB.js.map +1 -0
- package/dist/chunk-KDPYSOYZ.js +64 -0
- package/dist/chunk-KDPYSOYZ.js.map +1 -0
- package/dist/chunk-KSMDANKI.js +43 -0
- package/dist/chunk-KSMDANKI.js.map +1 -0
- package/dist/chunk-MEKCCOP5.js +46 -0
- package/dist/chunk-MEKCCOP5.js.map +1 -0
- package/dist/chunk-NOFXVRWL.js +451 -0
- package/dist/chunk-NOFXVRWL.js.map +1 -0
- package/dist/chunk-PC5MHNVA.js +171 -0
- package/dist/chunk-PC5MHNVA.js.map +1 -0
- package/dist/chunk-QKAQZ2GU.js +122 -0
- package/dist/chunk-QKAQZ2GU.js.map +1 -0
- package/dist/chunk-QZHSHSVV.js +26 -0
- package/dist/chunk-QZHSHSVV.js.map +1 -0
- package/dist/chunk-RBMK26XD.js +19 -0
- package/dist/chunk-RBMK26XD.js.map +1 -0
- package/dist/chunk-SFNJGF6M.js +262 -0
- package/dist/chunk-SFNJGF6M.js.map +1 -0
- package/dist/chunk-UJJNLGTM.js +112 -0
- package/dist/chunk-UJJNLGTM.js.map +1 -0
- package/dist/chunk-VGR4ZWJ3.js +418 -0
- package/dist/chunk-VGR4ZWJ3.js.map +1 -0
- package/dist/chunk-XG47P6D4.js +99 -0
- package/dist/chunk-XG47P6D4.js.map +1 -0
- package/dist/chunk-XZZAHNVM.js +21 -0
- package/dist/chunk-XZZAHNVM.js.map +1 -0
- package/dist/chunk-Y4TTYVNE.js +36 -0
- package/dist/chunk-Y4TTYVNE.js.map +1 -0
- package/dist/chunk-YDWIHW6Q.js +69 -0
- package/dist/chunk-YDWIHW6Q.js.map +1 -0
- package/dist/collapsible.js +6 -35
- package/dist/collapsible.js.map +1 -1
- package/dist/combobox.js +26 -694
- package/dist/combobox.js.map +1 -1
- package/dist/cta.d.ts +66 -0
- package/dist/cta.js +358 -0
- package/dist/cta.js.map +1 -0
- package/dist/currency-selector.d.ts +42 -0
- package/dist/currency-selector.js +192 -0
- package/dist/currency-selector.js.map +1 -0
- package/dist/date-picker.d.ts +18 -10
- package/dist/date-picker.js +105 -430
- package/dist/date-picker.js.map +1 -1
- package/dist/details-card.d.ts +19 -0
- package/dist/details-card.js +267 -0
- package/dist/details-card.js.map +1 -0
- package/dist/dialog.js +36 -146
- package/dist/dialog.js.map +1 -1
- package/dist/dropdown-menu.d.ts +1 -1
- package/dist/dropdown-menu.js +20 -358
- package/dist/dropdown-menu.js.map +1 -1
- package/dist/dropzone.js +13 -40
- package/dist/dropzone.js.map +1 -1
- package/dist/editorial-card.d.ts +29 -0
- package/dist/editorial-card.js +311 -0
- package/dist/editorial-card.js.map +1 -0
- package/dist/empty-state.js +5 -35
- package/dist/empty-state.js.map +1 -1
- package/dist/field.js +30 -135
- package/dist/field.js.map +1 -1
- package/dist/footer.d.ts +47 -0
- package/dist/footer.js +430 -0
- package/dist/footer.js.map +1 -0
- package/dist/funnel-chart.js +42 -415
- package/dist/funnel-chart.js.map +1 -1
- package/dist/gallery-indicator.d.ts +18 -0
- package/dist/gallery-indicator.js +12 -0
- package/dist/gallery-indicator.js.map +1 -0
- package/dist/heatmap-chart.d.ts +98 -0
- package/dist/heatmap-chart.js +248 -0
- package/dist/heatmap-chart.js.map +1 -0
- package/dist/infotip.d.ts +11 -0
- package/dist/infotip.js +66 -0
- package/dist/infotip.js.map +1 -0
- package/dist/input-group.d.ts +2 -1
- package/dist/input-group.js +15 -371
- package/dist/input-group.js.map +1 -1
- package/dist/input-size-context.js +5 -19
- package/dist/input-size-context.js.map +1 -1
- package/dist/input.js +6 -78
- package/dist/input.js.map +1 -1
- package/dist/item.js +5 -35
- package/dist/item.js.map +1 -1
- package/dist/kpi-card.js +12 -52
- package/dist/kpi-card.js.map +1 -1
- package/dist/label.js +5 -64
- package/dist/label.js.map +1 -1
- package/dist/line-chart.js +9 -166
- package/dist/line-chart.js.map +1 -1
- package/dist/logo.js +4 -141
- package/dist/logo.js.map +1 -1
- package/dist/map-indicator.d.ts +13 -0
- package/dist/map-indicator.js +109 -0
- package/dist/map-indicator.js.map +1 -0
- package/dist/match.d.ts +16 -0
- package/dist/match.js +113 -0
- package/dist/match.js.map +1 -0
- package/dist/media-gallery-hero.d.ts +60 -0
- package/dist/media-gallery-hero.js +362 -0
- package/dist/media-gallery-hero.js.map +1 -0
- package/dist/media-player.d.ts +60 -0
- package/dist/media-player.js +1394 -0
- package/dist/media-player.js.map +1 -0
- package/dist/number-input.js +30 -325
- package/dist/number-input.js.map +1 -1
- package/dist/page-header.js +4 -32
- package/dist/page-header.js.map +1 -1
- package/dist/pagination.d.ts +1 -0
- package/dist/pagination.js +27 -161
- package/dist/pagination.js.map +1 -1
- package/dist/password-input.d.ts +1 -0
- package/dist/password-input.js +21 -319
- package/dist/password-input.js.map +1 -1
- package/dist/phone-input.d.ts +2 -1
- package/dist/phone-input.js +148 -359
- package/dist/phone-input.js.map +1 -1
- package/dist/photo-gallery.d.ts +1 -1
- package/dist/photo-gallery.js +97 -393
- package/dist/photo-gallery.js.map +1 -1
- package/dist/pie-chart.js +17 -52
- package/dist/pie-chart.js.map +1 -1
- package/dist/popover.js +13 -158
- package/dist/popover.js.map +1 -1
- package/dist/price-tag.d.ts +35 -0
- package/dist/price-tag.js +178 -0
- package/dist/price-tag.js.map +1 -0
- package/dist/progress.d.ts +5 -2
- package/dist/progress.js +14 -303
- package/dist/progress.js.map +1 -1
- package/dist/property-listing-card.d.ts +32 -0
- package/dist/property-listing-card.js +235 -0
- package/dist/property-listing-card.js.map +1 -0
- package/dist/radar-chart.d.ts +110 -0
- package/dist/radar-chart.js +147 -0
- package/dist/radar-chart.js.map +1 -0
- package/dist/radio-group.js +15 -50
- package/dist/radio-group.js.map +1 -1
- package/dist/review-block.d.ts +20 -0
- package/dist/review-block.js +10 -0
- package/dist/review-block.js.map +1 -0
- package/dist/rich-text-editor.js +172 -433
- package/dist/rich-text-editor.js.map +1 -1
- package/dist/scatter-chart.d.ts +142 -0
- package/dist/scatter-chart.js +252 -0
- package/dist/scatter-chart.js.map +1 -0
- package/dist/search-input.d.ts +1 -0
- package/dist/search-input.js +22 -320
- package/dist/search-input.js.map +1 -1
- package/dist/select.js +15 -292
- package/dist/select.js.map +1 -1
- package/dist/separator.js +5 -68
- package/dist/separator.js.map +1 -1
- package/dist/sheet.js +14 -271
- package/dist/sheet.js.map +1 -1
- package/dist/sidebar.d.ts +1 -1
- package/dist/sidebar.js +89 -494
- package/dist/sidebar.js.map +1 -1
- package/dist/size-context.js +5 -17
- package/dist/size-context.js.map +1 -1
- package/dist/skeleton.js +4 -44
- package/dist/skeleton.js.map +1 -1
- package/dist/slider.d.ts +28 -0
- package/dist/slider.js +152 -0
- package/dist/slider.js.map +1 -0
- package/dist/sparkline.js +33 -341
- package/dist/sparkline.js.map +1 -1
- package/dist/stepper.js +5 -35
- package/dist/stepper.js.map +1 -1
- package/dist/styles.css +9593 -2
- package/dist/switch.js +13 -48
- package/dist/switch.js.map +1 -1
- package/dist/tab-list.js +35 -306
- package/dist/tab-list.js.map +1 -1
- package/dist/table.js +5 -32
- package/dist/table.js.map +1 -1
- package/dist/tabs.js +10 -150
- package/dist/tabs.js.map +1 -1
- package/dist/tag.d.ts +7 -6
- package/dist/tag.js +101 -97
- package/dist/tag.js.map +1 -1
- package/dist/testimonial-block.d.ts +34 -0
- package/dist/testimonial-block.js +377 -0
- package/dist/testimonial-block.js.map +1 -0
- package/dist/textarea.js +6 -73
- package/dist/textarea.js.map +1 -1
- package/dist/time-picker.js +119 -279
- package/dist/time-picker.js.map +1 -1
- package/dist/toast.js +27 -132
- package/dist/toast.js.map +1 -1
- package/dist/tooltip.d.ts +5 -5
- package/dist/tooltip.js +7 -90
- package/dist/tooltip.js.map +1 -1
- package/dist/tree-map.js +41 -414
- package/dist/tree-map.js.map +1 -1
- package/dist/waterfall-chart.d.ts +129 -0
- package/dist/waterfall-chart.js +577 -0
- package/dist/waterfall-chart.js.map +1 -0
- package/package.json +98 -28
- package/dist/base.css +0 -32
- package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
- package/dist/index.d.ts +0 -87
- package/dist/index.js +0 -10448
- package/dist/index.js.map +0 -1
- package/dist/red-hat-display.css +0 -2
- package/dist/theme/giddaa.css +0 -2
package/dist/time-picker.js
CHANGED
|
@@ -1,176 +1,22 @@
|
|
|
1
|
-
|
|
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)
|
|
284
|
-
|
|
285
|
-
|
|
139
|
+
if (idx !== centerIndex) {
|
|
140
|
+
setCenterIndex(idx);
|
|
141
|
+
onChangeRef.current(items[idx]);
|
|
142
|
+
}
|
|
286
143
|
}
|
|
287
|
-
return /* @__PURE__ */
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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__ */
|
|
357
|
-
/* @__PURE__ */
|
|
358
|
-
|
|
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
|
-
|
|
362
|
-
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
255
|
+
/* @__PURE__ */ jsxs(
|
|
408
256
|
"div",
|
|
409
257
|
{
|
|
410
258
|
className: cn(
|
|
411
|
-
"flex gap-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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
)
|
package/dist/time-picker.js.map
CHANGED
|
@@ -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":[]}
|