@k2b/ui 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/browser/actions/ContextMenu.js +3 -1
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/Dropdown.js +91 -46
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +4 -1
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +467 -0
- package/dist/browser/actions/GestureMenu.js.map +1 -0
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +1255 -534
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js +9 -3
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js +19 -1
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-behavior.js +9 -0
- package/dist/browser/chat/chat-behavior.js.map +1 -1
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Calendar.js +579 -533
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Lightbox.js +76 -40
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/MessageRow.js +2 -2
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +146 -79
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/Timeline.js +1038 -0
- package/dist/browser/content/Timeline.js.map +1 -0
- package/dist/browser/content/VideoPlayer.js +29 -9
- package/dist/browser/content/VideoPlayer.js.map +1 -1
- package/dist/browser/content/chart-inspection.js +7 -2
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/index.js +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/timeline-model.js +579 -0
- package/dist/browser/content/timeline-model.js.map +1 -0
- package/dist/browser/feedback/dialog-core.js +26 -14
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/inputs/ChoiceChips.js +66 -0
- package/dist/browser/inputs/ChoiceChips.js.map +1 -0
- package/dist/browser/inputs/ChoiceGroups.js +53 -12
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js +48 -33
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/SignatureInput.js +558 -0
- package/dist/browser/inputs/SignatureInput.js.map +1 -0
- package/dist/browser/inputs/TextInput.js +13 -1
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/emoji/EmojiPicker.js +841 -0
- package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -0
- package/dist/browser/inputs/emoji/emoji-data.js +1903 -0
- package/dist/browser/inputs/emoji/emoji-data.js.map +1 -0
- package/dist/browser/inputs/emoji/emoji-index.js +209 -0
- package/dist/browser/inputs/emoji/emoji-index.js.map +1 -0
- package/dist/browser/inputs/emoji/emoji-messages.js +64 -0
- package/dist/browser/inputs/emoji/emoji-messages.js.map +1 -0
- package/dist/browser/inputs/index.js +5 -0
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/markdown/actions.js +6 -2
- package/dist/browser/inputs/markdown/actions.js.map +1 -1
- package/dist/browser/inputs/markdown/code-zone.js +38 -2
- package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
- package/dist/browser/inputs/signature-messages.js +39 -0
- package/dist/browser/inputs/signature-messages.js.map +1 -0
- package/dist/browser/inputs/signature.js +208 -0
- package/dist/browser/inputs/signature.js.map +1 -0
- package/dist/browser/internal/render-error.js +49 -0
- package/dist/browser/internal/render-error.js.map +1 -0
- package/dist/browser/intl/messages.js +102 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +321 -222
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/FloatingWindow.js +4 -1
- package/dist/browser/layout/FloatingWindow.js.map +1 -1
- package/dist/browser/layout/SidebarItemPreview.js +5 -1
- package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/ResourceCard.js +212 -0
- package/dist/browser/surfaces/ResourceCard.js.map +1 -0
- package/dist/browser/surfaces/index.js +1 -0
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/licenses/emojibase-data.txt +21 -0
- package/dist/ssr/actions/ContextMenu.js +3 -1
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +49 -12
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +4 -1
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +411 -0
- package/dist/ssr/actions/GestureMenu.js.map +1 -0
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +767 -214
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +9 -3
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js +19 -1
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-behavior.js +9 -0
- package/dist/ssr/chat/chat-behavior.js.map +1 -1
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Calendar.js +183 -142
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +19 -5
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +2 -2
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +77 -36
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/Timeline.js +804 -0
- package/dist/ssr/content/Timeline.js.map +1 -0
- package/dist/ssr/content/VideoPlayer.js +29 -9
- package/dist/ssr/content/VideoPlayer.js.map +1 -1
- package/dist/ssr/content/chart-inspection.js +7 -2
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/index.js +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/timeline-model.js +579 -0
- package/dist/ssr/content/timeline-model.js.map +1 -0
- package/dist/ssr/feedback/dialog-core.js +26 -14
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/inputs/ChoiceChips.js +66 -0
- package/dist/ssr/inputs/ChoiceChips.js.map +1 -0
- package/dist/ssr/inputs/ChoiceGroups.js +12 -4
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +19 -4
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/SignatureInput.js +404 -0
- package/dist/ssr/inputs/SignatureInput.js.map +1 -0
- package/dist/ssr/inputs/TextInput.js +13 -1
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/emoji/EmojiPicker.js +551 -0
- package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -0
- package/dist/ssr/inputs/emoji/emoji-data.js +1903 -0
- package/dist/ssr/inputs/emoji/emoji-data.js.map +1 -0
- package/dist/ssr/inputs/emoji/emoji-index.js +209 -0
- package/dist/ssr/inputs/emoji/emoji-index.js.map +1 -0
- package/dist/ssr/inputs/emoji/emoji-messages.js +64 -0
- package/dist/ssr/inputs/emoji/emoji-messages.js.map +1 -0
- package/dist/ssr/inputs/index.js +5 -0
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/inputs/markdown/actions.js +6 -2
- package/dist/ssr/inputs/markdown/actions.js.map +1 -1
- package/dist/ssr/inputs/markdown/code-zone.js +38 -2
- package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
- package/dist/ssr/inputs/signature-messages.js +39 -0
- package/dist/ssr/inputs/signature-messages.js.map +1 -0
- package/dist/ssr/inputs/signature.js +208 -0
- package/dist/ssr/inputs/signature.js.map +1 -0
- package/dist/ssr/internal/render-error.js +49 -0
- package/dist/ssr/internal/render-error.js.map +1 -0
- package/dist/ssr/intl/messages.js +102 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +112 -41
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/FloatingWindow.js +4 -1
- package/dist/ssr/layout/FloatingWindow.js.map +1 -1
- package/dist/ssr/layout/SidebarItemPreview.js +5 -1
- package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/ResourceCard.js +115 -0
- package/dist/ssr/surfaces/ResourceCard.js.map +1 -0
- package/dist/ssr/surfaces/index.js +1 -0
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Dropdown.d.ts +13 -1
- package/dist/types/actions/FilterChip.d.ts +5 -0
- package/dist/types/actions/GestureMenu.d.ts +35 -0
- package/dist/types/actions/index.d.ts +2 -0
- package/dist/types/chat/ChatComposer.d.ts +27 -1
- package/dist/types/chat/chat-behavior.d.ts +15 -0
- package/dist/types/chat/index.d.ts +1 -1
- package/dist/types/chat/types.d.ts +34 -0
- package/dist/types/content/Calendar.d.ts +28 -8
- package/dist/types/content/Lightbox.d.ts +8 -0
- package/dist/types/content/Timeline.d.ts +49 -0
- package/dist/types/content/index.d.ts +4 -2
- package/dist/types/content/timeline-model.d.ts +148 -0
- package/dist/types/feedback/dialog-core.d.ts +1 -1
- package/dist/types/inputs/ChoiceChips.d.ts +20 -0
- package/dist/types/inputs/ChoiceGroups.d.ts +11 -2
- package/dist/types/inputs/FileInputs.d.ts +6 -0
- package/dist/types/inputs/SignatureInput.d.ts +22 -0
- package/dist/types/inputs/emoji/EmojiPicker.d.ts +42 -0
- package/dist/types/inputs/emoji/emoji-data.d.ts +2 -0
- package/dist/types/inputs/emoji/emoji-index.d.ts +109 -0
- package/dist/types/inputs/emoji/emoji-messages.d.ts +30 -0
- package/dist/types/inputs/index.d.ts +10 -0
- package/dist/types/inputs/markdown/actions.d.ts +2 -0
- package/dist/types/inputs/markdown/code-zone.d.ts +7 -0
- package/dist/types/inputs/signature-messages.d.ts +11 -0
- package/dist/types/inputs/signature.d.ts +72 -0
- package/dist/types/internal/render-error.d.ts +13 -0
- package/dist/types/intl/messages.d.ts +51 -0
- package/dist/types/layout/AppWorkspace.d.ts +17 -0
- package/dist/types/layout/SidebarItemPreview.d.ts +2 -0
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/ResourceCard.d.ts +31 -0
- package/dist/types/surfaces/index.d.ts +2 -0
- package/package.json +6 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/timeline-model.ts"],"sourcesContent":["import { dates as calendar, type DateContext } from \"@k2b/stdlib\";\nimport { layoutCalendarIntervals } from \"./calendar-event-layout\";\n\n/** A color token of the shared calendar palette, or a hex color such as a label color. */\nexport type TimelineColor = \"blue\" | \"emerald\" | \"amber\" | \"red\" | \"violet\" | \"cyan\" | \"zinc\" | `#${string}`;\n\nexport type TimelineItem = {\n /** Unique among the items. */\n id: string;\n label: string;\n /** A date-only string (`2026-10-08`) is a day in the time zone; anything else is an instant. */\n start: Date | string;\n /** End of a band. Without it, the item is a point in time. For all-day items, a midnight end is exclusive. */\n end?: Date | string;\n allDay?: boolean;\n /** `band` (default) shows the duration; `marker` shows a point in time at `start`, such as a deadline. */\n kind?: \"band\" | \"marker\";\n color?: TimelineColor;\n /** Extra text such as a place or a category: read with the item and shown where there is room. */\n detail?: string;\n /** Checkbox state. Leave it out for items without a checkbox. */\n checked?: boolean;\n /** Link target; without it the item is a button. */\n href?: string;\n};\n\n/**\n * A place on the main axis as the count of each unit before it: hours of waking time, nights, folds of empty days,\n * day headings, and all-day rows. The axis gives every unit its size, so one model serves both axes.\n */\nexport type TimelineSpan = readonly [hours: number, nights: number, folds: number, heads: number, rows: number];\nexport type TimelineUnits = TimelineSpan;\n\nexport const TIMELINE_UNIT_NAMES = [\"hour\", \"night\", \"fold\", \"head\", \"row\"] as const;\n/** Waking hours; the night between them is folded. */\nexport const TIMELINE_WAKE_HOURS = [6, 22] as const;\n/** Visible lanes of overlapping bands and of all-day items; more overlaps collapse into a \"+n\" entry in the last lane. */\nexport const TIMELINE_BAND_LANES = 3;\nexport const TIMELINE_ALL_DAY_LANES = 2;\n/** Visible items stacked in one night or fold; more collapse into a \"+n\" entry in the last place. */\nexport const TIMELINE_FOLD_LANES = 3;\n/** Free time shorter than this gets no label. */\nconst MIN_GAP = 3_600_000;\nconst HOUR = 3_600_000;\nconst DAY = 86_400_000;\n\nconst ZERO: TimelineSpan = [0, 0, 0, 0, 0];\nconst NIGHT: TimelineSpan = [0, 1, 0, 0, 0];\nconst FOLD: TimelineSpan = [0, 0, 1, 0, 0];\nconst HEAD: TimelineSpan = [0, 0, 0, 1, 0];\nconst ROW: TimelineSpan = [0, 0, 0, 0, 1];\nconst hours = (ms: number): TimelineSpan => [ms / HOUR, 0, 0, 0, 0];\n\nexport const addSpan = (a: TimelineSpan, b: TimelineSpan): TimelineSpan => [\n a[0] + b[0],\n a[1] + b[1],\n a[2] + b[2],\n a[3] + b[3],\n a[4] + b[4],\n];\nexport const subtractSpan = (a: TimelineSpan, b: TimelineSpan): TimelineSpan => [\n a[0] - b[0],\n a[1] - b[1],\n a[2] - b[2],\n a[3] - b[3],\n a[4] - b[4],\n];\nconst scaleSpan = (a: TimelineSpan, factor: number): TimelineSpan => [\n a[0] * factor,\n a[1] * factor,\n a[2] * factor,\n a[3] * factor,\n a[4] * factor,\n];\nexport const spanPx = (span: TimelineSpan, units: TimelineUnits): number =>\n span[0] * units[0] + span[1] * units[1] + span[2] * units[2] + span[3] * units[3] + span[4] * units[4];\n\nconst round = (value: number) => Math.round(value * 10_000) / 10_000;\n/** The span as a CSS length over the `--k2b-timeline-<unit>` sizes the axis sets. */\nexport const spanCss = (span: TimelineSpan): string => {\n const terms = span.flatMap((count, index) =>\n Math.abs(count) < 1e-6 ? [] : [`${round(count)} * var(--k2b-timeline-${TIMELINE_UNIT_NAMES[index]})`],\n );\n return terms.length === 0 ? \"0px\" : `calc(${terms.join(\" + \")})`;\n};\n\nexport type TimelineSegment = {\n kind: \"head\" | \"row\" | \"wake\" | \"night\" | \"fold\";\n t0: number;\n t1: number;\n at: TimelineSpan;\n size: TimelineSpan;\n group: number;\n};\n\ntype EntryBase = {\n /** Entry id: the item id, or for a \"+n\" entry `more:<first hidden id>`, made unique among the item ids. */\n id: string;\n group: number;\n /** The item's own times, also beyond the loaded range; for all-day entries, group indexes. */\n start: number;\n end: number;\n /** Main-axis place relative to the group, and length. */\n at: TimelineSpan;\n size: TimelineSpan;\n lane: number;\n lanes: number;\n};\n\nexport type TimelineItemEntry = EntryBase & {\n kind: \"band\" | \"marker\" | \"folded\" | \"all-day\";\n item: TimelineItem;\n /** For all-day items: the first and last day of the item inside the range. */\n firstKey: string;\n lastKey: string;\n};\n\nexport type TimelineMoreEntry = EntryBase & {\n kind: \"more\";\n area: \"band\" | \"fold\" | \"all-day\";\n hidden: TimelineItemEntry[];\n};\n\nexport type TimelineEntry = TimelineItemEntry | TimelineMoreEntry;\n\nexport type TimelineGroup = {\n index: number;\n /** `day:<date>` or `fold:<first>:<last>`; stable while the group keeps its days. */\n key: string;\n kind: \"day\" | \"fold\";\n firstKey: string;\n lastKey: string;\n t0: number;\n t1: number;\n /** Times the group's entries reach, beyond its own span for items in a neighbouring fold or over several days. */\n reach: [number, number];\n at: TimelineSpan;\n size: TimelineSpan;\n /** The group reserves a row for all-day items (vertical axis only). */\n row: boolean;\n today: boolean;\n past: boolean;\n /** List order: all-day items, then timed entries by start. */\n entries: TimelineEntry[];\n /** All-day entries of earlier groups that cover this group too. */\n echoes: TimelineEntry[];\n hours: Array<{ time: number; at: TimelineSpan }>;\n folds: Array<{ kind: \"night\" | \"fold\"; at: TimelineSpan; size: TimelineSpan }>;\n gaps: Array<{ at: TimelineSpan; end: number; hours: number; long: boolean }>;\n};\n\nexport type TimelineModel = {\n from: number;\n to: number;\n segments: TimelineSegment[];\n groups: TimelineGroup[];\n total: TimelineSpan;\n entries: Map<string, TimelineEntry>;\n /** Keyboard order of every entry id. */\n order: string[];\n posOf: (time: number) => TimelineSpan;\n /** The time at a pixel offset along the main axis. */\n timeAt: (px: number, units: TimelineUnits) => number;\n};\n\nconst dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/;\nexport const parseTimelineTime = (value: Date | string | undefined, context?: DateContext): number => {\n if (value === undefined) return Number.NaN;\n if (value instanceof Date) return value.getTime();\n if (dateOnly.test(value)) return calendar.parseCalendarDate(value, context).getTime();\n return new Date(value).getTime();\n};\n\nconst pad = (value: number) => String(value).padStart(2, \"0\");\nconst zoneFormats = new Map<string, Intl.DateTimeFormat>();\n/** Wall-clock parts of an instant in a time zone, with one cached formatter per zone: a year of items calls this often. */\nconst zonedParts = (time: number, timeZone: string): [number, number, number, number, number, number] => {\n let format = zoneFormats.get(timeZone);\n if (!format) {\n format = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n });\n zoneFormats.set(timeZone, format);\n }\n const parts: Record<string, number> = {};\n for (const part of format.formatToParts(time)) if (part.type !== \"literal\") parts[part.type] = Number(part.value);\n return [parts.year ?? 1970, parts.month ?? 1, parts.day ?? 1, parts.hour ?? 0, parts.minute ?? 0, parts.second ?? 0];\n};\nconst zoneOffset = (time: number, timeZone: string): number => {\n const [year, month, day, hour, minute, second] = zonedParts(time, timeZone);\n return Date.UTC(year, month - 1, day, hour, minute, second) - Math.floor(time / 1_000) * 1_000;\n};\n\n/** The day (`YYYY-MM-DD`) of an instant in the context's time zone. */\nexport const timelineDayKey = (time: number, context?: DateContext): string => {\n if (!context?.timeZone) {\n const date = new Date(time);\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n }\n const [year, month, day] = zonedParts(time, context.timeZone);\n return `${year}-${pad(month)}-${pad(day)}`;\n};\n\nexport const shiftDayKey = (key: string, days: number): string => {\n const [year = 1970, month = 1, day = 1] = key.split(\"-\").map(Number);\n return new Date(Date.UTC(year, month - 1, day + days)).toISOString().slice(0, 10);\n};\n\n/**\n * The instant of a whole hour (0–24) on a day in the context's time zone. As stdlib's `compatible` disambiguation, a\n * repeated hour resolves to its first occurrence and a skipped one to the time after the gap.\n */\nexport const timelineHourOf = (key: string, hour: number, context?: DateContext): number => {\n const [year = 1970, month = 1, day = 1] = key.split(\"-\").map(Number);\n if (!context?.timeZone) return new Date(year, month - 1, day, hour).getTime();\n const zone = context.timeZone;\n const wall = Date.UTC(year, month - 1, day, hour);\n // The offsets a day before and after are the ones on either side of a clock change at this time.\n const before = wall - zoneOffset(wall - DAY, zone);\n const after = wall - zoneOffset(wall + DAY, zone);\n const valid = [before, after].filter((time) => zoneOffset(time, zone) === wall - time);\n return valid.length > 0 ? Math.min(...valid) : before;\n};\n\ntype Normalized = {\n item: TimelineItem;\n start: number;\n end: number;\n allDay: boolean;\n point: boolean;\n firstKey: string;\n lastKey: string;\n};\n\nconst normalize = (item: TimelineItem, keyOf: (time: number) => string, context?: DateContext): Normalized | null => {\n const start = parseTimelineTime(item.start, context);\n if (!Number.isFinite(start)) return null;\n const parsedEnd = parseTimelineTime(item.end, context);\n const firstKey = keyOf(start);\n if (item.allDay) {\n const end = Number.isFinite(parsedEnd) && parsedEnd > start ? parsedEnd : start;\n const endKey = keyOf(end);\n const exclusive = end > start && timelineHourOf(endKey, 0, context) === end;\n const lastKey = exclusive ? shiftDayKey(endKey, -1) : endKey;\n return { item, start, end, allDay: true, point: false, firstKey, lastKey: lastKey < firstKey ? firstKey : lastKey };\n }\n const point = item.kind === \"marker\" || !Number.isFinite(parsedEnd) || parsedEnd <= start;\n return { item, start, end: point ? start : parsedEnd, allDay: false, point, firstKey, lastKey: firstKey };\n};\n\nconst byStart = (a: { start: number; end: number; id: string }, b: { start: number; end: number; id: string }) =>\n a.start - b.start || b.end - a.end || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0);\n\n/**\n * Lays out overlapping entries in at most `max` lanes. Where a cluster needs more, the entries beyond the last lane and\n * the ones they meet in it collapse into \"+n\" entries in the last lane, one per run of overlapping hidden entries.\n */\nconst laneEntries = (entries: TimelineItemEntry[], max: number): TimelineItemEntry[][] => {\n const clusters = new Map<number, Array<{ entry: TimelineItemEntry; lane: number; lanes: number }>>();\n for (const layout of layoutCalendarIntervals(entries, (entry) => entry)) {\n const cluster = clusters.get(layout.groupId) ?? [];\n cluster.push({ entry: layout.item, lane: layout.lane, lanes: layout.lanes });\n clusters.set(layout.groupId, cluster);\n }\n const runs: TimelineItemEntry[][] = [];\n for (const cluster of clusters.values()) {\n const lanes = cluster[0]?.lanes ?? 1;\n if (lanes <= max) {\n for (const { entry, lane } of cluster) {\n entry.lane = lane;\n entry.lanes = lanes;\n }\n continue;\n }\n // The last visible lane keeps its entries where they meet nothing beyond it.\n const beyond = cluster.filter(({ lane }) => lane >= max).map(({ entry }) => entry);\n const hidden: TimelineItemEntry[] = [];\n for (const { entry, lane } of cluster) {\n const overlapsBeyond = beyond.some((other) => other.start < entry.end && entry.start < other.end);\n if (lane >= max || (lane === max - 1 && overlapsBeyond)) hidden.push(entry);\n else {\n entry.lane = lane;\n entry.lanes = max;\n }\n }\n // Runs of hidden entries that overlap each other become one \"+n\" entry each.\n let run: TimelineItemEntry[] | undefined;\n let runEnd = Number.NEGATIVE_INFINITY;\n for (const entry of hidden.sort(byStart)) {\n const { start, end } = entry;\n if (run && start < runEnd) {\n run.push(entry);\n runEnd = Math.max(runEnd, end);\n } else {\n run = [entry];\n runs.push(run);\n runEnd = end;\n }\n }\n }\n return runs;\n};\n\nexport type TimelineModelInput = {\n from: number;\n to: number;\n /** The current day (`YYYY-MM-DD`), which always stays open. */\n today: string;\n items: readonly TimelineItem[];\n context?: DateContext;\n};\n\n/**\n * Builds the filmstrip: waking hours (6–22) are proportional, every night is one fold, and a run of days without\n * timed items is one fold. Positions depend only on the times and the items, never on measurement.\n */\nexport const buildTimelineModel = ({ from, to, today, items, context }: TimelineModelInput): TimelineModel => {\n const [wakeStart, wakeEnd] = TIMELINE_WAKE_HOURS;\n\n const segments: TimelineSegment[] = [];\n const groups: TimelineGroup[] = [];\n const groupOfKey = new Map<string, number>();\n const valid = Number.isFinite(from) && Number.isFinite(to) && to > from;\n const firstKey = valid ? timelineDayKey(from, context) : \"\";\n const lastKey = valid ? timelineDayKey(to - 1, context) : \"\";\n const todayKey = today;\n const wake = new Map<string, [number, number]>();\n const wakeOf = (key: string): [number, number] => {\n let value = wake.get(key);\n if (!value) {\n // Clocks change at night, so the waking hours of a day are whole hours after its 06:00.\n const open = timelineHourOf(key, wakeStart, context);\n value = [open, open + (wakeEnd - wakeStart) * HOUR];\n wake.set(key, value);\n }\n return value;\n };\n // Day keys of loaded times by binary search over the midnights, instead of a time-zone lookup per item.\n const dayKeys: string[] = [];\n const midnights: number[] = [];\n for (let key = firstKey; valid && key <= shiftDayKey(lastKey, 1); key = shiftDayKey(key, 1)) {\n dayKeys.push(key);\n midnights.push(timelineHourOf(key, 0, context));\n }\n const keyOf = (t: number): string => {\n if (midnights.length < 2 || t < midnights[0]! || t >= midnights.at(-1)!) return timelineDayKey(t, context);\n let low = 0;\n let high = midnights.length - 2;\n while (low < high) {\n const middle = (low + high + 1) >> 1;\n if (midnights[middle]! <= t) low = middle;\n else high = middle - 1;\n }\n return dayKeys[low]!;\n };\n const normalized = items.flatMap((item) => normalize(item, keyOf, context) ?? []);\n\n // Days with timed items in their waking hours stay open; today always does. So does a day at either edge whose\n // waking hours are loaded only in part: whether it is empty is not known yet, and folding it now would reshape it\n // when the rest loads.\n const busy = new Set<string>([todayKey]);\n if (valid) {\n const [firstOpen, firstClose] = wakeOf(firstKey);\n if (from > firstOpen && from < firstClose) busy.add(firstKey);\n const [lastOpen, lastClose] = wakeOf(lastKey);\n if (to > lastOpen && to < lastClose) busy.add(lastKey);\n }\n const covered = new Set<string>();\n for (const entry of valid ? normalized : []) {\n if (entry.allDay) {\n const first = entry.firstKey < firstKey ? firstKey : entry.firstKey;\n const last = entry.lastKey > lastKey ? lastKey : entry.lastKey;\n for (let key = first; key <= last; key = shiftDayKey(key, 1)) covered.add(key);\n continue;\n }\n const start = Math.max(entry.start, from);\n const end = Math.min(entry.end, to);\n if (entry.point ? entry.start < from || entry.start >= to : end <= start) continue;\n const last = keyOf(entry.point ? start : end - 1);\n for (let key = keyOf(start); key <= last; key = shiftDayKey(key, 1)) {\n const [open, close] = wakeOf(key);\n if (entry.point ? start >= open && start < close : start < close && end > open) busy.add(key);\n }\n }\n\n let pos = ZERO;\n let time = from;\n const push = (kind: TimelineSegment[\"kind\"], t0: number, t1: number, size: TimelineSpan) => {\n segments.push({ kind, t0, t1, at: pos, size, group: groups.length - 1 });\n pos = addSpan(pos, size);\n };\n const openGroup = (kind: TimelineGroup[\"kind\"], first: string, last: string) => {\n let row = false;\n for (let key = first; key <= last; key = shiftDayKey(key, 1)) {\n groupOfKey.set(key, groups.length);\n row ||= covered.has(key);\n }\n groups.push({\n index: groups.length,\n key: kind === \"day\" ? `day:${first}` : `fold:${first}:${last}`,\n kind,\n firstKey: first,\n lastKey: last,\n t0: time,\n t1: time,\n reach: [time, time],\n at: pos,\n size: ZERO,\n row,\n today: first <= todayKey && todayKey <= last,\n past: last < todayKey,\n entries: [],\n echoes: [],\n hours: [],\n folds: [],\n gaps: [],\n });\n push(\"head\", time, time, HEAD);\n if (row) push(\"row\", time, time, ROW);\n };\n\n // Every loaded day gets a group, also one whose time an earlier night already reaches to the end: its items are\n // placed in that night.\n for (let key = firstKey; valid && key <= lastKey; ) {\n const next = shiftDayKey(key, 1);\n if (busy.has(key)) {\n const [open, close] = wakeOf(key);\n openGroup(\"day\", key, key);\n if (time < to && time < open) {\n const end = Math.min(open, to);\n push(\"night\", time, end, NIGHT);\n time = end;\n }\n if (time < to && time < close) {\n const end = Math.min(close, to);\n push(\"wake\", time, end, hours(end - time));\n time = end;\n }\n // The night after a day belongs to the fold when empty days follow.\n if (time < to && (next > lastKey || busy.has(next))) {\n const end = Math.min(wakeOf(next)[0], to);\n push(\"night\", time, end, NIGHT);\n time = end;\n }\n key = next;\n continue;\n }\n let last = key;\n while (shiftDayKey(last, 1) <= lastKey && !busy.has(shiftDayKey(last, 1))) last = shiftDayKey(last, 1);\n openGroup(\"fold\", key, last);\n const end = Math.min(wakeOf(shiftDayKey(last, 1))[0], to);\n push(\"fold\", time, end, FOLD);\n time = end;\n key = shiftDayKey(last, 1);\n }\n const total = pos;\n for (const [index, group] of groups.entries()) {\n const next = groups[index + 1];\n group.t1 = next ? next.t0 : to;\n group.size = subtractSpan(next ? next.at : total, group.at);\n group.reach = [group.t0, group.t1];\n }\n\n const timed = segments.filter((segment) => segment.t1 > segment.t0);\n const segmentAt = (t: number): TimelineSegment | undefined => {\n let low = 0;\n let high = timed.length - 1;\n let found: TimelineSegment | undefined;\n while (low <= high) {\n const middle = (low + high) >> 1;\n const segment = timed[middle]!;\n if (segment.t0 <= t) {\n found = segment;\n low = middle + 1;\n } else high = middle - 1;\n }\n return found;\n };\n const posOf = (t: number): TimelineSpan => {\n const segment = segmentAt(t);\n if (!segment) return timed[0]?.at ?? ZERO;\n if (t >= segment.t1) return addSpan(segment.at, segment.size);\n return addSpan(segment.at, scaleSpan(segment.size, (t - segment.t0) / (segment.t1 - segment.t0)));\n };\n const timeAt = (px: number, units: TimelineUnits): number => {\n for (const segment of segments) {\n const start = spanPx(segment.at, units);\n const size = spanPx(segment.size, units);\n if (px < start + size || segment === segments.at(-1)) {\n if (segment.t1 === segment.t0 || size <= 0) return segment.t0;\n return segment.t0 + Math.max(0, Math.min(1, (px - start) / size)) * (segment.t1 - segment.t0);\n }\n }\n return from;\n };\n\n // Decorations: hour ticks, folds, and free time per waking segment.\n const relative = (group: TimelineGroup, span: TimelineSpan) => subtractSpan(span, group.at);\n for (const segment of segments) {\n const group = groups[segment.group]!;\n if (segment.kind === \"night\" || segment.kind === \"fold\")\n group.folds.push({ kind: segment.kind, at: relative(group, segment.at), size: segment.size });\n if (segment.kind !== \"wake\") continue;\n // Clocks change at night, so waking hours are whole hours after the day's 06:00.\n const open = wakeOf(keyOf(segment.t0))[0];\n for (let hour = 0; hour < wakeEnd - wakeStart; hour++) {\n const tick = open + hour * HOUR;\n if (tick >= segment.t0 && tick < segment.t1) group.hours.push({ time: tick, at: relative(group, posOf(tick)) });\n }\n }\n\n // Entries.\n const entries = new Map<string, TimelineEntry>();\n const bands: TimelineItemEntry[] = [];\n const allDay: TimelineItemEntry[] = [];\n const timedEntries: TimelineItemEntry[] = [];\n const foldStacks = new Map<TimelineSegment, TimelineItemEntry[]>();\n for (const entry of valid ? normalized : []) {\n if (entries.has(entry.item.id)) continue;\n if (entry.allDay) {\n const first = entry.firstKey < firstKey ? firstKey : entry.firstKey;\n const last = entry.lastKey > lastKey ? lastKey : entry.lastKey;\n if (first > last) continue;\n const groupIndex = groupOfKey.get(first);\n const lastGroup = groupOfKey.get(last);\n if (groupIndex === undefined || lastGroup === undefined) continue;\n const group = groups[groupIndex]!;\n const end = groups[lastGroup]!;\n const placed: TimelineItemEntry = {\n kind: \"all-day\",\n id: entry.item.id,\n item: entry.item,\n group: groupIndex,\n start: groupIndex,\n end: lastGroup + 1,\n at: ZERO,\n size: subtractSpan(addSpan(end.at, end.size), group.at),\n lane: 0,\n lanes: 1,\n firstKey: first,\n lastKey: last,\n };\n entries.set(placed.id, placed);\n allDay.push(placed);\n continue;\n }\n // Placed by the part inside the range, labelled by the item's own times.\n const start = entry.point ? entry.start : Math.max(entry.start, from);\n const end = entry.point ? entry.start : Math.min(entry.end, to);\n if (entry.point ? start < from || start >= to : end <= start) continue;\n const groupIndex = groupOfKey.get(keyOf(start));\n if (groupIndex === undefined) continue;\n const group = groups[groupIndex]!;\n const startSegment = segmentAt(start);\n const endSegment = entry.point ? startSegment : segmentAt(end - 1);\n const folded = startSegment !== undefined && startSegment.kind !== \"wake\" && startSegment === endSegment;\n const at = folded ? startSegment.at : posOf(start);\n const placed: TimelineItemEntry = {\n kind: folded ? \"folded\" : entry.point ? \"marker\" : \"band\",\n id: entry.item.id,\n item: entry.item,\n group: groupIndex,\n start: entry.start,\n end: entry.end,\n at: relative(group, at),\n size: folded ? startSegment.size : entry.point ? ZERO : subtractSpan(posOf(end), at),\n lane: 0,\n lanes: 1,\n firstKey: keyOf(start),\n lastKey: keyOf(start),\n };\n entries.set(placed.id, placed);\n timedEntries.push(placed);\n if (placed.kind === \"band\") bands.push(placed);\n if (folded) foldStacks.set(startSegment, [...(foldStacks.get(startSegment) ?? []), placed]);\n }\n\n // Items inside a fold stack in its middle, in time order, in up to three places; the rest share a \"+n\" entry.\n const foldRuns: TimelineItemEntry[][] = [];\n for (const stack of foldStacks.values()) {\n stack.sort(byStart);\n const shown = stack.length > TIMELINE_FOLD_LANES ? TIMELINE_FOLD_LANES - 1 : stack.length;\n for (const [lane, entry] of stack.slice(0, shown).entries()) {\n entry.lane = lane;\n entry.lanes = Math.min(stack.length, TIMELINE_FOLD_LANES);\n }\n if (shown < stack.length) foldRuns.push(stack.slice(shown));\n }\n\n const more: TimelineMoreEntry[] = [];\n // Item ids are the application's, so a \"+n\" id steps aside where an item already has it.\n const ids = new Set(normalized.map((entry) => entry.item.id));\n const collapse = (runs: TimelineItemEntry[][], area: TimelineMoreEntry[\"area\"], lanes: number) => {\n for (const run of runs) {\n const first = run[0]!;\n const group = groups[first.group]!;\n let start = first.start;\n let end = first.end;\n for (const entry of run) {\n start = Math.min(start, entry.start);\n end = Math.max(end, entry.end);\n }\n let id = `more:${first.id}`;\n for (let suffix = 2; ids.has(id); suffix++) id = `more:${first.id}:${suffix}`;\n ids.add(id);\n // A fold's \"+n\" takes the place of the fold; all-day entries count in groups, `end` is the index after their last.\n const lastGroup = area === \"all-day\" ? groups[Math.max(first.group, end - 1)]! : group;\n const placed: TimelineMoreEntry = {\n kind: \"more\",\n area,\n id,\n hidden: run,\n group: first.group,\n start,\n end,\n at: area === \"band\" ? relative(group, posOf(start)) : area === \"fold\" ? first.at : ZERO,\n size:\n area === \"band\"\n ? subtractSpan(posOf(end), posOf(start))\n : area === \"fold\"\n ? first.size\n : subtractSpan(addSpan(lastGroup.at, lastGroup.size), group.at),\n lane: lanes - 1,\n lanes,\n };\n for (const hidden of run) entries.delete(hidden.id);\n entries.set(placed.id, placed);\n more.push(placed);\n }\n };\n collapse(laneEntries(bands, TIMELINE_BAND_LANES), \"band\", TIMELINE_BAND_LANES);\n collapse(foldRuns, \"fold\", TIMELINE_FOLD_LANES);\n collapse(laneEntries(allDay, TIMELINE_ALL_DAY_LANES), \"all-day\", TIMELINE_ALL_DAY_LANES);\n\n const visibleAllDay = [...allDay.filter((entry) => entries.has(entry.id)), ...more.filter((entry) => entry.area === \"all-day\")];\n for (const entry of visibleAllDay.sort(byStart)) {\n groups[entry.group]!.entries.push(entry);\n for (let index = entry.start + 1; index < entry.end; index++) groups[index]?.echoes.push(entry);\n }\n const visibleTimed = [...timedEntries.filter((entry) => entries.has(entry.id)), ...more.filter((entry) => entry.area !== \"all-day\")];\n for (const entry of visibleTimed.sort(byStart)) groups[entry.group]!.entries.push(entry);\n for (const group of groups) {\n for (const entry of group.entries) {\n const allDayEntry = entry.kind === \"all-day\" || (entry.kind === \"more\" && entry.area === \"all-day\");\n const [start, end] = allDayEntry ? [group.t0, groups[entry.end - 1]!.t1] : [entry.start, entry.end];\n group.reach = [Math.min(group.reach[0], start), Math.max(group.reach[1], end)];\n }\n }\n\n // Free time: gaps of an hour or more between bands within waking hours.\n const busyBands = bands.toSorted(byStart);\n for (const segment of timed) {\n if (segment.kind !== \"wake\") continue;\n const group = groups[segment.group]!;\n let cursor = segment.t0;\n const addGap = (end: number) => {\n if (end - cursor < MIN_GAP) return;\n group.gaps.push({\n at: relative(group, posOf((cursor + end) / 2)),\n end,\n hours: Math.round(((end - cursor) / HOUR) * 2) / 2,\n long: end - cursor >= 3 * HOUR,\n });\n };\n for (const band of busyBands) {\n if (band.end <= segment.t0 || band.start >= segment.t1) continue;\n addGap(Math.max(cursor, band.start));\n cursor = Math.max(cursor, band.end);\n }\n addGap(segment.t1);\n }\n\n return {\n from,\n to,\n segments,\n groups,\n total,\n entries,\n order: groups.flatMap((group) => group.entries.map((entry) => entry.id)),\n posOf,\n timeAt,\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { createComponent } from "solid-js";
|
|
1
2
|
import { render } from "solid-js/web";
|
|
2
3
|
import { returnFocus, ringOnReturn } from "../internal/focus-return";
|
|
3
4
|
import { getK2bPortalRoot } from "../internal/portal";
|
|
5
|
+
import { RenderErrorBoundary } from "../internal/render-error";
|
|
4
6
|
import { resolveUiMessages } from "../intl/messages";
|
|
5
7
|
import { isPointInsideToast } from "./toast";
|
|
6
8
|
const DEFAULT_PANEL_CLASS = "k2b-dialog";
|
|
7
9
|
const DEFAULT_CONTENT_CLASS = "k2b-dialog__viewport";
|
|
10
|
+
/** The frame of a dialog whose content could not render: a custom or bare surface may draw no frame of its own. */
|
|
11
|
+
const RENDER_ERROR_PANEL_CLASS = "k2b-dialog k2b-dialog--small";
|
|
8
12
|
let nextDialogTitleId = 0;
|
|
9
13
|
/** The history state key that marks a dialog's same-URL entry. */
|
|
10
14
|
const HISTORY_MARKER = "k2bDialog";
|
|
@@ -340,20 +344,28 @@ export const createDialogCore = () => {
|
|
|
340
344
|
if (options.history) pushHistory(entry);
|
|
341
345
|
state.stack.push(entry);
|
|
342
346
|
try {
|
|
343
|
-
entry.dispose = render(() =>
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
347
|
+
entry.dispose = render(() => createComponent(RenderErrorBoundary, {
|
|
348
|
+
content: () => view(closeTyped, {
|
|
349
|
+
dialog,
|
|
350
|
+
setModal: modal => {
|
|
351
|
+
entry.modal = modal;
|
|
352
|
+
applyPresentation(entry);
|
|
353
|
+
},
|
|
354
|
+
setPosition: position => {
|
|
355
|
+
if (position && (!Number.isFinite(position.x) || !Number.isFinite(position.y))) return;
|
|
356
|
+
entry.position = position;
|
|
357
|
+
applyPresentation(entry);
|
|
358
|
+
},
|
|
359
|
+
requestDismiss: () => requestDismiss(entry),
|
|
360
|
+
setDismissHandler: handler => {
|
|
361
|
+
entry.dismissHandler = handler;
|
|
362
|
+
}
|
|
363
|
+
}),
|
|
364
|
+
onClose: () => closeTyped(undefined),
|
|
365
|
+
onError: () => {
|
|
366
|
+
entry.panelClassName = RENDER_ERROR_PANEL_CLASS;
|
|
367
|
+
container.className = DEFAULT_CONTENT_CLASS;
|
|
368
|
+
if (state.stack[state.stack.length - 1] === entry) dialog.className = RENDER_ERROR_PANEL_CLASS;
|
|
357
369
|
}
|
|
358
370
|
}), container);
|
|
359
371
|
applyPresentation(entry);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["feedback/dialog-core.ts"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { render } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { getK2bPortalRoot } from \"../internal/portal\";\nimport { resolveUiMessages } from \"../intl/messages\";\nimport { isPointInsideToast } from \"./toast\";\n\nexport type DialogClose<T> = (result?: T) => void;\n\nexport type OpenDialogOptions = {\n /** Close only this dialog when its owning operation is cancelled. */\n signal?: AbortSignal;\n panelClassName?: string;\n contentClassName?: string;\n initialFocus?: \"first-input\" | \"none\" | ((dialog: HTMLDialogElement) => HTMLElement | null);\n cancelBehavior?: \"resolve-undefined\" | \"ignore\";\n ariaLabel?: string;\n /**\n * Add a same-URL history entry while the dialog is open, so the browser's or the phone's Back closes the dialog\n * instead of leaving the page. Closing the dialog removes the entry again; the returned promise settles after that.\n */\n history?: boolean;\n};\n\nexport type DialogRender<T> = (\n close: DialogClose<T>,\n context: {\n dialog: HTMLDialogElement;\n /** Switch this entry between a modal and a modeless window without remounting. */\n setModal: (modal: boolean) => void;\n /** Set viewport coordinates, or restore the panel stylesheet position with null. */\n setPosition: (position: { x: number; y: number } | null) => void;\n /** Route Escape/backdrop through the same guarded handler as Cancel and X. */\n setDismissHandler: (handler: () => void | Promise<void>) => void;\n /** Request dismissal through this entry's cancellation policy and guard. */\n requestDismiss: () => Promise<void>;\n },\n) => JSX.Element;\n\nexport type DialogCore = {\n open: <T>(view: DialogRender<T>, options?: OpenDialogOptions) => Promise<T | undefined>;\n close: (result?: unknown) => void;\n isOpen: () => boolean;\n};\n\ntype DialogStackEntry = {\n container: HTMLDivElement;\n dispose?: () => void;\n resolve?: (value: unknown) => void;\n panelClassName: string;\n cancelBehavior: NonNullable<OpenDialogOptions[\"cancelBehavior\"]>;\n initialFocus: NonNullable<OpenDialogOptions[\"initialFocus\"]>;\n opener?: HTMLElement;\n openerRing: boolean;\n ariaLabel?: string;\n dismissHandler?: () => void | Promise<void>;\n dismissPending?: boolean;\n modal: boolean;\n position?: { x: number; y: number } | null;\n /** The marker of this dialog's history entry, for dialogs opened with `history`. */\n historyId?: number;\n};\n\ntype DialogState = {\n element?: HTMLDialogElement;\n modal?: boolean;\n stack: DialogStackEntry[];\n scrollLocked?: boolean;\n previousBodyOverflow?: string;\n previousHtmlOverflow?: string;\n mouseDownOnDialog?: boolean;\n connectionObserver?: MutationObserver;\n};\n\nconst DEFAULT_PANEL_CLASS = \"k2b-dialog\";\nconst DEFAULT_CONTENT_CLASS = \"k2b-dialog__viewport\";\nlet nextDialogTitleId = 0;\n/** The history state key that marks a dialog's same-URL entry. */\nconst HISTORY_MARKER = \"k2bDialog\";\n\nconst historyRecord = (): Record<string, unknown> =>\n typeof history.state === \"object\" && history.state !== null ? { ...history.state } : {};\nconst historyMarker = (): unknown => historyRecord()[HISTORY_MARKER];\n\nconst resolveInitialFocusTarget = (entry: DialogStackEntry, dialog: HTMLDialogElement): HTMLElement | null => {\n const { initialFocus } = entry;\n if (initialFocus === \"none\") return null;\n if (typeof initialFocus === \"function\") return initialFocus(dialog);\n const input = entry.container.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), [role='combobox']:not([disabled]):not([aria-disabled='true'])\",\n );\n return (\n input ??\n entry.container.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex='-1'])\",\n )\n );\n};\n\nconst applyAccessibleName = (dialog: HTMLDialogElement, entry: DialogStackEntry): void => {\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n if (entry.ariaLabel) {\n dialog.setAttribute(\"aria-label\", entry.ariaLabel);\n return;\n }\n const heading = entry.container.querySelector<HTMLElement>(\"h1, h2, h3\");\n if (!heading) {\n dialog.setAttribute(\"aria-label\", resolveUiMessages().dialog);\n return;\n }\n heading.id ||= `k2b-dialog-title-${++nextDialogTitleId}`;\n dialog.setAttribute(\"aria-labelledby\", heading.id);\n};\n\nconst schedule = (callback: () => void): void => {\n if (typeof requestAnimationFrame === \"function\") requestAnimationFrame(callback);\n else queueMicrotask(callback);\n};\n\n/**\n * Whether focus is still where closing a level left it, on the page or the\n * dialog: nothing took it before the next frame, neither a close handler nor a\n * Tab pressed right after Escape.\n */\nconst focusUnclaimed = (dialog: HTMLDialogElement): boolean => {\n const active = document.activeElement;\n return !active || active === document.body || active === dialog;\n};\n\nexport const createDialogCore = (): DialogCore => {\n const state: DialogState = { stack: [] };\n /** Markers of this core's entries in the browser history, oldest first. */\n let historyIds: number[] = [];\n let nextHistoryId = 0;\n let historySyncScheduled = false;\n let listeningToHistory = false;\n /** Settles when the synthetic Back that removes closed dialogs' entries has arrived. */\n let returning: Promise<void> | undefined;\n\n /** Closed dialogs leave the history with one Back to the newest dialog that is still open, or to the page. */\n const syncHistory = () => {\n historySyncScheduled = false;\n const openIds = new Set(state.stack.map((entry) => entry.historyId));\n const current = historyIds.at(-1);\n let steps = 0;\n while (historyIds.length > 0 && !openIds.has(historyIds.at(-1))) {\n historyIds.pop();\n steps++;\n }\n // Someone else moved the history meanwhile; leave it alone.\n if (steps === 0 || historyMarker() !== current) return;\n const back = new Promise<void>((resolve) => window.addEventListener(\"popstate\", () => resolve(), { once: true }));\n returning = back;\n void back.then(() => {\n if (returning === back) returning = undefined;\n });\n history.go(-steps);\n };\n\n const releaseHistory = (entry: DialogStackEntry) => {\n if (entry.historyId === undefined || historySyncScheduled) return;\n historySyncScheduled = true;\n queueMicrotask(syncHistory);\n };\n\n /** Back or Forward moved to another entry: close every dialog opened after the one it shows. */\n const onPopState = () => {\n const marker = historyMarker();\n const index = typeof marker === \"number\" ? historyIds.indexOf(marker) : -1;\n historyIds = historyIds.slice(0, index + 1);\n const gone = (entry: DialogStackEntry) => entry.historyId !== undefined && !historyIds.includes(entry.historyId);\n while (state.stack.some(gone)) popTop(undefined);\n };\n\n const pushHistory = (entry: DialogStackEntry) => {\n if (!listeningToHistory) {\n window.addEventListener(\"popstate\", onPopState);\n listeningToHistory = true;\n }\n const previous = historyRecord();\n // A reload or Forward never brings back a dialog or its sensitive transient state.\n if (historyIds.length === 0 && previous[HISTORY_MARKER] !== undefined) {\n delete previous[HISTORY_MARKER];\n history.replaceState(previous, \"\");\n }\n entry.historyId = ++nextHistoryId;\n historyIds.push(entry.historyId);\n history.pushState({ ...previous, [HISTORY_MARKER]: entry.historyId }, \"\");\n };\n\n const ensureDialogElement = () => {\n if (typeof document === \"undefined\") throw new Error(\"@k2b/ui dialogs can only be opened in the browser\");\n // Reuse the shared element whenever it is still in the document. Resolving\n // the portal root first would create a second <dialog> when focus has moved\n // into another `.k2b-ui` scope, orphaning the levels already on the stack.\n if (state.element?.isConnected) return state.element;\n\n const element = document.createElement(\"dialog\");\n element.onclose = () => {\n // Repeated Escape can force a non-cancelable native close. A retained\n // entry (ignore, an async guard, or a parent) still owns the modal.\n const top = state.stack[state.stack.length - 1];\n if (state.element !== element || element.open || !top) return;\n if (top.modal) element.showModal();\n else element.show();\n resolveInitialFocusTarget(top, element)?.focus();\n };\n getK2bPortalRoot().appendChild(element);\n state.element = element;\n return element;\n };\n\n const lockPageScroll = () => {\n if (typeof document === \"undefined\" || state.scrollLocked) return;\n state.previousBodyOverflow = document.body.style.overflow;\n state.previousHtmlOverflow = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n state.scrollLocked = true;\n };\n\n const unlockPageScroll = () => {\n if (typeof document === \"undefined\" || !state.scrollLocked) return;\n document.body.style.overflow = state.previousBodyOverflow ?? \"\";\n document.documentElement.style.overflow = state.previousHtmlOverflow ?? \"\";\n state.scrollLocked = false;\n state.previousBodyOverflow = undefined;\n state.previousHtmlOverflow = undefined;\n };\n\n const applyPresentation = (entry: DialogStackEntry) => {\n const dialog = state.element;\n if (!dialog || state.stack[state.stack.length - 1] !== entry) return;\n const position = entry.position;\n dialog.style.position = position ? \"fixed\" : \"\";\n dialog.style.inset = position ? `${position.y}px auto auto ${position.x}px` : \"\";\n dialog.style.margin = position ? \"0\" : \"\";\n dialog.style.transform = position ? \"none\" : \"\";\n dialog.dataset.modeless = String(!entry.modal);\n dialog.setAttribute(\"aria-modal\", String(entry.modal));\n if (dialog.open && state.modal !== entry.modal) {\n const active = document.activeElement;\n dialog.close();\n if (entry.modal) dialog.showModal();\n else dialog.show();\n if (active instanceof HTMLElement && active.isConnected && (!entry.modal || dialog.contains(active))) {\n active.focus({ preventScroll: true });\n } else resolveInitialFocusTarget(entry, dialog)?.focus({ preventScroll: true });\n }\n state.modal = entry.modal;\n if (entry.modal) lockPageScroll();\n else unlockPageScroll();\n };\n\n const modelessEscape = (event: KeyboardEvent) => {\n const top = state.stack[state.stack.length - 1];\n if (!top || top.modal || event.key !== \"Escape\" || event.defaultPrevented || event.isComposing) return;\n event.preventDefault();\n void requestDismiss(top);\n };\n\n const stopConnectionObserver = () => {\n document.removeEventListener(\"keydown\", modelessEscape);\n state.connectionObserver?.disconnect();\n state.connectionObserver = undefined;\n };\n\n const applyCancelBehavior = (\n dialog: HTMLDialogElement,\n close: () => void,\n behavior: NonNullable<OpenDialogOptions[\"cancelBehavior\"]>,\n ) => {\n dialog.oncancel = (event) => {\n if (behavior === \"ignore\") {\n event.preventDefault();\n return;\n }\n event.preventDefault();\n close();\n };\n dialog.onmousedown = (event) => {\n state.mouseDownOnDialog = event.target === dialog;\n };\n dialog.onclick = (event) => {\n const realBackdropClick = state.mouseDownOnDialog === true;\n state.mouseDownOnDialog = false;\n if (event.target !== dialog || !state.modal) return;\n if (!realBackdropClick) return;\n if (behavior === \"ignore\") return;\n if (isPointInsideToast(event.clientX, event.clientY)) return;\n close();\n };\n };\n\n const requestDismiss = async (entry: DialogStackEntry) => {\n if (state.stack[state.stack.length - 1] !== entry || entry.dismissPending || entry.cancelBehavior === \"ignore\") return;\n if (!entry.dismissHandler) {\n popTop(undefined);\n return;\n }\n entry.dismissPending = true;\n try {\n await entry.dismissHandler();\n } catch (error) {\n // A failed guard must never discard the dialog's state.\n console.error(\"Dialog dismissal failed\", error);\n } finally {\n entry.dismissPending = false;\n }\n };\n\n const popTop = (result?: unknown) => {\n const top = state.stack.pop();\n if (!top) return;\n releaseHistory(top);\n top.dispose?.();\n top.container.remove();\n\n const dialog = state.element;\n const previous = state.stack[state.stack.length - 1];\n if (previous && dialog) {\n previous.container.style.display = \"\";\n dialog.className = previous.panelClassName;\n applyPresentation(previous);\n applyAccessibleName(dialog, previous);\n applyCancelBehavior(dialog, () => void requestDismiss(previous), previous.cancelBehavior);\n schedule(() => {\n if (!focusUnclaimed(dialog)) return;\n if (top.opener?.isConnected) returnFocus(top.opener, top.openerRing);\n else resolveInitialFocusTarget(previous, dialog)?.focus();\n });\n } else if (dialog) {\n dialog.oncancel = null;\n dialog.onmousedown = null;\n dialog.onclick = null;\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n if (dialog.open && typeof dialog.close === \"function\") dialog.close();\n else dialog.removeAttribute(\"open\");\n dialog.remove();\n state.element = undefined;\n stopConnectionObserver();\n unlockPageScroll();\n // After the Escape that closed it: WebKit lights the ring of whatever\n // that key press leaves focused.\n schedule(() => {\n if (top.opener?.isConnected && focusUnclaimed(dialog)) returnFocus(top.opener, top.openerRing);\n });\n }\n\n top.resolve?.(result);\n };\n\n const resetDisconnectedDialog = () => {\n if (state.stack.length === 0 || state.element?.isConnected) return;\n const entries = state.stack.splice(0);\n const dialog = state.element;\n state.element = undefined;\n stopConnectionObserver();\n dialog?.remove();\n unlockPageScroll();\n for (const entry of entries.reverse()) {\n releaseHistory(entry);\n entry.dispose?.();\n entry.container.remove();\n entry.resolve?.(undefined);\n }\n };\n\n const observeConnection = () => {\n if (state.connectionObserver || typeof MutationObserver === \"undefined\") return;\n document.addEventListener(\"keydown\", modelessEscape);\n state.connectionObserver = new MutationObserver(resetDisconnectedDialog);\n state.connectionObserver.observe(document.documentElement, { childList: true, subtree: true });\n };\n\n const open = <T>(view: DialogRender<T>, options: OpenDialogOptions = {}): Promise<T | undefined> => {\n if (options.signal?.aborted) return Promise.resolve(undefined);\n if (options.history) {\n // Dialogs closed just now leave the history first, or this dialog's entry would be the one removed.\n if (historySyncScheduled) syncHistory();\n if (returning) return returning.then(() => open(view, options));\n }\n const dialog = ensureDialogElement();\n const previousTop = state.stack[state.stack.length - 1];\n if (previousTop) previousTop.container.style.display = \"none\";\n const activeElement = document.activeElement;\n\n const panelClassName = options.panelClassName ?? DEFAULT_PANEL_CLASS;\n const cancelBehavior = options.cancelBehavior ?? \"resolve-undefined\";\n const initialFocus = options.initialFocus ?? \"first-input\";\n dialog.className = panelClassName;\n\n const container = document.createElement(\"div\");\n container.className = options.contentClassName ?? DEFAULT_CONTENT_CLASS;\n dialog.appendChild(container);\n\n const entry: DialogStackEntry = {\n container,\n panelClassName,\n cancelBehavior,\n initialFocus,\n opener: activeElement instanceof HTMLElement ? activeElement : undefined,\n openerRing: ringOnReturn(activeElement),\n ariaLabel: options.ariaLabel,\n modal: true,\n };\n\n return new Promise((resolve, reject) => {\n const abort = () => {\n const index = state.stack.indexOf(entry);\n if (index < 0) return;\n if (index === state.stack.length - 1) popTop(undefined);\n else {\n state.stack.splice(index, 1);\n releaseHistory(entry);\n entry.dispose?.();\n entry.container.remove();\n entry.resolve?.(undefined);\n }\n };\n entry.resolve = (value) => {\n options.signal?.removeEventListener(\"abort\", abort);\n if (entry.historyId === undefined) {\n resolve(value as T | undefined);\n return;\n }\n // After the history sync, so a caller that navigates or opens the next dialog finds the history settled.\n queueMicrotask(() => void (returning ?? Promise.resolve()).then(() => resolve(value as T | undefined)));\n };\n const closeTyped: DialogClose<T> = (result) => {\n if (state.stack[state.stack.length - 1] !== entry) return;\n popTop(result);\n };\n\n if (options.history) pushHistory(entry);\n state.stack.push(entry);\n try {\n entry.dispose = render(\n () =>\n view(closeTyped, {\n dialog,\n setModal: (modal) => {\n entry.modal = modal;\n applyPresentation(entry);\n },\n setPosition: (position) => {\n if (position && (!Number.isFinite(position.x) || !Number.isFinite(position.y))) return;\n entry.position = position;\n applyPresentation(entry);\n },\n requestDismiss: () => requestDismiss(entry),\n setDismissHandler: (handler) => {\n entry.dismissHandler = handler;\n },\n }),\n container,\n );\n applyPresentation(entry);\n applyAccessibleName(dialog, entry);\n applyCancelBehavior(dialog, () => void requestDismiss(entry), cancelBehavior);\n\n if (state.stack.length === 1) {\n // The native dialog returns focus to the element focused when it\n // opened, with a ring of the browser's choosing. Opening from a\n // blurred document leaves the return to popTop and its opener ring.\n if (activeElement instanceof HTMLElement) activeElement.blur();\n if (typeof dialog.showModal === \"function\") {\n if (entry.modal) dialog.showModal();\n else dialog.show();\n } else dialog.setAttribute(\"open\", \"\");\n observeConnection();\n }\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n // Where opening left focus, the native dialog's own pick included. Focus that the content or a person moved\n // before the next frame stays: a browser can hold that frame back while keys already arrive.\n const opened = document.activeElement;\n schedule(() => {\n if (state.stack[state.stack.length - 1] !== entry) return;\n if (document.activeElement !== opened && !focusUnclaimed(dialog)) return;\n resolveInitialFocusTarget(entry, dialog)?.focus();\n });\n } catch (error) {\n entry.resolve = undefined;\n if (state.stack[state.stack.length - 1] === entry) popTop(undefined);\n reject(error);\n }\n });\n };\n\n const close: DialogCore[\"close\"] = (result) => {\n let first = true;\n while (state.stack.length > 0) {\n popTop(first ? result : undefined);\n first = false;\n }\n };\n\n return {\n open,\n close,\n isOpen: () => state.stack.length > 0,\n };\n};\n\nexport const dialogCore = createDialogCore();\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["feedback/dialog-core.ts"],"sourcesContent":["import { createComponent, type JSX } from \"solid-js\";\nimport { render } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { getK2bPortalRoot } from \"../internal/portal\";\nimport { RenderErrorBoundary } from \"../internal/render-error\";\nimport { resolveUiMessages } from \"../intl/messages\";\nimport { isPointInsideToast } from \"./toast\";\n\nexport type DialogClose<T> = (result?: T) => void;\n\nexport type OpenDialogOptions = {\n /** Close only this dialog when its owning operation is cancelled. */\n signal?: AbortSignal;\n panelClassName?: string;\n contentClassName?: string;\n initialFocus?: \"first-input\" | \"none\" | ((dialog: HTMLDialogElement) => HTMLElement | null);\n cancelBehavior?: \"resolve-undefined\" | \"ignore\";\n ariaLabel?: string;\n /**\n * Add a same-URL history entry while the dialog is open, so the browser's or the phone's Back closes the dialog\n * instead of leaving the page. Closing the dialog removes the entry again; the returned promise settles after that.\n */\n history?: boolean;\n};\n\nexport type DialogRender<T> = (\n close: DialogClose<T>,\n context: {\n dialog: HTMLDialogElement;\n /** Switch this entry between a modal and a modeless window without remounting. */\n setModal: (modal: boolean) => void;\n /** Set viewport coordinates, or restore the panel stylesheet position with null. */\n setPosition: (position: { x: number; y: number } | null) => void;\n /** Route Escape/backdrop through the same guarded handler as Cancel and X. */\n setDismissHandler: (handler: () => void | Promise<void>) => void;\n /** Request dismissal through this entry's cancellation policy and guard. */\n requestDismiss: () => Promise<void>;\n },\n) => JSX.Element;\n\nexport type DialogCore = {\n open: <T>(view: DialogRender<T>, options?: OpenDialogOptions) => Promise<T | undefined>;\n close: (result?: unknown) => void;\n isOpen: () => boolean;\n};\n\ntype DialogStackEntry = {\n container: HTMLDivElement;\n dispose?: () => void;\n resolve?: (value: unknown) => void;\n panelClassName: string;\n cancelBehavior: NonNullable<OpenDialogOptions[\"cancelBehavior\"]>;\n initialFocus: NonNullable<OpenDialogOptions[\"initialFocus\"]>;\n opener?: HTMLElement;\n openerRing: boolean;\n ariaLabel?: string;\n dismissHandler?: () => void | Promise<void>;\n dismissPending?: boolean;\n modal: boolean;\n position?: { x: number; y: number } | null;\n /** The marker of this dialog's history entry, for dialogs opened with `history`. */\n historyId?: number;\n};\n\ntype DialogState = {\n element?: HTMLDialogElement;\n modal?: boolean;\n stack: DialogStackEntry[];\n scrollLocked?: boolean;\n previousBodyOverflow?: string;\n previousHtmlOverflow?: string;\n mouseDownOnDialog?: boolean;\n connectionObserver?: MutationObserver;\n};\n\nconst DEFAULT_PANEL_CLASS = \"k2b-dialog\";\nconst DEFAULT_CONTENT_CLASS = \"k2b-dialog__viewport\";\n/** The frame of a dialog whose content could not render: a custom or bare surface may draw no frame of its own. */\nconst RENDER_ERROR_PANEL_CLASS = \"k2b-dialog k2b-dialog--small\";\nlet nextDialogTitleId = 0;\n/** The history state key that marks a dialog's same-URL entry. */\nconst HISTORY_MARKER = \"k2bDialog\";\n\nconst historyRecord = (): Record<string, unknown> =>\n typeof history.state === \"object\" && history.state !== null ? { ...history.state } : {};\nconst historyMarker = (): unknown => historyRecord()[HISTORY_MARKER];\n\nconst resolveInitialFocusTarget = (entry: DialogStackEntry, dialog: HTMLDialogElement): HTMLElement | null => {\n const { initialFocus } = entry;\n if (initialFocus === \"none\") return null;\n if (typeof initialFocus === \"function\") return initialFocus(dialog);\n const input = entry.container.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), [role='combobox']:not([disabled]):not([aria-disabled='true'])\",\n );\n return (\n input ??\n entry.container.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex='-1'])\",\n )\n );\n};\n\nconst applyAccessibleName = (dialog: HTMLDialogElement, entry: DialogStackEntry): void => {\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n if (entry.ariaLabel) {\n dialog.setAttribute(\"aria-label\", entry.ariaLabel);\n return;\n }\n const heading = entry.container.querySelector<HTMLElement>(\"h1, h2, h3\");\n if (!heading) {\n dialog.setAttribute(\"aria-label\", resolveUiMessages().dialog);\n return;\n }\n heading.id ||= `k2b-dialog-title-${++nextDialogTitleId}`;\n dialog.setAttribute(\"aria-labelledby\", heading.id);\n};\n\nconst schedule = (callback: () => void): void => {\n if (typeof requestAnimationFrame === \"function\") requestAnimationFrame(callback);\n else queueMicrotask(callback);\n};\n\n/**\n * Whether focus is still where closing a level left it, on the page or the\n * dialog: nothing took it before the next frame, neither a close handler nor a\n * Tab pressed right after Escape.\n */\nconst focusUnclaimed = (dialog: HTMLDialogElement): boolean => {\n const active = document.activeElement;\n return !active || active === document.body || active === dialog;\n};\n\nexport const createDialogCore = (): DialogCore => {\n const state: DialogState = { stack: [] };\n /** Markers of this core's entries in the browser history, oldest first. */\n let historyIds: number[] = [];\n let nextHistoryId = 0;\n let historySyncScheduled = false;\n let listeningToHistory = false;\n /** Settles when the synthetic Back that removes closed dialogs' entries has arrived. */\n let returning: Promise<void> | undefined;\n\n /** Closed dialogs leave the history with one Back to the newest dialog that is still open, or to the page. */\n const syncHistory = () => {\n historySyncScheduled = false;\n const openIds = new Set(state.stack.map((entry) => entry.historyId));\n const current = historyIds.at(-1);\n let steps = 0;\n while (historyIds.length > 0 && !openIds.has(historyIds.at(-1))) {\n historyIds.pop();\n steps++;\n }\n // Someone else moved the history meanwhile; leave it alone.\n if (steps === 0 || historyMarker() !== current) return;\n const back = new Promise<void>((resolve) => window.addEventListener(\"popstate\", () => resolve(), { once: true }));\n returning = back;\n void back.then(() => {\n if (returning === back) returning = undefined;\n });\n history.go(-steps);\n };\n\n const releaseHistory = (entry: DialogStackEntry) => {\n if (entry.historyId === undefined || historySyncScheduled) return;\n historySyncScheduled = true;\n queueMicrotask(syncHistory);\n };\n\n /** Back or Forward moved to another entry: close every dialog opened after the one it shows. */\n const onPopState = () => {\n const marker = historyMarker();\n const index = typeof marker === \"number\" ? historyIds.indexOf(marker) : -1;\n historyIds = historyIds.slice(0, index + 1);\n const gone = (entry: DialogStackEntry) => entry.historyId !== undefined && !historyIds.includes(entry.historyId);\n while (state.stack.some(gone)) popTop(undefined);\n };\n\n const pushHistory = (entry: DialogStackEntry) => {\n if (!listeningToHistory) {\n window.addEventListener(\"popstate\", onPopState);\n listeningToHistory = true;\n }\n const previous = historyRecord();\n // A reload or Forward never brings back a dialog or its sensitive transient state.\n if (historyIds.length === 0 && previous[HISTORY_MARKER] !== undefined) {\n delete previous[HISTORY_MARKER];\n history.replaceState(previous, \"\");\n }\n entry.historyId = ++nextHistoryId;\n historyIds.push(entry.historyId);\n history.pushState({ ...previous, [HISTORY_MARKER]: entry.historyId }, \"\");\n };\n\n const ensureDialogElement = () => {\n if (typeof document === \"undefined\") throw new Error(\"@k2b/ui dialogs can only be opened in the browser\");\n // Reuse the shared element whenever it is still in the document. Resolving\n // the portal root first would create a second <dialog> when focus has moved\n // into another `.k2b-ui` scope, orphaning the levels already on the stack.\n if (state.element?.isConnected) return state.element;\n\n const element = document.createElement(\"dialog\");\n element.onclose = () => {\n // Repeated Escape can force a non-cancelable native close. A retained\n // entry (ignore, an async guard, or a parent) still owns the modal.\n const top = state.stack[state.stack.length - 1];\n if (state.element !== element || element.open || !top) return;\n if (top.modal) element.showModal();\n else element.show();\n resolveInitialFocusTarget(top, element)?.focus();\n };\n getK2bPortalRoot().appendChild(element);\n state.element = element;\n return element;\n };\n\n const lockPageScroll = () => {\n if (typeof document === \"undefined\" || state.scrollLocked) return;\n state.previousBodyOverflow = document.body.style.overflow;\n state.previousHtmlOverflow = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n state.scrollLocked = true;\n };\n\n const unlockPageScroll = () => {\n if (typeof document === \"undefined\" || !state.scrollLocked) return;\n document.body.style.overflow = state.previousBodyOverflow ?? \"\";\n document.documentElement.style.overflow = state.previousHtmlOverflow ?? \"\";\n state.scrollLocked = false;\n state.previousBodyOverflow = undefined;\n state.previousHtmlOverflow = undefined;\n };\n\n const applyPresentation = (entry: DialogStackEntry) => {\n const dialog = state.element;\n if (!dialog || state.stack[state.stack.length - 1] !== entry) return;\n const position = entry.position;\n dialog.style.position = position ? \"fixed\" : \"\";\n dialog.style.inset = position ? `${position.y}px auto auto ${position.x}px` : \"\";\n dialog.style.margin = position ? \"0\" : \"\";\n dialog.style.transform = position ? \"none\" : \"\";\n dialog.dataset.modeless = String(!entry.modal);\n dialog.setAttribute(\"aria-modal\", String(entry.modal));\n if (dialog.open && state.modal !== entry.modal) {\n const active = document.activeElement;\n dialog.close();\n if (entry.modal) dialog.showModal();\n else dialog.show();\n if (active instanceof HTMLElement && active.isConnected && (!entry.modal || dialog.contains(active))) {\n active.focus({ preventScroll: true });\n } else resolveInitialFocusTarget(entry, dialog)?.focus({ preventScroll: true });\n }\n state.modal = entry.modal;\n if (entry.modal) lockPageScroll();\n else unlockPageScroll();\n };\n\n const modelessEscape = (event: KeyboardEvent) => {\n const top = state.stack[state.stack.length - 1];\n if (!top || top.modal || event.key !== \"Escape\" || event.defaultPrevented || event.isComposing) return;\n event.preventDefault();\n void requestDismiss(top);\n };\n\n const stopConnectionObserver = () => {\n document.removeEventListener(\"keydown\", modelessEscape);\n state.connectionObserver?.disconnect();\n state.connectionObserver = undefined;\n };\n\n const applyCancelBehavior = (\n dialog: HTMLDialogElement,\n close: () => void,\n behavior: NonNullable<OpenDialogOptions[\"cancelBehavior\"]>,\n ) => {\n dialog.oncancel = (event) => {\n if (behavior === \"ignore\") {\n event.preventDefault();\n return;\n }\n event.preventDefault();\n close();\n };\n dialog.onmousedown = (event) => {\n state.mouseDownOnDialog = event.target === dialog;\n };\n dialog.onclick = (event) => {\n const realBackdropClick = state.mouseDownOnDialog === true;\n state.mouseDownOnDialog = false;\n if (event.target !== dialog || !state.modal) return;\n if (!realBackdropClick) return;\n if (behavior === \"ignore\") return;\n if (isPointInsideToast(event.clientX, event.clientY)) return;\n close();\n };\n };\n\n const requestDismiss = async (entry: DialogStackEntry) => {\n if (state.stack[state.stack.length - 1] !== entry || entry.dismissPending || entry.cancelBehavior === \"ignore\") return;\n if (!entry.dismissHandler) {\n popTop(undefined);\n return;\n }\n entry.dismissPending = true;\n try {\n await entry.dismissHandler();\n } catch (error) {\n // A failed guard must never discard the dialog's state.\n console.error(\"Dialog dismissal failed\", error);\n } finally {\n entry.dismissPending = false;\n }\n };\n\n const popTop = (result?: unknown) => {\n const top = state.stack.pop();\n if (!top) return;\n releaseHistory(top);\n top.dispose?.();\n top.container.remove();\n\n const dialog = state.element;\n const previous = state.stack[state.stack.length - 1];\n if (previous && dialog) {\n previous.container.style.display = \"\";\n dialog.className = previous.panelClassName;\n applyPresentation(previous);\n applyAccessibleName(dialog, previous);\n applyCancelBehavior(dialog, () => void requestDismiss(previous), previous.cancelBehavior);\n schedule(() => {\n if (!focusUnclaimed(dialog)) return;\n if (top.opener?.isConnected) returnFocus(top.opener, top.openerRing);\n else resolveInitialFocusTarget(previous, dialog)?.focus();\n });\n } else if (dialog) {\n dialog.oncancel = null;\n dialog.onmousedown = null;\n dialog.onclick = null;\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n if (dialog.open && typeof dialog.close === \"function\") dialog.close();\n else dialog.removeAttribute(\"open\");\n dialog.remove();\n state.element = undefined;\n stopConnectionObserver();\n unlockPageScroll();\n // After the Escape that closed it: WebKit lights the ring of whatever\n // that key press leaves focused.\n schedule(() => {\n if (top.opener?.isConnected && focusUnclaimed(dialog)) returnFocus(top.opener, top.openerRing);\n });\n }\n\n top.resolve?.(result);\n };\n\n const resetDisconnectedDialog = () => {\n if (state.stack.length === 0 || state.element?.isConnected) return;\n const entries = state.stack.splice(0);\n const dialog = state.element;\n state.element = undefined;\n stopConnectionObserver();\n dialog?.remove();\n unlockPageScroll();\n for (const entry of entries.reverse()) {\n releaseHistory(entry);\n entry.dispose?.();\n entry.container.remove();\n entry.resolve?.(undefined);\n }\n };\n\n const observeConnection = () => {\n if (state.connectionObserver || typeof MutationObserver === \"undefined\") return;\n document.addEventListener(\"keydown\", modelessEscape);\n state.connectionObserver = new MutationObserver(resetDisconnectedDialog);\n state.connectionObserver.observe(document.documentElement, { childList: true, subtree: true });\n };\n\n const open = <T>(view: DialogRender<T>, options: OpenDialogOptions = {}): Promise<T | undefined> => {\n if (options.signal?.aborted) return Promise.resolve(undefined);\n if (options.history) {\n // Dialogs closed just now leave the history first, or this dialog's entry would be the one removed.\n if (historySyncScheduled) syncHistory();\n if (returning) return returning.then(() => open(view, options));\n }\n const dialog = ensureDialogElement();\n const previousTop = state.stack[state.stack.length - 1];\n if (previousTop) previousTop.container.style.display = \"none\";\n const activeElement = document.activeElement;\n\n const panelClassName = options.panelClassName ?? DEFAULT_PANEL_CLASS;\n const cancelBehavior = options.cancelBehavior ?? \"resolve-undefined\";\n const initialFocus = options.initialFocus ?? \"first-input\";\n dialog.className = panelClassName;\n\n const container = document.createElement(\"div\");\n container.className = options.contentClassName ?? DEFAULT_CONTENT_CLASS;\n dialog.appendChild(container);\n\n const entry: DialogStackEntry = {\n container,\n panelClassName,\n cancelBehavior,\n initialFocus,\n opener: activeElement instanceof HTMLElement ? activeElement : undefined,\n openerRing: ringOnReturn(activeElement),\n ariaLabel: options.ariaLabel,\n modal: true,\n };\n\n return new Promise((resolve, reject) => {\n const abort = () => {\n const index = state.stack.indexOf(entry);\n if (index < 0) return;\n if (index === state.stack.length - 1) popTop(undefined);\n else {\n state.stack.splice(index, 1);\n releaseHistory(entry);\n entry.dispose?.();\n entry.container.remove();\n entry.resolve?.(undefined);\n }\n };\n entry.resolve = (value) => {\n options.signal?.removeEventListener(\"abort\", abort);\n if (entry.historyId === undefined) {\n resolve(value as T | undefined);\n return;\n }\n // After the history sync, so a caller that navigates or opens the next dialog finds the history settled.\n queueMicrotask(() => void (returning ?? Promise.resolve()).then(() => resolve(value as T | undefined)));\n };\n const closeTyped: DialogClose<T> = (result) => {\n if (state.stack[state.stack.length - 1] !== entry) return;\n popTop(result);\n };\n\n if (options.history) pushHistory(entry);\n state.stack.push(entry);\n try {\n entry.dispose = render(\n () =>\n createComponent(RenderErrorBoundary, {\n content: () =>\n view(closeTyped, {\n dialog,\n setModal: (modal) => {\n entry.modal = modal;\n applyPresentation(entry);\n },\n setPosition: (position) => {\n if (position && (!Number.isFinite(position.x) || !Number.isFinite(position.y))) return;\n entry.position = position;\n applyPresentation(entry);\n },\n requestDismiss: () => requestDismiss(entry),\n setDismissHandler: (handler) => {\n entry.dismissHandler = handler;\n },\n }),\n onClose: () => closeTyped(undefined),\n onError: () => {\n entry.panelClassName = RENDER_ERROR_PANEL_CLASS;\n container.className = DEFAULT_CONTENT_CLASS;\n if (state.stack[state.stack.length - 1] === entry) dialog.className = RENDER_ERROR_PANEL_CLASS;\n },\n }),\n container,\n );\n applyPresentation(entry);\n applyAccessibleName(dialog, entry);\n applyCancelBehavior(dialog, () => void requestDismiss(entry), cancelBehavior);\n\n if (state.stack.length === 1) {\n // The native dialog returns focus to the element focused when it\n // opened, with a ring of the browser's choosing. Opening from a\n // blurred document leaves the return to popTop and its opener ring.\n if (activeElement instanceof HTMLElement) activeElement.blur();\n if (typeof dialog.showModal === \"function\") {\n if (entry.modal) dialog.showModal();\n else dialog.show();\n } else dialog.setAttribute(\"open\", \"\");\n observeConnection();\n }\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n // Where opening left focus, the native dialog's own pick included. Focus that the content or a person moved\n // before the next frame stays: a browser can hold that frame back while keys already arrive.\n const opened = document.activeElement;\n schedule(() => {\n if (state.stack[state.stack.length - 1] !== entry) return;\n if (document.activeElement !== opened && !focusUnclaimed(dialog)) return;\n resolveInitialFocusTarget(entry, dialog)?.focus();\n });\n } catch (error) {\n entry.resolve = undefined;\n if (state.stack[state.stack.length - 1] === entry) popTop(undefined);\n reject(error);\n }\n });\n };\n\n const close: DialogCore[\"close\"] = (result) => {\n let first = true;\n while (state.stack.length > 0) {\n popTop(first ? result : undefined);\n first = false;\n }\n };\n\n return {\n open,\n close,\n isOpen: () => state.stack.length > 0,\n };\n};\n\nexport const dialogCore = createDialogCore();\n"],"mappings":"AAAA,SAAS,eAAe,QAAkB,UAAU;AACpD,SAAS,MAAM,QAAQ,cAAc;AACrC,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AACpE,SAAS,gBAAgB,QAAQ,oBAAoB;AACrD,SAAS,mBAAmB,QAAQ,0BAA0B;AAC9D,SAAS,iBAAiB,QAAQ,kBAAkB;AACpD,SAAS,kBAAkB,QAAQ,SAAS;AAqE5C,MAAM,mBAAmB,GAAG,YAAY;AACxC,MAAM,qBAAqB,GAAG,sBAAsB;AACpD;AACA,MAAM,wBAAwB,GAAG,8BAA8B;AAC/D,IAAI,iBAAiB,GAAG,CAAC;AACzB;AACA,MAAM,cAAc,GAAG,WAAW;AAElC,MAAM,aAAa,GAAG,MACpB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG;EAAE,GAAG,OAAO,CAAC;AAAM,CAAC,GAAG,CAAC,CAAC;AACzF,MAAM,aAAa,GAAG,MAAe,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;AAEpE,MAAM,yBAAyB,GAAG,CAAC,KAAuB,EAAE,MAAyB,KAAyB;EAC5G,MAAM;IAAE;EAAa,CAAC,GAAG,KAAK;EAC9B,IAAI,YAAY,KAAK,MAAM,EAAE,OAAO,IAAI;EACxC,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM,CAAC;EACnE,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CACzC,6JACF,CAAC;EACD,OACE,KAAK,IACL,KAAK,CAAC,SAAS,CAAC,aAAa,CAC3B,gKACF,CAAC;AAEL,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,MAAyB,EAAE,KAAuB,KAAW;EACxF,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC;EACpC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC;EACzC,IAAI,KAAK,CAAC,SAAS,EAAE;IACnB,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC;IAClD;EACF;EACA,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CAAc,YAAY,CAAC;EACxE,IAAI,CAAC,OAAO,EAAE;IACZ,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7D;EACF;EACA,OAAO,CAAC,EAAE,KAAK,oBAAoB,EAAE,iBAAiB,EAAE;EACxD,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,QAAQ,GAAI,QAAoB,IAAW;EAC/C,IAAI,OAAO,qBAAqB,KAAK,UAAU,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,KAC5E,cAAc,CAAC,QAAQ,CAAC;AAC/B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,cAAc,GAAI,MAAyB,IAAc;EAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;EACrC,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,IAAI,MAAM,KAAK,MAAM;AACjE,CAAC;AAED,OAAO,MAAM,gBAAgB,GAAG,MAAkB;EAChD,MAAM,KAAkB,GAAG;IAAE,KAAK,EAAE;EAAG,CAAC;EACxC;EACA,IAAI,UAAoB,GAAG,EAAE;EAC7B,IAAI,aAAa,GAAG,CAAC;EACrB,IAAI,oBAAoB,GAAG,KAAK;EAChC,IAAI,kBAAkB,GAAG,KAAK;EAC9B;EACA,IAAI,SAAoC;;EAExC;EACA,MAAM,WAAW,GAAG,MAAM;IACxB,oBAAoB,GAAG,KAAK;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,KAAK,IAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC;IACb,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MAC/D,UAAU,CAAC,GAAG,CAAC,CAAC;MAChB,KAAK,EAAE;IACT;IACA;IACA,IAAI,KAAK,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,OAAO,EAAE;IAChD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAQ,OAAO,IAAK,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE;MAAE,IAAI,EAAE;IAAK,CAAC,CAAC,CAAC;IACjH,SAAS,GAAG,IAAI;IAChB,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;MACnB,IAAI,SAAS,KAAK,IAAI,EAAE,SAAS,GAAG,SAAS;IAC/C,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;EACpB,CAAC;EAED,MAAM,cAAc,GAAI,KAAuB,IAAK;IAClD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,oBAAoB,EAAE;IAC3D,oBAAoB,GAAG,IAAI;IAC3B,cAAc,CAAC,WAAW,CAAC;EAC7B,CAAC;;EAED;EACA,MAAM,UAAU,GAAG,MAAM;IACvB,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1E,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAI,KAAuB,IAAK,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;IAChH,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;EAClD,CAAC;EAED,MAAM,WAAW,GAAI,KAAuB,IAAK;IAC/C,IAAI,CAAC,kBAAkB,EAAE;MACvB,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC;MAC/C,kBAAkB,GAAG,IAAI;IAC3B;IACA,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;IAChC;IACA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE;MACrE,OAAO,QAAQ,CAAC,cAAc,CAAC;MAC/B,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpC;IACA,KAAK,CAAC,SAAS,GAAG,EAAE,aAAa;IACjC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAChC,OAAO,CAAC,SAAS,CAAC;MAAE,GAAG,QAAQ;MAAE,CAAC,cAAc,GAAG,KAAK,CAAC;IAAU,CAAC,EAAE,EAAE,CAAC;EAC3E,CAAC;EAED,MAAM,mBAAmB,GAAG,MAAM;IAChC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACzG;IACA;IACA;IACA,IAAI,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,KAAK,CAAC,OAAO;IAEpD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAChD,OAAO,CAAC,OAAO,GAAG,MAAM;MACtB;MACA;MACA,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;MAC/C,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;MACvD,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;MACnB,yBAAyB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC;IACvC,KAAK,CAAC,OAAO,GAAG,OAAO;IACvB,OAAO,OAAO;EAChB,CAAC;EAED,MAAM,cAAc,GAAG,MAAM;IAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE;IAC3D,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;IACzD,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ;IACpE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;IACvC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;IAClD,KAAK,CAAC,YAAY,GAAG,IAAI;EAC3B,CAAC;EAED,MAAM,gBAAgB,GAAG,MAAM;IAC7B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;IAC5D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE;IAC/D,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE;IAC1E,KAAK,CAAC,YAAY,GAAG,KAAK;IAC1B,KAAK,CAAC,oBAAoB,GAAG,SAAS;IACtC,KAAK,CAAC,oBAAoB,GAAG,SAAS;EACxC,CAAC;EAED,MAAM,iBAAiB,GAAI,KAAuB,IAAK;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;IAC/B,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,EAAE;IAC/C,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,GAAG,QAAQ,CAAC,CAAC,gBAAgB,QAAQ,CAAC,CAAC,IAAI,GAAG,EAAE;IAChF,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,GAAG,GAAG,EAAE;IACzC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,EAAE;IAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9C,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;MAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;MACrC,MAAM,CAAC,KAAK,CAAC,CAAC;MACd,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAC/B,MAAM,CAAC,IAAI,CAAC,CAAC;MAClB,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;QACpG,MAAM,CAAC,KAAK,CAAC;UAAE,aAAa,EAAE;QAAK,CAAC,CAAC;MACvC,CAAC,MAAM,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE;MAAK,CAAC,CAAC;IACjF;IACA,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;IACzB,IAAI,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAC7B,gBAAgB,CAAC,CAAC;EACzB,CAAC;EAED,MAAM,cAAc,GAAI,KAAoB,IAAK;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,WAAW,EAAE;IAChG,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,cAAc,CAAC,GAAG,CAAC;EAC1B,CAAC;EAED,MAAM,sBAAsB,GAAG,MAAM;IACnC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC;IACvD,KAAK,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IACtC,KAAK,CAAC,kBAAkB,GAAG,SAAS;EACtC,CAAC;EAED,MAAM,mBAAmB,GAAG,CAC1B,MAAyB,EACzB,KAAiB,EACjB,QAA0D,KACvD;IACH,MAAM,CAAC,QAAQ,GAAI,KAAK,IAAK;MAC3B,IAAI,QAAQ,KAAK,QAAQ,EAAE;QACzB,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB;MACF;MACA,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,KAAK,CAAC,CAAC;IACT,CAAC;IACD,MAAM,CAAC,WAAW,GAAI,KAAK,IAAK;MAC9B,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM;IACnD,CAAC;IACD,MAAM,CAAC,OAAO,GAAI,KAAK,IAAK;MAC1B,MAAM,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,KAAK,IAAI;MAC1D,KAAK,CAAC,iBAAiB,GAAG,KAAK;MAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;MAC7C,IAAI,CAAC,iBAAiB,EAAE;MACxB,IAAI,QAAQ,KAAK,QAAQ,EAAE;MAC3B,IAAI,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;MACtD,KAAK,CAAC,CAAC;IACT,CAAC;EACH,CAAC;EAED,MAAM,cAAc,GAAG,MAAO,KAAuB,IAAK;IACxD,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,EAAE;IAChH,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;MACzB,MAAM,CAAC,SAAS,CAAC;MACjB;IACF;IACA,KAAK,CAAC,cAAc,GAAG,IAAI;IAC3B,IAAI;MACF,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC,CAAC,OAAO,KAAK,EAAE;MACd;MACA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;IACjD,CAAC,SAAS;MACR,KAAK,CAAC,cAAc,GAAG,KAAK;IAC9B;EACF,CAAC;EAED,MAAM,MAAM,GAAI,MAAgB,IAAK;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE;IACV,cAAc,CAAC,GAAG,CAAC;IACnB,GAAG,CAAC,OAAO,GAAG,CAAC;IACf,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD,IAAI,QAAQ,IAAI,MAAM,EAAE;MACtB,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE;MACrC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,cAAc;MAC1C,iBAAiB,CAAC,QAAQ,CAAC;MAC3B,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC;MACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC;MACzF,QAAQ,CAAC,MAAM;QACb,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QAC7B,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,KAChE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;MAC3D,CAAC,CAAC;IACJ,CAAC,MAAM,IAAI,MAAM,EAAE;MACjB,MAAM,CAAC,QAAQ,GAAG,IAAI;MACtB,MAAM,CAAC,WAAW,GAAG,IAAI;MACzB,MAAM,CAAC,OAAO,GAAG,IAAI;MACrB,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC;MACpC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC;MACzC,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KACjE,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;MACnC,MAAM,CAAC,MAAM,CAAC,CAAC;MACf,KAAK,CAAC,OAAO,GAAG,SAAS;MACzB,sBAAsB,CAAC,CAAC;MACxB,gBAAgB,CAAC,CAAC;MAClB;MACA;MACA,QAAQ,CAAC,MAAM;QACb,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC;MAChG,CAAC,CAAC;IACJ;IAEA,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;EACvB,CAAC;EAED,MAAM,uBAAuB,GAAG,MAAM;IACpC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,KAAK,CAAC,OAAO,GAAG,SAAS;IACzB,sBAAsB,CAAC,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,CAAC;IAChB,gBAAgB,CAAC,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE;MACrC,cAAc,CAAC,KAAK,CAAC;MACrB,KAAK,CAAC,OAAO,GAAG,CAAC;MACjB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MACxB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;IAC5B;EACF,CAAC;EAED,MAAM,iBAAiB,GAAG,MAAM;IAC9B,IAAI,KAAK,CAAC,kBAAkB,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;IACzE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;IACpD,KAAK,CAAC,kBAAkB,GAAG,IAAI,gBAAgB,CAAC,uBAAuB,CAAC;IACxE,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;MAAE,SAAS,EAAE,IAAI;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;EAChG,CAAC;EAED,MAAM,IAAI,GAAG,CAAI,IAAqB,EAAE,OAA0B,GAAG,CAAC,CAAC,KAA6B;IAClG,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC9D,IAAI,OAAO,CAAC,OAAO,EAAE;MACnB;MACA,IAAI,oBAAoB,EAAE,WAAW,CAAC,CAAC;MACvC,IAAI,SAAS,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjE;IACA,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,IAAI,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;IAC7D,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa;IAE5C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,mBAAmB;IACpE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,mBAAmB;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,aAAa;IAC1D,MAAM,CAAC,SAAS,GAAG,cAAc;IAEjC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC,gBAAgB,IAAI,qBAAqB;IACvE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;IAE7B,MAAM,KAAuB,GAAG;MAC9B,SAAS;MACT,cAAc;MACd,cAAc;MACd,YAAY;MACZ,MAAM,EAAE,aAAa,YAAY,WAAW,GAAG,aAAa,GAAG,SAAS;MACxE,UAAU,EAAE,YAAY,CAAC,aAAa,CAAC;MACvC,SAAS,EAAE,OAAO,CAAC,SAAS;MAC5B,KAAK,EAAE;IACT,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;MACtC,MAAM,KAAK,GAAG,MAAM;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,EAAE;QACf,IAAI,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,KACnD;UACH,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;UAC5B,cAAc,CAAC,KAAK,CAAC;UACrB,KAAK,CAAC,OAAO,GAAG,CAAC;UACjB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;UACxB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC5B;MACF,CAAC;MACD,KAAK,CAAC,OAAO,GAAI,KAAK,IAAK;QACzB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;QACnD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;UACjC,OAAO,CAAC,KAAsB,CAAC;UAC/B;QACF;QACA;QACA,cAAc,CAAC,MAAM,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,KAAsB,CAAC,CAAC,CAAC;MACzG,CAAC;MACD,MAAM,UAA0B,GAAI,MAAM,IAAK;QAC7C,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;QACnD,MAAM,CAAC,MAAM,CAAC;MAChB,CAAC;MAED,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC;MACvC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;MACvB,IAAI;QACF,KAAK,CAAC,OAAO,GAAG,MAAM,CACpB,MACE,eAAe,CAAC,mBAAmB,EAAE;UACnC,OAAO,EAAE,MACP,IAAI,CAAC,UAAU,EAAE;YACf,MAAM;YACN,QAAQ,EAAG,KAAK,IAAK;cACnB,KAAK,CAAC,KAAK,GAAG,KAAK;cACnB,iBAAiB,CAAC,KAAK,CAAC;YAC1B,CAAC;YACD,WAAW,EAAG,QAAQ,IAAK;cACzB,IAAI,QAAQ,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;cAChF,KAAK,CAAC,QAAQ,GAAG,QAAQ;cACzB,iBAAiB,CAAC,KAAK,CAAC;YAC1B,CAAC;YACD,cAAc,EAAE,MAAM,cAAc,CAAC,KAAK,CAAC;YAC3C,iBAAiB,EAAG,OAAO,IAAK;cAC9B,KAAK,CAAC,cAAc,GAAG,OAAO;YAChC;UACF,CAAC,CAAC;UACJ,OAAO,EAAE,MAAM,UAAU,CAAC,SAAS,CAAC;UACpC,OAAO,EAAE,MAAM;YACb,KAAK,CAAC,cAAc,GAAG,wBAAwB;YAC/C,SAAS,CAAC,SAAS,GAAG,qBAAqB;YAC3C,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,SAAS,GAAG,wBAAwB;UAChG;QACF,CAAC,CAAC,EACJ,SACF,CAAC;QACD,iBAAiB,CAAC,KAAK,CAAC;QACxB,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC;QAClC,mBAAmB,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;QAE7E,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;UAC5B;UACA;UACA;UACA,IAAI,aAAa,YAAY,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;UAC9D,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE;YAC1C,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAC/B,MAAM,CAAC,IAAI,CAAC,CAAC;UACpB,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;UACtC,iBAAiB,CAAC,CAAC;QACrB;QACA,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE;UAAE,IAAI,EAAE;QAAK,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACpC;QACA;QACA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;QACrC,QAAQ,CAAC,MAAM;UACb,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;UACnD,IAAI,QAAQ,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;UAClE,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC;MACJ,CAAC,CAAC,OAAO,KAAK,EAAE;QACd,KAAK,CAAC,OAAO,GAAG,SAAS;QACzB,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC;MACf;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAM,KAA0B,GAAI,MAAM,IAAK;IAC7C,IAAI,KAAK,GAAG,IAAI;IAChB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;MAC7B,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;MAClC,KAAK,GAAG,KAAK;IACf;EACF,CAAC;EAED,OAAO;IACL,IAAI;IACJ,KAAK;IACL,MAAM,EAAE,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG;EACrC,CAAC;AACH,CAAC;AAED,OAAO,MAAM,UAAU,GAAG,gBAAgB,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
2
|
+
import { memo as _$memo } from "solid-js/web";
|
|
3
|
+
import { createFieldMeta, Field, fieldDescribedBy } from "../internal/field";
|
|
4
|
+
import { ChoiceGroups } from "./ChoiceGroups";
|
|
5
|
+
import { resolveMaybeAccessor } from "./field-contract";
|
|
6
|
+
/**
|
|
7
|
+
* A labeled single choice shown as one row of chips, for a handful of quick picks such as a preset or a proposed date.
|
|
8
|
+
* The row scrolls sideways instead of wrapping, so its height stays the same on every screen and for every selection.
|
|
9
|
+
* `null` selects no chip; the first chip then holds the tab stop. Use `Select` for long or searchable lists and
|
|
10
|
+
* `SegmentedControl` for switching between views or modes.
|
|
11
|
+
*/
|
|
12
|
+
export function ChoiceChips(props) {
|
|
13
|
+
const meta = createFieldMeta(props.id);
|
|
14
|
+
const value = () => resolveMaybeAccessor(props.value) ?? null;
|
|
15
|
+
return _$createComponent(Field, {
|
|
16
|
+
meta: meta,
|
|
17
|
+
labelFor: false,
|
|
18
|
+
get ["class"]() {
|
|
19
|
+
return `k2b-choice-chips ${props.class ?? ""}`;
|
|
20
|
+
},
|
|
21
|
+
get label() {
|
|
22
|
+
return props.label;
|
|
23
|
+
},
|
|
24
|
+
get description() {
|
|
25
|
+
return props.description;
|
|
26
|
+
},
|
|
27
|
+
get error() {
|
|
28
|
+
return props.error;
|
|
29
|
+
},
|
|
30
|
+
get required() {
|
|
31
|
+
return props.required;
|
|
32
|
+
},
|
|
33
|
+
get disabled() {
|
|
34
|
+
return props.disabled;
|
|
35
|
+
},
|
|
36
|
+
get children() {
|
|
37
|
+
return _$createComponent(ChoiceGroups, {
|
|
38
|
+
get choices() {
|
|
39
|
+
return props.options;
|
|
40
|
+
},
|
|
41
|
+
get value() {
|
|
42
|
+
return value();
|
|
43
|
+
},
|
|
44
|
+
onValueChange: next => {
|
|
45
|
+
const option = props.options.find(candidate => candidate.value === next);
|
|
46
|
+
if (!option) return;
|
|
47
|
+
props.onValueChange?.(option.value);
|
|
48
|
+
props.onValueCommit?.(option.value);
|
|
49
|
+
},
|
|
50
|
+
get ariaLabel() {
|
|
51
|
+
return props["aria-label"];
|
|
52
|
+
},
|
|
53
|
+
get labelledBy() {
|
|
54
|
+
return _$memo(() => !!props.label)() ? meta.labelId : undefined;
|
|
55
|
+
},
|
|
56
|
+
get describedBy() {
|
|
57
|
+
return fieldDescribedBy(meta, props);
|
|
58
|
+
},
|
|
59
|
+
get disabled() {
|
|
60
|
+
return props.disabled;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=ChoiceChips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/ChoiceChips.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { createFieldMeta, Field, fieldDescribedBy } from \"../internal/field\";\nimport { ChoiceGroups } from \"./ChoiceGroups\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\n\nexport type ChoiceChipOption<T extends string = string> = {\n value: T;\n label: string;\n icon?: string;\n};\n\nexport type ChoiceChipsProps<T extends string = string> = Omit<ValueFieldProps<T | null>, \"onValueChange\" | \"onValueCommit\"> & {\n options: readonly ChoiceChipOption<T>[];\n /** Receives the chosen value; choosing never reports `null`. */\n onValueChange?: (value: T) => void;\n onValueCommit?: (value: T) => void;\n};\n\n/**\n * A labeled single choice shown as one row of chips, for a handful of quick picks such as a preset or a proposed date.\n * The row scrolls sideways instead of wrapping, so its height stays the same on every screen and for every selection.\n * `null` selects no chip; the first chip then holds the tab stop. Use `Select` for long or searchable lists and\n * `SegmentedControl` for switching between views or modes.\n */\nexport function ChoiceChips<T extends string = string>(props: ChoiceChipsProps<T>): JSX.Element {\n const meta = createFieldMeta(props.id);\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n return (\n <Field\n meta={meta}\n labelFor={false}\n class={`k2b-choice-chips ${props.class ?? \"\"}`}\n label={props.label}\n description={props.description}\n error={props.error}\n required={props.required}\n disabled={props.disabled}\n >\n <ChoiceGroups\n choices={props.options}\n value={value()}\n onValueChange={(next) => {\n const option = props.options.find((candidate) => candidate.value === next);\n if (!option) return;\n props.onValueChange?.(option.value);\n props.onValueCommit?.(option.value);\n }}\n ariaLabel={props[\"aria-label\"]}\n labelledBy={props.label ? meta.labelId : undefined}\n describedBy={fieldDescribedBy(meta, props)}\n disabled={props.disabled}\n />\n </Field>\n );\n}\n"],"mappings":";;AACA,SAAS,eAAe,EAAE,KAAK,EAAE,gBAAgB,QAAQ,mBAAmB;AAC5E,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,oBAAoB,QAAQ,kBAAkB;AAevD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,WAAW,CAA4B,KAA0B,EAAe;EAC9F,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;EACtC,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI;EAC7D,yBACG,KAAK;IACJ,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,KAAK;IAAA;MAAA,OACR,oBAAoB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;IAAA;IAAA,IAC9C,KAAK;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA,IAClB,WAAW;MAAA,OAAE,KAAK,CAAC,WAAW;IAAA;IAAA,IAC9B,KAAK;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA,IAClB,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACxB,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA;MAAA,yBAEvB,YAAY;QAAA,IACX,OAAO;UAAA,OAAE,KAAK,CAAC,OAAO;QAAA;QAAA,IACtB,KAAK;UAAA,OAAE,KAAK,CAAC,CAAC;QAAA;QACd,aAAa,EAAG,IAAI,IAAK;UACvB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC;UAC1E,IAAI,CAAC,MAAM,EAAE;UACb,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;UACnC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;QACrC,CAAC;QAAA,IACD,SAAS;UAAA,OAAE,KAAK,CAAC,YAAY,CAAC;QAAA;QAAA,IAC9B,UAAU;UAAA,OAAE,oBAAK,CAAC,KAAK,MAAG,IAAI,CAAC,OAAO,GAAG,SAAS;QAAA;QAAA,IAClD,WAAW;UAAA,OAAE,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;QAAA;QAAA,IAC1C,QAAQ;UAAA,OAAE,KAAK,CAAC,QAAQ;QAAA;MAAA;IAAA;EAAA;AAIhC","ignoreList":[]}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { template as _$template } from "solid-js/web";
|
|
2
2
|
import { delegateEvents as _$delegateEvents } from "solid-js/web";
|
|
3
|
+
import { className as _$className } from "solid-js/web";
|
|
4
|
+
import { setProperty as _$setProperty } from "solid-js/web";
|
|
5
|
+
import { memo as _$memo } from "solid-js/web";
|
|
3
6
|
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
4
7
|
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
5
8
|
import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
|
|
@@ -11,8 +14,13 @@ import { createComponent as _$createComponent } from "solid-js/web";
|
|
|
11
14
|
import { use as _$use } from "solid-js/web";
|
|
12
15
|
var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-choice-groups-scrollbar aria-hidden=true><span>`),
|
|
13
16
|
_tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-choice-groups-shell><div class=k2b-choice-groups role=radiogroup></div><!$><!/>`),
|
|
14
|
-
_tmpl$3 = /*#__PURE__*/_$template(`<button type=button role=radio
|
|
17
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<button type=button role=radio><!$><!/><!$><!/>`),
|
|
18
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<i aria-hidden=true>`);
|
|
15
19
|
import { createEffect, createSignal, For, onCleanup, onMount, Show } from "solid-js";
|
|
20
|
+
/**
|
|
21
|
+
* A single-choice row of chips that scrolls sideways instead of wrapping, so its height never changes. Select and
|
|
22
|
+
* MultiSelect use it for their filters; `ChoiceChips` is the public field around it.
|
|
23
|
+
*/
|
|
16
24
|
export function ChoiceGroups(props) {
|
|
17
25
|
let viewport;
|
|
18
26
|
let buttons = [];
|
|
@@ -45,9 +53,12 @@ export function ChoiceGroups(props) {
|
|
|
45
53
|
width
|
|
46
54
|
});
|
|
47
55
|
};
|
|
56
|
+
|
|
57
|
+
// With no matching choice the first chip takes the tab stop, so the group stays reachable by keyboard.
|
|
58
|
+
const tabStop = (value, index) => props.value === value || index === 0 && !props.choices.some(choice => choice.value === props.value);
|
|
48
59
|
const choose = (index, focus = false) => {
|
|
49
60
|
const choice = props.choices[index];
|
|
50
|
-
if (!choice) return;
|
|
61
|
+
if (!choice || props.disabled) return;
|
|
51
62
|
props.onValueChange(choice.value);
|
|
52
63
|
if (!focus) return;
|
|
53
64
|
queueMicrotask(() => {
|
|
@@ -105,7 +116,11 @@ export function ChoiceGroups(props) {
|
|
|
105
116
|
return props.choices;
|
|
106
117
|
},
|
|
107
118
|
children: (group, index) => (() => {
|
|
108
|
-
var _el$7 = _$getNextElement(_tmpl$3)
|
|
119
|
+
var _el$7 = _$getNextElement(_tmpl$3),
|
|
120
|
+
_el$8 = _el$7.firstChild,
|
|
121
|
+
[_el$9, _co$2] = _$getNextMarker(_el$8.nextSibling),
|
|
122
|
+
_el$0 = _el$9.nextSibling,
|
|
123
|
+
[_el$1, _co$3] = _$getNextMarker(_el$0.nextSibling);
|
|
109
124
|
_el$7.$$keydown = event => {
|
|
110
125
|
if (event.key === "ArrowRight" || event.key === "ArrowDown") {
|
|
111
126
|
event.preventDefault();
|
|
@@ -120,19 +135,30 @@ export function ChoiceGroups(props) {
|
|
|
120
135
|
};
|
|
121
136
|
_el$7.$$click = () => choose(index());
|
|
122
137
|
_$use(element => buttons[index()] = element, _el$7);
|
|
123
|
-
_$insert(_el$7, () =>
|
|
138
|
+
_$insert(_el$7, (() => {
|
|
139
|
+
var _c$ = _$memo(() => !!group.icon);
|
|
140
|
+
return () => _c$() && (() => {
|
|
141
|
+
var _el$10 = _$getNextElement(_tmpl$4);
|
|
142
|
+
_$effect(() => _$className(_el$10, group.icon));
|
|
143
|
+
return _el$10;
|
|
144
|
+
})();
|
|
145
|
+
})(), _el$9, _co$2);
|
|
146
|
+
_$insert(_el$7, () => group.label, _el$1, _co$3);
|
|
124
147
|
_$effect(_p$ => {
|
|
125
|
-
var _v$
|
|
126
|
-
_v$
|
|
127
|
-
_v$
|
|
128
|
-
|
|
129
|
-
_v$
|
|
130
|
-
_v$
|
|
148
|
+
var _v$7 = props.value === group.value,
|
|
149
|
+
_v$8 = props.controls,
|
|
150
|
+
_v$9 = props.disabled,
|
|
151
|
+
_v$0 = tabStop(group.value, index()) ? 0 : -1;
|
|
152
|
+
_v$7 !== _p$.e && _$setAttribute(_el$7, "aria-checked", _p$.e = _v$7);
|
|
153
|
+
_v$8 !== _p$.t && _$setAttribute(_el$7, "aria-controls", _p$.t = _v$8);
|
|
154
|
+
_v$9 !== _p$.a && _$setProperty(_el$7, "disabled", _p$.a = _v$9);
|
|
155
|
+
_v$0 !== _p$.o && _$setAttribute(_el$7, "tabindex", _p$.o = _v$0);
|
|
131
156
|
return _p$;
|
|
132
157
|
}, {
|
|
133
158
|
e: undefined,
|
|
134
159
|
t: undefined,
|
|
135
|
-
a: undefined
|
|
160
|
+
a: undefined,
|
|
161
|
+
o: undefined
|
|
136
162
|
});
|
|
137
163
|
_$runHydrationEvents();
|
|
138
164
|
return _el$7;
|
|
@@ -165,7 +191,22 @@ export function ChoiceGroups(props) {
|
|
|
165
191
|
return _el$3;
|
|
166
192
|
}
|
|
167
193
|
}), _el$6, _co$);
|
|
168
|
-
_$effect(
|
|
194
|
+
_$effect(_p$ => {
|
|
195
|
+
var _v$3 = props.labelledBy ? undefined : props.ariaLabel,
|
|
196
|
+
_v$4 = props.labelledBy,
|
|
197
|
+
_v$5 = props.describedBy,
|
|
198
|
+
_v$6 = props.disabled ? "true" : undefined;
|
|
199
|
+
_v$3 !== _p$.e && _$setAttribute(_el$2, "aria-label", _p$.e = _v$3);
|
|
200
|
+
_v$4 !== _p$.t && _$setAttribute(_el$2, "aria-labelledby", _p$.t = _v$4);
|
|
201
|
+
_v$5 !== _p$.a && _$setAttribute(_el$2, "aria-describedby", _p$.a = _v$5);
|
|
202
|
+
_v$6 !== _p$.o && _$setAttribute(_el$2, "aria-disabled", _p$.o = _v$6);
|
|
203
|
+
return _p$;
|
|
204
|
+
}, {
|
|
205
|
+
e: undefined,
|
|
206
|
+
t: undefined,
|
|
207
|
+
a: undefined,
|
|
208
|
+
o: undefined
|
|
209
|
+
});
|
|
169
210
|
_$runHydrationEvents();
|
|
170
211
|
return _el$;
|
|
171
212
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/ChoiceGroups.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\n\ntype ChoiceGroup = { value: string | null; label: string };\n\nexport function ChoiceGroups(props: {\n choices: readonly ChoiceGroup[];\n value: string | null;\n onValueChange: (value: string | null) => void;\n ariaLabel: string;\n controls: string;\n}): JSX.Element {\n let viewport: HTMLDivElement | undefined;\n let buttons: HTMLButtonElement[] = [];\n let dragOffset = 0;\n const [scrollbar, setScrollbar] = createSignal({ overflow: false, left: 0, width: 0 });\n\n const syncScrollbar = () => {\n if (!viewport) return;\n const { clientWidth, scrollLeft, scrollWidth } = viewport;\n if (clientWidth <= 0 || scrollWidth <= clientWidth) {\n setScrollbar({ overflow: false, left: 0, width: 0 });\n return;\n }\n const width = Math.min(clientWidth, Math.max(24, (clientWidth * clientWidth) / scrollWidth));\n const left = (scrollLeft / (scrollWidth - clientWidth)) * (clientWidth - width);\n setScrollbar({ overflow: true, left, width });\n };\n\n const choose = (index: number, focus = false) => {\n const choice = props.choices[index];\n if (!choice) return;\n props.onValueChange(choice.value);\n if (!focus) return;\n queueMicrotask(() => {\n buttons[index]?.focus();\n buttons[index]?.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n });\n };\n const move = (index: number, direction: 1 | -1) => choose((index + direction + props.choices.length) % props.choices.length, true);\n const focusEdge = (last: boolean) => choose(last ? props.choices.length - 1 : 0, true);\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (!viewport) return;\n const track = event.currentTarget;\n const { width } = scrollbar();\n const rect = track.getBoundingClientRect();\n const available = Math.max(1, rect.width - width);\n const thumbLeft = Math.min(available, Math.max(0, event.clientX - rect.left - dragOffset));\n viewport.scrollLeft = (thumbLeft / available) * (viewport.scrollWidth - viewport.clientWidth);\n syncScrollbar();\n };\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n event.preventDefault();\n const track = event.currentTarget;\n const current = scrollbar();\n dragOffset =\n event.target === track\n ? current.width / 2\n : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));\n track.setPointerCapture(event.pointerId);\n scrollFromPointer(event);\n };\n\n onMount(() => {\n syncScrollbar();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbar);\n if (viewport) observer?.observe(viewport);\n onCleanup(() => observer?.disconnect());\n });\n createEffect(() => {\n props.choices.map((choice) => `${choice.value ?? \"\"}:${choice.label}`).join(\"|\");\n queueMicrotask(syncScrollbar);\n });\n\n return (\n <div class=\"k2b-choice-groups-shell\" onPointerEnter={syncScrollbar} onFocusIn={syncScrollbar}>\n <div ref={viewport} class=\"k2b-choice-groups\" role=\"radiogroup\" aria-label={props.ariaLabel} onScroll={syncScrollbar}>\n <For each={props.choices}>\n {(group, index) => (\n <button\n ref={(element) => (buttons[index()] = element)}\n type=\"button\"\n role=\"radio\"\n aria-checked={props.value === group.value}\n aria-controls={props.controls}\n tabIndex={props.value === group.value ? 0 : -1}\n onClick={() => choose(index())}\n onKeyDown={(event) => {\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n move(index(), 1);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n move(index(), -1);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusEdge(event.key === \"End\");\n }\n }}\n >\n {group.label}\n </button>\n )}\n </For>\n </div>\n <Show when={scrollbar().overflow}>\n <div\n class=\"k2b-choice-groups-scrollbar\"\n aria-hidden=\"true\"\n onPointerDown={startScrollbarDrag}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-choice-scroll-left\": `${scrollbar().left}px`,\n \"--k2b-choice-scroll-width\": `${scrollbar().width}px`,\n }}\n />\n </div>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/ChoiceGroups.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\n\ntype ChoiceGroup = { value: string | null; label: string; icon?: string };\n\n/**\n * A single-choice row of chips that scrolls sideways instead of wrapping, so its height never changes. Select and\n * MultiSelect use it for their filters; `ChoiceChips` is the public field around it.\n */\nexport function ChoiceGroups(props: {\n choices: readonly ChoiceGroup[];\n value: string | null;\n onValueChange: (value: string | null) => void;\n ariaLabel?: string;\n /** The field label that names the group; replaces `ariaLabel`. */\n labelledBy?: string;\n describedBy?: string;\n controls?: string;\n disabled?: boolean;\n}): JSX.Element {\n let viewport: HTMLDivElement | undefined;\n let buttons: HTMLButtonElement[] = [];\n let dragOffset = 0;\n const [scrollbar, setScrollbar] = createSignal({ overflow: false, left: 0, width: 0 });\n\n const syncScrollbar = () => {\n if (!viewport) return;\n const { clientWidth, scrollLeft, scrollWidth } = viewport;\n if (clientWidth <= 0 || scrollWidth <= clientWidth) {\n setScrollbar({ overflow: false, left: 0, width: 0 });\n return;\n }\n const width = Math.min(clientWidth, Math.max(24, (clientWidth * clientWidth) / scrollWidth));\n const left = (scrollLeft / (scrollWidth - clientWidth)) * (clientWidth - width);\n setScrollbar({ overflow: true, left, width });\n };\n\n // With no matching choice the first chip takes the tab stop, so the group stays reachable by keyboard.\n const tabStop = (value: string | null, index: number) =>\n props.value === value || (index === 0 && !props.choices.some((choice) => choice.value === props.value));\n const choose = (index: number, focus = false) => {\n const choice = props.choices[index];\n if (!choice || props.disabled) return;\n props.onValueChange(choice.value);\n if (!focus) return;\n queueMicrotask(() => {\n buttons[index]?.focus();\n buttons[index]?.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n });\n };\n const move = (index: number, direction: 1 | -1) => choose((index + direction + props.choices.length) % props.choices.length, true);\n const focusEdge = (last: boolean) => choose(last ? props.choices.length - 1 : 0, true);\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (!viewport) return;\n const track = event.currentTarget;\n const { width } = scrollbar();\n const rect = track.getBoundingClientRect();\n const available = Math.max(1, rect.width - width);\n const thumbLeft = Math.min(available, Math.max(0, event.clientX - rect.left - dragOffset));\n viewport.scrollLeft = (thumbLeft / available) * (viewport.scrollWidth - viewport.clientWidth);\n syncScrollbar();\n };\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n event.preventDefault();\n const track = event.currentTarget;\n const current = scrollbar();\n dragOffset =\n event.target === track\n ? current.width / 2\n : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));\n track.setPointerCapture(event.pointerId);\n scrollFromPointer(event);\n };\n\n onMount(() => {\n syncScrollbar();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbar);\n if (viewport) observer?.observe(viewport);\n onCleanup(() => observer?.disconnect());\n });\n createEffect(() => {\n props.choices.map((choice) => `${choice.value ?? \"\"}:${choice.label}`).join(\"|\");\n queueMicrotask(syncScrollbar);\n });\n\n return (\n <div class=\"k2b-choice-groups-shell\" onPointerEnter={syncScrollbar} onFocusIn={syncScrollbar}>\n <div\n ref={viewport}\n class=\"k2b-choice-groups\"\n role=\"radiogroup\"\n aria-label={props.labelledBy ? undefined : props.ariaLabel}\n aria-labelledby={props.labelledBy}\n aria-describedby={props.describedBy}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onScroll={syncScrollbar}\n >\n <For each={props.choices}>\n {(group, index) => (\n <button\n ref={(element) => (buttons[index()] = element)}\n type=\"button\"\n role=\"radio\"\n aria-checked={props.value === group.value}\n aria-controls={props.controls}\n disabled={props.disabled}\n tabIndex={tabStop(group.value, index()) ? 0 : -1}\n onClick={() => choose(index())}\n onKeyDown={(event) => {\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n move(index(), 1);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n move(index(), -1);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusEdge(event.key === \"End\");\n }\n }}\n >\n {group.icon && <i class={group.icon} aria-hidden=\"true\" />}\n {group.label}\n </button>\n )}\n </For>\n </div>\n <Show when={scrollbar().overflow}>\n <div\n class=\"k2b-choice-groups-scrollbar\"\n aria-hidden=\"true\"\n onPointerDown={startScrollbarDrag}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-choice-scroll-left\": `${scrollbar().left}px`,\n \"--k2b-choice-scroll-width\": `${scrollbar().width}px`,\n }}\n />\n </div>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|