gridsmith-ui 0.31.1 → 0.32.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/CHANGELOG.md +46 -1
- package/dist/charts.d.ts +101 -30
- package/dist/charts.js +180 -105
- package/dist/charts.js.map +1 -1
- package/dist/chat.js +6 -6
- package/dist/{chunk-EZ3ZGFGA.js → chunk-2724SJO2.js} +12 -4
- package/dist/chunk-2724SJO2.js.map +1 -0
- package/dist/{chunk-IZW5XHKA.js → chunk-DO6DLTFK.js} +10 -8
- package/dist/chunk-DO6DLTFK.js.map +1 -0
- package/dist/{chunk-KSJTMSYA.js → chunk-H732QL56.js} +4 -4
- package/dist/{chunk-KSJTMSYA.js.map → chunk-H732QL56.js.map} +1 -1
- package/dist/{chunk-DR6WEI3A.js → chunk-HCEHTJ5E.js} +3 -3
- package/dist/{chunk-DR6WEI3A.js.map → chunk-HCEHTJ5E.js.map} +1 -1
- package/dist/{chunk-2TCCSKL3.js → chunk-HUVZQOU4.js} +5 -5
- package/dist/{chunk-2TCCSKL3.js.map → chunk-HUVZQOU4.js.map} +1 -1
- package/dist/{chunk-TH272DIC.js → chunk-JHZ22HQP.js} +75 -24
- package/dist/chunk-JHZ22HQP.js.map +1 -0
- package/dist/{chunk-I6JJ7KKP.js → chunk-NGZJK57C.js} +14 -10
- package/dist/chunk-NGZJK57C.js.map +1 -0
- package/dist/{chunk-BHTAVJIG.js → chunk-OVHM55JF.js} +5 -5
- package/dist/{chunk-BHTAVJIG.js.map → chunk-OVHM55JF.js.map} +1 -1
- package/dist/{chunk-NDL2JGQ7.js → chunk-QY2RA2HO.js} +5 -5
- package/dist/{chunk-NDL2JGQ7.js.map → chunk-QY2RA2HO.js.map} +1 -1
- package/dist/{chunk-W3GY5ROH.js → chunk-R2IAK3J3.js} +3 -3
- package/dist/{chunk-W3GY5ROH.js.map → chunk-R2IAK3J3.js.map} +1 -1
- package/dist/{chunk-V73LHNRL.js → chunk-RS624TD5.js} +29 -10
- package/dist/chunk-RS624TD5.js.map +1 -0
- package/dist/{chunk-IOHGE4EW.js → chunk-SIEU4H3H.js} +8 -8
- package/dist/chunk-SIEU4H3H.js.map +1 -0
- package/dist/{chunk-DBHVJ7Z3.js → chunk-SS3C24IJ.js} +3 -2
- package/dist/chunk-SS3C24IJ.js.map +1 -0
- package/dist/{chunk-K3NAFQ4S.js → chunk-TMPPBXX3.js} +3 -3
- package/dist/{chunk-K3NAFQ4S.js.map → chunk-TMPPBXX3.js.map} +1 -1
- package/dist/{chunk-SLGGZ3MU.js → chunk-WSKPESAX.js} +12 -10
- package/dist/chunk-WSKPESAX.js.map +1 -0
- package/dist/{chunk-HQFTP7Y5.js → chunk-XBVZIN26.js} +4 -4
- package/dist/{chunk-HQFTP7Y5.js.map → chunk-XBVZIN26.js.map} +1 -1
- package/dist/data-grid.js +9 -9
- package/dist/data-grid.js.map +1 -1
- package/dist/editor-mentions.js +2 -2
- package/dist/editor.js +3 -2
- package/dist/editor.js.map +1 -1
- package/dist/index.d.ts +44 -6
- package/dist/index.js +436 -213
- package/dist/index.js.map +1 -1
- package/dist/kanban.js +9 -9
- package/dist/resizable.d.ts +11 -2
- package/dist/resizable.js +96 -22
- package/dist/resizable.js.map +1 -1
- package/dist/roots.css +2 -2
- package/dist/tokens.css +6 -6
- package/dist/virtualized.js +9 -8
- package/dist/virtualized.js.map +1 -1
- package/dist-static/tokens.css +6 -6
- package/package.json +1 -1
- package/dist/chunk-DBHVJ7Z3.js.map +0 -1
- package/dist/chunk-EZ3ZGFGA.js.map +0 -1
- package/dist/chunk-I6JJ7KKP.js.map +0 -1
- package/dist/chunk-IOHGE4EW.js.map +0 -1
- package/dist/chunk-IZW5XHKA.js.map +0 -1
- package/dist/chunk-SLGGZ3MU.js.map +0 -1
- package/dist/chunk-TH272DIC.js.map +0 -1
- package/dist/chunk-V73LHNRL.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../showcase/src/components/Checkbox.tsx","../../../showcase/src/lib/date-grid.ts","../../../showcase/src/lib/segments.ts","../../../showcase/src/lib/date-segments.tsx","../../../showcase/src/lib/week-start.ts","../../../showcase/src/lib/locale-cache.ts","../../../showcase/src/components/Calendar/calendar-utils.ts","../../../showcase/src/components/DatePicker.tsx","../../../showcase/src/components/HoverCard.tsx","../../../showcase/src/components/TextOverflow.tsx","../../../showcase/src/lib/sort-indicator.tsx","../../../showcase/src/lib/table-utils.ts","../../../showcase/src/lib/card-cell.tsx","../../../showcase/src/lib/use-cards-switch.ts"],"names":["last","monthIndex","useRef","useEffect","jsx","jsxs","useContext","addDays","isSameDay","useState","useCallback","Fragment","createPortal","TextOverflow"],"mappings":"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","file":"chunk-I6JJ7KKP.js","sourcesContent":["import { useRef, useEffect, useCallback, useContext, createContext, type ReactNode, type Ref } from \"react\";\nimport { cn, PEER_FOCUS_RING } from \"../lib/utils\";\nimport { useReportedChange } from \"../lib/form-context\";\nimport { useFieldControl, type FieldControlWiring } from \"./Field\";\nimport { CHECK_FILL } from \"../lib/control-looks\";\n\ntype CheckboxSize = \"sm\" | \"md\";\n\n/** Box, check glyph and label sizes. `sm` sits beside the builder's xs-sized controls. */\nconst CHECKBOX_SIZES: Record<CheckboxSize, { box: string; glyph: number; label: string }> = {\n sm: { box: \"h-[16px] w-[16px]\", glyph: 10, label: \"text-xs\" },\n md: { box: \"h-[18px] w-[18px]\", glyph: 12, label: \"text-sm\" },\n};\n\n/** A Field passes its wiring (0.21.0): its label names the box, and its hint and error describe it. */\ninterface CheckboxProps extends FieldControlWiring {\n checked: boolean;\n /**\n * The box's new state. `shiftKey`: whether Shift was held as it changed, by a click or by Space, so a list can select\n * the run of rows up to it (Table, Sprint 25.8.7 item 23).\n */\n onChange: (checked: boolean, detail: { shiftKey: boolean }) => void;\n label?: string;\n size?: CheckboxSize;\n disabled?: boolean;\n indeterminate?: boolean;\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function Checkbox({ checked, onChange: onChangeProp, label, size = \"md\", disabled = false, indeterminate = false, className, ref, ...wiring }: CheckboxProps) {\n // Sprint 25.12 A15: a new value the user gives this control marks the form's overlay; the page's onChange runs as given\n const onChange = useReportedChange(onChangeProp, checked);\n const internalRef = useRef<HTMLInputElement>(null);\n // Shift held with Space: the browser's click from a key may not carry the key's Shift, so it is noted here\n const spaceWithShift = useRef(false);\n const dims = CHECKBOX_SIZES[size];\n // In a Field, the box takes the Field's id, so the Field's label names it (\"Admin, person 2\" in an AddAnother row)\n // its own label on screen (the <label> round it), else the Field's, leads its name; a page's aria-label or\n // aria-labelledby beside one is left out, with a warning (the final review of Sprint 25.31, 2)\n const control = useFieldControl(wiring, { component: \"Checkbox\", ownLabel: label ? true : undefined });\n\n const mergedRef = useCallback(\n (node: HTMLInputElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n },\n [ref],\n );\n\n useEffect(() => {\n if (internalRef.current) internalRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n const showDash = indeterminate;\n const filled = checked || indeterminate;\n\n return (\n <label\n className={cn(\n \"flex items-center gap-ds-2.5 cursor-pointer select-none\",\n // a label's row is padded; a box alone isn't, its target drawn round it instead, 24 px square however small the\n // box (WCAG 2.5.8), so it sits level with what's beside it (Sprint 25.8.7 item 22: a page's py-0 couldn't undo it)\n label ? \"py-ds-1\" : \"relative before:absolute before:left-1/2 before:top-1/2 before:h-6 before:w-6 before:-translate-x-1/2 before:-translate-y-1/2 before:content-['']\",\n disabled && \"opacity-disabled cursor-not-allowed\",\n className\n )}\n >\n {/* the input covers its box, unseen, so the box is what Tab brings into view, outline and all (Sprint 25.29 item 19:\n a 1 px hidden input was, and the box's outline was cut by 12 px at a page's foot) */}\n <span className=\"relative inline-flex shrink-0\">\n <input\n ref={mergedRef}\n type=\"checkbox\"\n id={control.id}\n aria-label={control.labelId ? undefined : control.label}\n aria-labelledby={control.shown ? undefined : wiring[\"aria-labelledby\"]}\n aria-describedby={control.describedBy}\n aria-invalid={control.invalid || undefined}\n required={control.required || undefined}\n checked={checked}\n disabled={disabled}\n onKeyDown={(e) => { if (e.key === \" \") spaceWithShift.current = e.shiftKey; }}\n // Space's click comes as the key-up's own action, after this handler and its microtasks: clear the note after it\n onKeyUp={(e) => { if (e.key === \" \") setTimeout(() => { spaceWithShift.current = false; }, 0); }}\n onBlur={() => { spaceWithShift.current = false; }}\n onChange={(e) => onChange(e.target.checked, { shiftKey: (e.nativeEvent as MouseEvent).shiftKey === true || spaceWithShift.current })}\n className=\"peer absolute inset-0 m-0 h-full w-full cursor-[inherit] opacity-0\"\n />\n <span\n className={cn(\n \"flex items-center justify-center\",\n dims.box, \"shrink-0\",\n \"rounded-[calc(var(--ds-radius-sm)*0.6)]\",\n \"border-[2px]\",\n \"transition-all\",\n PEER_FOCUS_RING,\n filled\n ? cn(CHECK_FILL, \"border-[var(--ds-check-border)]\")\n : \"bg-[var(--ds-input-bg)] border-[var(--ds-input-border)]\",\n disabled && \"pointer-events-none\"\n )}\n >\n <svg\n width={dims.glyph}\n height={dims.glyph}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n className={cn(\n \"text-[var(--ds-check-fg)] transition-opacity\",\n filled ? \"opacity-100\" : \"opacity-0\"\n )}\n >\n {showDash ? (\n <path d=\"M3 6H9\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" />\n ) : (\n <path d=\"M2.5 6L5 8.5L9.5 3.5\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n )}\n </svg>\n </span>\n </span>\n {label && <span className={cn(dims.label, \"text-[var(--ds-text-primary)]\")}>{label}</span>}\n </label>\n );\n}\n\n/* ── CheckboxGroup with context ─────────────────────────── */\n\ninterface CheckboxGroupCtx {\n value: string[];\n onChange: (value: string[]) => void;\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupCtx | null>(null);\n\ninterface CheckboxGroupProps {\n value: string[];\n onChange: (value: string[]) => void;\n children: ReactNode;\n className?: string;\n}\n\nexport function CheckboxGroup({ value, onChange, children, className }: CheckboxGroupProps) {\n return (\n <CheckboxGroupContext value={{ value, onChange }}>\n <div role=\"group\" className={cn(\"flex flex-col gap-ds-2\", className)}>\n {children}\n </div>\n </CheckboxGroupContext>\n );\n}\n\ninterface CheckboxGroupItemProps {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport function CheckboxGroupItem({ value, label, disabled }: CheckboxGroupItemProps) {\n const ctx = useContext(CheckboxGroupContext);\n const resolvedValue = ctx?.value ?? [];\n const resolvedOnChange = ctx?.onChange;\n\n const checked = resolvedValue.includes(value);\n return (\n <Checkbox\n checked={checked}\n disabled={disabled}\n label={label}\n onChange={(c) => {\n resolvedOnChange?.(c ? [...resolvedValue, value] : resolvedValue.filter((v) => v !== value));\n }}\n />\n );\n}\n","/**\n * Keyboard moves for a calendar's day grid (Sprint 25.7, D14(b)): the APG date\n * picker's keys. Left and Right move a day, Up and Down a week, Home and End go\n * to the ends of the week, PageUp and PageDown move a month (Shift: a year) and\n * keep the day, clamped to the month's last day. All arithmetic is on calendar\n * days in local time, so a clock change never lands on the wrong day.\n */\n\nimport type { Weekday } from \"./week-start\";\nexport function addDays(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n}\n\n/** The same day `n` months later, or the month's last day when it has fewer days (31 January + 1 month = 28 February). */\nexport function addMonthsClamped(d: Date, n: number): Date {\n const first = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const last = new Date(first.getFullYear(), first.getMonth() + 1, 0).getDate();\n return new Date(first.getFullYear(), first.getMonth(), Math.min(d.getDate(), last));\n}\n\nexport function sameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\n/** A stable key for a day: YYYY-MM-DD in local time (the grid's data-grid-key). */\nexport function dayKey(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n}\n\n/**\n * Days a picker won't let the person choose, beside its min and max (Sprint 25.8.7 item 9): a function of the day, true\n * for a day that can't be chosen (a holiday, a booked day), or the weekdays that can't, Sunday 0 to Saturday 6 ([0, 6]\n * for weekends).\n */\nexport type DisabledDates = ((day: Date) => boolean) | readonly Weekday[];\n\n/** Whether `rule` excludes `day`. No rule excludes nothing. */\nexport function isExcludedDay(rule: DisabledDates | undefined, day: Date): boolean {\n if (!rule) return false;\n return typeof rule === \"function\" ? rule(day) : rule.includes(day.getDay() as Weekday);\n}\n\n/** Where a key moves the grid's focus from `from`, or null for a key the grid does not handle. */\nexport function moveDay(from: Date, key: string, shift: boolean, weekStartsOn: Weekday = 0): Date | null {\n const intoWeek = (from.getDay() - weekStartsOn + 7) % 7;\n switch (key) {\n case \"ArrowLeft\": return addDays(from, -1);\n case \"ArrowRight\": return addDays(from, 1);\n case \"ArrowUp\": return addDays(from, -7);\n case \"ArrowDown\": return addDays(from, 7);\n case \"Home\": return addDays(from, -intoWeek);\n case \"End\": return addDays(from, 6 - intoWeek);\n case \"PageUp\": return addMonthsClamped(from, shift ? -12 : -1);\n case \"PageDown\": return addMonthsClamped(from, shift ? 12 : 1);\n default: return null;\n }\n}\n","/**\n * Segmented date and time entry (round 16, the owner's item 7): a field is a row of segments (hours, minutes, AM/PM;\n * day, month, year), each its own Tab stop. Up/Down step the value (wrapping); Left/Right move between segments;\n * Backspace clears. Pure, so it is unit-tested directly.\n *\n * Typing (Sprint 25.8.7 item 7, the owner's middle way, D67): a segment keeps focus until the person moves on, by Tab,\n * an arrow key or typing the separator, and a digit the segment can't take (it is full, or the digit can't follow: \"2\"\n * then \"5\" is no hour) starts the next segment instead. So a pause or a Tab never skips a segment, as moving on by\n * itself did (07, Tab, 12 gave 07/–/12), and digits typed alone (07122026, 0920) still fill the field.\n */\nexport interface SegmentSpec {\n key: string;\n label: string;\n min: number;\n max: number;\n /** How many digits the segment takes at most (2 for hours, minutes, day, month; 4 for a year). */\n maxDigits: number;\n placeholder: string;\n}\n\n/** Step a segment's value by delta, wrapping at the ends; an empty segment starts at its minimum (or maximum, stepping down). */\nexport function stepValue(spec: SegmentSpec, current: number | null, delta: number): number {\n if (current === null) return delta > 0 ? spec.min : spec.max;\n const span = spec.max - spec.min + 1;\n return spec.min + ((((current - spec.min + delta) % span) + span) % span);\n}\n\n/**\n * What a digit typed into a segment does. \"here\": the segment takes it, and `buffer` is the digits typed into it since\n * it last took focus, `value` what they make (null while they make no valid value, such as a lone \"0\" for a month).\n * \"next\": the segment can't take it, so it starts the next segment (the field moves focus there and types it again).\n */\nexport type TypedDigit = { kind: \"here\"; buffer: string; value: number | null } | { kind: \"next\" };\n\n/**\n * Type one digit into a segment. `buffer` holds the digits typed into it since it last took focus: a segment the\n * person comes back to is typed afresh. The segment takes the digit while it has room and the digits still make a\n * value in range; else the digit belongs to the next segment. An empty segment always takes it.\n */\nexport function typeDigit(spec: SegmentSpec, buffer: string, digit: string): TypedDigit {\n if (!/^\\d$/.test(digit)) return { kind: \"here\", buffer, value: valueOf(spec, buffer) };\n const next = buffer + digit;\n if (buffer && (next.length > spec.maxDigits || Number(next) > spec.max)) return { kind: \"next\" };\n return { kind: \"here\", buffer: next, value: valueOf(spec, next) };\n}\n\nfunction valueOf(spec: SegmentSpec, digits: string): number | null {\n if (!digits) return null;\n const n = Number(digits);\n return n >= spec.min && n <= spec.max ? n : null;\n}\n\n/** The keys that move on from a date's segment, as people write dates: 07/12/2026, 07-12-2026, 07.12.2026, 7 12 2026. */\nexport const DATE_SEPARATORS: readonly string[] = [\"/\", \"-\", \".\", \" \"];\n/** The keys that move on from a time's segment: 09:20, 09.20, 9 20. */\nexport const TIME_SEPARATORS: readonly string[] = [\":\", \".\", \" \"];\n\n/**\n * A separator moves on from a segment that holds something, typed or already there; on an empty one it does nothing,\n * so a separator never skips a segment either.\n */\nexport function separatorMovesOn(separators: readonly string[], key: string, holds: boolean): boolean {\n return holds && separators.includes(key);\n}\n\n/**\n * The rule over a whole run of keys, as a person types into a field with focus on its first segment: digits, the\n * separators, and \"Tab\", which moves on as the browser's Tab moves from one segment's stop to the next. Returns each\n * segment's value. The fields apply the same `typeDigit` and `separatorMovesOn` key by key; this is the rule's own\n * statement of how typing reads, for its tests and for anything that needs to know what a run of keys gives.\n */\nexport function typeKeys(specs: readonly SegmentSpec[], keys: readonly string[], separators: readonly string[]): Array<number | null> {\n const values: Array<number | null> = specs.map(() => null);\n let at = 0;\n let buffer = \"\";\n const moveTo = (i: number) => { at = i; buffer = \"\"; };\n for (const key of keys) {\n if (at >= specs.length) break;\n if (key === \"Tab\") { moveTo(at + 1); continue; }\n if (/^\\d$/.test(key)) {\n const r = typeDigit(specs[at], buffer, key);\n if (r.kind === \"here\") { buffer = r.buffer; values[at] = r.value; continue; }\n if (at + 1 >= specs.length) continue; // the last segment: nothing after it takes the digit\n moveTo(at + 1);\n const carried = typeDigit(specs[at], \"\", key) as Extract<TypedDigit, { kind: \"here\" }>;\n buffer = carried.buffer;\n values[at] = carried.value;\n continue;\n }\n if (separatorMovesOn(separators, key, buffer !== \"\" || values[at] !== null) && at + 1 < specs.length) moveTo(at + 1);\n }\n return values;\n}\n\nexport const pad2 = (n: number) => String(n).padStart(2, \"0\");\n\n/** The segment specs for a time field. */\nexport function timeSegments(use24Hour: boolean): SegmentSpec[] {\n return [\n { key: \"hour\", label: \"Hours\", min: use24Hour ? 0 : 1, max: use24Hour ? 23 : 12, maxDigits: 2, placeholder: \"--\" },\n { key: \"minute\", label: \"Minutes\", min: 0, max: 59, maxDigits: 2, placeholder: \"--\" },\n ];\n}\n\n/** The segment specs for a date field, in the locale's order (day first or month first). */\nexport function dateSegments(dayFirst: boolean, daysInMonth = 31): SegmentSpec[] {\n const day: SegmentSpec = { key: \"day\", label: \"Day\", min: 1, max: daysInMonth, maxDigits: 2, placeholder: \"dd\" };\n const month: SegmentSpec = { key: \"month\", label: \"Month\", min: 1, max: 12, maxDigits: 2, placeholder: \"mm\" };\n const year: SegmentSpec = { key: \"year\", label: \"Year\", min: 1, max: 9999, maxDigits: 4, placeholder: \"yyyy\" };\n return dayFirst ? [day, month, year] : [month, day, year];\n}\n","import { useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from \"react\";\nimport { cn } from \"./utils\";\nimport { DATE_SEPARATORS, dateSegments, pad2, separatorMovesOn, stepValue, typeDigit, type SegmentSpec } from \"./segments\";\nimport { formatLocale } from \"./format-locale\";\n\n/** Whether a locale writes the day before the month (\"25/12/2000\"); the browser's reading by default. Decides an ambiguous numeric date, and the parts' order. */\nexport function localeDayFirst(locale: string | undefined = formatLocale()): boolean {\n try {\n const parts = new Intl.DateTimeFormat(locale).formatToParts(new Date(2000, 11, 25));\n return parts.findIndex((p) => p.type === \"day\") < parts.findIndex((p) => p.type === \"month\");\n } catch { return true; }\n}\n\n/**\n * The typed parts of one date or of several (Sprint 25.8.7 item 9: DatePicker's one, DateRangePicker's start and end),\n * each a spinbutton in the locale's order, typed by lib/segments.ts's rule (item 7): a part keeps focus until the person\n * moves on (Tab, an arrow, a separator) and a digit it can't take starts the next part, a range's end after its start's\n * year. Up/Down step a part, Home/End take its ends, Backspace clears it, and one emptied goes back to the part before.\n * The owner decides what a typed date means (inside its limits, a range in order): this reports each date as typed.\n */\nexport interface DatePartsValue { day: number | null; month: number | null; year: number | null }\ntype PartKey = keyof DatePartsValue;\n\nconst NONE: DatePartsValue = { day: null, month: null, year: null };\nconst partsOf = (d: Date | null): DatePartsValue => (d ? { day: d.getDate(), month: d.getMonth() + 1, year: d.getFullYear() } : NONE);\nconst daysIn = (year: number, monthIndex: number) => new Date(year, monthIndex + 1, 0).getDate();\n\n/** The day the parts make, or null: a part missing, or no such day (31 February). */\nexport function dateOfParts(p: DatePartsValue): Date | null {\n if (p.day === null || p.month === null || p.year === null) return null;\n const d = new Date(p.year, p.month - 1, p.day);\n return d.getFullYear() === p.year && d.getMonth() === p.month - 1 && d.getDate() === p.day ? d : null;\n}\nconst sameDay = (a: Date | null, b: Date | null) => (a === null || b === null ? a === b : a.getTime() === b.getTime());\n\nexport interface DateSegmentFieldsProps {\n /** The committed dates: one for a date, two for a range. One from elsewhere (not the typing's own) resets its parts. */\n values: ReadonlyArray<Date | null>;\n /** Each date's name before each of its parts' (\"Start\" gives \"Start day\"); none for a single date. */\n names?: readonly string[];\n dayFirst: boolean;\n /** Before the browser has the page, a value's parts are drawn empty (its local day waits for the browser, Sprint 25.20). */\n hydrated: boolean;\n disabled?: boolean;\n /**\n * At each change: every date as its parts make it (null while a part is empty or the parts make no day), and whether\n * each date's parts are all filled.\n */\n onChange: (dates: Array<Date | null>, filled: boolean[]) => void;\n /** Between two dates, what reads between them (\"–\"). */\n between?: string;\n /** Lets the owner put focus on a part (its first, on a click on the field). */\n focusRef?: (focus: (index: number) => void) => void;\n}\n\nexport function DateSegmentFields({ values, names, dayFirst, hydrated, disabled, onChange, between = \"–\", focusRef }: DateSegmentFieldsProps) {\n const [parts, setParts] = useState<DatePartsValue[]>(() => values.map(partsOf));\n // The digits typed into a part but not yet a value (\"0\" before the \"7\" of 07): state, because the part displays it.\n const [buffers, setBuffers] = useState<Record<string, string>>({});\n // A value the owner hands straight back mid-typing keeps the parts and buffers; one from elsewhere resets them.\n const reported = useRef<Array<Date | null>>(values.map(() => null));\n const valuesKey = values.map((v) => (v ? v.getTime() : \"\")).join(\"|\");\n useEffect(() => {\n setParts((cur) => values.map((v, i) => (sameDay(v, reported.current[i] ?? null) && cur[i] ? cur[i] : partsOf(v))));\n setBuffers((b) => (values.every((v, i) => sameDay(v, reported.current[i] ?? null)) ? b : {}));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valuesKey]);\n\n // each date's specs, its day's limit the drawn month's (31 until the browser has the page)\n const specsOf = (p: DatePartsValue) => dateSegments(dayFirst, hydrated && p.month && p.year ? daysIn(p.year, p.month - 1) : 31);\n const all = parts.flatMap((p, d) => specsOf(p).map((spec) => ({ date: d, spec, k: spec.key as PartKey })));\n const bufferKey = (date: number, k: PartKey) => `${date}:${k}`;\n const refs = useRef<Array<HTMLSpanElement | null>>([]);\n const focusAt = (i: number) => { refs.current[Math.max(0, Math.min(all.length - 1, i))]?.focus(); };\n useEffect(() => { focusRef?.(focusAt); });\n\n const report = (next: DatePartsValue[]) => {\n const dates = next.map(dateOfParts);\n reported.current = dates;\n onChange(dates, next.map((p) => p.day !== null && p.month !== null && p.year !== null));\n };\n // one part set per key press (a carried digit sets the next part only), so the parts this render drew are current\n const setPart = (date: number, k: PartKey, v: number | null) => {\n const next = parts.map((p, i) => (i === date ? { ...p, [k]: v } : p));\n setParts(next);\n report(next);\n };\n const fresh = (date: number, k: PartKey) => setBuffers((b) => (b[bufferKey(date, k)] ? { ...b, [bufferKey(date, k)]: \"\" } : b));\n\n const typeInto = (i: number, digit: string) => {\n const { date, spec, k } = all[i];\n const r = typeDigit(spec, buffers[bufferKey(date, k)] ?? \"\", digit);\n if (r.kind === \"here\") { setBuffers((b) => ({ ...b, [bufferKey(date, k)]: r.buffer })); setPart(date, k, r.value); return; }\n // the part can't take it: the digit starts the next part, a range's end after its start; after the last, nowhere.\n // Focus first: a part taking focus is typed afresh, and the digit must land after that.\n const next = all[i + 1];\n if (!next) return;\n focusAt(i + 1);\n const carried = typeDigit(next.spec, \"\", digit);\n if (carried.kind !== \"here\") return;\n setBuffers((b) => ({ ...b, [bufferKey(next.date, next.k)]: carried.buffer }));\n setPart(next.date, next.k, carried.value);\n };\n\n const onKeyDown = (e: ReactKeyboardEvent<HTMLSpanElement>, i: number, spec: SegmentSpec) => {\n const key = e.key;\n if (key === \"Tab\" || key === \"Shift\" || key === \"Escape\" || key.startsWith(\"F\")) return;\n e.preventDefault();\n const { date, k } = all[i];\n const held = parts[date][k];\n const buffer = buffers[bufferKey(date, k)];\n const clearBuffer = () => setBuffers((b) => ({ ...b, [bufferKey(date, k)]: \"\" }));\n if (key === \"ArrowLeft\") { focusAt(i - 1); return; }\n if (key === \"ArrowRight\") { focusAt(i + 1); return; }\n if (key === \"ArrowUp\" || key === \"ArrowDown\") { clearBuffer(); setPart(date, k, stepValue(spec, held, key === \"ArrowUp\" ? 1 : -1)); return; }\n if (key === \"Home\") { clearBuffer(); setPart(date, k, spec.min); return; }\n if (key === \"End\") { clearBuffer(); setPart(date, k, spec.max); return; }\n if (key === \"Backspace\" || key === \"Delete\") { if (held === null && !buffer) { focusAt(i - 1); return; } clearBuffer(); setPart(date, k, null); return; }\n if (/^\\d$/.test(key)) { typeInto(i, key); return; }\n if (separatorMovesOn(DATE_SEPARATORS, key, !!buffer || held !== null)) focusAt(i + 1);\n };\n\n // the value's day, month and year are its local ones, drawn once the browser has the page (Sprint 25.20 D3)\n const drawn = hydrated ? parts : parts.map(() => NONE);\n const shown = (date: number, spec: SegmentSpec) => {\n const k = spec.key as PartKey;\n const b = buffers[bufferKey(date, k)];\n const v = drawn[date][k];\n if (b && v === null) return b;\n if (v === null) return spec.placeholder;\n return k === \"year\" ? String(v) : pad2(v);\n };\n\n return (\n <>\n {all.map(({ date, spec, k }, i) => {\n const firstOfDate = i === 0 || all[i - 1].date !== date;\n const name = names?.[date];\n const v = drawn[date][k];\n return (\n <span key={`${date}:${spec.key}`} className=\"contents\">\n {firstOfDate && date > 0 && <span aria-hidden className=\"px-ds-1 text-[var(--ds-text-muted)]\">{between}</span>}\n {!firstOfDate && <span aria-hidden className=\"px-[1px] text-[var(--ds-text-muted)]\">/</span>}\n <span\n ref={(el) => { refs.current[i] = el; }}\n role=\"spinbutton\"\n tabIndex={disabled ? -1 : 0}\n data-segment={spec.key}\n data-segment-of={names ? String(date) : undefined}\n aria-label={name ? `${name} ${spec.label.toLowerCase()}` : spec.label}\n aria-valuemin={spec.min}\n aria-valuemax={spec.max}\n aria-valuenow={v ?? undefined}\n aria-valuetext={v === null ? \"empty\" : String(v)}\n onKeyDown={(e) => onKeyDown(e, i, spec)}\n // a part the person comes back to, by focus or a click, is typed afresh (item 7)\n onFocus={() => fresh(date, k)}\n onMouseDown={() => fresh(date, k)}\n onClick={(e) => e.stopPropagation()}\n className={cn(\"rounded-[var(--ds-radius-sm)] px-[2px] outline-none focus:bg-[var(--ds-accent-subtle)] focus:text-[var(--ds-accent-ink)] cursor-text\", v === null && !buffers[bufferKey(date, k)] && \"text-[var(--ds-text-muted)]\")}\n >\n {shown(date, spec)}\n </span>\n </span>\n );\n })}\n </>\n );\n}\n","import { useContext } from \"react\";\nimport { formatLocale } from \"./format-locale\";\nimport { useHydrated } from \"./hydrated\";\nimport { LocaleContext } from \"./locale\";\n\n/** A day of the week as `Date.getDay()` counts them: Sunday 0, Monday 1 … Saturday 6. */\nexport type Weekday = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n/**\n * The regions whose week doesn't start on Monday, from CLDR 47's week data (ICU 77), for a browser whose Intl has no\n * week information (getWeekInfo() or weekInfo). Every other region starts on Monday.\n */\nconst FIRST_DAY_BY_REGION: Readonly<Record<string, Weekday>> = Object.fromEntries([\n ...[\"AG\", \"AS\", \"BD\", \"BR\", \"BS\", \"BT\", \"BW\", \"BZ\", \"CA\", \"CO\", \"DM\", \"DO\", \"ET\", \"GT\", \"GU\", \"HK\", \"HN\", \"ID\", \"IL\", \"IN\", \"JM\", \"JP\", \"KE\", \"KH\", \"KR\", \"LA\", \"MH\", \"MM\", \"MO\", \"MT\", \"MX\", \"MZ\", \"NI\", \"NP\", \"PA\", \"PE\", \"PH\", \"PK\", \"PR\", \"PT\", \"PY\", \"SA\", \"SG\", \"SV\", \"TH\", \"TT\", \"TW\", \"UM\", \"US\", \"VE\", \"VI\", \"WS\", \"YE\", \"ZA\", \"ZW\"].map((r) => [r, 0]),\n ...[\"AF\", \"BH\", \"DJ\", \"DZ\", \"EG\", \"IQ\", \"IR\", \"JO\", \"KW\", \"LY\", \"OM\", \"QA\", \"SD\", \"SY\"].map((r) => [r, 6]),\n [\"MV\", 5],\n]);\n\ninterface WeekInfo { firstDay?: number }\ntype LocaleWithWeek = Intl.Locale & { getWeekInfo?: () => WeekInfo; weekInfo?: WeekInfo };\n\n/**\n * The first day of the week where a language tag is spoken, or undefined when the tag can't be read. Never throws: a\n * missing or unreadable tag gives undefined (`new Intl.Locale(undefined)` throws). Intl's own week information where the\n * browser has it (its `firstDay` counts Monday 1 … Sunday 7), else the region's row in CLDR's table, the region implied\n * where the tag has none (\"en\" is \"en-US\", \"de\" is \"de-DE\").\n */\nexport function weekStartOf(tag: string | undefined): Weekday | undefined {\n if (!tag) return undefined;\n try {\n const locale = new Intl.Locale(tag) as LocaleWithWeek;\n const info = typeof locale.getWeekInfo === \"function\" ? locale.getWeekInfo() : locale.weekInfo;\n if (info && typeof info.firstDay === \"number\" && info.firstDay >= 1 && info.firstDay <= 7) return (info.firstDay % 7) as Weekday;\n const region = locale.region ?? locale.maximize().region;\n if (!region) return undefined;\n return FIRST_DAY_BY_REGION[region] ?? 1;\n } catch {\n return undefined;\n }\n}\n\n/** The languages last read, and the day they gave: every grid asks on every render, and the answer rarely changes. */\nlet last: { key: string; day: Weekday } | null = null;\n\n/** The first day for a visitor's languages, in their order, then the page's locale, then Monday. */\nfunction firstDayFor(spoken: readonly string[], page: string | undefined): Weekday {\n for (const tag of [...spoken, page]) {\n const found = weekStartOf(tag);\n if (found !== undefined) return found;\n }\n return 1;\n}\n\n/**\n * Sprint 25.19 W1 (P9): the first day of the visitor's week. The browser's languages first, in order (a German visitor to\n * an English page gets Monday), then the page's language (formatLocale()), then Monday. With no page yet (a server's\n * render) it is Monday. Components read it through useWeekStart, which waits for the browser before using it.\n */\nexport function regionWeekStart(): Weekday {\n if (typeof document === \"undefined\") return 1;\n const spoken = typeof navigator === \"undefined\" ? [] : navigator.languages?.length ? navigator.languages : navigator.language ? [navigator.language] : [];\n const page = formatLocale();\n const key = `${spoken.join(\",\")}|${page ?? \"\"}`;\n if (last?.key === key) return last.day;\n const day = firstDayFor(spoken, page);\n last = { key, day };\n return day;\n}\n\n/**\n * The week's first day for a date grid: the page's own `weekStartsOn` when it gives one, else the first day where the\n * component's own `locale` is spoken (the Gantt's), else the visitor's (regionWeekStart). A server knows the visitor only\n * from the request: with LocaleProvider's `acceptLanguage`, the server's render and the one that hydrates it start the\n * week on the visitor's day (Sprint 25.20 L1); without it they start on Monday (the render that hydrates must match), and\n * the browser's day applies straight after, as useTimeScale does for today. A render with no server HTML reads it at once.\n */\nexport function useWeekStart(own?: Weekday, locale?: string): Weekday {\n const readable = useHydrated();\n const choice = useContext(LocaleContext);\n if (own !== undefined) return own;\n if (locale !== undefined) return weekStartOf(locale) ?? 1;\n if (readable) return regionWeekStart();\n return choice?.hasHeader ? firstDayFor(choice.spoken, choice.server) : 1;\n}\n","/**\n * Caches keyed by locale, each holding at most `limit` entries, the least recently used dropped first (Sprint 25.20's\n * fresh-eyes review). In a browser a page writes in one or two locales; on a server the locale comes from each request's\n * Accept-Language header, so a cache that never forgets grows with every visitor's language, and with headers made up to\n * grow it. Size a cache for its keys: a formatter keyed by locale and options holds about a dozen per locale.\n */\nconst caches = new Set<Map<string, unknown>>();\n\nexport function localeCache<V>(limit: number): (key: string, make: () => V) => V {\n const map = new Map<string, V>();\n caches.add(map as Map<string, unknown>);\n return (key, make) => {\n const hit = map.get(key);\n if (hit !== undefined) {\n // most recently used last\n map.delete(key);\n map.set(key, hit);\n return hit;\n }\n const made = make();\n map.set(key, made);\n if (map.size > limit) map.delete(map.keys().next().value as string);\n return made;\n };\n}\n\n/**\n * Empties every locale cache. For a test that renders a server's HTML and hydrates it in one process: a formatter made\n * without a time zone keeps the zone it was made in, so the browser's side starts with none of the server's.\n */\nexport function clearLocaleCaches(): void {\n for (const map of caches) map.clear();\n}\n\n/** The number of entries in each locale cache (tests). */\nexport function localeCacheSizes(): number[] {\n return Array.from(caches, (map) => map.size);\n}\n","import type { CalendarEvent } from \"./types\";\nimport type { Weekday } from \"../../lib/week-start\";\n\nimport { useFormatLocale } from \"../../lib/locale\";\nimport { dayKey } from \"../../lib/date-grid\";\nimport { localeCache } from \"../../lib/locale-cache\";\n\n/*\n * Sprint 25.18 F2 (the owner's D49): the Calendar writes its dates and times in the page's language, through Intl, as\n * the rest of the library has since 0.25.0 (formatLocale); its own month and weekday names and its US-style times were\n * English written by hand. The words around them (\"Today\", \"all-day\", \"+N more\") stay the library's English.\n */\n\n/**\n * A formatter for a locale, made once for each locale and set of options: building one is costly, and every key press in\n * a grid redraws hundreds of names (the review of 2 October: 558 made for one arrow in the week).\n */\nconst formatters = localeCache<Intl.DateTimeFormat>(512);\nfunction dtfFor(locale: string | undefined, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n return formatters(`${locale ?? \"\"}|${JSON.stringify(options)}`, () => new Intl.DateTimeFormat(locale, options));\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\nexport function isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\n\nexport function isWeekend(d: Date): boolean {\n const day = d.getDay();\n return day === 0 || day === 6;\n}\n\nexport function startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\nexport function startOfWeek(d: Date, weekStartsOn: Weekday = 0): Date {\n const date = new Date(d);\n const day = date.getDay();\n const diff = (day - weekStartsOn + 7) % 7;\n date.setDate(date.getDate() - diff);\n return startOfDay(date);\n}\n\nexport function endOfWeek(d: Date, weekStartsOn: Weekday = 0): Date {\n const start = startOfWeek(d, weekStartsOn);\n const end = new Date(start);\n end.setDate(end.getDate() + 6);\n end.setHours(23, 59, 59, 999);\n return end;\n}\n\nexport function addDays(d: Date, n: number): Date {\n const result = new Date(d);\n result.setDate(result.getDate() + n);\n return result;\n}\n\n/** The same day n months on, or the month's last day where it has none: 31 January → 28 February, never 3 March. */\nexport function addMonths(d: Date, n: number): Date {\n const result = new Date(d);\n const day = result.getDate();\n result.setDate(1);\n result.setMonth(result.getMonth() + n);\n result.setDate(Math.min(day, new Date(result.getFullYear(), result.getMonth() + 1, 0).getDate()));\n return result;\n}\n\n/** Returns a 6x7 grid of Date objects for a full month view */\nexport function getMonthGrid(year: number, month: number, weekStartsOn: Weekday = 0): Date[][] {\n const firstOfMonth = new Date(year, month, 1);\n const gridStart = startOfWeek(firstOfMonth, weekStartsOn);\n\n const weeks: Date[][] = [];\n const current = new Date(gridStart);\n\n for (let w = 0; w < 6; w++) {\n const week: Date[] = [];\n for (let d = 0; d < 7; d++) {\n week.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n weeks.push(week);\n }\n\n return weeks;\n}\n\n/** Returns 7 Date objects for the week containing the given date */\nexport function getWeekDays(date: Date, weekStartsOn: Weekday = 0): Date[] {\n const start = startOfWeek(date, weekStartsOn);\n const days: Date[] = [];\n for (let i = 0; i < 7; i++) {\n days.push(addDays(start, i));\n }\n return days;\n}\n\nconst DAY_MS = 86_400_000;\n\n/** Whole calendar days from `a` to `b` (local days, so a clock change never counts a day twice). */\nexport function daysBetween(a: Date, b: Date): number {\n return Math.round((startOfDay(b).getTime() - startOfDay(a).getTime()) / DAY_MS);\n}\n\n/**\n * The calendar days an event covers (Sprint 25.18 A12, P9): an all-day event through its end date (\"7 to 9 September\"\n * covers the 9th); a timed one up to its end, which is exclusive, so one ending at midnight ends the day before.\n */\nexport function eventSpan(e: CalendarEvent): { first: Date; last: Date } {\n const first = startOfDay(e.start);\n if (!e.end) return { first, last: first };\n const lastInstant = e.allDay ? e.end : new Date(e.end.getTime() - 1);\n const last = startOfDay(lastInstant);\n return { first, last: last < first ? first : last };\n}\n\n/** Drawn as a bar across its days (the month view, the week's all-day row): an all-day event, or a timed one of a day or more (P9). */\nexport function isBarEvent(e: CalendarEvent): boolean {\n if (e.allDay) return true;\n if (!e.end) return false;\n // a day or more on the calendar, not in hours: midnight to midnight is a day on the day the clocks change too (23 or\n // 25 hours; the second review)\n const dayLater = new Date(e.start);\n dayLater.setDate(dayLater.getDate() + 1);\n return e.end.getTime() >= dayLater.getTime();\n}\n\nexport function getEventsForDay(events: CalendarEvent[], date: Date): CalendarEvent[] {\n const day = startOfDay(date).getTime();\n return events.filter((e) => {\n const { first, last } = eventSpan(e);\n return first.getTime() <= day && day <= last.getTime();\n });\n}\n\n/**\n * Each day's events, in their order, for the days in [from, to), keyed by local day key (\"2026-10-06\"): one pass over\n * the events, for a view of many days (the year: looking each of its 365 days up in every event is days × events, and\n * a year of daily repeats is thousands of events).\n */\nexport function groupEventsByDay(events: CalendarEvent[], from: Date, to: Date): Map<string, CalendarEvent[]> {\n const out = new Map<string, CalendarEvent[]>();\n const lo = startOfDay(from), hi = startOfDay(to);\n for (const e of events) {\n const { first, last } = eventSpan(e);\n for (let day = first < lo ? lo : first; day <= last && day < hi; day = new Date(day.getFullYear(), day.getMonth(), day.getDate() + 1)) {\n const key = dayKey(day);\n const list = out.get(key);\n if (list) list.push(e);\n else out.set(key, [e]);\n }\n }\n return out;\n}\n\nexport function getEventsForRange(events: CalendarEvent[], start: Date, end: Date): CalendarEvent[] {\n return events.filter((e) => {\n const { first, last } = eventSpan(e);\n return first <= end && last >= startOfDay(start);\n });\n}\n\n/** One day's piece of a timed event (P9): from its start, or midnight, to its end, or the next midnight. */\nexport interface DayPiece {\n event: CalendarEvent;\n start: Date;\n end: Date;\n}\n\n/** The timed events' pieces on a day, in start order: an overnight event gives a piece on each of its days. */\nexport function dayPieces(events: CalendarEvent[], date: Date): DayPiece[] {\n const dayStart = startOfDay(date);\n const next = new Date(dayStart.getFullYear(), dayStart.getMonth(), dayStart.getDate() + 1);\n const pieces: DayPiece[] = [];\n for (const event of events) {\n if (isBarEvent(event)) continue;\n // an event with no end, or no length, takes an hour, within its own day: drawn on the day it's on, as the month and\n // its card have it (the second review: at 23:30 it spilled onto the next day)\n const ownDayEnd = new Date(event.start.getFullYear(), event.start.getMonth(), event.start.getDate() + 1);\n const end = event.end && event.end > event.start ? event.end : new Date(Math.min(event.start.getTime() + 3_600_000, ownDayEnd.getTime()));\n const start = event.start < dayStart ? dayStart : event.start;\n const stop = end > next ? next : end;\n if (stop > start) pieces.push({ event, start, end: stop });\n }\n return pieces.sort((a, b) => a.start.getTime() - b.start.getTime() || b.end.getTime() - a.end.getTime());\n}\n\n/** The days an event runs past its start's: one ending at exactly midnight ends on its own day, as it's drawn (P9). */\nfunction endDays(start: Date, end: Date): number {\n return end > start ? daysBetween(start, new Date(end.getTime() - 1)) : daysBetween(start, end);\n}\n\n/**\n * The Calendar's dates and times in one locale (Sprint 25.20 L1): a component takes them from useDateWords(), whose\n * locale the server and the hydrating browser share, so the same words are drawn on both sides. Made once per locale.\n */\nfunction makeDateWords(locale: string | undefined) {\n const dtf = (options: Intl.DateTimeFormatOptions) => dtfFor(locale, options);\n /** Whether the locale keeps a 12-hour clock (\"9:00 AM\") or a 24-hour one (\"09:00\"). */\n const twelveHour = () => /^h1[12]$/.test(dtf({ hour: \"numeric\" }).resolvedOptions().hourCycle ?? \"\");\n /** A time's options: a 24-hour clock writes its hours in two digits everywhere (\"04:00\", as its ranges do), a 12-hour one doesn't. */\n const timeOptions = (): Intl.DateTimeFormatOptions => ({ hour: twelveHour() ? \"numeric\" : \"2-digit\", minute: \"2-digit\" });\n /** \"+1\", in the locale's own digits: an overnight time's day offset (P12). */\n const dayOffset = (days: number) => new Intl.NumberFormat(locale, { signDisplay: \"always\" }).format(days);\n\n /** A month's name: \"September\", \"Sept\"; \"septembre\" on a French page. */\n function monthName(month: number, width: \"long\" | \"short\" = \"long\"): string {\n return dtf({ month: width }).format(new Date(2026, month, 1));\n }\n\n /** The weekday names from the week's first day: [\"Mon\", \"Tue\", …], or narrow [\"M\", \"T\", …]. */\n function weekdayNames(weekStartsOn: Weekday, width: \"long\" | \"short\" | \"narrow\" = \"short\"): string[] {\n const f = dtf({ weekday: width });\n // 4 January 2026 is a Sunday\n return Array.from({ length: 7 }, (_, i) => f.format(new Date(2026, 0, 4 + weekStartsOn + i)));\n }\n\n /** A time of day: \"9:00 AM\", \"09:00\". */\n function formatTime(d: Date): string {\n return dtf(timeOptions()).format(d);\n }\n\n /** The hour's label in the week's hours: \"8 AM\" on a 12-hour clock, \"08:00\" on a 24-hour one. */\n function formatHourLabel(hour: number): string {\n const at = new Date(2026, 0, 5, hour);\n return twelveHour() ? dtf({ hour: \"numeric\" }).format(at) : dtf({ hour: \"2-digit\", minute: \"2-digit\" }).format(at);\n }\n\n /**\n * A time range: \"9:00 – 10:30 AM\", \"09:00–10:30\". One that ends on a later day reads its end's offset in days,\n * \"20:00 – 04:00 (+1)\" (the owner's D53, P12): the event is the day's it starts on, as the rota's nights are.\n */\n function formatTimeRange(start: Date, end?: Date): string {\n if (!end) return formatTime(start);\n const f = dtf(timeOptions());\n if (daysBetween(start, end) === 0) return f.formatRange(start, end);\n // the locale's own separator between the two ends\n const sep = f.formatRangeToParts(start, end).find((p) => p.source === \"shared\" && p.type === \"literal\")?.value ?? \" – \";\n const days = endDays(start, end);\n return days === 0 ? `${f.format(start)}${sep}${f.format(end)}` : `${f.format(start)}${sep}${f.format(end)} (${dayOffset(days)})`;\n }\n\n /** The same range for a screen reader: the offset in words, \"20:00 to 04:00 the next day\" (the library's English). */\n function speakTimeRange(start: Date, end?: Date): string {\n if (!end) return formatTime(start);\n const days = endDays(start, end);\n const to = `${formatTime(start)} to ${formatTime(end)}`;\n return days === 0 ? to : days === 1 ? `${to} the next day` : `${to}, ${days} days later`;\n }\n\n /** A month and its year: \"September 2026\". */\n function formatMonthYear(d: Date): string {\n return dtf({ month: \"long\", year: \"numeric\" }).format(d);\n }\n\n /** A day in full, for names: \"Thursday 17 September 2026\" in British English. */\n function formatDayLong(d: Date): string {\n return dtf({ weekday: \"long\", day: \"numeric\", month: \"long\", year: \"numeric\" }).format(d);\n }\n\n /** A day in short: \"Thu 17 Sept\" in British English. */\n function formatDayShort(d: Date): string {\n return dtf({ weekday: \"short\", day: \"numeric\", month: \"short\" }).format(d);\n }\n\n /** A date as a field shows one: \"Mar 5, 2026\", \"5 Mar 2026\". */\n function formatDayMedium(d: Date): string {\n return dtf({ day: \"numeric\", month: \"short\", year: \"numeric\" }).format(d);\n }\n\n /** Two dates as a range picker shows them: \"Mar 5 – 9, 2026\", \"5–9 Mar 2026\". */\n function formatDayRange(start: Date, end: Date): string {\n return dtf({ day: \"numeric\", month: \"short\", year: \"numeric\" }).formatRange(startOfDay(start), startOfDay(end));\n }\n\n /** Two months: \"January – February 2026\". */\n function formatMonthRange(start: Date, end: Date): string {\n return dtf({ month: \"long\", year: \"numeric\" }).formatRange(new Date(start.getFullYear(), start.getMonth(), 1), new Date(end.getFullYear(), end.getMonth(), 1));\n }\n\n /** The week's dates: \"Sep 7 – 13, 2026\", \"7–13 Sept 2026\". */\n function formatWeekRange(d: Date, weekStartsOn: Weekday = 0): string {\n return dtf({ day: \"numeric\", month: \"short\", year: \"numeric\" }).formatRange(startOfWeek(d, weekStartsOn), startOfDay(endOfWeek(d, weekStartsOn)));\n }\n\n /**\n * When an event happens, as its card and its name say it: a day (\"Thu 17 Sept\"), its days (\"7–9 Sept\"), a day and its\n * times (\"Thu 17 Sept, 09:00–10:30\"), an overnight one with its offset (\"Mon 12 Oct, 20:00 – 04:00 (+1)\"), or a longer\n * one's two moments.\n */\n function formatEventWhen(e: CalendarEvent, spoken = false): string {\n const { first, last } = eventSpan(e);\n const multiDay = last > first;\n if (e.allDay) {\n if (!multiDay) return spoken ? formatDayLong(first) : formatDayShort(first);\n return dtf(spoken ? { weekday: \"long\", day: \"numeric\", month: \"long\" } : { day: \"numeric\", month: \"short\" }).formatRange(first, last);\n }\n if (!e.end || !isBarEvent(e)) {\n const day = spoken ? formatDayLong(e.start) : formatDayShort(e.start);\n // an end at or before the start is no end: one time, never \"11:45 PM to 11:45 PM\"\n const end = e.end && e.end > e.start ? e.end : undefined;\n return `${day}, ${spoken ? speakTimeRange(e.start, end) : formatTimeRange(e.start, end)}`;\n }\n return dtf({ weekday: \"short\", day: \"numeric\", month: \"short\", hour: \"numeric\", minute: \"2-digit\" }).formatRange(e.start, e.end);\n }\n\n return { monthName, weekdayNames, formatTime, formatHourLabel, formatTimeRange, speakTimeRange, formatMonthYear, formatDayLong, formatDayShort, formatDayMedium, formatDayRange, formatMonthRange, formatWeekRange, formatEventWhen };\n}\n\nexport type DateWords = ReturnType<typeof makeDateWords>;\n\nconst wordsByLocale = localeCache<DateWords>(32);\n\n/** The Calendar's dates and times in a locale (undefined: the browser's own language). */\nexport function dateWords(locale: string | undefined): DateWords {\n return wordsByLocale(locale ?? \"\", () => makeDateWords(locale));\n}\n\n/** The dates and times in the locale the component writes in (useFormatLocale): the same object while it doesn't change. */\nexport function useDateWords(): DateWords {\n return dateWords(useFormatLocale());\n}\n\n/** One bar's piece in a week row: from its first day there for `span` days, in its lane. */\nexport interface BarSegment {\n event: CalendarEvent;\n startCol: number;\n span: number;\n lane: number;\n /** It began before this row, or goes on after it: that end is square, so two pieces read as one event. */\n continuesBefore: boolean;\n continuesAfter: boolean;\n}\n\nexport interface WeekLayout {\n segments: BarSegment[];\n /** Per day: the events its \"+N more\" holds (empty where everything shows). */\n more: CalendarEvent[][];\n /** The lanes the row draws. */\n lanes: number;\n}\n\n/**\n * A week row's events as bars in lanes (Sprint 25.18 A12): every event overlapping the week, one bar across its days\n * there, keeping its lane on each day it covers. Bars come first, longest first, then timed events by start. The row\n * shows `capacity` lanes; a day with more events than that gives its last lane to \"+N more\" (counting what it holds\n * there and below), and a bar in that lane is cut around it.\n */\nexport function layoutWeek(events: CalendarEvent[], days: Date[], capacity: number): WeekLayout {\n const weekStart = startOfDay(days[0]);\n const weekEnd = startOfDay(days[days.length - 1]);\n type Item = { event: CalendarEvent; startCol: number; endCol: number; before: boolean; after: boolean; length: number };\n const items: Item[] = [];\n for (const event of events) {\n const { first, last } = eventSpan(event);\n if (last < weekStart || first > weekEnd) continue;\n items.push({\n event,\n startCol: Math.max(0, daysBetween(weekStart, first)),\n endCol: Math.min(days.length - 1, daysBetween(weekStart, last)),\n before: first < weekStart,\n after: last > weekEnd,\n length: daysBetween(first, last) + 1,\n });\n }\n items.sort((a, b) => {\n const barA = isBarEvent(a.event) || a.length > 1, barB = isBarEvent(b.event) || b.length > 1;\n if (barA !== barB) return barA ? -1 : 1;\n if (barA && a.length !== b.length) return b.length - a.length;\n return a.event.start.getTime() - b.event.start.getTime() || a.event.title.localeCompare(b.event.title);\n });\n // the lowest lane free on every day the item covers\n const taken: boolean[][] = [];\n const laneOf = new Map<Item, number>();\n for (const item of items) {\n let lane = 0;\n while (Array.from({ length: item.endCol - item.startCol + 1 }, (_, k) => taken[lane]?.[item.startCol + k]).some(Boolean)) lane++;\n taken[lane] ??= [];\n for (let c = item.startCol; c <= item.endCol; c++) taken[lane][c] = true;\n laneOf.set(item, lane);\n }\n const cap = Math.max(1, capacity);\n // a day overflows when an event there sits below the last lane\n const overflow = days.map((_, c) => items.some((it) => laneOf.get(it)! >= cap && it.startCol <= c && c <= it.endCol));\n const more: CalendarEvent[][] = days.map((_, c) => (overflow[c] ? items.filter((it) => laneOf.get(it)! >= cap - 1 && it.startCol <= c && c <= it.endCol).map((it) => it.event) : []));\n const segments: BarSegment[] = [];\n for (const item of items) {\n const lane = laneOf.get(item)!;\n if (lane >= cap) continue;\n if (lane < cap - 1) {\n segments.push({ event: item.event, startCol: item.startCol, span: item.endCol - item.startCol + 1, lane, continuesBefore: item.before, continuesAfter: item.after });\n continue;\n }\n // the last lane: cut around the days whose \"+N more\" takes it\n let runStart = -1;\n for (let c = item.startCol; c <= item.endCol + 1; c++) {\n const free = c <= item.endCol && !overflow[c];\n if (free && runStart < 0) runStart = c;\n if (!free && runStart >= 0) {\n segments.push({ event: item.event, startCol: runStart, span: c - runStart, lane, continuesBefore: runStart > item.startCol || item.before, continuesAfter: c - 1 < item.endCol || item.after });\n runStart = -1;\n }\n }\n }\n const lanes = Math.min(cap, taken.length);\n return { segments, more, lanes };\n}\n\n/** A piece placed among the ones it overlaps: its column, and how many columns its group of overlapping pieces takes. */\nexport interface PlacedPiece {\n piece: DayPiece;\n column: number;\n columns: number;\n}\n\n/**\n * The week's hours side by side where they overlap: each group of pieces that overlap one another shares the day's\n * width, and a piece clear of the others takes all of it (the whole day's narrowest share was given to every piece).\n */\nexport function layoutPieces(pieces: DayPiece[], minMinutes = 0): PlacedPiece[] {\n const out: PlacedPiece[] = [];\n let group: PlacedPiece[] = [];\n let columnEnds: number[] = [];\n let groupEnd = -Infinity;\n const close = () => {\n for (const placed of group) placed.columns = columnEnds.length;\n out.push(...group);\n group = [];\n columnEnds = [];\n };\n for (const piece of pieces) {\n const at = piece.start.getTime();\n // where it ends as drawn: a short event is drawn taller than its time, so two back to back sit side by side, not\n // one over the other (the review of 2 October)\n const end = Math.max(piece.end.getTime(), at + minMinutes * 60_000);\n if (group.length && at >= groupEnd) close();\n let column = columnEnds.findIndex((e) => e <= at);\n if (column < 0) column = columnEnds.push(0) - 1;\n columnEnds[column] = end;\n groupEnd = Math.max(group.length ? groupEnd : -Infinity, end);\n group.push({ piece, column, columns: 0 });\n }\n if (group.length) close();\n return out;\n}\n\n/** Minutes since midnight as a fraction of 24 hours (0–1) */\nexport function timeToFraction(d: Date): number {\n return (d.getHours() * 60 + d.getMinutes()) / (24 * 60);\n}\n","import { useState, useRef, useEffect, useMemo, useId, useContext, type Ref } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn, ACTIVE_RING, ERROR_ACTIVE_RING, ERROR_FOCUS_WITHIN_RING, FIELD_FOCUS_WITHIN_RING, FOCUS_RING } from \"../lib/utils\";\nimport { useInputModality } from \"../lib/input-modality\";\nimport { Icon } from \"../lib/icons\";\nimport { Button, ControlSizeContext, type ControlSize } from \"./Button\";\nimport { AutoTooltip } from \"./Tooltip\";\nimport { usePosition } from \"../lib/use-position\";\nimport { useGridKeyboard, usePopupFocus } from \"../lib/focus\";\nimport { addMonthsClamped, dayKey, isExcludedDay, moveDay, type DisabledDates } from \"../lib/date-grid\";\nimport { DateSegmentFields, localeDayFirst } from \"../lib/date-segments\";\nimport { useLatest } from \"../lib/use-latest\";\nimport { useFieldControl, type FieldControlWiring } from \"./Field\";\nimport { useReportedChange } from \"../lib/form-context\";\nimport { formatLocale } from \"../lib/format-locale\";\nimport { useWeekStart, type Weekday } from \"../lib/week-start\";\nimport { dateWords, useDateWords } from \"./Calendar/calendar-utils\";\nimport { useFormatLocale } from \"../lib/locale\";\nimport { useHydrated, useToday } from \"../lib/hydrated\";\n\nconst CONTROL_HEIGHT: Record<ControlSize, string> = {\n sm: \"h-[var(--ds-control-height-sm)]\",\n md: \"h-[var(--ds-control-height-md)]\",\n lg: \"h-[var(--ds-control-height-lg)]\",\n};\n\nconst TEXT_SIZE: Record<ControlSize, string> = {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n};\n\ninterface DatePickerProps extends Omit<FieldControlWiring, \"id\"> {\n value: Date | null;\n onChange: (date: Date | null) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n ref?: Ref<HTMLDivElement>;\n container?: Element | DocumentFragment;\n error?: boolean;\n label?: string;\n /** Forwarded to the trigger button so an external Label htmlFor can be associated. Defaults to a generated id used by the built-in label. */\n id?: string;\n size?: ControlSize;\n /** Earliest / latest selectable day (inclusive). Days outside are disabled. */\n min?: Date;\n max?: Date;\n /**\n * Days that can't be chosen, beside min and max: a function of the day (true to exclude it: a holiday, a booked day),\n * or the weekdays to exclude, Sunday 0 to Saturday 6 ([0, 6] for weekends). They show as unavailable, can't be picked\n * by click, keyboard or typing, and a typed one marks the field invalid.\n */\n disabledDates?: DisabledDates;\n /**\n * Range context for paired \"Start date\" / \"End date\" pickers. The other\n * end of the range is shown as selected and the days between are shaded,\n * so choosing an end date shows the start date and the span. When this\n * picker has no value yet, hovering previews the span from the other end.\n */\n range?: { start?: Date | null; end?: Date | null };\n /** The week's first day, Sunday 0 to Saturday 6. Default: the first day of the visitor's week, from their browser's languages, then the page's language, then Monday (gridsmith-ui 0.27.0); Sunday before. */\n weekStartsOn?: Weekday;\n}\n\n/** English month names, which a typed date may use on any page (\"Mar 5, 2026\"), beside the page's own (Sprint 25.18 F2). */\nconst ENGLISH_MONTHS = [\n \"january\", \"february\", \"march\", \"april\", \"may\", \"june\",\n \"july\", \"august\", \"september\", \"october\", \"november\", \"december\",\n];\n\nfunction getDaysInMonth(year: number, month: number) {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** How many days of the week come before the month's 1st, from the week's first day. */\nfunction getFirstDayOfWeek(year: number, month: number, weekStartsOn: Weekday) {\n return (new Date(year, month, 1).getDay() - weekStartsOn + 7) % 7;\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\n\n\n\nfunction validDate(year: number, monthIndex: number, day: number): Date | null {\n if (monthIndex < 0 || monthIndex > 11 || day < 1) return null;\n const d = new Date(year, monthIndex, day);\n return d.getFullYear() === year && d.getMonth() === monthIndex && d.getDate() === day ? d : null;\n}\n\n/**\n * Round 15 (the owner's 52.6): what a person types as a Date, or null. Accepts the field's own display (\"Mar 5, 2026\"),\n * \"5 Mar 2026\", \"March 5 2026\", ISO \"2026-03-05\", and numeric \"05/03/2026\" or \"3/5/26\" — an ambiguous numeric date\n * follows the locale's order; a part over 12 settles it either way.\n */\n/** A month named in English or in the page's language, in full or shortened (\"mars\", \"févr.\"), or -1. */\nfunction monthIndex(name: string, locale: string | undefined): number {\n const typed = name.toLocaleLowerCase().replace(/\\.$/, \"\");\n const fold = (m: string) => m.toLocaleLowerCase().replace(/\\.$/, \"\");\n const { monthName } = dateWords(locale);\n const lists = [ENGLISH_MONTHS, Array.from({ length: 12 }, (_, i) => fold(monthName(i, \"long\"))), Array.from({ length: 12 }, (_, i) => fold(monthName(i, \"short\")))];\n for (const list of lists) {\n const i = list.findIndex((m) => m.startsWith(typed) || (typed.length >= 3 && typed.startsWith(m)));\n if (i >= 0) return i;\n }\n return -1;\n}\n\nexport function parseTypedDate(text: string, dayFirst: boolean = localeDayFirst(), locale: string | undefined = formatLocale()): Date | null {\n const t = text.trim().replace(/\\s+/g, \" \");\n if (!t) return null;\n let m = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/.exec(t);\n if (m) return validDate(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n m = /^(\\p{L}{3,})\\.?\\s+(\\d{1,2}),?\\s+(\\d{4})$/u.exec(t);\n if (m) { const mi = monthIndex(m[1], locale); return mi < 0 ? null : validDate(Number(m[3]), mi, Number(m[2])); }\n m = /^(\\d{1,2})\\.?\\s+(\\p{L}{3,})\\.?,?\\s+(\\d{4})$/u.exec(t);\n if (m) { const mi = monthIndex(m[2], locale); return mi < 0 ? null : validDate(Number(m[3]), mi, Number(m[1])); }\n m = /^(\\d{1,2})[/.-](\\d{1,2})[/.-](\\d{2,4})$/.exec(t);\n if (m) {\n const a = Number(m[1]), b = Number(m[2]);\n const year = m[3].length === 2 ? 2000 + Number(m[3]) : Number(m[3]);\n const [day, month] = a > 12 ? [a, b] : b > 12 ? [b, a] : dayFirst ? [a, b] : [b, a];\n return validDate(year, month - 1, day);\n }\n return null;\n}\n\nexport function DatePicker({ value, onChange: onChangeProp, placeholder = \"Pick a date\", disabled, className, ref, container, error = false, label, id, size: sizeProp, min, max, disabledDates, range, weekStartsOn: weekStartsOnProp, ...wiring }: DatePickerProps) {\n // Sprint 25.19 W1 (P9): the page's own day, else the visitor's week (Monday on a server's render without the request's\n // languages)\n const weekStartsOn = useWeekStart(weekStartsOnProp);\n // Sprint 25.20: the locale the server and the hydrating browser share; the value's day and today are the visitor's, so\n // they wait for the browser (D3)\n const locale = useFormatLocale();\n const { formatDayLong, formatMonthYear, weekdayNames } = useDateWords();\n const hydrated = useHydrated();\n const today = useToday();\n // Sprint 25.12 A15: a new value the user gives this control marks the form's overlay; the page's onChange runs as given\n const onChange = useReportedChange(onChangeProp, value);\n const contextSize = useContext(ControlSizeContext);\n const size = sizeProp ?? contextSize ?? \"md\";\n const [open, setOpen] = useState(false);\n const [hover, setHover] = useState<Date | null>(null);\n // Open on the value's month, else on the other end of the range, else today.\n const [viewDate, setViewDate] = useState(() => value ?? range?.start ?? range?.end ?? new Date());\n const triggerRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const generatedId = useId();\n // Inside a Field the group takes the Field's id, label, hint, error and required state (round 27 review: it was named\n // \"Date\", and the summary read \"Start date: Needs attention\" without the message). A group cannot carry\n // aria-required, so it says \"Required\" in its description.\n // its own label on screen names it, its words as the group's aria-label (the final review of Sprint 25.31, 2)\n const control = useFieldControl({ ...wiring, id, error: error || undefined }, { requiredInDescription: true, component: \"DatePicker\", ownLabel: label ? true : undefined });\n // The day, month and year are one field (Sprint 30, P13): the keyboard's outline when Tab reached it, the active look\n // after a pointer press, and the active look while the panel is open\n useInputModality();\n const inputId = control.id ?? generatedId;\n const pos = usePosition(triggerRef, panelRef, open, { side: \"bottom\", align: \"start\", offset: 4, flip: true });\n\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n const daysInMonth = getDaysInMonth(year, month);\n const firstDay = getFirstDayOfWeek(year, month, weekStartsOn);\n\n const startOf = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const isDisabledDay = (d: Date) => (!!min && d < startOf(min)) || (!!max && d > startOf(max)) || isExcludedDay(disabledDates, d);\n\n // Sprint 25.7 (D14(b), the APG date picker): the day grid is one Tab stop. It opens on the chosen day, else today,\n // and the arrows, Home/End and PageUp/PageDown move it; moving out of the month shows the next one.\n const [focusDate, setFocusDate] = useState<Date>(() => startOf(value ?? range?.start ?? range?.end ?? new Date()));\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n const start = startOf(value ?? range?.start ?? range?.end ?? today ?? new Date());\n setFocusDate(start);\n setViewDate(new Date(start.getFullYear(), start.getMonth(), 1));\n }\n }\n const showDay = (d: Date) => {\n setFocusDate(d);\n if (d.getFullYear() !== year || d.getMonth() !== month) setViewDate(new Date(d.getFullYear(), d.getMonth(), 1));\n };\n const grid = useGridKeyboard({\n container: gridRef,\n active: focusDate,\n setActive: showDay,\n keyOf: dayKey,\n move: (from, e) => moveDay(from, e.key, e.shiftKey, weekStartsOn),\n });\n\n const prevMonth = () => { setViewDate(new Date(year, month - 1, 1)); setFocusDate(addMonthsClamped(focusDate, -1)); };\n const nextMonth = () => { setViewDate(new Date(year, month + 1, 1)); setFocusDate(addMonthsClamped(focusDate, 1)); };\n\n // Portaled panel (Sprint 25.7): focus moves onto the grid's day on open; Escape and a choice hand it back to what\n // opened it (the calendar button); Tab out of the panel carries on from there.\n const { isTop: isTopLayer, returnFocus } = usePopupFocus(open, { trigger: buttonRef, panel: panelRef, close: () => setOpen(false), tabExits: \"edges\" });\n const focusActiveDay = useLatest(grid.focusActive);\n useEffect(() => {\n if (!open) return;\n const raf = requestAnimationFrame(() => focusActiveDay.current());\n return () => cancelAnimationFrame(raf);\n }, [open, focusActiveDay]);\n\n // Focus goes back to what opened the picker before the consumer's onChange runs, so a focus move it makes (to the\n // end date, after a start date) wins, as in every popup (Sprint 25.7).\n const choose = (d: Date | null) => {\n returnFocus();\n onChange(d);\n setOpen(false);\n };\n\n // Round 16 (the owner's item 7): a segmented field — day, month and year in the locale's order, each a spinbutton.\n // Digits fill the focused segment, which keeps focus until the person moves on (Tab, an arrow, a separator), and a\n // digit it can't take starts the next one (Sprint 25.8.7 item 7, lib/segments.ts); Up/Down step it, Left/Right move\n // between segments, Backspace clears, a pasted date is parsed whole; the calendar button opens the chooser as an aid.\n // A complete, valid date inside min/max commits at once.\n const dayFirst = useMemo(() => localeDayFirst(locale), [locale]);\n // the field's parts (lib/date-segments.tsx, shared with DateRangePicker's typed range): it reports the date as typed,\n // and the picker takes it when it is a day the calendar would let the person choose\n const focusPart = useRef<(index: number) => void>(() => {});\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const t = e.target as Node;\n if (triggerRef.current?.contains(t) || panelRef.current?.contains(t)) return;\n setOpen(false);\n };\n const keyHandler = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n returnFocus();\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n document.addEventListener(\"keydown\", keyHandler);\n return () => {\n document.removeEventListener(\"mousedown\", handler);\n document.removeEventListener(\"keydown\", keyHandler);\n };\n }, [open, isTopLayer, returnFocus]);\n const [typedInvalid, setTypedInvalid] = useState(false);\n const takeTyped = (d: Date | null, filled: boolean) => {\n if (!filled) { setTypedInvalid(false); return; }\n // the grid's own test, so a typed day and a clicked one agree (Sprint 25.8.7 item 9: an excluded day can't be typed)\n const ok = !!d && !isDisabledDay(d);\n setTypedInvalid(!ok);\n if (d && ok && !(value && isSameDay(value, d))) { onChange(d); setViewDate(d); }\n };\n const applyTyped = (text: string) => {\n const d = parseTypedDate(text, dayFirst, locale);\n if (d) takeTyped(d, true);\n };\n\n const selectDay = (day: number) => {\n const d = new Date(year, month, day);\n if (isDisabledDay(d)) return;\n choose(d);\n };\n\n // Range band: the two ends are value/range, in either order; while this\n // picker is empty, the hovered day previews where the span would go.\n const rangeA = range?.start ?? null;\n const rangeB = range?.end ?? null;\n const otherEnd = value ? (rangeA && !isSameDay(rangeA, value) ? rangeA : rangeB) : (rangeA ?? rangeB);\n const thisEnd = value ?? (otherEnd && hover ? hover : null);\n const [bandStart, bandEnd] = otherEnd && thisEnd\n ? (otherEnd <= thisEnd ? [otherEnd, thisEnd] : [thisEnd, otherEnd])\n : [null, null];\n const inBand = (d: Date) => !!(bandStart && bandEnd && d > bandStart && d < bandEnd);\n\n const cells: (number | null)[] = [];\n for (let i = 0; i < firstDay; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n while (cells.length % 7) cells.push(null);\n const weeks: (number | null)[][] = [];\n for (let i = 0; i < cells.length; i += 7) weeks.push(cells.slice(i, i + 7));\n\n return (\n <div ref={ref} className={cn(className)}>\n {label && <label htmlFor={inputId} className=\"block text-sm font-medium text-[var(--ds-text-primary)] mb-ds-1\">{label}</label>}\n {control.requiredNote}\n <div\n ref={triggerRef}\n data-date-field=\"\"\n role=\"group\"\n id={inputId}\n aria-label={control.labelId ? undefined : label ?? control.label ?? \"Date\"}\n aria-labelledby={control.labelId}\n aria-describedby={control.describedBy}\n aria-description={!value ? placeholder : undefined}\n aria-invalid={control.invalid || typedInvalid || undefined}\n onPaste={(e) => { const text = e.clipboardData.getData(\"text\"); if (text) { e.preventDefault(); applyTyped(text); } }}\n className={cn(\n \"flex items-center gap-ds-2 w-full\",\n CONTROL_HEIGHT[size], TEXT_SIZE[size],\n \"border-[length:var(--ds-border-width)]\",\n control.invalid || typedInvalid ? \"border-[var(--ds-status-error)]\" : \"border-[var(--ds-input-border)]\",\n \"bg-[var(--ds-input-bg)] rounded-[var(--ds-radius-md)]\",\n \"shadow-[var(--ds-input-shadow)]\",\n \"transition-colors\",\n \"px-ds-3 py-ds-2\",\n !control.invalid && !disabled && !open && \"hover:border-[var(--ds-input-border-hover)]\",\n open && (control.invalid || typedInvalid ? ERROR_ACTIVE_RING : ACTIVE_RING),\n // the segments mark which part has focus (their tint); the field draws the focus (a hover keeps its border)\n control.invalid || typedInvalid ? ERROR_FOCUS_WITHIN_RING : FIELD_FOCUS_WITHIN_RING,\n disabled && \"opacity-disabled cursor-not-allowed\",\n \"text-[var(--ds-text-primary)]\"\n )}\n >\n <Icon name=\"calendar\" size={14} className=\"text-[var(--ds-text-muted)] shrink-0\" />\n <div className=\"flex items-center min-w-0 flex-1 tabular-nums\" onClick={() => focusPart.current(0)}>\n <DateSegmentFields\n values={[value]}\n dayFirst={dayFirst}\n hydrated={hydrated}\n disabled={disabled}\n focusRef={(focus) => { focusPart.current = focus; }}\n onChange={([d], [filled]) => takeTyped(d, filled)}\n />\n </div>\n {/* an icon button's one tooltip, its name (Sprint 25.29 item 18, accessibility#10) */}\n <AutoTooltip content=\"Choose a date\">\n <button\n ref={buttonRef}\n type=\"button\"\n aria-label=\"Choose a date\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => !disabled && setOpen(!open)}\n disabled={disabled}\n className={cn(\"shrink-0 -mr-ds-1 rounded-[var(--ds-radius-sm)] text-[var(--ds-text-muted)] hover:text-[var(--ds-text-primary)] disabled:cursor-not-allowed\", FOCUS_RING)}\n >\n <Icon name=\"chevron-down\" size={14} />\n </button>\n </AutoTooltip>\n </div>\n\n {open && createPortal(\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-label=\"Choose a date\"\n // Safari drops focus to the body on a mousedown on a button; a panel that takes focus keeps it inside the\n // picker, so a Field's leave check never fires mid-choice (round 27 review)\n tabIndex={-1}\n className={cn(\n \"fixed z-[var(--ds-z-popover)] w-[280px] outline-none\",\n \"bg-[var(--ds-bg-surface-elevated)]\",\n \"[backdrop-filter:var(--ds-glass-filter)] [-webkit-backdrop-filter:var(--ds-glass-filter)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]\",\n \"rounded-[var(--ds-radius-md)]\",\n \"shadow-[var(--ds-shadow-dropdown),var(--ds-glass-inset)]\"\n )}\n style={{ top: pos.top, left: pos.left }}\n >\n <div\n className=\"flex items-center justify-between bg-[var(--ds-bg-muted)] rounded-t-[var(--ds-radius-md)]\"\n style={{ padding: \"var(--ds-space-2) var(--ds-space-3)\" }}\n >\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" onClick={prevMonth} aria-label=\"Previous month\">\n <Icon name=\"chevron-right\" size={14} className=\"rotate-180\" />\n </Button>\n <span className=\"text-sm font-medium text-[var(--ds-text-primary)]\">\n {formatMonthYear(viewDate)}\n </span>\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" onClick={nextMonth} aria-label=\"Next month\">\n <Icon name=\"chevron-right\" size={14} />\n </Button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={formatMonthYear(viewDate)}\n onKeyDown={grid.onKeyDown}\n // 4 px between days, so the outline of the day beside the chosen one sits in the gap, never on its fill\n // (Sprint 30, the owner's decision C)\n className=\"flex flex-col gap-[4px] tabular-nums\"\n style={{ padding: \"var(--ds-space-2) var(--ds-space-3)\" }}\n >\n <div role=\"row\" className=\"grid grid-cols-7 gap-[4px] mb-ds-0.5\">\n {weekdayNames(weekStartsOn, \"narrow\").map((d, i) => (\n <div key={i} role=\"columnheader\" aria-label={weekdayNames(weekStartsOn, \"long\")[i]} className=\"text-center text-2xs font-medium text-[var(--ds-text-muted)] py-ds-1\">\n {d}\n </div>\n ))}\n </div>\n\n {weeks.map((week, w) => (\n <div key={w} role=\"row\" className=\"grid grid-cols-7 gap-[4px]\" onMouseLeave={() => setHover(null)}>\n {week.map((day, i) => {\n if (day === null) return <div key={`empty-${i}`} role=\"gridcell\" />;\n const dateObj = new Date(year, month, day);\n const isSelected = !!value && isSameDay(dateObj, value);\n const isOtherEnd = !!otherEnd && isSameDay(dateObj, otherEnd);\n const isToday = today !== null && isSameDay(dateObj, today);\n const between = inBand(dateObj);\n const dis = isDisabledDay(dateObj);\n\n return (\n <button\n key={day}\n type=\"button\"\n role=\"gridcell\"\n data-grid-key={dayKey(dateObj)}\n tabIndex={grid.tabIndexOf(dateObj)}\n aria-disabled={dis || undefined}\n onClick={() => selectDay(day)}\n onFocus={() => { if (!isSameDay(dateObj, focusDate)) setFocusDate(dateObj); }}\n onMouseEnter={() => setHover(dateObj)}\n aria-selected={isSelected}\n aria-current={isToday ? \"date\" : undefined}\n aria-label={formatDayLong(dateObj)}\n className={cn(\n \"w-full aspect-square flex items-center justify-center text-xs\",\n \"transition-colors cursor-pointer\",\n FOCUS_RING,\n isSelected\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)] font-bold rounded-[var(--ds-radius-sm)]\"\n : isOtherEnd\n ? \"bg-[var(--ds-accent-muted)] text-[var(--ds-accent-subtle-text)] font-semibold rounded-[var(--ds-radius-sm)]\"\n : between\n ? \"bg-[var(--ds-accent-subtle)] text-[var(--ds-accent-subtle-text)] rounded-none\"\n : isToday\n ? \"border-[length:var(--ds-border-width)] border-[var(--ds-accent-ink)] text-[var(--ds-accent-ink)] font-medium rounded-[var(--ds-radius-sm)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-emphasis)] rounded-[var(--ds-radius-sm)]\",\n dis && \"opacity-disabled cursor-not-allowed hover:bg-transparent\",\n )}\n >\n {day}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n\n <div\n className=\"flex justify-between items-center bg-[var(--ds-bg-muted)] border-t-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] rounded-b-[var(--ds-radius-md)]\"\n style={{ padding: \"var(--ds-space-2) var(--ds-space-3)\" }}\n >\n <Button type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n // today can be outside min and max, or excluded (Sprint 25.8.7 item 9): then it can't be chosen here either\n disabled={today !== null && isDisabledDay(startOf(today))}\n onClick={() => {\n const now = new Date();\n setViewDate(now);\n choose(now);\n }}\n >\n Today\n </Button>\n {value && (\n <Button type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => choose(null)}\n >\n Clear\n </Button>\n )}\n </div>\n </div>,\n container ?? document.body\n )}\n </div>\n );\n}\n","import { useState, useRef, useCallback, type ReactNode } from \"react\";\nimport { RowsCtx } from \"../lib/surface-context\";\nimport { createPortal } from \"react-dom\";\nimport { cn, GLASS_DROPDOWN } from \"../lib/utils\";\nimport { Slot } from \"../lib/slot\";\nimport { usePosition, type Side } from \"../lib/use-position\";\n\ninterface HoverCardProps {\n content: ReactNode;\n children: ReactNode;\n side?: Side;\n delay?: number;\n closeDelay?: number;\n className?: string;\n container?: Element | DocumentFragment;\n}\n\nexport function HoverCard({\n content,\n children,\n side = \"bottom\",\n delay = 300,\n closeDelay = 200,\n className,\n container,\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n const openTimeout = useRef<ReturnType<typeof setTimeout>>(undefined);\n const closeTimeout = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n const pos = usePosition(triggerRef, floatingRef, open, { side, offset: 8, flip: true });\n\n const show = useCallback(() => {\n clearTimeout(closeTimeout.current);\n openTimeout.current = setTimeout(() => setOpen(true), delay);\n }, [delay]);\n\n const hide = useCallback(() => {\n clearTimeout(openTimeout.current);\n closeTimeout.current = setTimeout(() => setOpen(false), closeDelay);\n }, [closeDelay]);\n\n return (\n <>\n <Slot\n ref={triggerRef}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n {children}\n </Slot>\n {open && createPortal(\n <div\n ref={floatingRef}\n onMouseEnter={() => { clearTimeout(closeTimeout.current); }}\n onMouseLeave={hide}\n className={cn(\n \"fixed z-[var(--ds-z-popover)]\",\n \"w-72 p-ds-4\",\n \"bg-[var(--ds-bg-surface-elevated)] text-[var(--ds-text-primary)]\",\n GLASS_DROPDOWN,\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]\",\n \"rounded-[var(--ds-radius-md)]\",\n \"animate-in fade-in-0 zoom-in-95\",\n className,\n )}\n style={{ top: pos.top, left: pos.left }}\n >\n {/* an overlay's content is no collection's row, wherever it was opened from */}\n <RowsCtx value={false}>{content}</RowsCtx>\n </div>,\n container ?? document.body,\n )}\n </>\n );\n}\n","import { cloneElement, forwardRef, useCallback, useState, type ReactElement, type ReactNode, type Ref } from \"react\";\nimport { cn, FOCUS_RING } from \"../lib/utils\";\nimport { useTextOverflow } from \"../lib/use-text-overflow\";\nimport { CONTROL_ANCESTOR } from \"../lib/focus\";\nimport { mergeRefs } from \"../lib/slot\";\nimport { RevealTooltip } from \"./Tooltip\";\nimport { HoverCard } from \"./HoverCard\";\n\n/** What cut text can sit in whose own focus is the way to it: a control, or a table's row that opens on a click. */\nconst TEXT_HOLDER = `${CONTROL_ANCESTOR}, tr[tabindex]`;\n\n/**\n * Text cut to fit, an ellipsis or a clamp of lines (Sprint 25.8.7 item 5): its full text shows in its tooltip, on hover,\n * on keyboard focus and on a tap (WCAG's text-spacing guidance accepts an ellipsis only with a keyboard or activation\n * route). Cut, it is a Tab stop that draws the library's focus outline, as every control does (the tooltip alone would\n * read as no focus where tooltips are hidden, Sprint 26's D14); in a control (a button, a link, a cell of a grid, a row\n * that opens on a click) it takes no stop, since a stop nested in a control breaks it and the control's own focus is\n * the way to the text. Uncut, it is the text as it is. `card`: the full text in a HoverCard, for long multi-line text.\n * Shared by TextOverflow and the tables' cut cells.\n */\nexport function CutText({ cut, content, card = false, children }: { cut: boolean; content: ReactNode; card?: boolean; children: ReactElement<{ className?: string; ref?: Ref<HTMLElement> }> }) {\n const [inControl, setInControl] = useState(false);\n const placed = useCallback((el: HTMLElement | null) => {\n if (!el) return;\n const inside = !!el.parentElement?.closest(TEXT_HOLDER);\n // taken off at once, before a parent's own check of what it holds (RelativeTime's way)\n if (inside) el.removeAttribute(\"tabindex\");\n setInControl(inside);\n }, []);\n if (!cut) return children;\n const stop = cloneElement(children, {\n ref: mergeRefs(children.props.ref, placed),\n ...(inControl ? {} : { tabIndex: 0, className: cn(children.props.className, \"rounded-[var(--ds-radius-sm)]\", FOCUS_RING) }),\n } as Record<string, unknown>);\n if (card) {\n return <HoverCard content={<div className=\"max-w-[320px] text-sm text-[var(--ds-text-primary)]\">{content}</div>}>{stop}</HoverCard>;\n }\n return <RevealTooltip content={content}>{stop}</RevealTooltip>;\n}\n\nexport interface TextOverflowProps {\n /** Max visible lines before truncation. 1 = single-line ellipsis, >1 = line-clamp-N. */\n lines?: number;\n /**\n * Show the full text when it is cut: on hover, on keyboard focus (cut text is a Tab stop, drawing the focus outline,\n * except inside a control, whose own focus reaches it) and on a tap. Default: true.\n */\n tooltip?: boolean;\n /** Custom tooltip content. Defaults to the text content of children. */\n tooltipContent?: ReactNode;\n /** Use HoverCard instead of Tooltip for long multi-line content. */\n expandMode?: \"tooltip\" | \"hovercard\";\n /** The HTML element to render. Default: \"div\". */\n as?: \"span\" | \"p\" | \"div\";\n children: ReactNode;\n className?: string;\n}\n\n/** A table's cut cell (Table's and DataGrid's `truncate`): its lines clamped, its full text through CutText. */\nexport function CutCell({ children, lines }: { children: ReactNode; lines: number }) {\n const { ref, isTruncated } = useTextOverflow({ lines });\n const clampClass = lines === 1 ? \"truncate\" : `line-clamp-${lines}`;\n return <CutText cut={isTruncated} content={children}><span ref={ref} className={cn(clampClass, \"block\")}>{children}</span></CutText>;\n}\n\n/**\n * A table's email address: cut past 40 characters, or where the table squeezes its column, its full address through\n * CutText (Sprint 25.8.7 item 5: it had only a native title, which no keyboard or tap reaches).\n */\nexport function CutEmail({ children }: { children: ReactNode }) {\n const { ref, isTruncated } = useTextOverflow({ lines: 1 });\n return <CutText cut={isTruncated} content={children}><span ref={ref} className=\"max-w-[40ch] truncate inline-block align-bottom\">{children}</span></CutText>;\n}\n\nconst lineClampClasses: Record<number, string> = {\n 1: \"truncate\",\n 2: \"line-clamp-2\",\n 3: \"line-clamp-3\",\n 4: \"line-clamp-4\",\n 5: \"line-clamp-5\",\n 6: \"line-clamp-6\",\n};\n\nfunction getTruncationClass(lines: number): string {\n return lineClampClasses[lines] || `line-clamp-[${lines}]`;\n}\n\nexport const TextOverflow = forwardRef<HTMLElement, TextOverflowProps>(function TextOverflow(\n {\n lines = 1,\n tooltip = true,\n tooltipContent,\n expandMode = \"tooltip\",\n as = \"div\",\n children,\n className,\n },\n forwardedRef,\n) {\n const { ref: overflowRef, isTruncated } = useTextOverflow({ lines });\n\n const truncClass = getTruncationClass(lines);\n\n const Tag = as;\n const content = (\n <Tag\n ref={(node: HTMLElement | null) => {\n overflowRef(node);\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n }}\n className={cn(truncClass, \"min-w-0\", className)}\n >\n {children}\n </Tag>\n );\n\n if (!tooltip) return content;\n return <CutText cut={isTruncated} content={tooltipContent ?? children} card={expandMode === \"hovercard\"}>{content}</CutText>;\n});\n","import { Icon } from \"./icons\";\n\n/** How a column is sorted: not at all, smallest first, or largest first. */\nexport type SortState = false | \"asc\" | \"desc\";\n\n/**\n * A sortable column's indicator, Table's and DataGrid's alike (the owner's choice at the look check, 14 October). Every\n * sortable header shows it, so it can be seen that the column sorts: unsorted, both chevrons in the muted text colour,\n * the 3:1 an icon that marks a control needs (4.6:1 and more, measured in three themes); sorted, the one chevron that\n * points the way, in the accent. Its box is the same size in every state, so a header never moves when its column sorts\n * (data_display#10). A screen reader hears the order from the header's aria-sort, so the icons are hidden from it.\n */\nexport function SortIndicator({ sorted }: { sorted: SortState }) {\n return (\n <span aria-hidden=\"true\" data-sort={sorted || \"none\"} className=\"relative inline-block h-[18px] w-3 shrink-0\">\n {sorted ? (\n <Icon name={sorted === \"asc\" ? \"chevron-up\" : \"chevron-down\"} size={12} className=\"absolute left-0 top-[3px] text-[var(--ds-accent-ink)]\" />\n ) : (\n <>\n <Icon name=\"chevron-up\" size={12} className=\"absolute left-0 top-0 text-[var(--ds-text-muted)]\" />\n <Icon name=\"chevron-down\" size={12} className=\"absolute left-0 bottom-0 text-[var(--ds-text-muted)]\" />\n </>\n )}\n </span>\n );\n}\n","/** Shared column-kind inference for Table and DataGrid. */\n\n/**\n * What a column holds, which decides how its cells lay out: numbers and dates shrink to their content and stay whole,\n * an identifier (a long run of digits: a barcode, an ID) may wrap anywhere, an email truncates, text wraps at spaces.\n * In an editable DataGrid it also chooses each cell's editor (Sprint 25.8.7 item 19): a number, a date, a choice from\n * the column's options, a yes or no; a choice and a yes or no lay out as text does, in a Table too.\n */\nexport type ColumnKind = \"date\" | \"number\" | \"email\" | \"label\" | \"text\" | \"identifier\" | \"choice\" | \"boolean\";\n\nconst DATE_ISO = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst DATE_US = /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/;\n// a month's name or its short form, with or without a full stop: \"Jan\", \"Sept\", \"Sep.\", \"September\" (Sprint 25.13 A35)\nconst MONTH = \"[A-Z][a-z]{2,8}\\\\.?\";\nconst DATE_TEXT_MDY = new RegExp(`^${MONTH}\\\\s+\\\\d{1,2},?\\\\s+\\\\d{4}$`); // \"Jan 12, 2024\" or \"Sept 12 2024\"\nconst DATE_TEXT_DMY = new RegExp(`^\\\\d{1,2}\\\\s+${MONTH}\\\\s+\\\\d{4}$`); // \"12 Jan 2024\", \"24 Sept 2026\"\n// a date this year, with no year: \"Sep 16\", \"16 Sept\" (the review of 30 September). Only a month's own name, so \"Room 12\"\n// isn't a date.\nconst MONTH_NAME = \"(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\\\\.?\";\nconst DATE_TEXT_MD = new RegExp(`^${MONTH_NAME}\\\\s+\\\\d{1,2}$`);\nconst DATE_TEXT_DM = new RegExp(`^\\\\d{1,2}\\\\s+${MONTH_NAME}$`);\n// a number, with a currency before or a unit after it: \"$1,200\", \"12%\", \"18 KB\", \"1.2 MB\", \"250 ms\" (Sprint 25.13 A35)\nconst NUMBER_RE = /^[$€£¥]?\\s?[\\d,]+\\.?\\d*\\s?(?:%|[KMGTP]i?B|B|bytes?|ms|s|sec|min|h|hrs?|kg|g|km|m|°[CF])?$/i;\n// a long run of digits is an identifier, never a quantity: a barcode or an account number (Sprint 25.13 A35)\nconst IDENTIFIER_RE = /^\\d{13,}$/;\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nfunction isDate(v: string): boolean {\n return DATE_ISO.test(v) || DATE_US.test(v) || DATE_TEXT_MDY.test(v) || DATE_TEXT_DMY.test(v) || DATE_TEXT_MD.test(v) || DATE_TEXT_DM.test(v);\n}\n\nfunction isJsx(v: unknown): boolean {\n return typeof v === \"object\" && v !== null;\n}\n\nfunction detectKind(values: unknown[]): ColumnKind | undefined {\n // Filter out null/undefined\n const present = values.filter((v) => v != null);\n if (present.length === 0) return undefined;\n\n // Any JSX value means no kind\n if (present.some(isJsx)) return undefined;\n\n // Yes or no (Sprint 25.8.7 item 19: DataGrid edits it with a Checkbox, never as the text \"true\"). A choice is never\n // guessed: its options are the column's to give.\n if (present.every((v) => typeof v === \"boolean\")) return \"boolean\";\n\n // Check date (strings only)\n if (present.every((v) => typeof v === \"string\" && isDate(v))) return \"date\";\n\n // A long run of digits, as text or as a number too large to be one: an identifier\n if (present.every((v) => (typeof v === \"string\" && IDENTIFIER_RE.test(v)) || (typeof v === \"number\" && Math.abs(v) >= 1e13 && Number.isInteger(v)))) return \"identifier\";\n\n // Check number: all typeof number, or all strings matching the number pattern\n if (present.every((v) => typeof v === \"number\")) return \"number\";\n if (present.every((v) => typeof v === \"string\" && NUMBER_RE.test(v))) return \"number\";\n\n // Check email\n if (present.every((v) => typeof v === \"string\" && EMAIL_RE.test(v))) return \"email\";\n\n // Check label: strings <= 20 chars, no line breaks\n if (present.every((v) => typeof v === \"string\" && v.length <= 20 && !/[\\n\\r]/.test(v))) return \"label\";\n\n // Fallback\n return \"text\";\n}\n\n/**\n * The kind of a column from the words its cells show (Sprint 25.13 A35): a column of elements has no kind from its\n * values, so the Table reads what they render. Only a date or a number counts from rendered text, to keep it whole.\n */\nexport function kindOfRenderedText(texts: string[]): ColumnKind | undefined {\n const kind = detectKind(texts.map((t) => t.trim()).filter(Boolean));\n return kind === \"date\" || kind === \"number\" ? kind : undefined;\n}\n\n/**\n * Sample data rows and infer a ColumnKind for each key.\n * Returns a Map of key -> kind for columns that matched a pattern.\n * Columns with mixed types or JSX values get no entry.\n */\nexport function inferColumnKinds(\n data: Record<string, unknown>[],\n columnKeys: string[],\n maxSample = 50,\n): Map<string, ColumnKind> {\n const sample = data.length > maxSample ? data.slice(0, maxSample) : data;\n const result = new Map<string, ColumnKind>();\n\n for (const key of columnKeys) {\n const values = sample.map((row) => row[key]);\n const kind = detectKind(values);\n if (kind) result.set(key, kind);\n }\n\n return result;\n}\n","/**\n * The value cell of a Table or DataGrid in card mode (Sprint 25.4 C-2, C-4).\n *\n * A card row is `label | value`, the value right-aligned. Three things a value must do on a phone:\n * - wrap a long single string at sensible points first (after @, ., /, -) and mid-word only as a last resort\n * (`overflow-wrap: break-word` breaks inside a word only when the word alone cannot fit a line);\n * - clamp after two lines with the full text in a tooltip;\n * - reach the builder's own markup: a nested flex row (icon + name) keeps `min-width: auto` and overflows unless\n * every descendant is told `min-width: 0` and given the same break rule.\n *\n * A cell that holds an Avatar stacks: the avatar above, the primary text, then the secondary, aligned to the value\n * column. The rule is CSS (`:has([data-avatar])`) on the value cell's direct child, so a hand-rolled\n * `<div class=\"flex\"><Avatar/><div>…</div></div>` stacks the same way EntityCell does.\n */\nimport { Fragment, type ReactNode } from \"react\";\nimport { cn } from \"./utils\";\nimport { Tooltip } from \"../components/Tooltip\";\nimport { useTextOverflow } from \"./use-text-overflow\";\n\nexport const CARD_VALUE_CLASS = cn(\n \"min-w-0 text-right text-[var(--ds-text-primary)]\",\n \"[overflow-wrap:break-word] [&_*]:min-w-0 [&_*]:[overflow-wrap:break-word]\",\n // A hand-rolled avatar cell (div > Avatar + text) keeps its row and sits against the value column's right edge,\n // like EntityCell (round 7: the stacked cell was replaced).\n \"[&:has([data-avatar])>*]:flex [&:has([data-avatar])>*]:items-center [&:has([data-avatar])>*]:justify-end [&:has([data-avatar])>*]:text-right\",\n);\n\nconst BREAK_AFTER = /([@./-])/g;\n\n/** The string with a soft break opportunity after each @, ., / and -, so a long email or path wraps there first. */\nexport function breakable(text: string): ReactNode {\n const parts = text.split(BREAK_AFTER);\n if (parts.length === 1) return text;\n return parts.map((part, i) => (\n <Fragment key={i}>{part}{i % 2 === 1 && <wbr />}</Fragment>\n ));\n}\n\n/** A string value: sensible breaks, two lines, the full text as a tooltip once it clamps. */\nexport function CardStringValue({ text }: { text: string }) {\n const { ref, isTruncated } = useTextOverflow({ lines: 2, content: text });\n const el = <span ref={ref} className=\"block line-clamp-2\">{breakable(text)}</span>;\n return isTruncated ? <Tooltip content={text}>{el}</Tooltip> : el;\n}\n\nexport function CardValue({ value, id }: { value: ReactNode; id?: string }) {\n return (\n <span id={id} className={CARD_VALUE_CLASS}>\n {typeof value === \"string\" ? <CardStringValue text={value} /> : value}\n </span>\n );\n}\n","import { useLayoutEffect, useRef, useState } from \"react\";\n\n/**\n * Sprint 25.13 A35: below this width of its own, about a phone's, a table that doesn't fit shows cards; it goes back to\n * a table once it has the room the table needed, or this much more, so a width near the line can't flip it back and\n * forth.\n */\nexport const CARDS_BELOW = 440;\nexport const CARDS_HYSTERESIS = 40;\n\n/**\n * Whether a table (Table, DataGrid) shows cards (Sprint 25.13 A35): on a narrow screen, as before, and anywhere else\n * only when its own width is under `cardsBelow` and the table doesn't fit it — measured on the element `rootRef` holds,\n * never against the screen's breakpoint, so a table in a pane, a drawer or a dialog stays a table and scrolls sideways,\n * and a table that fits stays a table however narrow its box. 0 never switches by width. The root is whichever element\n * renders, so the measure follows the mode and `remeasure` (a titled table's root differs). A width of 0 (not laid out\n * yet, or no layout at all) decides nothing.\n *\n * The review of 30 September: the switch measured the root in both modes, and in a box that sizes to its content (a\n * flex item, an inline-block, a grid item placed at its start) the table's width said cards and the cards' width said\n * table, so it flipped on every commit until React stopped the page. It now decides each way from what the other mode\n * can't change: a table goes to cards when it overflows its frame (a box sized to its content never makes it overflow),\n * and cards go back once the root has the width the table needed then, which the cards can't make it overflow again.\n */\nexport function useCardsSwitch(narrowScreen: boolean, cardsBelow: number = CARDS_BELOW, remeasure?: unknown) {\n const rootRef = useRef<HTMLElement | null>(null);\n const [narrowBox, setNarrowBox] = useState(false);\n // the root's width at which the table fits its frame, read when it went to cards\n const needed = useRef(0);\n const cards = narrowScreen || narrowBox;\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (!root || cardsBelow <= 0) { setNarrowBox(false); return; }\n const measure = () => {\n // the width of the root's place: the cards' list reaches past its box by the room it keeps for a card's keyboard\n // outline, its margins taken back (Sprint 30, P3), which mustn't read as more width than the table had there\n const style = getComputedStyle(root);\n const width = root.getBoundingClientRect().width + (parseFloat(style.marginLeft) || 0) + (parseFloat(style.marginRight) || 0);\n if (width <= 0) return;\n if (narrowBox) {\n if (width >= Math.min(needed.current, cardsBelow + CARDS_HYSTERESIS)) setNarrowBox(false);\n return;\n }\n // cards shown for a narrow screen measure nothing: the table isn't drawn to read\n if (cards) return;\n const frame = root.querySelector<HTMLElement>(\"[data-table-scroll]\") ?? root;\n const over = frame.scrollWidth - frame.clientWidth;\n if (width < cardsBelow && over > 1) {\n needed.current = width + over;\n setNarrowBox(true);\n }\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(root);\n // the table's own width too: rows arriving can make it overflow a frame that keeps its size\n const table = root.querySelector(\"[data-table-scroll] > *\");\n if (table) observer.observe(table);\n return () => observer.disconnect();\n }, [cardsBelow, cards, narrowBox, remeasure]);\n return { cards, rootRef };\n}\n"]}
|