@acronis-platform/ui-react 0.61.0 → 0.62.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.
@@ -0,0 +1,63 @@
1
+ import { addMonths as o } from "../../../node_modules/.pnpm/date-fns@4.3.0/node_modules/date-fns/addMonths.js";
2
+ const i = 50;
3
+ function s(r, t, n, e = i) {
4
+ return {
5
+ fromYear: r ?? n - e,
6
+ toYear: t ?? n + e
7
+ };
8
+ }
9
+ function l(r, t) {
10
+ var n;
11
+ return r ?? ((n = t == null ? void 0 : t.options) == null ? void 0 : n.weekStartsOn) ?? 1;
12
+ }
13
+ function g(r) {
14
+ return Array.from({ length: 12 }, (t, n) => ({
15
+ value: n,
16
+ label: r(new Date(2e3, n, 1))
17
+ }));
18
+ }
19
+ function m(r, t) {
20
+ return Array.from({ length: Math.max(t - r + 1, 1) }, (n, e) => ({
21
+ value: r + e,
22
+ label: String(r + e)
23
+ }));
24
+ }
25
+ function d(r, t, n) {
26
+ return (t.getFullYear() - r.getFullYear()) * 12 + (t.getMonth() - r.getMonth()) < n - 1 ? o(t, -(n - 1)) : r;
27
+ }
28
+ function f(r, t, n, e, u) {
29
+ switch (r) {
30
+ case "single":
31
+ return {
32
+ mode: "single",
33
+ selected: t,
34
+ onSelect: n
35
+ };
36
+ case "multiple":
37
+ return {
38
+ mode: "multiple",
39
+ selected: t,
40
+ onSelect: n,
41
+ min: e,
42
+ max: u
43
+ };
44
+ case "range":
45
+ return {
46
+ mode: "range",
47
+ selected: t,
48
+ onSelect: n,
49
+ min: e,
50
+ max: u
51
+ };
52
+ }
53
+ }
54
+ export {
55
+ i as DEFAULT_YEAR_SPAN,
56
+ f as buildModeProps,
57
+ g as buildMonthItems,
58
+ m as buildYearItems,
59
+ d as clampNavigationTarget,
60
+ l as resolveWeekStartsOn,
61
+ s as resolveYearRange
62
+ };
63
+ //# sourceMappingURL=calendar-panel-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-panel-utils.js","sources":["../../../../src/components/ui/calendar-panel/calendar-panel-utils.ts"],"sourcesContent":["import { addMonths } from 'date-fns';\n\nimport type { CalendarPanelSelected, CalendarPanelVariant } from './calendar-panel';\nimport type { DateRange, DayPickerLocale, DayPickerProps } from 'react-day-picker';\n\n/** Number of years offered on each side of the current year by default. */\nexport const DEFAULT_YEAR_SPAN = 50;\n\n/** A `{value, label}` pair for one `InputSelect` option in the header dropdowns. */\nexport interface CalendarSelectItem<T> {\n value: T;\n label: string;\n}\n\n/**\n * Resolves the year dropdown's bounds: an explicit `fromYear`/`toYear` wins,\n * otherwise falls back to `currentYear` ± `span`.\n */\nexport function resolveYearRange(\n fromYear: number | undefined,\n toYear: number | undefined,\n currentYear: number,\n span: number = DEFAULT_YEAR_SPAN\n): { fromYear: number; toYear: number } {\n return {\n fromYear: fromYear ?? currentYear - span,\n toYear: toYear ?? currentYear + span,\n };\n}\n\n/** Day-of-week index DayPicker accepts for `weekStartsOn` (0 = Sunday). */\nexport type WeekStartsOn = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n/**\n * Resolves the week's first day: an explicit `weekStartsOn` wins, then the\n * `locale`'s own week start, then Monday (per the design default).\n */\nexport function resolveWeekStartsOn(\n weekStartsOn: WeekStartsOn | undefined,\n locale: DayPickerLocale | undefined\n): WeekStartsOn {\n return weekStartsOn ?? (locale?.options?.weekStartsOn as WeekStartsOn | undefined) ?? 1;\n}\n\n/**\n * Builds the 12 month dropdown items. Formats each from year 2000 (a leap\n * year), so every month — including February 29 — formats from a valid date.\n */\nexport function buildMonthItems(\n formatMonthLabel: (date: Date) => string\n): CalendarSelectItem<number>[] {\n return Array.from({ length: 12 }, (_unused, index) => ({\n value: index,\n label: formatMonthLabel(new Date(2000, index, 1)),\n }));\n}\n\n/**\n * Builds the year dropdown items spanning `fromYear`..`toYear` inclusive.\n * An inverted range (`toYear < fromYear`) clamps to a single `fromYear` item\n * rather than producing an empty or negative-length list.\n */\nexport function buildYearItems(\n fromYear: number,\n toYear: number\n): CalendarSelectItem<number>[] {\n return Array.from({ length: Math.max(toYear - fromYear + 1, 1) }, (_unused, index) => ({\n value: fromYear + index,\n label: String(fromYear + index),\n }));\n}\n\n/**\n * Backs a header-dropdown navigation target off so the last of `numberOfMonths`\n * displayed months doesn't run past `endMonth`. Mirrors react-day-picker's own\n * `getInitialMonth` back-off — its `goToMonth` only clamps the *first* displayed\n * month to `endMonth`, so for a two-month `range` panel, requesting a first month\n * within one month of `endMonth` (e.g. `endMonth` itself) leaves the second month\n * past the bound, and `getDisplayMonths` silently drops it instead of the pair\n * sliding back.\n */\nexport function clampNavigationTarget(\n target: Date,\n endMonth: Date,\n numberOfMonths: number\n): Date {\n const monthsUntilEnd =\n (endMonth.getFullYear() - target.getFullYear()) * 12 +\n (endMonth.getMonth() - target.getMonth());\n return monthsUntilEnd < numberOfMonths - 1\n ? addMonths(endMonth, -(numberOfMonths - 1))\n : target;\n}\n\n/**\n * Assembles DayPicker's mode-specific selection props from `variant`. DayPicker's\n * props are a discriminated union keyed by a literal `mode`, so each branch is\n * built separately (rather than a single object with `mode: variant`) — a\n * literal tag is what lets TypeScript pick the matching union member without\n * an `as DayPickerProps` assertion. `selected`/`onSelect` are cast per branch\n * to their branch-specific shape only, which the discriminated `CalendarPanelProps`\n * union above guarantees is safe at the call site.\n */\nexport function buildModeProps(\n variant: CalendarPanelVariant,\n selected: CalendarPanelSelected,\n onSelect: ((selected: CalendarPanelSelected, triggerDate: Date) => void) | undefined,\n min: number | undefined,\n max: number | undefined\n): DayPickerProps {\n switch (variant) {\n case 'single':\n return {\n mode: 'single',\n selected: selected as Date | undefined,\n onSelect: onSelect as ((selected: Date | undefined, triggerDate: Date) => void) | undefined,\n };\n case 'multiple':\n return {\n mode: 'multiple',\n selected: selected as Date[] | undefined,\n onSelect: onSelect as ((selected: Date[] | undefined, triggerDate: Date) => void) | undefined,\n min,\n max,\n };\n case 'range':\n return {\n mode: 'range',\n selected: selected as DateRange | undefined,\n onSelect: onSelect as ((selected: DateRange | undefined, triggerDate: Date) => void) | undefined,\n min,\n max,\n };\n }\n}\n"],"names":["DEFAULT_YEAR_SPAN","resolveYearRange","fromYear","toYear","currentYear","span","resolveWeekStartsOn","weekStartsOn","locale","_a","buildMonthItems","formatMonthLabel","_unused","index","buildYearItems","clampNavigationTarget","target","endMonth","numberOfMonths","addMonths","buildModeProps","variant","selected","onSelect","min","max"],"mappings":";AAMO,MAAMA,IAAoB;AAY1B,SAASC,EACdC,GACAC,GACAC,GACAC,IAAeL,GACuB;AACtC,SAAO;AAAA,IACL,UAAUE,KAAYE,IAAcC;AAAA,IACpC,QAAQF,KAAUC,IAAcC;AAAA,EAAA;AAEpC;AASO,SAASC,EACdC,GACAC,GACc;;AACd,SAAOD,OAAiBE,IAAAD,KAAA,gBAAAA,EAAQ,YAAR,gBAAAC,EAAiB,iBAA6C;AACxF;AAMO,SAASC,EACdC,GAC8B;AAC9B,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,CAACC,GAASC,OAAW;AAAA,IACrD,OAAOA;AAAA,IACP,OAAOF,EAAiB,IAAI,KAAK,KAAME,GAAO,CAAC,CAAC;AAAA,EAAA,EAChD;AACJ;AAOO,SAASC,EACdZ,GACAC,GAC8B;AAC9B,SAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAIA,IAASD,IAAW,GAAG,CAAC,EAAA,GAAK,CAACU,GAASC,OAAW;AAAA,IACrF,OAAOX,IAAWW;AAAA,IAClB,OAAO,OAAOX,IAAWW,CAAK;AAAA,EAAA,EAC9B;AACJ;AAWO,SAASE,EACdC,GACAC,GACAC,GACM;AAIN,UAFGD,EAAS,YAAA,IAAgBD,EAAO,iBAAiB,MACjDC,EAAS,SAAA,IAAaD,EAAO,SAAA,KACRE,IAAiB,IACrCC,EAAUF,GAAU,EAAEC,IAAiB,EAAE,IACzCF;AACN;AAWO,SAASI,EACdC,GACAC,GACAC,GACAC,GACAC,GACgB;AAChB,UAAQJ,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAAC;AAAA,QACA,UAAAC;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAAD;AAAA,QACA,UAAAC;AAAA,QACA,KAAAC;AAAA,QACA,KAAAC;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAAH;AAAA,QACA,UAAAC;AAAA,QACA,KAAAC;AAAA,QACA,KAAAC;AAAA,MAAA;AAAA,EACF;AAEN;"}
@@ -0,0 +1,260 @@
1
+ import { jsxs as M, jsx as t } from "react/jsx-runtime";
2
+ import * as r from "react";
3
+ import { cn as D } from "../../../lib/utils.js";
4
+ import { buildMonthItems as K, buildYearItems as Q, clampNavigationTarget as k, resolveWeekStartsOn as X, resolveYearRange as Z, buildModeProps as $, DEFAULT_YEAR_SPAN as ee } from "./calendar-panel-utils.js";
5
+ import { useDayPicker as ae } from "../../../node_modules/.pnpm/react-day-picker@10.0.1_@types_react@19.2.15_react@19.2.6/node_modules/react-day-picker/dist/esm/useDayPicker.js";
6
+ import { addMonths as F } from "../../../node_modules/.pnpm/date-fns@4.3.0/node_modules/date-fns/addMonths.js";
7
+ import { format as re } from "../../../node_modules/.pnpm/date-fns@4.3.0/node_modules/date-fns/format.js";
8
+ import { DayPicker as te } from "../../../node_modules/.pnpm/react-day-picker@10.0.1_@types_react@19.2.15_react@19.2.6/node_modules/react-day-picker/dist/esm/DayPicker.js";
9
+ import { DialogFooterDefault as oe } from "../dialog-footer-default/dialog-footer-default.js";
10
+ import { Button as L } from "../button/button.js";
11
+ import { InputSelect as ne, InputSelectTrigger as de, InputSelectValue as le, InputSelectContent as ie, InputSelectItem as ce } from "../input-select/input-select.js";
12
+ const O = r.createContext(null);
13
+ function N({
14
+ items: n,
15
+ value: a,
16
+ ariaLabel: o,
17
+ onValueChange: d
18
+ }) {
19
+ return /* @__PURE__ */ M(
20
+ ne,
21
+ {
22
+ items: n,
23
+ value: a,
24
+ onValueChange: (e) => d(Number(e)),
25
+ children: [
26
+ /* @__PURE__ */ t(de, { "aria-label": o, className: "min-w-0 flex-1", children: /* @__PURE__ */ t(le, {}) }),
27
+ /* @__PURE__ */ t(ie, { children: n.map((e) => /* @__PURE__ */ t(ce, { value: e.value, children: e.label }, e.value)) })
28
+ ]
29
+ }
30
+ );
31
+ }
32
+ N.displayName = "CalendarHeaderSelect";
33
+ function R({
34
+ calendarMonth: n,
35
+ displayIndex: a,
36
+ className: o,
37
+ ...d
38
+ }) {
39
+ const { goToMonth: e } = ae(), l = r.useContext(O);
40
+ if (!l)
41
+ throw new Error("CalendarHeader must be rendered inside <CalendarPanel>.");
42
+ const { monthLabel: u, yearLabel: c, fromYear: v, toYear: b, formatMonthLabel: h, endMonth: p, numberOfMonths: f } = l, g = n.date, i = g.getMonth(), s = g.getFullYear(), y = r.useMemo(
43
+ () => K(h),
44
+ [h]
45
+ ), C = r.useMemo(
46
+ () => Q(v, b),
47
+ [v, b]
48
+ );
49
+ return /* @__PURE__ */ M(
50
+ "header",
51
+ {
52
+ className: D(
53
+ "flex items-center gap-[var(--ui-calendar-header-gap)] border-b-[length:var(--ui-calendar-header-border-width)] border-[color:var(--ui-calendar-header-border-color)] px-[var(--ui-calendar-header-padding-x)] py-[var(--ui-calendar-header-padding-y)] [border-bottom-style:var(--ui-calendar-header-border-style)]",
54
+ o
55
+ ),
56
+ ...d,
57
+ children: [
58
+ /* @__PURE__ */ t(
59
+ N,
60
+ {
61
+ items: y,
62
+ value: i,
63
+ ariaLabel: u,
64
+ onValueChange: (m) => e(
65
+ k(
66
+ F(new Date(s, m, 1), -a),
67
+ p,
68
+ f
69
+ )
70
+ )
71
+ }
72
+ ),
73
+ /* @__PURE__ */ t(
74
+ N,
75
+ {
76
+ items: C,
77
+ value: s,
78
+ ariaLabel: c,
79
+ onValueChange: (m) => e(
80
+ k(
81
+ F(new Date(m, i, 1), -a),
82
+ p,
83
+ f
84
+ )
85
+ )
86
+ }
87
+ )
88
+ ]
89
+ }
90
+ );
91
+ }
92
+ R.displayName = "CalendarHeader";
93
+ function _({
94
+ className: n,
95
+ day: a,
96
+ modifiers: o,
97
+ ...d
98
+ }) {
99
+ const e = r.useRef(null);
100
+ r.useEffect(() => {
101
+ var c;
102
+ o.focused && ((c = e.current) == null || c.focus());
103
+ }, [o.focused]);
104
+ const l = !!o.range_middle, u = !!o.selected && !l;
105
+ return /* @__PURE__ */ t(
106
+ "button",
107
+ {
108
+ ref: e,
109
+ type: "button",
110
+ "data-day": a.date.toLocaleDateString(),
111
+ "data-active": u,
112
+ "data-range-middle": l,
113
+ className: D(
114
+ "ui-calendar-value-text-style",
115
+ "flex size-[var(--ui-calendar-item-width-min)] min-h-[var(--ui-calendar-item-height-min)] min-w-[var(--ui-calendar-item-width-min)] cursor-pointer items-center justify-center border border-[color:var(--ui-calendar-item-border-idle)] bg-[var(--ui-calendar-item-color-idle)] p-0 text-[var(--ui-calendar-value-color-idle-primary)] outline-none transition-colors [font-variant-numeric:var(--ui-calendar-value-font-variant-numeric)]",
116
+ "not-data-[active=true]:hover:border-[color:var(--ui-calendar-item-border-hover)] not-data-[active=true]:hover:bg-[var(--ui-calendar-item-color-hover)]",
117
+ "data-[range-middle=true]:bg-[var(--ui-calendar-item-color-hover)] data-[range-middle=true]:text-[var(--ui-calendar-value-color-idle-primary)]",
118
+ "data-[active=true]:border-[color:var(--ui-calendar-item-border-active)] data-[active=true]:bg-[var(--ui-calendar-item-color-active)] data-[active=true]:text-[var(--ui-calendar-value-color-active)]",
119
+ "group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-[var(--ui-focus-primary)]",
120
+ "disabled:pointer-events-none disabled:text-[var(--ui-calendar-value-color-disabled)]",
121
+ n
122
+ ),
123
+ ...d
124
+ }
125
+ );
126
+ }
127
+ _.displayName = "CalendarItem";
128
+ const ue = r.forwardRef(
129
+ ({
130
+ className: n,
131
+ variant: a = "single",
132
+ selected: o,
133
+ onSelect: d,
134
+ defaultMonth: e,
135
+ month: l,
136
+ onMonthChange: u,
137
+ disabled: c,
138
+ min: v,
139
+ max: b,
140
+ showOutsideDays: h = !0,
141
+ weekStartsOn: p,
142
+ fromYear: f,
143
+ toYear: g,
144
+ locale: i,
145
+ monthLabel: s = "Month",
146
+ yearLabel: y = "Year",
147
+ formatMonthLabel: C,
148
+ cancelLabel: m = "Cancel",
149
+ applyLabel: A = "Apply",
150
+ onCancel: H,
151
+ onApply: T,
152
+ dir: S,
153
+ ...z
154
+ }, B) => {
155
+ const E = (/* @__PURE__ */ new Date()).getFullYear(), { fromYear: x, toYear: w } = Z(
156
+ f,
157
+ g,
158
+ E,
159
+ ee
160
+ ), V = X(p, i), j = a !== "single", I = a === "range" ? 2 : 1, W = r.useCallback(
161
+ (J) => re(J, "MMMM", { locale: i }),
162
+ [i]
163
+ ), P = C ?? W, U = r.useMemo(() => new Date(x, 0, 1), [x]), Y = r.useMemo(() => new Date(w, 11, 1), [w]), q = r.useMemo(
164
+ () => ({
165
+ monthLabel: s,
166
+ yearLabel: y,
167
+ fromYear: x,
168
+ toYear: w,
169
+ formatMonthLabel: P,
170
+ endMonth: Y,
171
+ numberOfMonths: I
172
+ }),
173
+ [
174
+ s,
175
+ y,
176
+ x,
177
+ w,
178
+ P,
179
+ Y,
180
+ I
181
+ ]
182
+ ), G = $(
183
+ a,
184
+ o,
185
+ d,
186
+ v,
187
+ b
188
+ );
189
+ return /* @__PURE__ */ M(
190
+ "div",
191
+ {
192
+ ref: B,
193
+ dir: S,
194
+ "data-slot": "calendar-panel",
195
+ "data-variant": a,
196
+ className: D(
197
+ "inline-flex w-fit flex-col overflow-hidden rounded-[var(--ui-calendar-container-border-radius)] border-[length:var(--ui-calendar-container-border-width)] border-[color:var(--ui-calendar-container-border-color)] bg-[var(--ui-calendar-container-color)] shadow-md [border-style:var(--ui-calendar-container-border-style)]",
198
+ n
199
+ ),
200
+ ...z,
201
+ children: [
202
+ /* @__PURE__ */ t(O.Provider, { value: q, children: /* @__PURE__ */ t(
203
+ te,
204
+ {
205
+ ...G,
206
+ dir: S,
207
+ defaultMonth: e,
208
+ month: l,
209
+ onMonthChange: u,
210
+ disabled: c,
211
+ startMonth: U,
212
+ endMonth: Y,
213
+ showOutsideDays: h,
214
+ weekStartsOn: V,
215
+ locale: i,
216
+ numberOfMonths: a === "range" ? 2 : 1,
217
+ hideNavigation: !0,
218
+ classNames: {
219
+ root: "flex",
220
+ months: "flex flex-row",
221
+ // The vertical rule between the two `range` months is the first
222
+ // column's inline-end border, so it mirrors under RTL.
223
+ // Width = 7 day columns + 2 sides of body padding, derived from tokens
224
+ // so it stays in sync if either is retokened.
225
+ month: "flex w-[calc(var(--ui-calendar-item-width-min)*7+var(--ui-calendar-body-padding-x)*2)] flex-col border-e-[length:var(--ui-calendar-body-border-width)] border-[color:var(--ui-calendar-body-border-color)] last:border-e-0 [border-inline-end-style:var(--ui-calendar-body-border-style)]",
226
+ // `table-fixed` (rather than the default `auto`) is what makes the
227
+ // 32px-per-column contract above actually hold: under `auto`
228
+ // layout a single wide weekday abbreviation (e.g. some `ar`/`te`/
229
+ // `kn` locales) widens its whole column past the fixed 248px month
230
+ // width, which the panel's `overflow-hidden` then clips — silently
231
+ // dropping a day column instead of just the label.
232
+ month_grid: "w-full table-fixed border-separate border-spacing-0 px-[var(--ui-calendar-body-padding-x)] py-[var(--ui-calendar-body-padding-y)]",
233
+ weekday: "ui-calendar-value-text-style size-[var(--ui-calendar-item-width-min)] overflow-hidden whitespace-nowrap p-0 text-center font-normal text-[var(--ui-calendar-value-color-idle-secondary)]",
234
+ day: "group/day size-[var(--ui-calendar-item-width-min)] p-0 text-center",
235
+ outside: "[&_button]:text-[var(--ui-calendar-value-color-disabled)]",
236
+ disabled: "[&_button]:text-[var(--ui-calendar-value-color-disabled)]",
237
+ hidden: "invisible"
238
+ },
239
+ components: {
240
+ MonthCaption: R,
241
+ DayButton: _
242
+ }
243
+ }
244
+ ) }),
245
+ j && /* @__PURE__ */ M(oe, { children: [
246
+ /* @__PURE__ */ t(L, { variant: "secondary", onClick: H, children: m }),
247
+ /* @__PURE__ */ t(L, { onClick: T, children: A })
248
+ ] })
249
+ ]
250
+ }
251
+ );
252
+ }
253
+ );
254
+ ue.displayName = "CalendarPanel";
255
+ export {
256
+ R as CalendarHeader,
257
+ _ as CalendarItem,
258
+ ue as CalendarPanel
259
+ };
260
+ //# sourceMappingURL=calendar-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-panel.js","sources":["../../../../src/components/ui/calendar-panel/calendar-panel.tsx"],"sourcesContent":["import * as React from 'react';\nimport { addMonths, format } from 'date-fns';\nimport {\n DayPicker,\n useDayPicker,\n type DateRange,\n type DayButton,\n type DayPickerLocale,\n type Matcher,\n type MonthCaptionProps,\n} from 'react-day-picker';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '../button';\nimport { DialogFooterDefault } from '../dialog-footer-default';\nimport {\n InputSelect,\n InputSelectContent,\n InputSelectItem,\n InputSelectTrigger,\n InputSelectValue,\n} from '../input-select';\nimport {\n DEFAULT_YEAR_SPAN,\n buildModeProps,\n buildMonthItems,\n buildYearItems,\n clampNavigationTarget,\n resolveWeekStartsOn,\n resolveYearRange,\n type CalendarSelectItem,\n} from './calendar-panel-utils';\n\n// The Figma \"Calendar\" panel: a bordered, elevated day-picker panel themed by the\n// dedicated `--ui-calendar-*` tier. Its three variants are the three\n// `react-day-picker` selection modes, and each one changes the panel's structure:\n// • single — one 248px month, no footer.\n// • multiple — one 248px month + a Cancel/Apply footer.\n// • range — two 248px months side by side (divided by a vertical rule) sharing\n// one Cancel/Apply footer.\n// Figma's `state` axis (idle / selected) is demo-only — it is DayPicker's runtime\n// selection state, not a prop.\n//\n// The month/year pickers in the header are real `InputSelect` instances (as in the\n// design), wired through DayPicker's custom-component API: the whole `MonthCaption`\n// is replaced, rather than using `captionLayout=\"dropdown\"`'s native `<select>`\n// elements. Per-instance caption options (labels, year window, month formatter) reach\n// that override through `CalendarPanelCaptionContext`, since DayPicker instantiates\n// custom components itself and passes only its own props.\n//\n// Every cell — idle, hover, in-range, endpoint — is a flat square: this design has no\n// corner-radius differentiation, so there is deliberately no range-endpoint \"pill\"\n// rounding.\n\nexport type CalendarPanelVariant = 'single' | 'multiple' | 'range';\n\n/** Selected value, shaped by the active `variant`. */\nexport type CalendarPanelSelected = Date | Date[] | DateRange | undefined;\n\ninterface CalendarPanelCaptionContextValue {\n monthLabel: string;\n yearLabel: string;\n fromYear: number;\n toYear: number;\n formatMonthLabel: (date: Date) => string;\n endMonth: Date;\n numberOfMonths: number;\n}\n\nconst CalendarPanelCaptionContext =\n React.createContext<CalendarPanelCaptionContextValue | null>(null);\n\n/** One header dropdown (month or year) — an `InputSelect` over a fixed item list. */\nfunction CalendarHeaderSelect({\n items,\n value,\n ariaLabel,\n onValueChange,\n}: {\n items: CalendarSelectItem<number>[];\n value: number;\n ariaLabel: string;\n onValueChange: (next: number) => void;\n}) {\n return (\n <InputSelect\n items={items}\n value={value}\n onValueChange={(next) => onValueChange(Number(next))}\n >\n <InputSelectTrigger aria-label={ariaLabel} className=\"min-w-0 flex-1\">\n <InputSelectValue />\n </InputSelectTrigger>\n <InputSelectContent>\n {items.map((item) => (\n <InputSelectItem key={item.value} value={item.value}>\n {item.label}\n </InputSelectItem>\n ))}\n </InputSelectContent>\n </InputSelect>\n );\n}\nCalendarHeaderSelect.displayName = 'CalendarHeaderSelect';\n\n/**\n * The header of one month column: a month `InputSelect` and a year `InputSelect`.\n * Replaces DayPicker's `MonthCaption`.\n */\nfunction CalendarHeader({\n calendarMonth,\n displayIndex,\n className,\n ...props\n}: MonthCaptionProps) {\n const { goToMonth } = useDayPicker();\n const context = React.useContext(CalendarPanelCaptionContext);\n if (!context) {\n throw new Error('CalendarHeader must be rendered inside <CalendarPanel>.');\n }\n const { monthLabel, yearLabel, fromYear, toYear, formatMonthLabel, endMonth, numberOfMonths } =\n context;\n\n const date = calendarMonth.date;\n const month = date.getMonth();\n const year = date.getFullYear();\n\n const monthItems = React.useMemo(\n () => buildMonthItems(formatMonthLabel),\n [formatMonthLabel]\n );\n\n const yearItems = React.useMemo(\n () => buildYearItems(fromYear, toYear),\n [fromYear, toYear]\n );\n\n return (\n <header\n className={cn(\n 'flex items-center gap-[var(--ui-calendar-header-gap)] border-b-[length:var(--ui-calendar-header-border-width)] border-[color:var(--ui-calendar-header-border-color)] px-[var(--ui-calendar-header-padding-x)] py-[var(--ui-calendar-header-padding-y)] [border-bottom-style:var(--ui-calendar-header-border-style)]',\n className\n )}\n {...props}\n >\n <CalendarHeaderSelect\n items={monthItems}\n value={month}\n ariaLabel={monthLabel}\n onValueChange={(next) =>\n goToMonth(\n clampNavigationTarget(\n addMonths(new Date(year, next, 1), -displayIndex),\n endMonth,\n numberOfMonths\n )\n )\n }\n />\n <CalendarHeaderSelect\n items={yearItems}\n value={year}\n ariaLabel={yearLabel}\n onValueChange={(next) =>\n goToMonth(\n clampNavigationTarget(\n addMonths(new Date(next, month, 1), -displayIndex),\n endMonth,\n numberOfMonths\n )\n )\n }\n />\n </header>\n );\n}\nCalendarHeader.displayName = 'CalendarHeader';\n\n/**\n * One day cell (Figma's \"CalendarItem\") — a flat 32×32 square. `data-active`\n * (a selected day or either range endpoint) and `data-range-middle` are mutually\n * exclusive, so their backgrounds never compete.\n */\nfunction CalendarItem({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const ref = React.useRef<HTMLButtonElement>(null);\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus();\n }, [modifiers.focused]);\n\n const isRangeMiddle = Boolean(modifiers.range_middle);\n const isActive = Boolean(modifiers.selected) && !isRangeMiddle;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n data-day={day.date.toLocaleDateString()}\n data-active={isActive}\n data-range-middle={isRangeMiddle}\n className={cn(\n 'ui-calendar-value-text-style',\n 'flex size-[var(--ui-calendar-item-width-min)] min-h-[var(--ui-calendar-item-height-min)] min-w-[var(--ui-calendar-item-width-min)] cursor-pointer items-center justify-center border border-[color:var(--ui-calendar-item-border-idle)] bg-[var(--ui-calendar-item-color-idle)] p-0 text-[var(--ui-calendar-value-color-idle-primary)] outline-none transition-colors [font-variant-numeric:var(--ui-calendar-value-font-variant-numeric)]',\n 'not-data-[active=true]:hover:border-[color:var(--ui-calendar-item-border-hover)] not-data-[active=true]:hover:bg-[var(--ui-calendar-item-color-hover)]',\n 'data-[range-middle=true]:bg-[var(--ui-calendar-item-color-hover)] data-[range-middle=true]:text-[var(--ui-calendar-value-color-idle-primary)]',\n 'data-[active=true]:border-[color:var(--ui-calendar-item-border-active)] data-[active=true]:bg-[var(--ui-calendar-item-color-active)] data-[active=true]:text-[var(--ui-calendar-value-color-active)]',\n 'group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-[var(--ui-focus-primary)]',\n 'disabled:pointer-events-none disabled:text-[var(--ui-calendar-value-color-disabled)]',\n className\n )}\n {...props}\n />\n );\n}\nCalendarItem.displayName = 'CalendarItem';\n\ninterface CalendarPanelSharedProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect' | 'defaultValue'> {\n /**\n * Text direction. Forwarded to `DayPicker` explicitly — an ancestor's `dir`\n * mirrors the panel's CSS layout automatically (logical properties), but\n * `react-day-picker` only flips its Arrow Left/Right keyboard roaming when\n * `dir` is passed to it directly, so it must also be passed here.\n */\n dir?: 'ltr' | 'rtl';\n /** Uncontrolled initial month shown. */\n defaultMonth?: Date;\n /** Controlled month shown (the first month, for `range`). */\n month?: Date;\n /** Called when the displayed month changes (header dropdowns). */\n onMonthChange?: (month: Date) => void;\n /** Days that cannot be selected. */\n disabled?: Matcher | Matcher[];\n /** Minimum number of selectable days (`multiple` / `range`; ignored for `single`). */\n min?: number;\n /** Maximum number of selectable days (`multiple` / `range`; ignored for `single`). */\n max?: number;\n /** Render the leading/trailing days of the adjacent months. */\n showOutsideDays?: boolean;\n /**\n * First day of the week (0 = Sunday). Defaults to `locale`'s own week start,\n * falling back to Monday (per the design) when no `locale` is given.\n */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /**\n * First year offered by the year dropdown and the earliest month the grid\n * can navigate to. Defaults to 50 years back.\n */\n fromYear?: number;\n /**\n * Last year offered by the year dropdown and the latest month the grid can\n * navigate to. Defaults to 50 years ahead.\n */\n toYear?: number;\n /**\n * Localizes weekday names and DayPicker's default day-cell/caption accessible\n * labels (e.g. `import { es } from 'react-day-picker/locale'`). Defaults to\n * date-fns `enUS`. Does not translate `monthLabel`/`yearLabel`/`cancelLabel`/\n * `applyLabel`/`formatMonthLabel` — those are separate props the consumer\n * must localize themselves.\n */\n locale?: DayPickerLocale;\n /** Accessible name of the month dropdown. */\n monthLabel?: string;\n /** Accessible name of the year dropdown. */\n yearLabel?: string;\n /** Formats a month's name for the month dropdown. Defaults to `locale`-aware `date-fns` formatting. */\n formatMonthLabel?: (date: Date) => string;\n /** Footer \"Cancel\" button label (`multiple` / `range`). */\n cancelLabel?: string;\n /** Footer \"Apply\" button label (`multiple` / `range`). */\n applyLabel?: string;\n /** Called when the footer's Cancel button is pressed. */\n onCancel?: () => void;\n /** Called when the footer's Apply button is pressed. */\n onApply?: () => void;\n}\n\n/** `variant=\"single\"` (the default) — `selected` is a single optional `Date`. */\nexport interface CalendarPanelSingleProps extends CalendarPanelSharedProps {\n /** Selection mode + panel structure. `multiple`/`range` add the Cancel/Apply footer; `range` shows two months. */\n variant?: 'single';\n /** The selected date. Uncontrolled unless `onSelect` is provided. */\n selected?: Date;\n /** Called when the selection changes. Providing it makes `selected` controlled. */\n onSelect?: (selected: Date | undefined, triggerDate: Date) => void;\n}\n\n/** `variant=\"multiple\"` — `selected` is a `Date[]`, and the footer is shown. */\nexport interface CalendarPanelMultipleProps extends CalendarPanelSharedProps {\n variant: 'multiple';\n selected?: Date[];\n onSelect?: (selected: Date[] | undefined, triggerDate: Date) => void;\n}\n\n/** `variant=\"range\"` — `selected` is a `DateRange`, two months render, and the footer is shown. */\nexport interface CalendarPanelRangeProps extends CalendarPanelSharedProps {\n variant: 'range';\n selected?: DateRange;\n onSelect?: (selected: DateRange | undefined, triggerDate: Date) => void;\n}\n\n/**\n * `CalendarPanel`'s props, discriminated by `variant` — a `single` panel only\n * accepts a `Date`, `multiple` only a `Date[]`, `range` only a `DateRange`, so\n * mismatched `selected`/`onSelect` shapes are caught at the call site instead\n * of silently reaching `react-day-picker` with the wrong shape at runtime.\n */\nexport type CalendarPanelProps =\n | CalendarPanelSingleProps\n | CalendarPanelMultipleProps\n | CalendarPanelRangeProps;\n\nconst CalendarPanel = React.forwardRef<HTMLDivElement, CalendarPanelProps>(\n (\n {\n className,\n variant = 'single',\n selected,\n onSelect,\n defaultMonth,\n month,\n onMonthChange,\n disabled,\n min,\n max,\n showOutsideDays = true,\n weekStartsOn,\n fromYear,\n toYear,\n locale,\n monthLabel = 'Month',\n yearLabel = 'Year',\n formatMonthLabel,\n cancelLabel = 'Cancel',\n applyLabel = 'Apply',\n onCancel,\n onApply,\n dir,\n ...props\n },\n ref\n ) => {\n const currentYear = new Date().getFullYear();\n const { fromYear: resolvedFromYear, toYear: resolvedToYear } = resolveYearRange(\n fromYear,\n toYear,\n currentYear,\n DEFAULT_YEAR_SPAN\n );\n const resolvedWeekStartsOn = resolveWeekStartsOn(weekStartsOn, locale);\n const showFooter = variant !== 'single';\n const numberOfMonths = variant === 'range' ? 2 : 1;\n\n // Stable across renders when the consumer doesn't override `formatMonthLabel`,\n // so `captionContext` below doesn't get a new identity (and rebuild the month\n // dropdown items) on every render.\n const defaultFormatMonthLabel = React.useCallback(\n (date: Date) => format(date, 'MMMM', { locale }),\n [locale]\n );\n const resolvedFormatMonthLabel = formatMonthLabel ?? defaultFormatMonthLabel;\n\n // Bounds the header dropdowns' navigation to the same window their own\n // options list offers — without this, keyboard shortcuts (Shift+PageUp/\n // PageDown) and a controlled `month` can move the grid past `fromYear`/\n // `toYear` while the year dropdown still only lists that range.\n const startMonth = React.useMemo(() => new Date(resolvedFromYear, 0, 1), [resolvedFromYear]);\n const endMonth = React.useMemo(() => new Date(resolvedToYear, 11, 1), [resolvedToYear]);\n\n const captionContext = React.useMemo<CalendarPanelCaptionContextValue>(\n () => ({\n monthLabel,\n yearLabel,\n fromYear: resolvedFromYear,\n toYear: resolvedToYear,\n formatMonthLabel: resolvedFormatMonthLabel,\n endMonth,\n numberOfMonths,\n }),\n [\n monthLabel,\n yearLabel,\n resolvedFromYear,\n resolvedToYear,\n resolvedFormatMonthLabel,\n endMonth,\n numberOfMonths,\n ]\n );\n\n // `selected`/`onSelect` are already guaranteed consistent with `variant` by\n // the discriminated `CalendarPanelProps` union above — this is the one\n // place that bridges to `DayPickerProps`'s own (differently-shaped)\n // discriminated union.\n const modeProps = buildModeProps(\n variant,\n selected,\n onSelect as unknown as\n | ((selected: CalendarPanelSelected, triggerDate: Date) => void)\n | undefined,\n min,\n max\n );\n\n return (\n <div\n ref={ref}\n dir={dir}\n data-slot=\"calendar-panel\"\n data-variant={variant}\n className={cn(\n 'inline-flex w-fit flex-col overflow-hidden rounded-[var(--ui-calendar-container-border-radius)] border-[length:var(--ui-calendar-container-border-width)] border-[color:var(--ui-calendar-container-border-color)] bg-[var(--ui-calendar-container-color)] shadow-md [border-style:var(--ui-calendar-container-border-style)]',\n className\n )}\n {...props}\n >\n <CalendarPanelCaptionContext.Provider value={captionContext}>\n <DayPicker\n {...modeProps}\n dir={dir}\n defaultMonth={defaultMonth}\n month={month}\n onMonthChange={onMonthChange}\n disabled={disabled}\n startMonth={startMonth}\n endMonth={endMonth}\n showOutsideDays={showOutsideDays}\n weekStartsOn={resolvedWeekStartsOn}\n locale={locale}\n numberOfMonths={variant === 'range' ? 2 : 1}\n // The design navigates months through the header dropdowns only —\n // there are no prev/next chevrons.\n hideNavigation\n classNames={{\n root: 'flex',\n months: 'flex flex-row',\n // The vertical rule between the two `range` months is the first\n // column's inline-end border, so it mirrors under RTL.\n // Width = 7 day columns + 2 sides of body padding, derived from tokens\n // so it stays in sync if either is retokened.\n month:\n 'flex w-[calc(var(--ui-calendar-item-width-min)*7+var(--ui-calendar-body-padding-x)*2)] flex-col border-e-[length:var(--ui-calendar-body-border-width)] border-[color:var(--ui-calendar-body-border-color)] last:border-e-0 [border-inline-end-style:var(--ui-calendar-body-border-style)]',\n // `table-fixed` (rather than the default `auto`) is what makes the\n // 32px-per-column contract above actually hold: under `auto`\n // layout a single wide weekday abbreviation (e.g. some `ar`/`te`/\n // `kn` locales) widens its whole column past the fixed 248px month\n // width, which the panel's `overflow-hidden` then clips — silently\n // dropping a day column instead of just the label.\n month_grid:\n 'w-full table-fixed border-separate border-spacing-0 px-[var(--ui-calendar-body-padding-x)] py-[var(--ui-calendar-body-padding-y)]',\n weekday:\n 'ui-calendar-value-text-style size-[var(--ui-calendar-item-width-min)] overflow-hidden whitespace-nowrap p-0 text-center font-normal text-[var(--ui-calendar-value-color-idle-secondary)]',\n day: 'group/day size-[var(--ui-calendar-item-width-min)] p-0 text-center',\n outside: '[&_button]:text-[var(--ui-calendar-value-color-disabled)]',\n disabled: '[&_button]:text-[var(--ui-calendar-value-color-disabled)]',\n hidden: 'invisible',\n }}\n components={{\n MonthCaption: CalendarHeader,\n DayButton: CalendarItem,\n }}\n />\n </CalendarPanelCaptionContext.Provider>\n {showFooter && (\n <DialogFooterDefault>\n <Button variant=\"secondary\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button onClick={onApply}>{applyLabel}</Button>\n </DialogFooterDefault>\n )}\n </div>\n );\n }\n);\nCalendarPanel.displayName = 'CalendarPanel';\n\nexport { CalendarPanel, CalendarItem, CalendarHeader };\n"],"names":["CalendarPanelCaptionContext","React","CalendarHeaderSelect","items","value","ariaLabel","onValueChange","jsxs","InputSelect","next","jsx","InputSelectTrigger","InputSelectValue","InputSelectContent","item","InputSelectItem","CalendarHeader","calendarMonth","displayIndex","className","props","goToMonth","useDayPicker","context","monthLabel","yearLabel","fromYear","toYear","formatMonthLabel","endMonth","numberOfMonths","date","month","year","monthItems","buildMonthItems","yearItems","buildYearItems","cn","clampNavigationTarget","addMonths","CalendarItem","day","modifiers","ref","_a","isRangeMiddle","isActive","CalendarPanel","variant","selected","onSelect","defaultMonth","onMonthChange","disabled","min","max","showOutsideDays","weekStartsOn","locale","cancelLabel","applyLabel","onCancel","onApply","dir","currentYear","resolvedFromYear","resolvedToYear","resolveYearRange","DEFAULT_YEAR_SPAN","resolvedWeekStartsOn","resolveWeekStartsOn","showFooter","defaultFormatMonthLabel","format","resolvedFormatMonthLabel","startMonth","captionContext","modeProps","buildModeProps","DayPicker","DialogFooterDefault","Button"],"mappings":";;;;;;;;;;;AAqEA,MAAMA,IACJC,EAAM,cAAuD,IAAI;AAGnE,SAASC,EAAqB;AAAA,EAC5B,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AACF,GAKG;AACD,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAAL;AAAA,MACA,OAAAC;AAAA,MACA,eAAe,CAACK,MAASH,EAAc,OAAOG,CAAI,CAAC;AAAA,MAEnD,UAAA;AAAA,QAAA,gBAAAC,EAACC,MAAmB,cAAYN,GAAW,WAAU,kBACnD,UAAA,gBAAAK,EAACE,MAAiB,EAAA,CACpB;AAAA,0BACCC,IAAA,EACE,UAAAV,EAAM,IAAI,CAACW,MACV,gBAAAJ,EAACK,IAAA,EAAiC,OAAOD,EAAK,OAC3C,UAAAA,EAAK,SADcA,EAAK,KAE3B,CACD,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AACAZ,EAAqB,cAAc;AAMnC,SAASc,EAAe;AAAA,EACtB,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAAsB;AACpB,QAAM,EAAE,WAAAC,EAAA,IAAcC,GAAA,GAChBC,IAAUtB,EAAM,WAAWD,CAA2B;AAC5D,MAAI,CAACuB;AACH,UAAM,IAAI,MAAM,yDAAyD;AAE3E,QAAM,EAAE,YAAAC,GAAY,WAAAC,GAAW,UAAAC,GAAU,QAAAC,GAAQ,kBAAAC,GAAkB,UAAAC,GAAU,gBAAAC,MAC3EP,GAEIQ,IAAOd,EAAc,MACrBe,IAAQD,EAAK,SAAA,GACbE,IAAOF,EAAK,YAAA,GAEZG,IAAajC,EAAM;AAAA,IACvB,MAAMkC,EAAgBP,CAAgB;AAAA,IACtC,CAACA,CAAgB;AAAA,EAAA,GAGbQ,IAAYnC,EAAM;AAAA,IACtB,MAAMoC,EAAeX,GAAUC,CAAM;AAAA,IACrC,CAACD,GAAUC,CAAM;AAAA,EAAA;AAGnB,SACE,gBAAApB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW+B;AAAA,QACT;AAAA,QACAnB;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAV;AAAA,UAACR;AAAA,UAAA;AAAA,YACC,OAAOgC;AAAA,YACP,OAAOF;AAAA,YACP,WAAWR;AAAA,YACX,eAAe,CAACf,MACdY;AAAA,cACEkB;AAAA,gBACEC,EAAU,IAAI,KAAKP,GAAMxB,GAAM,CAAC,GAAG,CAACS,CAAY;AAAA,gBAChDW;AAAA,gBACAC;AAAA,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QAAA;AAAA,QAGJ,gBAAApB;AAAA,UAACR;AAAA,UAAA;AAAA,YACC,OAAOkC;AAAA,YACP,OAAOH;AAAA,YACP,WAAWR;AAAA,YACX,eAAe,CAAChB,MACdY;AAAA,cACEkB;AAAA,gBACEC,EAAU,IAAI,KAAK/B,GAAMuB,GAAO,CAAC,GAAG,CAACd,CAAY;AAAA,gBACjDW;AAAA,gBACAC;AAAA,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EAAA;AAGN;AACAd,EAAe,cAAc;AAO7B,SAASyB,EAAa;AAAA,EACpB,WAAAtB;AAAA,EACA,KAAAuB;AAAA,EACA,WAAAC;AAAA,EACA,GAAGvB;AACL,GAA2C;AACzC,QAAMwB,IAAM3C,EAAM,OAA0B,IAAI;AAChD,EAAAA,EAAM,UAAU,MAAM;;AACpB,IAAI0C,EAAU,aAASE,IAAAD,EAAI,YAAJ,QAAAC,EAAa;AAAA,EACtC,GAAG,CAACF,EAAU,OAAO,CAAC;AAEtB,QAAMG,IAAgB,EAAQH,EAAU,cAClCI,IAAW,EAAQJ,EAAU,YAAa,CAACG;AAEjD,SACE,gBAAApC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAkC;AAAA,MACA,MAAK;AAAA,MACL,YAAUF,EAAI,KAAK,mBAAA;AAAA,MACnB,eAAaK;AAAA,MACb,qBAAmBD;AAAA,MACnB,WAAWR;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAnB;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AACAqB,EAAa,cAAc;AAmG3B,MAAMO,KAAgB/C,EAAM;AAAA,EAC1B,CACE;AAAA,IACE,WAAAkB;AAAA,IACA,SAAA8B,IAAU;AAAA,IACV,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,cAAAC;AAAA,IACA,OAAApB;AAAA,IACA,eAAAqB;AAAA,IACA,UAAAC;AAAA,IACA,KAAAC;AAAA,IACA,KAAAC;AAAA,IACA,iBAAAC,IAAkB;AAAA,IAClB,cAAAC;AAAA,IACA,UAAAhC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAgC;AAAA,IACA,YAAAnC,IAAa;AAAA,IACb,WAAAC,IAAY;AAAA,IACZ,kBAAAG;AAAA,IACA,aAAAgC,IAAc;AAAA,IACd,YAAAC,IAAa;AAAA,IACb,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,KAAAC;AAAA,IACA,GAAG5C;AAAA,EAAA,GAELwB,MACG;AACH,UAAMqB,KAAc,oBAAI,KAAA,GAAO,YAAA,GACzB,EAAE,UAAUC,GAAkB,QAAQC,MAAmBC;AAAA,MAC7D1C;AAAA,MACAC;AAAA,MACAsC;AAAA,MACAI;AAAA,IAAA,GAEIC,IAAuBC,EAAoBb,GAAcC,CAAM,GAC/Da,IAAavB,MAAY,UACzBnB,IAAiBmB,MAAY,UAAU,IAAI,GAK3CwB,IAA0BxE,EAAM;AAAA,MACpC,CAAC8B,MAAe2C,GAAO3C,GAAM,QAAQ,EAAE,QAAA4B,GAAQ;AAAA,MAC/C,CAACA,CAAM;AAAA,IAAA,GAEHgB,IAA2B/C,KAAoB6C,GAM/CG,IAAa3E,EAAM,QAAQ,MAAM,IAAI,KAAKiE,GAAkB,GAAG,CAAC,GAAG,CAACA,CAAgB,CAAC,GACrFrC,IAAW5B,EAAM,QAAQ,MAAM,IAAI,KAAKkE,GAAgB,IAAI,CAAC,GAAG,CAACA,CAAc,CAAC,GAEhFU,IAAiB5E,EAAM;AAAA,MAC3B,OAAO;AAAA,QACL,YAAAuB;AAAA,QACA,WAAAC;AAAA,QACA,UAAUyC;AAAA,QACV,QAAQC;AAAA,QACR,kBAAkBQ;AAAA,QAClB,UAAA9C;AAAA,QACA,gBAAAC;AAAA,MAAA;AAAA,MAEF;AAAA,QACEN;AAAA,QACAC;AAAA,QACAyC;AAAA,QACAC;AAAA,QACAQ;AAAA,QACA9C;AAAA,QACAC;AAAA,MAAA;AAAA,IACF,GAOIgD,IAAYC;AAAA,MAChB9B;AAAA,MACAC;AAAA,MACAC;AAAA,MAGAI;AAAA,MACAC;AAAA,IAAA;AAGF,WACE,gBAAAjD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAqC;AAAA,QACA,KAAAoB;AAAA,QACA,aAAU;AAAA,QACV,gBAAcf;AAAA,QACd,WAAWX;AAAA,UACT;AAAA,UACAnB;AAAA,QAAA;AAAA,QAED,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAV,EAACV,EAA4B,UAA5B,EAAqC,OAAO6E,GAC3C,UAAA,gBAAAnE;AAAA,YAACsE;AAAA,YAAA;AAAA,cACE,GAAGF;AAAA,cACJ,KAAAd;AAAA,cACA,cAAAZ;AAAA,cACA,OAAApB;AAAA,cACA,eAAAqB;AAAA,cACA,UAAAC;AAAA,cACA,YAAAsB;AAAA,cACA,UAAA/C;AAAA,cACA,iBAAA4B;AAAA,cACA,cAAca;AAAA,cACd,QAAAX;AAAA,cACA,gBAAgBV,MAAY,UAAU,IAAI;AAAA,cAG1C,gBAAc;AAAA,cACd,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKR,OACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOF,YACE;AAAA,gBACF,SACE;AAAA,gBACF,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,QAAQ;AAAA,cAAA;AAAA,cAEV,YAAY;AAAA,gBACV,cAAcjC;AAAA,gBACd,WAAWyB;AAAA,cAAA;AAAA,YACb;AAAA,UAAA,GAEJ;AAAA,UACC+B,uBACES,IAAA,EACC,UAAA;AAAA,YAAA,gBAAAvE,EAACwE,GAAA,EAAO,SAAQ,aAAY,SAASpB,GAClC,UAAAF,GACH;AAAA,YACA,gBAAAlD,EAACwE,GAAA,EAAO,SAASnB,GAAU,UAAAF,EAAA,CAAW;AAAA,UAAA,EAAA,CACxC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AACAb,GAAc,cAAc;"}
@@ -0,0 +1,25 @@
1
+ import * as m from "react";
2
+ import { mergeProps as o } from "@base-ui/react/merge-props";
3
+ import { useRender as s } from "@base-ui/react/use-render";
4
+ import { cn as p } from "../../../lib/utils.js";
5
+ const f = m.forwardRef(
6
+ ({ className: r, render: e, ...a }, t) => s({
7
+ render: e,
8
+ ref: t,
9
+ defaultTagName: "div",
10
+ props: o(
11
+ {
12
+ className: p(
13
+ "flex w-full items-stretch gap-[var(--ui-gap-16)] [&>*]:flex-1",
14
+ r
15
+ )
16
+ },
17
+ a
18
+ )
19
+ })
20
+ );
21
+ f.displayName = "FilterCards";
22
+ export {
23
+ f as FilterCards
24
+ };
25
+ //# sourceMappingURL=filter-cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-cards.js","sources":["../../../../src/components/ui/filter-cards/filter-cards.tsx"],"sourcesContent":["import * as React from 'react';\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport { useRender } from '@base-ui/react/use-render';\n\nimport { cn } from '@/lib/utils';\n\n// Mirrors the Figma \"FilterCards\" component: a horizontal row of `CardFilter`\n// items (Figma's nested \"ListCards\" slot maps to `children`) that fills its\n// container and distributes the available width evenly across however many\n// cards are passed in, matching the \"fill container\" sizing Figma applies to\n// each CardFilter instance inside this composition — it overrides CardFilter's\n// own fixed 224px width. The only styling this container owns is the 16px\n// inter-card gap (`--ui-gap-16`) and `items-stretch`, so every card matches\n// the row's tallest sibling even if one card's label wraps onto a second\n// line; there is no dedicated `--ui-filter-cards-*` token tier.\n//\n// Cards only shrink down to their own content's natural (min-content) width —\n// there is no `min-w-0` override, so the browser's default `min-width: auto`\n// on flex items applies. Once the cards' combined min-content width exceeds\n// the row, the row overflows its container rather than clipping any card's\n// content; the consumer is responsible for giving the row a scrollable\n// container (e.g. `overflow-x-auto`) if that's the desired behavior for a\n// given layout — FilterCards itself never adds scroll or wrap.\nexport interface FilterCardsProps extends React.ComponentPropsWithoutRef<'div'> {\n /**\n * Replace the rendered `<div>` with another element or component\n * (Base UI composition).\n */\n render?: useRender.RenderProp;\n}\n\nconst FilterCards = React.forwardRef<HTMLDivElement, FilterCardsProps>(\n ({ className, render, ...props }, ref) => {\n return useRender({\n render,\n ref,\n defaultTagName: 'div',\n props: mergeProps<'div'>(\n {\n className: cn(\n 'flex w-full items-stretch gap-[var(--ui-gap-16)] [&>*]:flex-1',\n className\n ),\n },\n props\n ),\n });\n }\n);\nFilterCards.displayName = 'FilterCards';\n\nexport { FilterCards };\n"],"names":["FilterCards","React","className","render","props","ref","useRender","mergeProps","cn"],"mappings":";;;;AA+BA,MAAMA,IAAcC,EAAM;AAAA,EACxB,CAAC,EAAE,WAAAC,GAAW,QAAAC,GAAQ,GAAGC,EAAA,GAASC,MACzBC,EAAU;AAAA,IACf,QAAAH;AAAA,IACA,KAAAE;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAOE;AAAA,MACL;AAAA,QACE,WAAWC;AAAA,UACT;AAAA,UACAN;AAAA,QAAA;AAAA,MACF;AAAA,MAEFE;AAAA,IAAA;AAAA,EACF,CACD;AAEL;AACAJ,EAAY,cAAc;"}
@@ -1,34 +1,46 @@
1
1
  import { jsx as o } from "react/jsx-runtime";
2
- import { Separator as t, Panel as i, Group as n } from "../../../node_modules/.pnpm/react-resizable-panels@4.11.2_react-dom@19.2.6_react@19.2.6__react@19.2.6/node_modules/react-resizable-panels/dist/react-resizable-panels.js";
3
- import { cn as e } from "../../../lib/utils.js";
2
+ import { Separator as t, Panel as e, Group as n } from "../../../node_modules/.pnpm/react-resizable-panels@4.11.2_react-dom@19.2.6_react@19.2.6__react@19.2.6/node_modules/react-resizable-panels/dist/react-resizable-panels.js";
3
+ import { cn as i } from "../../../lib/utils.js";
4
4
  function u({ className: r, ...a }) {
5
5
  return /* @__PURE__ */ o(
6
6
  n,
7
7
  {
8
- className: e("flex h-full w-full aria-[orientation=vertical]:flex-col", r),
8
+ className: i("flex h-full w-full aria-[orientation=vertical]:flex-col", r),
9
9
  ...a
10
10
  }
11
11
  );
12
12
  }
13
13
  function b(r) {
14
- return /* @__PURE__ */ o(i, { ...r });
14
+ return /* @__PURE__ */ o(e, { ...r });
15
15
  }
16
16
  function c({ className: r, ...a }) {
17
17
  return /* @__PURE__ */ o(
18
18
  t,
19
19
  {
20
- className: e(
21
- // 9px hit area: 1px divider + 4px padding each side.
22
- "relative flex w-[9px] items-center justify-center",
20
+ className: i(
21
+ // 9px hit area (Figma: 1px divider + 4px each side) that costs **no layout
22
+ // space**: the negative inline margins cancel the width, so the box overlays
23
+ // the panel boundary instead of pushing the panels apart. `z-10` keeps it —
24
+ // and the divider it paints — above the panel backgrounds/borders it overlaps.
25
+ // The margins are asymmetric (-4px start / -5px end) because the 1px line can
26
+ // only sit on one side of the boundary: the box spans 4px before it and 5px
27
+ // after, which is 4px of padding on each side of the line, whole-pixel. Logical
28
+ // (`ms`/`me`), so RTL mirrors it.
29
+ "relative z-10 w-[9px] -ms-1 -me-[5px]",
23
30
  "cursor-[var(--ui-resizable-cursor)] outline-none",
24
- // Centered 1px divider line (idle → semantic border, hover → hover token, drag → active token).
31
+ // 1px divider line, absolutely positioned at the center of the hit area —
32
+ // i.e. on the panel boundary (idle → semantic border, hover → hover token,
33
+ // drag → active token).
25
34
  // Uses a CSS border (not width+background) so the browser pixel-snaps the line
26
35
  // and it doesn't blur across device pixels when the handle lands at a fractional position.
27
36
  // The vertical divider is a zero-width box painted by its inline-start
28
37
  // (left) border; the horizontal override below swaps to the block-start
29
38
  // (top) border. Color is set with `border-color` (all sides) so it
30
39
  // applies regardless of which side carries the width.
31
- "after:absolute after:inset-y-0 after:inset-x-0 after:mx-auto after:w-0",
40
+ // Offset a flat 4px rather than centered with `start-1/2` / auto margins: the
41
+ // box's 8px of leftover space is split 4/4 around the line by construction,
42
+ // and centering an odd-width box would land the line on a half pixel.
43
+ "after:absolute after:inset-y-0 after:start-[4px] after:w-0",
32
44
  "after:[border-inline-start-width:var(--ui-resizable-border-width)] after:border-solid after:[border-color:var(--ui-border-on-surface-border)]",
33
45
  "hover:after:[border-color:var(--ui-resizable-border-color-hover)]",
34
46
  "active:after:[border-color:var(--ui-resizable-border-color-active)]",
@@ -38,8 +50,8 @@ function c({ className: r, ...a }) {
38
50
  // orientation=horizontal = panels stacked → horizontal divider line.
39
51
  // Draw it with the block-start (top) border and reset the inline-start
40
52
  // border used for the vertical line, so the full-width line renders.
41
- "aria-[orientation=horizontal]:h-[9px] aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:cursor-[ns-resize]",
42
- "aria-[orientation=horizontal]:after:inset-x-0 aria-[orientation=horizontal]:after:inset-y-auto aria-[orientation=horizontal]:after:start-auto aria-[orientation=horizontal]:after:top-1/2 aria-[orientation=horizontal]:after:h-0 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:-translate-y-1/2 aria-[orientation=horizontal]:after:translate-x-0",
53
+ "aria-[orientation=horizontal]:ms-0 aria-[orientation=horizontal]:me-0 aria-[orientation=horizontal]:-mt-1 aria-[orientation=horizontal]:-mb-[5px] aria-[orientation=horizontal]:h-[9px] aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:cursor-[ns-resize]",
54
+ "aria-[orientation=horizontal]:after:inset-x-0 aria-[orientation=horizontal]:after:start-auto aria-[orientation=horizontal]:after:inset-y-auto aria-[orientation=horizontal]:after:top-[4px] aria-[orientation=horizontal]:after:h-0 aria-[orientation=horizontal]:after:w-full",
43
55
  "aria-[orientation=horizontal]:after:[border-inline-start-width:0] aria-[orientation=horizontal]:after:[border-block-start-width:var(--ui-resizable-border-width)]",
44
56
  r
45
57
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"resizable.js","sources":["../../../../src/components/ui/resizable/resizable.tsx"],"sourcesContent":["import * as ResizablePrimitive from 'react-resizable-panels';\n\nimport { cn } from '@/lib/utils';\n\n// Resizable panels: a thin wrapper over `react-resizable-panels` (v4: `Group` /\n// `Panel` / `Separator`) themed with the next-gen `--ui-resizable-*` token tier,\n// following the shadcn composition (`ResizablePanelGroup` / `ResizablePanel` /\n// `ResizableHandle`). Base UI has no resizable primitive, so this is the one\n// component that wraps a third-party panel library instead.\n//\n// The handle is the 9px-wide draggable `Separator` (Figma node 4649:6681,\n// 1px divider + 4px padding each side for hover hit area). It paints a centered\n// 1px divider line (`--ui-resizable-border-width`) — `--ui-border-on-surface-border`\n// at rest (idle), `--ui-resizable-border-color-hover` on pointer hover,\n// `--ui-resizable-border-color-active` while dragging (`:active`). Keyboard focus\n// paints a 3px `--ui-focus-primary` ring; the resting cursor is\n// `--ui-resizable-cursor` (`ew-resize`). Each interaction state is wired to its\n// own token so brands can diverge.\n//\n// `orientation=\"vertical\"` (panels stacked) flips the layout: the Group goes\n// `flex-col`, the Separator becomes a horizontal line (`aria-orientation=horizontal`),\n// and the cursor becomes `ns-resize`.\n\nfunction ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n className={cn('flex h-full w-full aria-[orientation=vertical]:flex-col', className)}\n {...props}\n />\n );\n}\n\nfunction ResizablePanel(props: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel {...props} />;\n}\n\nexport type ResizableHandleProps = ResizablePrimitive.SeparatorProps;\n\nfunction ResizableHandle({ className, ...props }: ResizableHandleProps) {\n return (\n <ResizablePrimitive.Separator\n className={cn(\n // 9px hit area: 1px divider + 4px padding each side.\n 'relative flex w-[9px] items-center justify-center',\n 'cursor-[var(--ui-resizable-cursor)] outline-none',\n // Centered 1px divider line (idle → semantic border, hover → hover token, drag → active token).\n // Uses a CSS border (not width+background) so the browser pixel-snaps the line\n // and it doesn't blur across device pixels when the handle lands at a fractional position.\n // The vertical divider is a zero-width box painted by its inline-start\n // (left) border; the horizontal override below swaps to the block-start\n // (top) border. Color is set with `border-color` (all sides) so it\n // applies regardless of which side carries the width.\n 'after:absolute after:inset-y-0 after:inset-x-0 after:mx-auto after:w-0',\n 'after:[border-inline-start-width:var(--ui-resizable-border-width)] after:border-solid after:[border-color:var(--ui-border-on-surface-border)]',\n 'hover:after:[border-color:var(--ui-resizable-border-color-hover)]',\n 'active:after:[border-color:var(--ui-resizable-border-color-active)]',\n // Focus ring: 3px box-shadow on the line itself so it auto-centers (Figma 4649:6686).\n 'focus-visible:after:[box-shadow:0_0_0_3px_var(--ui-focus-primary)] focus-visible:after:[border-color:var(--ui-resizable-border-color-active)]',\n 'active:after:shadow-none',\n // orientation=horizontal = panels stacked → horizontal divider line.\n // Draw it with the block-start (top) border and reset the inline-start\n // border used for the vertical line, so the full-width line renders.\n 'aria-[orientation=horizontal]:h-[9px] aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:cursor-[ns-resize]',\n 'aria-[orientation=horizontal]:after:inset-x-0 aria-[orientation=horizontal]:after:inset-y-auto aria-[orientation=horizontal]:after:start-auto aria-[orientation=horizontal]:after:top-1/2 aria-[orientation=horizontal]:after:h-0 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:-translate-y-1/2 aria-[orientation=horizontal]:after:translate-x-0',\n 'aria-[orientation=horizontal]:after:[border-inline-start-width:0] aria-[orientation=horizontal]:after:[border-block-start-width:var(--ui-resizable-border-width)]',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle };\n"],"names":["ResizablePanelGroup","className","props","jsx","ResizablePrimitive.Group","cn","ResizablePanel","ResizablePrimitive.Panel","ResizableHandle","ResizablePrimitive.Separator"],"mappings":";;;AAuBA,SAASA,EAAoB,EAAE,WAAAC,GAAW,GAAGC,KAAwC;AACnF,SACE,gBAAAC;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,WAAWC,EAAG,2DAA2DJ,CAAS;AAAA,MACjF,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASI,EAAeJ,GAAsC;AAC5D,SAAO,gBAAAC,EAACI,GAAA,EAA0B,GAAGL,EAAA,CAAO;AAC9C;AAIA,SAASM,EAAgB,EAAE,WAAAP,GAAW,GAAGC,KAA+B;AACtE,SACE,gBAAAC;AAAA,IAACM;AAAAA,IAAA;AAAA,MACC,WAAWJ;AAAA;AAAA,QAET;AAAA,QACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA;AAAA,QACA;AAAA;AAAA;AAAA;AAAA,QAIA;AAAA,QACA;AAAA,QACA;AAAA,QACAJ;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;"}
1
+ {"version":3,"file":"resizable.js","sources":["../../../../src/components/ui/resizable/resizable.tsx"],"sourcesContent":["import * as ResizablePrimitive from 'react-resizable-panels';\n\nimport { cn } from '@/lib/utils';\n\n// Resizable panels: a thin wrapper over `react-resizable-panels` (v4: `Group` /\n// `Panel` / `Separator`) themed with the next-gen `--ui-resizable-*` token tier,\n// following the shadcn composition (`ResizablePanelGroup` / `ResizablePanel` /\n// `ResizableHandle`). Base UI has no resizable primitive, so this is the one\n// component that wraps a third-party panel library instead.\n//\n// The handle is the draggable `Separator` (Figma node 4649:6681): a 9px hit area —\n// the 1px divider plus 4px each side — that costs **no layout space**. Negative\n// margins cancel its width, so the box overlays the panel boundary rather than\n// pushing the panels apart. That keeps the two panels' edges (and their own borders)\n// flush, which is what a consumer sees as \"the borders touch\".\n//\n// It paints a 1px divider line (`--ui-resizable-border-width`) centered on that\n// boundary — `--ui-border-on-surface-border` at rest (idle),\n// `--ui-resizable-border-color-hover` on pointer hover,\n// `--ui-resizable-border-color-active` while dragging. Keyboard focus paints a 3px\n// `--ui-focus-primary` ring; the resting cursor is `--ui-resizable-cursor`\n// (`ew-resize`). Each interaction state is wired to its own token so brands can\n// diverge.\n//\n// `orientation=\"vertical\"` (panels stacked) flips the layout: the Group goes\n// `flex-col`, the Separator becomes a horizontal line (`aria-orientation=horizontal`),\n// and the cursor becomes `ns-resize`.\n\nfunction ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n className={cn('flex h-full w-full aria-[orientation=vertical]:flex-col', className)}\n {...props}\n />\n );\n}\n\nfunction ResizablePanel(props: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel {...props} />;\n}\n\nexport type ResizableHandleProps = ResizablePrimitive.SeparatorProps;\n\nfunction ResizableHandle({ className, ...props }: ResizableHandleProps) {\n return (\n <ResizablePrimitive.Separator\n className={cn(\n // 9px hit area (Figma: 1px divider + 4px each side) that costs **no layout\n // space**: the negative inline margins cancel the width, so the box overlays\n // the panel boundary instead of pushing the panels apart. `z-10` keeps it —\n // and the divider it paints — above the panel backgrounds/borders it overlaps.\n // The margins are asymmetric (-4px start / -5px end) because the 1px line can\n // only sit on one side of the boundary: the box spans 4px before it and 5px\n // after, which is 4px of padding on each side of the line, whole-pixel. Logical\n // (`ms`/`me`), so RTL mirrors it.\n 'relative z-10 w-[9px] -ms-1 -me-[5px]',\n 'cursor-[var(--ui-resizable-cursor)] outline-none',\n // 1px divider line, absolutely positioned at the center of the hit area —\n // i.e. on the panel boundary (idle → semantic border, hover → hover token,\n // drag → active token).\n // Uses a CSS border (not width+background) so the browser pixel-snaps the line\n // and it doesn't blur across device pixels when the handle lands at a fractional position.\n // The vertical divider is a zero-width box painted by its inline-start\n // (left) border; the horizontal override below swaps to the block-start\n // (top) border. Color is set with `border-color` (all sides) so it\n // applies regardless of which side carries the width.\n // Offset a flat 4px rather than centered with `start-1/2` / auto margins: the\n // box's 8px of leftover space is split 4/4 around the line by construction,\n // and centering an odd-width box would land the line on a half pixel.\n 'after:absolute after:inset-y-0 after:start-[4px] after:w-0',\n 'after:[border-inline-start-width:var(--ui-resizable-border-width)] after:border-solid after:[border-color:var(--ui-border-on-surface-border)]',\n 'hover:after:[border-color:var(--ui-resizable-border-color-hover)]',\n 'active:after:[border-color:var(--ui-resizable-border-color-active)]',\n // Focus ring: 3px box-shadow on the line itself so it auto-centers (Figma 4649:6686).\n 'focus-visible:after:[box-shadow:0_0_0_3px_var(--ui-focus-primary)] focus-visible:after:[border-color:var(--ui-resizable-border-color-active)]',\n 'active:after:shadow-none',\n // orientation=horizontal = panels stacked → horizontal divider line.\n // Draw it with the block-start (top) border and reset the inline-start\n // border used for the vertical line, so the full-width line renders.\n 'aria-[orientation=horizontal]:ms-0 aria-[orientation=horizontal]:me-0 aria-[orientation=horizontal]:-mt-1 aria-[orientation=horizontal]:-mb-[5px] aria-[orientation=horizontal]:h-[9px] aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:cursor-[ns-resize]',\n 'aria-[orientation=horizontal]:after:inset-x-0 aria-[orientation=horizontal]:after:start-auto aria-[orientation=horizontal]:after:inset-y-auto aria-[orientation=horizontal]:after:top-[4px] aria-[orientation=horizontal]:after:h-0 aria-[orientation=horizontal]:after:w-full',\n 'aria-[orientation=horizontal]:after:[border-inline-start-width:0] aria-[orientation=horizontal]:after:[border-block-start-width:var(--ui-resizable-border-width)]',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle };\n"],"names":["ResizablePanelGroup","className","props","jsx","ResizablePrimitive.Group","cn","ResizablePanel","ResizablePrimitive.Panel","ResizableHandle","ResizablePrimitive.Separator"],"mappings":";;;AA4BA,SAASA,EAAoB,EAAE,WAAAC,GAAW,GAAGC,KAAwC;AACnF,SACE,gBAAAC;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,WAAWC,EAAG,2DAA2DJ,CAAS;AAAA,MACjF,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASI,EAAeJ,GAAsC;AAC5D,SAAO,gBAAAC,EAACI,GAAA,EAA0B,GAAGL,EAAA,CAAO;AAC9C;AAIA,SAASM,EAAgB,EAAE,WAAAP,GAAW,GAAGC,KAA+B;AACtE,SACE,gBAAAC;AAAA,IAACM;AAAAA,IAAA;AAAA,MACC,WAAWJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAST;AAAA,QACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAaA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA;AAAA,QACA;AAAA;AAAA;AAAA;AAAA,QAIA;AAAA,QACA;AAAA,QACA;AAAA,QACAJ;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;"}