@k2b/ui 0.44.0 → 0.45.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/dist/browser/actions/Tabs.js +3 -4
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/menu-sheet.js +2 -3
- package/dist/browser/actions/menu-sheet.js.map +1 -1
- package/dist/browser/actions/phone-sheet.js +4 -0
- package/dist/browser/actions/phone-sheet.js.map +1 -0
- package/dist/browser/content/DataTable.js +47 -51
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +5 -1
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/dialog-tone.js +26 -0
- package/dist/browser/feedback/dialog-tone.js.map +1 -0
- package/dist/browser/feedback/index.js.map +1 -1
- package/dist/browser/feedback/prompt-confirm.js +223 -0
- package/dist/browser/feedback/prompt-confirm.js.map +1 -0
- package/dist/browser/feedback/prompts.js +195 -343
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/ChoiceList.js +45 -17
- package/dist/browser/inputs/ChoiceList.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +1647 -334
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +5 -4
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/date-input-messages.js +128 -0
- package/dist/browser/inputs/date-input-messages.js.map +1 -0
- package/dist/browser/inputs/date-input-status.js +132 -0
- package/dist/browser/inputs/date-input-status.js.map +1 -0
- package/dist/browser/inputs/date-input.js +334 -0
- package/dist/browser/inputs/date-input.js.map +1 -0
- package/dist/browser/inputs/date-sheet.js +49 -0
- package/dist/browser/inputs/date-sheet.js.map +1 -0
- package/dist/browser/internal/reveal-in-scroller.js +28 -0
- package/dist/browser/internal/reveal-in-scroller.js.map +1 -0
- package/dist/browser/intl/messages.js +6 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +536 -512
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +3 -0
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js +167 -132
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/Settings.js +175 -139
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +2 -4
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/StatusBadge.js +47 -14
- package/dist/browser/surfaces/StatusBadge.js.map +1 -1
- package/dist/browser/text-editor/TextEditor.js +7 -0
- package/dist/browser/text-editor/TextEditor.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +3 -4
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/menu-sheet.js +2 -3
- package/dist/ssr/actions/menu-sheet.js.map +1 -1
- package/dist/ssr/actions/phone-sheet.js +4 -0
- package/dist/ssr/actions/phone-sheet.js.map +1 -0
- package/dist/ssr/content/DataTable.js +1 -2
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +5 -1
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/dialog-tone.js +26 -0
- package/dist/ssr/feedback/dialog-tone.js.map +1 -0
- package/dist/ssr/feedback/index.js.map +1 -1
- package/dist/ssr/feedback/prompt-confirm.js +123 -0
- package/dist/ssr/feedback/prompt-confirm.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +60 -132
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/ChoiceList.js +29 -9
- package/dist/ssr/inputs/ChoiceList.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +1183 -166
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +5 -4
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/date-input-messages.js +128 -0
- package/dist/ssr/inputs/date-input-messages.js.map +1 -0
- package/dist/ssr/inputs/date-input-status.js +132 -0
- package/dist/ssr/inputs/date-input-status.js.map +1 -0
- package/dist/ssr/inputs/date-input.js +334 -0
- package/dist/ssr/inputs/date-input.js.map +1 -0
- package/dist/ssr/inputs/date-sheet.js +44 -0
- package/dist/ssr/inputs/date-sheet.js.map +1 -0
- package/dist/ssr/internal/reveal-in-scroller.js +28 -0
- package/dist/ssr/internal/reveal-in-scroller.js.map +1 -0
- package/dist/ssr/intl/messages.js +6 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +44 -23
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +3 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +48 -30
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/Settings.js +34 -18
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +2 -4
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/StatusBadge.js +26 -8
- package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
- package/dist/ssr/text-editor/TextEditor.js +7 -0
- package/dist/ssr/text-editor/TextEditor.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/menu-sheet.d.ts +1 -3
- package/dist/types/actions/phone-sheet.d.ts +3 -0
- package/dist/types/feedback/dialog-tone.d.ts +10 -0
- package/dist/types/feedback/index.d.ts +1 -0
- package/dist/types/feedback/prompt-confirm.d.ts +19 -0
- package/dist/types/feedback/prompts.d.ts +4 -8
- package/dist/types/inputs/ChoiceList.d.ts +7 -3
- package/dist/types/inputs/DatePicker.d.ts +13 -3
- package/dist/types/inputs/TextInput.d.ts +1 -1
- package/dist/types/inputs/date-input-messages.d.ts +64 -0
- package/dist/types/inputs/date-input-status.d.ts +35 -0
- package/dist/types/inputs/date-input.d.ts +90 -0
- package/dist/types/inputs/date-sheet.d.ts +14 -0
- package/dist/types/internal/reveal-in-scroller.d.ts +6 -0
- package/dist/types/intl/messages.d.ts +3 -0
- package/dist/types/layout/AppWorkspace.d.ts +14 -0
- package/dist/types/layout/BottomSheet.d.ts +3 -0
- package/dist/types/layout/PanelDialog.d.ts +3 -0
- package/dist/types/layout/Settings.d.ts +17 -1
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/StatusBadge.d.ts +5 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/DataTable.tsx"],"sourcesContent":["import {\n type Accessor,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n Match,\n on,\n onCleanup,\n onMount,\n Show,\n Switch,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { announce } from \"../feedback/announce\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport type { CollectionSelection } from \"./collection-selection\";\nimport { useDataTableMessages } from \"./data-table-messages\";\n\nconst WIDE_TABLE_COLUMNS = 8;\n\nexport type DataTableColumn<T> = {\n id: string;\n header: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n subtitle?: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n value?: keyof T | ((row: T) => unknown);\n class?: string;\n headerClass?: string;\n cellClass?: string;\n /** Defaults to right for numeric values and left for everything else. */\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Keeps each value on one line, so the column is at least as wide as its\n * longest value. For dates, times, numbers, amounts, and short codes.\n * Defaults to true when the column's first value is a number or date. The\n * default cell wrapper already keeps every value on one line; this option\n * decides wrapping for content under a custom `cellContentClass`, and a\n * `white-space` that class sets itself wins.\n */\n nowrap?: boolean;\n /**\n * Marks the column sortable. Pass a string when the server's sort key\n * differs from the column id — they often do, because one column can show a\n * rate while another sorts by the absolute count behind it.\n */\n sortable?: boolean | string;\n};\n\nexport type DataTableSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport type DataTableRenderCell<T> = (ctx: {\n row: T;\n col: DataTableColumn<T>;\n value: unknown;\n render: (value: unknown) => JSX.Element;\n}) => JSX.Element;\n\nexport type DataTableRenderHeader<T> = (ctx: { col: DataTableColumn<T>; render: () => JSX.Element }) => JSX.Element;\n\nexport type DataTableFooter<T> = {\n values?: Record<string, unknown>;\n renderCell?: (ctx: { col: DataTableColumn<T>; value: unknown; render: (value: unknown) => JSX.Element }) => JSX.Element;\n};\n\nexport type DataTableProps<T> = {\n rows: readonly T[];\n columns: readonly DataTableColumn<T>[];\n /** Accessible name for a standalone table region. Defaults to \"Data table\". */\n ariaLabel?: string;\n /** ID of a visible heading that labels the table region. Takes precedence over ariaLabel. */\n ariaLabelledBy?: string;\n getRowId?: (row: T) => string;\n /** Current server-side ordering, or null when the default applies. */\n sort?: DataTableSort | null;\n /**\n * Link target for a sortable header. Link-based because every admin table is\n * server-rendered: sorting is a query change, not client state.\n */\n sortHref?: (next: DataTableSort) => string;\n /**\n * Sorts on the client instead: sortable headers become buttons that report the\n * next order, with the same look and order of directions as `sortHref`.\n */\n onSortChange?: (next: DataTableSort) => void;\n selectedRowId?: string | null;\n /** Optional multi-selection shared with another collection view. Requires getRowId. */\n selection?: CollectionSelection;\n rowClass?: string | ((row: T) => string | undefined);\n hoverRows?: boolean;\n onRowClick?: (row: T) => void;\n onRowDoubleClick?: (row: T) => void;\n onRowContextMenu?: (row: T) => void;\n renderCell?: DataTableRenderCell<T>;\n renderHeader?: DataTableRenderHeader<T>;\n footer?: DataTableFooter<T>;\n hasMore?: boolean;\n loadingMore?: boolean;\n loading?: boolean;\n /** Initial placeholder count, clamped to an integer from 1 to 50. Defaults to 5. */\n loadingRows?: number;\n onLoadMore?: () => void;\n empty?: JSX.Element;\n density?: \"compact\" | \"normal\";\n stickyHeader?: boolean;\n highlightColumns?: boolean;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n cellContentClass?: string;\n fillHeight?: boolean;\n /** Visual frame for a standalone table. Defaults preserve the legacy class-based behavior. */\n surface?: \"paper\" | \"plain\";\n class?: string;\n /** Additional classes for the table element. Core table geometry is always retained. */\n tableClass?: string;\n /** Additional classes for the scrolling region, such as `k2b-detail-trail`. */\n scrollClass?: string;\n scrollPreserveKey?: string | false;\n};\n\nexport type DataTablePanelProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTableHeaderProps = {\n title: string;\n subtitle?: string;\n children?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\";\n class?: string;\n};\n\nexport type DataTableControlsProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTablePanelFooterProps = {\n children: JSX.Element;\n class?: string;\n};\n\ntype DataTablePanelContextValue = {\n headingId: string;\n hasHeading: Accessor<boolean>;\n registerHeading: () => void;\n};\n\nconst DataTablePanelContext = createContext<DataTablePanelContextValue>();\n\nconst defaultRender = (value: unknown, locale: string, messages: ReturnType<ReturnType<typeof useUiMessages>>): JSX.Element => {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (value instanceof Date) return value.toLocaleString(locale);\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\nconst renderColumnPart = <T,>(\n part: DataTableColumn<T>[\"header\"] | DataTableColumn<T>[\"subtitle\"],\n col: DataTableColumn<T>,\n): JSX.Element => {\n if (typeof part === \"function\") return part({ col });\n return part;\n};\n\nconst rowInteractiveSelector = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"label\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]\",\n \"[role='button']\",\n \"[role='checkbox']\",\n \"[role='link']\",\n \"[role='menuitem']\",\n \"[role='option']\",\n \"[role='radio']\",\n \"[role='switch']\",\n \"[role='tab']\",\n \"[tabindex]\",\n].join(\",\");\n\nconst isNestedRowControl = (event: Event): boolean =>\n event.target instanceof Element && event.target.closest(rowInteractiveSelector) !== event.currentTarget;\n\n/** Distance in pixels before the table's end at which the next page is requested. */\nconst loadMoreMargin = 240;\n\ntype DataTableScrollbarAxis = \"x\" | \"y\";\ntype DataTableScrollbarMetrics = { overflow: boolean; offset: number; size: number };\n\nconst scrollbarMetrics = (viewportSize: number, contentSize: number, scrollOffset: number): DataTableScrollbarMetrics => {\n if (viewportSize <= 0 || contentSize <= viewportSize + 1) return { overflow: false, offset: 0, size: 0 };\n const size = Math.min(viewportSize, Math.max(24, (viewportSize * viewportSize) / contentSize));\n const offset = (scrollOffset / (contentSize - viewportSize)) * (viewportSize - size);\n return { overflow: true, offset, size };\n};\n\nfunction DataTableRoot<T>(props: DataTableProps<T>) {\n const messages = useUiMessages();\n const dataTableMessages = useDataTableMessages();\n const locale = useLocale();\n const [hoveredColumn, setHoveredColumn] = createSignal<number | null>(null);\n const [scrollbars, setScrollbars] = createSignal<Record<DataTableScrollbarAxis, DataTableScrollbarMetrics>>({\n x: { overflow: false, offset: 0, size: 0 },\n y: { overflow: false, offset: 0, size: 0 },\n });\n const [scrollbarEnhanced, setScrollbarEnhanced] = createSignal(false);\n const [scrolling, setScrolling] = createSignal(false);\n const panel = useContext(DataTablePanelContext);\n let tableRef: HTMLTableElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let loadMoreRef: HTMLDivElement | undefined;\n let scrollingTimeout: ReturnType<typeof setTimeout> | undefined;\n let scrollbarDragOffset = 0;\n let hasMore = false;\n let loadingMore = false;\n let onLoadMore: (() => void) | undefined;\n let loadMoreRequested = false;\n let previousRowsLength = props.rows.length;\n let previousLoadingMore = !!props.loadingMore;\n let previousHasMore = !!props.hasMore;\n const loadingRows = () => Math.min(50, Math.max(1, Math.trunc(Number.isNaN(props.loadingRows) ? 5 : (props.loadingRows ?? 5))));\n const rowId = (row: T) => props.getRowId?.(row);\n const isInteractive = () => !!props.selection || !!props.onRowClick || !!props.onRowDoubleClick;\n const shouldHoverRows = () => props.hoverRows ?? isInteractive();\n const shouldRenderLoadMoreSentinel = () => !!props.onLoadMore;\n const labelledBy = () => props.ariaLabelledBy ?? (panel?.hasHeading() ? panel.headingId : undefined);\n const surface = () => props.surface ?? (props.class ? \"plain\" : \"paper\");\n const cellContentClass = () => props.cellContentClass ?? \"k2b-data-table__cell-text\";\n const tableClass = () => `k2b-data-table ${props.tableClass ?? \"\"}`.trim();\n const columnHighlighted = (index: number) =>\n props.highlightColumns !== false && shouldHoverRows() && hoveredColumn() === index ? \"true\" : undefined;\n const setHoveredColumnIfEnabled = (index: number) => {\n if (shouldHoverRows()) setHoveredColumn(index);\n };\n\n /**\n * A bounded table scrolls its own viewport. A table that grows with its rows\n * leaves scrolling to the page or an ancestor, so its end is measured against\n * the browser viewport instead.\n */\n const isNearBottom = () => {\n if (!scrollRef || !loadMoreRef) return false;\n if (scrollRef.scrollHeight > scrollRef.clientHeight + 1) {\n return scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - loadMoreMargin;\n }\n return loadMoreRef.getBoundingClientRect().top <= window.innerHeight + loadMoreMargin;\n };\n\n const maybeLoadMore = () => {\n if (!hasMore || loadingMore || !onLoadMore) return;\n if (!isNearBottom()) {\n // Leaving the end re-arms a request the owner declined, for example while its first page was still loading.\n loadMoreRequested = false;\n return;\n }\n if (loadMoreRequested) return;\n loadMoreRequested = true;\n try {\n onLoadMore();\n } catch (error) {\n loadMoreRequested = false;\n throw error;\n }\n };\n\n const syncScrollbars = () => {\n if (!scrollRef) return;\n setScrollbars({\n x: scrollbarMetrics(scrollRef.clientWidth, scrollRef.scrollWidth, scrollRef.scrollLeft),\n y: scrollbarMetrics(scrollRef.clientHeight, scrollRef.scrollHeight, scrollRef.scrollTop),\n });\n };\n\n const revealScrollbars = () => {\n setScrolling(true);\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n scrollingTimeout = setTimeout(() => {\n setScrolling(false);\n scrollingTimeout = undefined;\n }, 700);\n };\n\n const onScroll = () => {\n syncScrollbars();\n revealScrollbars();\n maybeLoadMore();\n };\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (!scrollRef) return;\n const track = event.currentTarget;\n const metrics = scrollbars()[axis];\n const rect = track.getBoundingClientRect();\n const trackSize = axis === \"y\" ? rect.height : rect.width;\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n const available = Math.max(1, trackSize - metrics.size);\n const thumbOffset = Math.min(available, Math.max(0, pointerOffset - scrollbarDragOffset));\n const maxScroll = axis === \"y\" ? scrollRef.scrollHeight - scrollRef.clientHeight : scrollRef.scrollWidth - scrollRef.clientWidth;\n if (axis === \"y\") scrollRef.scrollTop = (thumbOffset / available) * maxScroll;\n else scrollRef.scrollLeft = (thumbOffset / available) * maxScroll;\n syncScrollbars();\n revealScrollbars();\n };\n\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (event.button !== 0) return;\n event.preventDefault();\n const metrics = scrollbars()[axis];\n const rect = event.currentTarget.getBoundingClientRect();\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n scrollbarDragOffset =\n event.target === event.currentTarget ? metrics.size / 2 : Math.min(metrics.size, Math.max(0, pointerOffset - metrics.offset));\n event.currentTarget.setPointerCapture(event.pointerId);\n // The track's own pointerup or pointercancel ends the hold.\n suppressTextSelection(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => {\n if (typeof col.value === \"function\") return col.value(row);\n if (col.value) return row[col.value];\n return undefined;\n };\n\n const columnPresentation = createMemo(() => {\n const presentation = new Map<string, { align: NonNullable<DataTableColumn<T>[\"align\"]>; nowrap: boolean }>();\n for (const col of props.columns) {\n let numeric = false;\n let date = false;\n if (col.align === undefined || col.nowrap === undefined) {\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n numeric = typeof value === \"number\" || typeof value === \"bigint\";\n date = value instanceof Date;\n break;\n }\n }\n presentation.set(col.id, { align: col.align ?? (numeric ? \"right\" : \"left\"), nowrap: col.nowrap ?? (numeric || date) });\n }\n return presentation;\n });\n\n /** `data-align` mirrors Cloud's `text-left/center/right` on the same cell. */\n const alignAttr = (col: DataTableColumn<T>) => {\n const align = columnPresentation().get(col.id)?.align ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const nowrapAttr = (col: DataTableColumn<T>) => (columnPresentation().get(col.id)?.nowrap ? \"true\" : undefined);\n\n const sortKeyOf = (col: DataTableColumn<T>): string | null =>\n col.sortable === true ? col.id : typeof col.sortable === \"string\" ? col.sortable : null;\n\n /**\n * Sorting is a link by default: server-rendered tables keep the order in the\n * URL. Client tables pass onSortChange instead. Clicking the active column\n * flips its direction.\n */\n const nextSortFor = (key: string): DataTableSort => ({\n key,\n direction: props.sort?.key === key && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\",\n });\n\n /** Only a sortable column carries a sort state; the rest carry none at all. */\n const ariaSortFor = (col: DataTableColumn<T>): \"ascending\" | \"descending\" | \"none\" | undefined => {\n const key = sortKeyOf(col);\n if (!key || (!props.sortHref && !props.onSortChange && !props.renderHeader)) return undefined;\n if (props.sort?.key !== key) return \"none\";\n return props.sort?.direction === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const renderHeaderDefault = (col: DataTableColumn<T>): JSX.Element => {\n const key = sortKeyOf(col);\n // Only how a column sorts decides the element. The order lives in its attributes, so a header button keeps\n // keyboard focus when a click sorts the table and the reader can press it again to reverse the order.\n const mode = createMemo(() => (!key ? null : props.sortHref ? \"link\" : props.onSortChange ? \"button\" : null));\n const active = () => key !== null && props.sort?.key === key;\n const title = () => (\n <>\n <span class=\"k2b-data-table__header-title\">{renderColumnPart(col.header, col)}</span>\n <Show when={col.subtitle !== undefined}>\n <span class=\"k2b-data-table__header-subtitle\">{renderColumnPart(col.subtitle, col)}</span>\n </Show>\n </>\n );\n const line = () => (\n <span class=\"k2b-data-table__header-line\">\n {title()}\n {/* Inactive columns keep a dimmed marker so the row reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${active() && props.sort?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={active() ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n );\n\n return (\n <Switch\n fallback={\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title()}\n </div>\n }\n >\n <Match when={mode() === \"link\"}>\n <a\n href={key ? props.sortHref?.(nextSortFor(key)) : undefined}\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n >\n {line()}\n </a>\n </Match>\n <Match when={mode() === \"button\"}>\n <button\n type=\"button\"\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n onClick={() => key && props.onSortChange?.(nextSortFor(key))}\n >\n {line()}\n </button>\n </Match>\n </Switch>\n );\n };\n\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), messages());\n const renderCellDefault = (row: T, col: DataTableColumn<T>) => renderValueDefault(valueOf(row, col));\n\n const onRowKeyDown = (event: KeyboardEvent, row: T) => {\n if (!isInteractive()) return;\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined && props.selection?.keyDown(event, id)) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n (props.selection ? props.onRowDoubleClick : (props.onRowClick ?? props.onRowDoubleClick))?.(row);\n };\n\n const onRowClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined) props.selection?.select(id, event);\n props.onRowClick?.(row);\n };\n\n const onRowDoubleClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowDoubleClick?.(row);\n };\n\n const rowClass = (row: T) => {\n if (typeof props.rowClass === \"function\") return props.rowClass(row) ?? \"\";\n return props.rowClass ?? \"\";\n };\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !loadMoreRef) return;\n // The viewport root notices the end whichever element scrolls; `isNearBottom` decides.\n const observer = new IntersectionObserver(maybeLoadMore, { rootMargin: `${loadMoreMargin}px` });\n observer.observe(loadMoreRef);\n onCleanup(() => observer.disconnect());\n });\n\n onMount(() => {\n setScrollbarEnhanced(true);\n syncScrollbars();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbars);\n if (scrollRef) observer?.observe(scrollRef);\n if (tableRef) observer?.observe(tableRef);\n onCleanup(() => {\n observer?.disconnect();\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n });\n });\n\n // Announced once per wait, outside the region that `aria-busy` keeps quiet.\n createEffect(\n on(\n () => !!props.loading && props.rows.length === 0,\n (waiting) => {\n if (waiting) announce(dataTableMessages().loadingRows);\n },\n ),\n );\n\n createEffect(() => {\n const rowsLength = props.rows.length;\n const nextHasMore = !!props.hasMore;\n const nextLoadingMore = !!props.loadingMore;\n if (rowsLength !== previousRowsLength || (previousLoadingMore && !nextLoadingMore) || (!previousHasMore && nextHasMore)) {\n loadMoreRequested = false;\n }\n previousRowsLength = rowsLength;\n previousLoadingMore = nextLoadingMore;\n previousHasMore = nextHasMore;\n hasMore = nextHasMore;\n loadingMore = nextLoadingMore;\n onLoadMore = props.onLoadMore;\n maybeLoadMore();\n queueMicrotask(syncScrollbars);\n });\n\n return (\n <Show when={props.columns.length > 0} fallback={<Placeholder surface=\"paper\" description={<>{dataTableMessages().noColumns}</>} />}>\n <Dynamic\n component={surface() === \"paper\" ? Paper : \"div\"}\n class={`k2b-table-shell ${props.class ?? \"\"}`}\n data-surface={surface()}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-overflow-x={scrollbars().x.overflow ? \"true\" : undefined}\n data-overflow-y={scrollbars().y.overflow ? \"true\" : undefined}\n data-scrollbar-enhanced={scrollbarEnhanced() ? \"true\" : undefined}\n data-scrolling={scrolling() ? \"true\" : undefined}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div\n ref={scrollRef}\n role=\"region\"\n aria-label={labelledBy() ? undefined : (props.ariaLabel ?? dataTableMessages().dataTable)}\n aria-labelledby={labelledBy()}\n aria-busy={props.loading ? \"true\" : undefined}\n tabIndex={0}\n class={`k2b-table-wrap${props.scrollClass ? ` ${props.scrollClass}` : \"\"}`}\n data-density={props.density === \"compact\" ? \"compact\" : undefined}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-surface={surface()}\n data-scroll-preserve={props.scrollPreserveKey || undefined}\n onScroll={onScroll}\n >\n <table\n ref={tableRef}\n class={tableClass()}\n data-fill={props.fillHeight ? \"true\" : undefined}\n data-wide={props.columns.length > WIDE_TABLE_COLUMNS ? \"true\" : undefined}\n >\n <Show when={props.loading}>\n {/* Names the table while it waits; the announcement goes through the shared live region outside the busy region. */}\n <caption class=\"k2b-sr-only\">{dataTableMessages().loadingRows}</caption>\n </Show>\n <thead class=\"k2b-data-table__head\" data-sticky={props.stickyHeader === false ? undefined : \"true\"}>\n <tr class=\"k2b-data-table__head-row\">\n <For each={props.columns}>\n {(col, index) => (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader ? props.renderHeader({ col, render: () => renderHeaderDefault(col) }) : renderHeaderDefault(col)}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <Show\n when={props.rows.length > 0}\n fallback={\n <Show\n when={props.loading}\n fallback={\n <tr>\n <td class=\"k2b-data-table__empty\" colspan={props.columns.length}>\n <Placeholder description={<>{props.empty ?? dataTableMessages().noRecords}</>} />\n </td>\n </tr>\n }\n >\n <For each={Array.from({ length: loadingRows() })}>\n {() => (\n <tr class=\"k2b-data-table__row\" data-loading=\"true\" aria-hidden=\"true\">\n <For each={props.columns}>\n {(col) => (\n <td data-align={alignAttr(col)}>\n <span class=\"k2b-data-table__skeleton\" />\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n {/* The spacer takes the spare height while loading too, so rows keep their height when data arrives. */}\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n }\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n return (\n <tr\n ref={(element) => {\n const key = id();\n if (key !== undefined) props.selection?.register(key, element);\n }}\n class={`k2b-data-table__row ${rowClass(row)}`}\n data-hover={shouldHoverRows() ? \"true\" : undefined}\n data-clickable={shouldHoverRows() && isInteractive() ? \"true\" : undefined}\n data-selected={isSelected() ? \"true\" : undefined}\n aria-selected={props.selection ? !!isSelected() : undefined}\n tabIndex={props.selection ? (props.selection.focused() === id() ? 0 : -1) : isInteractive() ? 0 : undefined}\n onFocus={() => {\n const key = id();\n if (key !== undefined) props.selection?.markFocused(key);\n }}\n onClick={(event) => onRowClick(event, row)}\n onDblClick={(event) => onRowDoubleClick(event, row)}\n onContextMenu={() => props.onRowContextMenu?.(row)}\n onKeyDown={(e) => onRowKeyDown(e, row)}\n >\n <For each={props.columns}>\n {(col, index) => {\n const value = () => valueOf(row, col);\n return (\n <td\n class={`${col.cellClass ?? \"\"} ${col.class ?? \"\"}`}\n data-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-valign={props.verticalAlign && props.verticalAlign !== \"middle\" ? props.verticalAlign : undefined}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n <div class={cellContentClass()}>\n {props.renderCell\n ? props.renderCell({\n row,\n col,\n value: value(),\n render: (v) => renderCellDefault(row, { ...col, value: () => v }),\n })\n : renderValueDefault(value())}\n </div>\n </td>\n );\n }}\n </For>\n </tr>\n );\n }}\n </For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n </tbody>\n <Show when={props.footer}>\n {(footer) => (\n <tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\">\n <tr class=\"k2b-data-table__foot-row\">\n <For each={props.columns}>\n {(col, index) => {\n const value = () => footer().values?.[col.id];\n return (\n <td\n class=\"k2b-data-table__footer-cell\"\n data-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: renderValueDefault })\n : renderValueDefault(value())}\n </td>\n );\n }}\n </For>\n </tr>\n </tfoot>\n )}\n </Show>\n </table>\n <Show when={shouldRenderLoadMoreSentinel()}>\n <div ref={loadMoreRef} class=\"k2b-data-table__sentinel\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={[\"y\", \"x\"] as const}>\n {(axis) => (\n <div\n class=\"k2b-data-table__scrollbar\"\n data-axis={axis}\n data-overflow={scrollbars()[axis].overflow ? \"true\" : undefined}\n aria-hidden=\"true\"\n onPointerDown={(event) => startScrollbarDrag(event, axis)}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event, axis);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-data-table-scroll-offset\": `${scrollbars()[axis].offset}px`,\n \"--k2b-data-table-scroll-size\": `${scrollbars()[axis].size}px`,\n }}\n />\n </div>\n )}\n </For>\n </Dynamic>\n </Show>\n );\n}\n\nconst DataTablePanel = (props: DataTablePanelProps): JSX.Element => {\n const headingId = `k2b-data-table-${createUniqueId()}-heading`;\n const [hasHeading, setHasHeading] = createSignal(false);\n const context: DataTablePanelContextValue = {\n headingId,\n hasHeading,\n registerHeading: () => setHasHeading(true),\n };\n\n return (\n <DataTablePanelContext.Provider value={context}>\n <Paper as=\"section\" class={`k2b-data-panel ${props.class ?? \"\"}`}>\n {props.children}\n </Paper>\n </DataTablePanelContext.Provider>\n );\n};\n\nconst DataTableHeader = (props: DataTableHeaderProps): JSX.Element => {\n const panel = useContext(DataTablePanelContext);\n panel?.registerHeading();\n\n return (\n <div class={`k2b-data-panel__header ${props.class ?? \"\"}`}>\n <PanelHeader\n title={<span id={panel?.headingId}>{props.title}</span>}\n subtitle={props.subtitle}\n actions={props.children}\n as={props.as}\n size={props.size}\n />\n </div>\n );\n};\n\nconst DataTableControls = (props: DataTableControlsProps): JSX.Element => (\n <div class={`k2b-data-panel__controls ${props.class ?? \"\"}`}>{props.children}</div>\n);\n\nconst DataTablePanelFooter = (props: DataTablePanelFooterProps): JSX.Element => (\n <footer class={`k2b-data-panel__footer ${props.class ?? \"\"}`}>{props.children}</footer>\n);\n\ntype DataTableComponent = {\n <T>(props: DataTableProps<T>): JSX.Element;\n Panel: (props: DataTablePanelProps) => JSX.Element;\n Header: (props: DataTableHeaderProps) => JSX.Element;\n Controls: (props: DataTableControlsProps) => JSX.Element;\n Footer: (props: DataTablePanelFooterProps) => JSX.Element;\n};\n\nconst DataTable = DataTableRoot as DataTableComponent;\nDataTable.Panel = DataTablePanel;\nDataTable.Header = DataTableHeader;\nDataTable.Controls = DataTableControls;\nDataTable.Footer = DataTablePanelFooter;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/DataTable.tsx"],"sourcesContent":["import {\n type Accessor,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n Match,\n on,\n onCleanup,\n onMount,\n Show,\n Switch,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { announce } from \"../feedback/announce\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport type { CollectionSelection } from \"./collection-selection\";\nimport { useDataTableMessages } from \"./data-table-messages\";\n\nexport type DataTableColumn<T> = {\n id: string;\n header: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n subtitle?: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n value?: keyof T | ((row: T) => unknown);\n class?: string;\n headerClass?: string;\n cellClass?: string;\n /** Defaults to right for numeric values and left for everything else. */\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Keeps each value on one line, so the column is at least as wide as its\n * longest value. For dates, times, numbers, amounts, and short codes.\n * Defaults to true when the column's first value is a number or date. The\n * default cell wrapper already keeps every value on one line; this option\n * decides wrapping for content under a custom `cellContentClass`, and a\n * `white-space` that class sets itself wins.\n */\n nowrap?: boolean;\n /**\n * Marks the column sortable. Pass a string when the server's sort key\n * differs from the column id — they often do, because one column can show a\n * rate while another sorts by the absolute count behind it.\n */\n sortable?: boolean | string;\n};\n\nexport type DataTableSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport type DataTableRenderCell<T> = (ctx: {\n row: T;\n col: DataTableColumn<T>;\n value: unknown;\n render: (value: unknown) => JSX.Element;\n}) => JSX.Element;\n\nexport type DataTableRenderHeader<T> = (ctx: { col: DataTableColumn<T>; render: () => JSX.Element }) => JSX.Element;\n\nexport type DataTableFooter<T> = {\n values?: Record<string, unknown>;\n renderCell?: (ctx: { col: DataTableColumn<T>; value: unknown; render: (value: unknown) => JSX.Element }) => JSX.Element;\n};\n\nexport type DataTableProps<T> = {\n rows: readonly T[];\n columns: readonly DataTableColumn<T>[];\n /** Accessible name for a standalone table region. Defaults to \"Data table\". */\n ariaLabel?: string;\n /** ID of a visible heading that labels the table region. Takes precedence over ariaLabel. */\n ariaLabelledBy?: string;\n getRowId?: (row: T) => string;\n /** Current server-side ordering, or null when the default applies. */\n sort?: DataTableSort | null;\n /**\n * Link target for a sortable header. Link-based because every admin table is\n * server-rendered: sorting is a query change, not client state.\n */\n sortHref?: (next: DataTableSort) => string;\n /**\n * Sorts on the client instead: sortable headers become buttons that report the\n * next order, with the same look and order of directions as `sortHref`.\n */\n onSortChange?: (next: DataTableSort) => void;\n selectedRowId?: string | null;\n /** Optional multi-selection shared with another collection view. Requires getRowId. */\n selection?: CollectionSelection;\n rowClass?: string | ((row: T) => string | undefined);\n hoverRows?: boolean;\n onRowClick?: (row: T) => void;\n onRowDoubleClick?: (row: T) => void;\n onRowContextMenu?: (row: T) => void;\n renderCell?: DataTableRenderCell<T>;\n renderHeader?: DataTableRenderHeader<T>;\n footer?: DataTableFooter<T>;\n hasMore?: boolean;\n loadingMore?: boolean;\n loading?: boolean;\n /** Initial placeholder count, clamped to an integer from 1 to 50. Defaults to 5. */\n loadingRows?: number;\n onLoadMore?: () => void;\n empty?: JSX.Element;\n density?: \"compact\" | \"normal\";\n stickyHeader?: boolean;\n highlightColumns?: boolean;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n cellContentClass?: string;\n fillHeight?: boolean;\n /** Visual frame for a standalone table. Defaults preserve the legacy class-based behavior. */\n surface?: \"paper\" | \"plain\";\n class?: string;\n /** Additional classes for the table element. Core table geometry is always retained. */\n tableClass?: string;\n /** Additional classes for the scrolling region, such as `k2b-detail-trail`. */\n scrollClass?: string;\n scrollPreserveKey?: string | false;\n};\n\nexport type DataTablePanelProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTableHeaderProps = {\n title: string;\n subtitle?: string;\n children?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\";\n class?: string;\n};\n\nexport type DataTableControlsProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTablePanelFooterProps = {\n children: JSX.Element;\n class?: string;\n};\n\ntype DataTablePanelContextValue = {\n headingId: string;\n hasHeading: Accessor<boolean>;\n registerHeading: () => void;\n};\n\nconst DataTablePanelContext = createContext<DataTablePanelContextValue>();\n\nconst defaultRender = (value: unknown, locale: string, messages: ReturnType<ReturnType<typeof useUiMessages>>): JSX.Element => {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (value instanceof Date) return value.toLocaleString(locale);\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\nconst renderColumnPart = <T,>(\n part: DataTableColumn<T>[\"header\"] | DataTableColumn<T>[\"subtitle\"],\n col: DataTableColumn<T>,\n): JSX.Element => {\n if (typeof part === \"function\") return part({ col });\n return part;\n};\n\nconst rowInteractiveSelector = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"label\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]\",\n \"[role='button']\",\n \"[role='checkbox']\",\n \"[role='link']\",\n \"[role='menuitem']\",\n \"[role='option']\",\n \"[role='radio']\",\n \"[role='switch']\",\n \"[role='tab']\",\n \"[tabindex]\",\n].join(\",\");\n\nconst isNestedRowControl = (event: Event): boolean =>\n event.target instanceof Element && event.target.closest(rowInteractiveSelector) !== event.currentTarget;\n\n/** Distance in pixels before the table's end at which the next page is requested. */\nconst loadMoreMargin = 240;\n\ntype DataTableScrollbarAxis = \"x\" | \"y\";\ntype DataTableScrollbarMetrics = { overflow: boolean; offset: number; size: number };\n\nconst scrollbarMetrics = (viewportSize: number, contentSize: number, scrollOffset: number): DataTableScrollbarMetrics => {\n if (viewportSize <= 0 || contentSize <= viewportSize + 1) return { overflow: false, offset: 0, size: 0 };\n const size = Math.min(viewportSize, Math.max(24, (viewportSize * viewportSize) / contentSize));\n const offset = (scrollOffset / (contentSize - viewportSize)) * (viewportSize - size);\n return { overflow: true, offset, size };\n};\n\nfunction DataTableRoot<T>(props: DataTableProps<T>) {\n const messages = useUiMessages();\n const dataTableMessages = useDataTableMessages();\n const locale = useLocale();\n const [hoveredColumn, setHoveredColumn] = createSignal<number | null>(null);\n const [scrollbars, setScrollbars] = createSignal<Record<DataTableScrollbarAxis, DataTableScrollbarMetrics>>({\n x: { overflow: false, offset: 0, size: 0 },\n y: { overflow: false, offset: 0, size: 0 },\n });\n const [scrollbarEnhanced, setScrollbarEnhanced] = createSignal(false);\n const [scrolling, setScrolling] = createSignal(false);\n const panel = useContext(DataTablePanelContext);\n let tableRef: HTMLTableElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let loadMoreRef: HTMLDivElement | undefined;\n let scrollingTimeout: ReturnType<typeof setTimeout> | undefined;\n let scrollbarDragOffset = 0;\n let hasMore = false;\n let loadingMore = false;\n let onLoadMore: (() => void) | undefined;\n let loadMoreRequested = false;\n let previousRowsLength = props.rows.length;\n let previousLoadingMore = !!props.loadingMore;\n let previousHasMore = !!props.hasMore;\n const loadingRows = () => Math.min(50, Math.max(1, Math.trunc(Number.isNaN(props.loadingRows) ? 5 : (props.loadingRows ?? 5))));\n const rowId = (row: T) => props.getRowId?.(row);\n const isInteractive = () => !!props.selection || !!props.onRowClick || !!props.onRowDoubleClick;\n const shouldHoverRows = () => props.hoverRows ?? isInteractive();\n const shouldRenderLoadMoreSentinel = () => !!props.onLoadMore;\n const labelledBy = () => props.ariaLabelledBy ?? (panel?.hasHeading() ? panel.headingId : undefined);\n const surface = () => props.surface ?? (props.class ? \"plain\" : \"paper\");\n const cellContentClass = () => props.cellContentClass ?? \"k2b-data-table__cell-text\";\n const tableClass = () => `k2b-data-table ${props.tableClass ?? \"\"}`.trim();\n const columnHighlighted = (index: number) =>\n props.highlightColumns !== false && shouldHoverRows() && hoveredColumn() === index ? \"true\" : undefined;\n const setHoveredColumnIfEnabled = (index: number) => {\n if (shouldHoverRows()) setHoveredColumn(index);\n };\n\n /**\n * A bounded table scrolls its own viewport. A table that grows with its rows\n * leaves scrolling to the page or an ancestor, so its end is measured against\n * the browser viewport instead.\n */\n const isNearBottom = () => {\n if (!scrollRef || !loadMoreRef) return false;\n if (scrollRef.scrollHeight > scrollRef.clientHeight + 1) {\n return scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - loadMoreMargin;\n }\n return loadMoreRef.getBoundingClientRect().top <= window.innerHeight + loadMoreMargin;\n };\n\n const maybeLoadMore = () => {\n if (!hasMore || loadingMore || !onLoadMore) return;\n if (!isNearBottom()) {\n // Leaving the end re-arms a request the owner declined, for example while its first page was still loading.\n loadMoreRequested = false;\n return;\n }\n if (loadMoreRequested) return;\n loadMoreRequested = true;\n try {\n onLoadMore();\n } catch (error) {\n loadMoreRequested = false;\n throw error;\n }\n };\n\n const syncScrollbars = () => {\n if (!scrollRef) return;\n setScrollbars({\n x: scrollbarMetrics(scrollRef.clientWidth, scrollRef.scrollWidth, scrollRef.scrollLeft),\n y: scrollbarMetrics(scrollRef.clientHeight, scrollRef.scrollHeight, scrollRef.scrollTop),\n });\n };\n\n const revealScrollbars = () => {\n setScrolling(true);\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n scrollingTimeout = setTimeout(() => {\n setScrolling(false);\n scrollingTimeout = undefined;\n }, 700);\n };\n\n const onScroll = () => {\n syncScrollbars();\n revealScrollbars();\n maybeLoadMore();\n };\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (!scrollRef) return;\n const track = event.currentTarget;\n const metrics = scrollbars()[axis];\n const rect = track.getBoundingClientRect();\n const trackSize = axis === \"y\" ? rect.height : rect.width;\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n const available = Math.max(1, trackSize - metrics.size);\n const thumbOffset = Math.min(available, Math.max(0, pointerOffset - scrollbarDragOffset));\n const maxScroll = axis === \"y\" ? scrollRef.scrollHeight - scrollRef.clientHeight : scrollRef.scrollWidth - scrollRef.clientWidth;\n if (axis === \"y\") scrollRef.scrollTop = (thumbOffset / available) * maxScroll;\n else scrollRef.scrollLeft = (thumbOffset / available) * maxScroll;\n syncScrollbars();\n revealScrollbars();\n };\n\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (event.button !== 0) return;\n event.preventDefault();\n const metrics = scrollbars()[axis];\n const rect = event.currentTarget.getBoundingClientRect();\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n scrollbarDragOffset =\n event.target === event.currentTarget ? metrics.size / 2 : Math.min(metrics.size, Math.max(0, pointerOffset - metrics.offset));\n event.currentTarget.setPointerCapture(event.pointerId);\n // The track's own pointerup or pointercancel ends the hold.\n suppressTextSelection(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => {\n if (typeof col.value === \"function\") return col.value(row);\n if (col.value) return row[col.value];\n return undefined;\n };\n\n const columnPresentation = createMemo(() => {\n const presentation = new Map<string, { align: NonNullable<DataTableColumn<T>[\"align\"]>; nowrap: boolean }>();\n for (const col of props.columns) {\n let numeric = false;\n let date = false;\n if (col.align === undefined || col.nowrap === undefined) {\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n numeric = typeof value === \"number\" || typeof value === \"bigint\";\n date = value instanceof Date;\n break;\n }\n }\n presentation.set(col.id, { align: col.align ?? (numeric ? \"right\" : \"left\"), nowrap: col.nowrap ?? (numeric || date) });\n }\n return presentation;\n });\n\n /** `data-align` mirrors Cloud's `text-left/center/right` on the same cell. */\n const alignAttr = (col: DataTableColumn<T>) => {\n const align = columnPresentation().get(col.id)?.align ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const nowrapAttr = (col: DataTableColumn<T>) => (columnPresentation().get(col.id)?.nowrap ? \"true\" : undefined);\n\n const sortKeyOf = (col: DataTableColumn<T>): string | null =>\n col.sortable === true ? col.id : typeof col.sortable === \"string\" ? col.sortable : null;\n\n /**\n * Sorting is a link by default: server-rendered tables keep the order in the\n * URL. Client tables pass onSortChange instead. Clicking the active column\n * flips its direction.\n */\n const nextSortFor = (key: string): DataTableSort => ({\n key,\n direction: props.sort?.key === key && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\",\n });\n\n /** Only a sortable column carries a sort state; the rest carry none at all. */\n const ariaSortFor = (col: DataTableColumn<T>): \"ascending\" | \"descending\" | \"none\" | undefined => {\n const key = sortKeyOf(col);\n if (!key || (!props.sortHref && !props.onSortChange && !props.renderHeader)) return undefined;\n if (props.sort?.key !== key) return \"none\";\n return props.sort?.direction === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const renderHeaderDefault = (col: DataTableColumn<T>): JSX.Element => {\n const key = sortKeyOf(col);\n // Only how a column sorts decides the element. The order lives in its attributes, so a header button keeps\n // keyboard focus when a click sorts the table and the reader can press it again to reverse the order.\n const mode = createMemo(() => (!key ? null : props.sortHref ? \"link\" : props.onSortChange ? \"button\" : null));\n const active = () => key !== null && props.sort?.key === key;\n const title = () => (\n <>\n <span class=\"k2b-data-table__header-title\">{renderColumnPart(col.header, col)}</span>\n <Show when={col.subtitle !== undefined}>\n <span class=\"k2b-data-table__header-subtitle\">{renderColumnPart(col.subtitle, col)}</span>\n </Show>\n </>\n );\n const line = () => (\n <span class=\"k2b-data-table__header-line\">\n {title()}\n {/* Inactive columns keep a dimmed marker so the row reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${active() && props.sort?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={active() ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n );\n\n return (\n <Switch\n fallback={\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title()}\n </div>\n }\n >\n <Match when={mode() === \"link\"}>\n <a\n href={key ? props.sortHref?.(nextSortFor(key)) : undefined}\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n >\n {line()}\n </a>\n </Match>\n <Match when={mode() === \"button\"}>\n <button\n type=\"button\"\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n onClick={() => key && props.onSortChange?.(nextSortFor(key))}\n >\n {line()}\n </button>\n </Match>\n </Switch>\n );\n };\n\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), messages());\n const renderCellDefault = (row: T, col: DataTableColumn<T>) => renderValueDefault(valueOf(row, col));\n\n const onRowKeyDown = (event: KeyboardEvent, row: T) => {\n if (!isInteractive()) return;\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined && props.selection?.keyDown(event, id)) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n (props.selection ? props.onRowDoubleClick : (props.onRowClick ?? props.onRowDoubleClick))?.(row);\n };\n\n const onRowClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined) props.selection?.select(id, event);\n props.onRowClick?.(row);\n };\n\n const onRowDoubleClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowDoubleClick?.(row);\n };\n\n const rowClass = (row: T) => {\n if (typeof props.rowClass === \"function\") return props.rowClass(row) ?? \"\";\n return props.rowClass ?? \"\";\n };\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !loadMoreRef) return;\n // The viewport root notices the end whichever element scrolls; `isNearBottom` decides.\n const observer = new IntersectionObserver(maybeLoadMore, { rootMargin: `${loadMoreMargin}px` });\n observer.observe(loadMoreRef);\n onCleanup(() => observer.disconnect());\n });\n\n onMount(() => {\n setScrollbarEnhanced(true);\n syncScrollbars();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbars);\n if (scrollRef) observer?.observe(scrollRef);\n if (tableRef) observer?.observe(tableRef);\n onCleanup(() => {\n observer?.disconnect();\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n });\n });\n\n // Announced once per wait, outside the region that `aria-busy` keeps quiet.\n createEffect(\n on(\n () => !!props.loading && props.rows.length === 0,\n (waiting) => {\n if (waiting) announce(dataTableMessages().loadingRows);\n },\n ),\n );\n\n createEffect(() => {\n const rowsLength = props.rows.length;\n const nextHasMore = !!props.hasMore;\n const nextLoadingMore = !!props.loadingMore;\n if (rowsLength !== previousRowsLength || (previousLoadingMore && !nextLoadingMore) || (!previousHasMore && nextHasMore)) {\n loadMoreRequested = false;\n }\n previousRowsLength = rowsLength;\n previousLoadingMore = nextLoadingMore;\n previousHasMore = nextHasMore;\n hasMore = nextHasMore;\n loadingMore = nextLoadingMore;\n onLoadMore = props.onLoadMore;\n maybeLoadMore();\n queueMicrotask(syncScrollbars);\n });\n\n return (\n <Show when={props.columns.length > 0} fallback={<Placeholder surface=\"paper\" description={<>{dataTableMessages().noColumns}</>} />}>\n <Dynamic\n component={surface() === \"paper\" ? Paper : \"div\"}\n class={`k2b-table-shell ${props.class ?? \"\"}`}\n data-surface={surface()}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-overflow-x={scrollbars().x.overflow ? \"true\" : undefined}\n data-overflow-y={scrollbars().y.overflow ? \"true\" : undefined}\n data-scrollbar-enhanced={scrollbarEnhanced() ? \"true\" : undefined}\n data-scrolling={scrolling() ? \"true\" : undefined}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div\n ref={scrollRef}\n role=\"region\"\n aria-label={labelledBy() ? undefined : (props.ariaLabel ?? dataTableMessages().dataTable)}\n aria-labelledby={labelledBy()}\n aria-busy={props.loading ? \"true\" : undefined}\n tabIndex={0}\n class={`k2b-table-wrap${props.scrollClass ? ` ${props.scrollClass}` : \"\"}`}\n data-density={props.density === \"compact\" ? \"compact\" : undefined}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-surface={surface()}\n data-scroll-preserve={props.scrollPreserveKey || undefined}\n onScroll={onScroll}\n >\n <table ref={tableRef} class={tableClass()} data-fill={props.fillHeight ? \"true\" : undefined}>\n <Show when={props.loading}>\n {/* Names the table while it waits; the announcement goes through the shared live region outside the busy region. */}\n <caption class=\"k2b-sr-only\">{dataTableMessages().loadingRows}</caption>\n </Show>\n <thead class=\"k2b-data-table__head\" data-sticky={props.stickyHeader === false ? undefined : \"true\"}>\n <tr class=\"k2b-data-table__head-row\">\n <For each={props.columns}>\n {(col, index) => (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader ? props.renderHeader({ col, render: () => renderHeaderDefault(col) }) : renderHeaderDefault(col)}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <Show\n when={props.rows.length > 0}\n fallback={\n <Show\n when={props.loading}\n fallback={\n <tr>\n <td class=\"k2b-data-table__empty\" colspan={props.columns.length}>\n <Placeholder description={<>{props.empty ?? dataTableMessages().noRecords}</>} />\n </td>\n </tr>\n }\n >\n <For each={Array.from({ length: loadingRows() })}>\n {() => (\n <tr class=\"k2b-data-table__row\" data-loading=\"true\" aria-hidden=\"true\">\n <For each={props.columns}>\n {(col) => (\n <td data-align={alignAttr(col)}>\n <span class=\"k2b-data-table__skeleton\" />\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n {/* The spacer takes the spare height while loading too, so rows keep their height when data arrives. */}\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n }\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n return (\n <tr\n ref={(element) => {\n const key = id();\n if (key !== undefined) props.selection?.register(key, element);\n }}\n class={`k2b-data-table__row ${rowClass(row)}`}\n data-hover={shouldHoverRows() ? \"true\" : undefined}\n data-clickable={shouldHoverRows() && isInteractive() ? \"true\" : undefined}\n data-selected={isSelected() ? \"true\" : undefined}\n aria-selected={props.selection ? !!isSelected() : undefined}\n tabIndex={props.selection ? (props.selection.focused() === id() ? 0 : -1) : isInteractive() ? 0 : undefined}\n onFocus={() => {\n const key = id();\n if (key !== undefined) props.selection?.markFocused(key);\n }}\n onClick={(event) => onRowClick(event, row)}\n onDblClick={(event) => onRowDoubleClick(event, row)}\n onContextMenu={() => props.onRowContextMenu?.(row)}\n onKeyDown={(e) => onRowKeyDown(e, row)}\n >\n <For each={props.columns}>\n {(col, index) => {\n const value = () => valueOf(row, col);\n return (\n <td\n class={`${col.cellClass ?? \"\"} ${col.class ?? \"\"}`}\n data-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-valign={props.verticalAlign && props.verticalAlign !== \"middle\" ? props.verticalAlign : undefined}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n <div class={cellContentClass()}>\n {props.renderCell\n ? props.renderCell({\n row,\n col,\n value: value(),\n render: (v) => renderCellDefault(row, { ...col, value: () => v }),\n })\n : renderValueDefault(value())}\n </div>\n </td>\n );\n }}\n </For>\n </tr>\n );\n }}\n </For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n </tbody>\n <Show when={props.footer}>\n {(footer) => (\n <tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\">\n <tr class=\"k2b-data-table__foot-row\">\n <For each={props.columns}>\n {(col, index) => {\n const value = () => footer().values?.[col.id];\n return (\n <td\n class=\"k2b-data-table__footer-cell\"\n data-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: renderValueDefault })\n : renderValueDefault(value())}\n </td>\n );\n }}\n </For>\n </tr>\n </tfoot>\n )}\n </Show>\n </table>\n <Show when={shouldRenderLoadMoreSentinel()}>\n <div ref={loadMoreRef} class=\"k2b-data-table__sentinel\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={[\"y\", \"x\"] as const}>\n {(axis) => (\n <div\n class=\"k2b-data-table__scrollbar\"\n data-axis={axis}\n data-overflow={scrollbars()[axis].overflow ? \"true\" : undefined}\n aria-hidden=\"true\"\n onPointerDown={(event) => startScrollbarDrag(event, axis)}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event, axis);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-data-table-scroll-offset\": `${scrollbars()[axis].offset}px`,\n \"--k2b-data-table-scroll-size\": `${scrollbars()[axis].size}px`,\n }}\n />\n </div>\n )}\n </For>\n </Dynamic>\n </Show>\n );\n}\n\nconst DataTablePanel = (props: DataTablePanelProps): JSX.Element => {\n const headingId = `k2b-data-table-${createUniqueId()}-heading`;\n const [hasHeading, setHasHeading] = createSignal(false);\n const context: DataTablePanelContextValue = {\n headingId,\n hasHeading,\n registerHeading: () => setHasHeading(true),\n };\n\n return (\n <DataTablePanelContext.Provider value={context}>\n <Paper as=\"section\" class={`k2b-data-panel ${props.class ?? \"\"}`}>\n {props.children}\n </Paper>\n </DataTablePanelContext.Provider>\n );\n};\n\nconst DataTableHeader = (props: DataTableHeaderProps): JSX.Element => {\n const panel = useContext(DataTablePanelContext);\n panel?.registerHeading();\n\n return (\n <div class={`k2b-data-panel__header ${props.class ?? \"\"}`}>\n <PanelHeader\n title={<span id={panel?.headingId}>{props.title}</span>}\n subtitle={props.subtitle}\n actions={props.children}\n as={props.as}\n size={props.size}\n />\n </div>\n );\n};\n\nconst DataTableControls = (props: DataTableControlsProps): JSX.Element => (\n <div class={`k2b-data-panel__controls ${props.class ?? \"\"}`}>{props.children}</div>\n);\n\nconst DataTablePanelFooter = (props: DataTablePanelFooterProps): JSX.Element => (\n <footer class={`k2b-data-panel__footer ${props.class ?? \"\"}`}>{props.children}</footer>\n);\n\ntype DataTableComponent = {\n <T>(props: DataTableProps<T>): JSX.Element;\n Panel: (props: DataTablePanelProps) => JSX.Element;\n Header: (props: DataTableHeaderProps) => JSX.Element;\n Controls: (props: DataTableControlsProps) => JSX.Element;\n Footer: (props: DataTablePanelFooterProps) => JSX.Element;\n};\n\nconst DataTable = DataTableRoot as DataTableComponent;\nDataTable.Panel = DataTablePanel;\nDataTable.Header = DataTableHeader;\nDataTable.Controls = DataTableControls;\nDataTable.Footer = DataTablePanelFooter;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -35,7 +35,11 @@ const applyAccessibleName = (dialog, entry) => {
|
|
|
35
35
|
dialog.removeAttribute("aria-label");
|
|
36
36
|
dialog.removeAttribute("aria-labelledby");
|
|
37
37
|
dialog.removeAttribute("aria-describedby");
|
|
38
|
-
|
|
38
|
+
// A toned dialog names its tone in a hidden word that describes the dialog, so its heading keeps the title alone.
|
|
39
|
+
const tone = entry.container.querySelector("[data-dialog-tone-label]");
|
|
40
|
+
if (tone) tone.id ||= `k2b-dialog-tone-${++nextDialogTitleId}`;
|
|
41
|
+
const describedBy = [entry.ariaDescribedBy, tone?.id].filter(Boolean).join(" ");
|
|
42
|
+
if (describedBy) dialog.setAttribute("aria-describedby", describedBy);
|
|
39
43
|
if (entry.ariaLabel) {
|
|
40
44
|
dialog.setAttribute("aria-label", entry.ariaLabel);
|
|
41
45
|
return;
|
|
@@ -1 +1 @@
|
|
|
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 ariaDescribedBy?: string;\n /** Use for a consequential confirmation that requires a response. Defaults to dialog. */\n role?: \"dialog\" | \"alertdialog\";\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. Normally closing the dialog removes the entry again; the returned promise settles after that.\n * With the Navigation API, same-URL traversals between this core's entries and the page do not reach application popstate listeners.\n * Without it, only the synthetic Back on close is suppressed.\n * Island disposal closes every open dialog immediately and forgets its marker without traversing history.\n * The same-URL entry remains for the router to replace and counts as a page entry for later dialogs.\n * A traversal that `@k2b/ssr/nav` hides from popstate listeners reaches this core through `ssr:nav-popstate`.\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 ariaDescribedBy?: string;\n role: \"dialog\" | \"alertdialog\";\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;\nlet nextHistoryId = 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];\nconst historySnapshot = () => ({ href: location.href, length: history.length });\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.setAttribute(\"role\", entry.role);\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n dialog.removeAttribute(\"aria-describedby\");\n if (entry.ariaDescribedBy) dialog.setAttribute(\"aria-describedby\", entry.ariaDescribedBy);\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\n/** Checked by shape: a test harness or an iframe may create the event in another realm. */\nconst isPopState = (value: unknown): value is PopStateEvent =>\n typeof value === \"object\" && value !== null && \"type\" in value && value.type === \"popstate\" && \"state\" in value;\n\ntype HistoryEntry = { historyId?: number };\ntype HistoryHolder = HistoryEntry & { onBack: () => void };\n\nexport const createDialogCore = () => {\n const state: DialogState = { stack: [] };\n /** Markers of this core's entries in the browser history, oldest first. */\n let historyIds: number[] = [];\n const issued = new Set<number>();\n /**\n * Markers forgotten during island disposal. Their entries stay in `historyIds` as barriers: a synthetic Back never\n * crosses one, because the router may have replaced that entry with another page.\n */\n const forgotten = new Set<number>();\n const deadMarker = (marker: unknown): marker is number => typeof marker === \"number\" && forgotten.has(marker);\n /** How often islands were disposed, so a dialog that waits to open notices that a content swap happened meanwhile. */\n let disposals = 0;\n const ownMarker = (marker: unknown): marker is number => typeof marker === \"number\" && issued.has(marker);\n let seen: ReturnType<typeof historySnapshot> | undefined;\n let traversalFrom: { href: string; marker: unknown } | undefined;\n let syntheticFrom: { href: string; marker: unknown } | undefined;\n const historyHolders = new Set<HistoryHolder>();\n let historySyncScheduled = false;\n let disposingIslands = false;\n /** Settles when the synthetic Back that removes closed dialogs' entries has arrived. */\n let returning: Promise<void> | undefined;\n let resolveReturning: (() => void) | undefined;\n\n /** Outside island disposal, closed entries leave with one Back to the newest live dialog or holder, or to the page. */\n const syncHistory = () => {\n if (returning) {\n void returning.then(() => {\n if (historySyncScheduled) syncHistory();\n });\n return;\n }\n historySyncScheduled = false;\n const openIds = new Set([...state.stack, ...historyHolders].map((entry) => entry.historyId));\n const current = historyIds.at(-1);\n let steps = 0;\n while (historyIds.length > 0 && !openIds.has(historyIds.at(-1)) && !deadMarker(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 || location.href !== seen?.href || history.length !== seen?.length) return;\n const back = new Promise<void>((resolve) => {\n resolveReturning = resolve;\n });\n returning = back;\n void back.then(() => {\n if (returning === back) returning = undefined;\n });\n syntheticFrom = { href: location.href, marker: current };\n history.go(-steps);\n };\n\n const releaseHistory = (entry: HistoryEntry) => {\n if (entry.historyId === undefined) return;\n // During a content swap the router owns history. Forget the marker without moving history; its entry stays a\n // barrier for later synthetic Backs and is left for the router to replace.\n if (disposingIslands) {\n issued.delete(entry.historyId);\n forgotten.add(entry.historyId);\n entry.historyId = undefined;\n return;\n }\n if (historySyncScheduled) return;\n historySyncScheduled = true;\n queueMicrotask(syncHistory);\n };\n\n /** Traversals this core already handled: a page swap router also reports the ones it hides from listeners. */\n const handled = new WeakSet<PopStateEvent>();\n /** Back or Forward moved to another entry: close dialogs and holders opened after the one it shows. */\n const onPopState = (event: PopStateEvent) => {\n if (handled.has(event)) return;\n handled.add(event);\n const resolveBack = resolveReturning;\n // Without the Navigation API, only our synthetic Back has a known departure.\n const from = typeof navigation !== \"undefined\" ? traversalFrom : resolveBack ? syntheticFrom : undefined;\n traversalFrom = undefined;\n syntheticFrom = undefined;\n resolveReturning = undefined;\n try {\n const marker = historyMarker();\n if (from && from.href === location.href && from.marker !== marker && (ownMarker(from.marker) || ownMarker(marker))) {\n event.stopImmediatePropagation();\n }\n // Own entries are ordered by id. A retired entry reached by Forward stays tracked, so closing the dialogs\n // beneath it also removes it. A forgotten entry keeps the holders opened before it and stays a barrier.\n historyIds = ownMarker(marker) || deadMarker(marker) ? [...historyIds.filter((id) => id < marker), marker] : [];\n const gone = (entry: DialogStackEntry) => entry.historyId !== undefined && !historyIds.includes(entry.historyId);\n while (state.stack.some(gone)) popTop(undefined);\n for (const holder of [...historyHolders].reverse()) {\n if (holder.historyId === undefined || historyIds.includes(holder.historyId)) continue;\n historyHolders.delete(holder);\n releaseHistory(holder);\n holder.onBack();\n }\n } finally {\n seen = historySnapshot();\n resolveBack?.();\n }\n };\n\n /**\n * Island disposal means the page content changes, as a document load would. Every dialog closes, top first, whichever\n * code opened it: which island calls open() is not knowable after an await, in onMount or from a timer, and a modal\n * left over the new content would block it.\n */\n const onIslandDispose = () => {\n if (!disposingIslands) {\n disposingIslands = true;\n queueMicrotask(() => {\n disposingIslands = false;\n });\n // Entries released just before, whose Back has not started yet, stay as well: the router owns history now.\n // A Back already on its way still settles through `returning`.\n historySyncScheduled = false;\n const live = new Set([...state.stack, ...historyHolders].map((entry) => entry.historyId));\n for (const id of historyIds) {\n if (live.has(id) || !issued.delete(id)) continue;\n forgotten.add(id);\n }\n }\n disposals++;\n while (state.stack.length > 0) popTop(undefined);\n };\n\n /** `@k2b/ssr/nav` stops a traversal to another server page before later listeners and reports it here. */\n const onHiddenPopState = (event: Event) => {\n const detail: unknown = \"detail\" in event ? event.detail : undefined;\n if (isPopState(detail)) onPopState(detail);\n };\n const onNavigate = (event: NavigateEvent) => {\n if (event.navigationType === \"traverse\") traversalFrom = { href: location.href, marker: historyMarker() };\n };\n /** The window whose history this core listens to; a test harness may replace the window between dialogs. */\n let listening: { window: Window; navigation?: Navigation } | undefined;\n const listen = () => {\n if (listening?.window === window) return;\n listening?.window.removeEventListener(\"popstate\", onPopState, { capture: true });\n listening?.window.removeEventListener(\"ssr:nav-popstate\", onHiddenPopState, { capture: true });\n listening?.window.removeEventListener(\"ssr:island-dispose\", onIslandDispose, { capture: true });\n listening?.navigation?.removeEventListener(\"navigate\", onNavigate);\n window.addEventListener(\"popstate\", onPopState, { capture: true });\n window.addEventListener(\"ssr:nav-popstate\", onHiddenPopState, { capture: true });\n // Capture opens the disposal window before target listeners can release history holders.\n window.addEventListener(\"ssr:island-dispose\", onIslandDispose, { capture: true });\n const current = typeof navigation !== \"undefined\" ? navigation : undefined;\n current?.addEventListener(\"navigate\", onNavigate);\n listening = { window, navigation: current };\n };\n // Chromium runs a window's popstate listeners in the order they were added, capture or not. The shared core is\n // created before islands mount and add their navigation listeners, so it listens from the start.\n if (typeof window !== \"undefined\") listen();\n\n const pushHistory = (entry: HistoryEntry) => {\n listen();\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 issued.add(entry.historyId);\n historyIds.push(entry.historyId);\n history.pushState({ ...previous, [HISTORY_MARKER]: entry.historyId }, \"\");\n seen = historySnapshot();\n };\n\n /** Internal non-dialog participation in the same history stack. Releasing never calls onBack. */\n const holdHistory = (onBack: () => void): (() => void) => {\n const holder: HistoryHolder = { onBack };\n historyHolders.add(holder);\n const pushWhenReady = () => {\n if (!historyHolders.has(holder)) return;\n // Just like open(): remove closed entries before adding another one.\n if (historySyncScheduled) syncHistory();\n if (returning) void returning.then(pushWhenReady);\n else pushHistory(holder);\n };\n pushWhenReady();\n return () => {\n if (!historyHolders.delete(holder)) return;\n releaseHistory(holder);\n };\n };\n\n /**\n * Settles once released entries have left history or were forgotten during island disposal. A caller that navigates waits\n * for it, as a dialog's result waits: a Back still on its way would otherwise land behind the new entry.\n */\n const historySettled = async (): Promise<void> => {\n while (historySyncScheduled || returning) {\n if (!returning) syncHistory();\n if (returning) await returning;\n }\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 dialog.removeAttribute(\"aria-describedby\");\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 return openAfter(view, options, disposals);\n };\n\n const openAfter = <T>(view: DialogRender<T>, options: OpenDialogOptions, requested: number): 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(() => openAfter(view, options, requested));\n }\n // A dialog that waited for history while islands were disposed would open over content it was never meant for.\n if (disposals !== requested) return Promise.resolve(undefined);\n const dialog = ensureDialogElement();\n listen();\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 ariaDescribedBy: options.ariaDescribedBy,\n role: options.role ?? \"dialog\",\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 (!options.history) {\n resolve(value as T | undefined);\n return;\n }\n // After every pending history sync, so a caller that navigates or opens the next dialog finds the history settled.\n // This holds for a marker forgotten during island disposal too, while an earlier synthetic Back is on its way.\n queueMicrotask(() => void historySettled().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 holdHistory,\n historySettled,\n };\n};\n\nconst { holdHistory, historySettled, ...publicDialogCore } = createDialogCore();\nexport const dialogCore: DialogCore = publicDialogCore;\n\n/**\n * Internal: transient UI shares dialogs' Back handling without exposing another public dialog capability.\n * Same-URL traversals are suppressed with the Navigation API; without it, only the synthetic Back on release is suppressed.\n * Release during island disposal forgets the marker without traversing; the router may replace the remaining entry.\n */\nexport const holdDialogHistory = holdHistory;\n/** Internal: waits until released holders have left history or were forgotten during island disposal. */\nexport const dialogHistorySettled = historySettled;\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 ariaDescribedBy?: string;\n /** Use for a consequential confirmation that requires a response. Defaults to dialog. */\n role?: \"dialog\" | \"alertdialog\";\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. Normally closing the dialog removes the entry again; the returned promise settles after that.\n * With the Navigation API, same-URL traversals between this core's entries and the page do not reach application popstate listeners.\n * Without it, only the synthetic Back on close is suppressed.\n * Island disposal closes every open dialog immediately and forgets its marker without traversing history.\n * The same-URL entry remains for the router to replace and counts as a page entry for later dialogs.\n * A traversal that `@k2b/ssr/nav` hides from popstate listeners reaches this core through `ssr:nav-popstate`.\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 ariaDescribedBy?: string;\n role: \"dialog\" | \"alertdialog\";\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;\nlet nextHistoryId = 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];\nconst historySnapshot = () => ({ href: location.href, length: history.length });\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.setAttribute(\"role\", entry.role);\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n dialog.removeAttribute(\"aria-describedby\");\n // A toned dialog names its tone in a hidden word that describes the dialog, so its heading keeps the title alone.\n const tone = entry.container.querySelector<HTMLElement>(\"[data-dialog-tone-label]\");\n if (tone) tone.id ||= `k2b-dialog-tone-${++nextDialogTitleId}`;\n const describedBy = [entry.ariaDescribedBy, tone?.id].filter(Boolean).join(\" \");\n if (describedBy) dialog.setAttribute(\"aria-describedby\", describedBy);\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\n/** Checked by shape: a test harness or an iframe may create the event in another realm. */\nconst isPopState = (value: unknown): value is PopStateEvent =>\n typeof value === \"object\" && value !== null && \"type\" in value && value.type === \"popstate\" && \"state\" in value;\n\ntype HistoryEntry = { historyId?: number };\ntype HistoryHolder = HistoryEntry & { onBack: () => void };\n\nexport const createDialogCore = () => {\n const state: DialogState = { stack: [] };\n /** Markers of this core's entries in the browser history, oldest first. */\n let historyIds: number[] = [];\n const issued = new Set<number>();\n /**\n * Markers forgotten during island disposal. Their entries stay in `historyIds` as barriers: a synthetic Back never\n * crosses one, because the router may have replaced that entry with another page.\n */\n const forgotten = new Set<number>();\n const deadMarker = (marker: unknown): marker is number => typeof marker === \"number\" && forgotten.has(marker);\n /** How often islands were disposed, so a dialog that waits to open notices that a content swap happened meanwhile. */\n let disposals = 0;\n const ownMarker = (marker: unknown): marker is number => typeof marker === \"number\" && issued.has(marker);\n let seen: ReturnType<typeof historySnapshot> | undefined;\n let traversalFrom: { href: string; marker: unknown } | undefined;\n let syntheticFrom: { href: string; marker: unknown } | undefined;\n const historyHolders = new Set<HistoryHolder>();\n let historySyncScheduled = false;\n let disposingIslands = false;\n /** Settles when the synthetic Back that removes closed dialogs' entries has arrived. */\n let returning: Promise<void> | undefined;\n let resolveReturning: (() => void) | undefined;\n\n /** Outside island disposal, closed entries leave with one Back to the newest live dialog or holder, or to the page. */\n const syncHistory = () => {\n if (returning) {\n void returning.then(() => {\n if (historySyncScheduled) syncHistory();\n });\n return;\n }\n historySyncScheduled = false;\n const openIds = new Set([...state.stack, ...historyHolders].map((entry) => entry.historyId));\n const current = historyIds.at(-1);\n let steps = 0;\n while (historyIds.length > 0 && !openIds.has(historyIds.at(-1)) && !deadMarker(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 || location.href !== seen?.href || history.length !== seen?.length) return;\n const back = new Promise<void>((resolve) => {\n resolveReturning = resolve;\n });\n returning = back;\n void back.then(() => {\n if (returning === back) returning = undefined;\n });\n syntheticFrom = { href: location.href, marker: current };\n history.go(-steps);\n };\n\n const releaseHistory = (entry: HistoryEntry) => {\n if (entry.historyId === undefined) return;\n // During a content swap the router owns history. Forget the marker without moving history; its entry stays a\n // barrier for later synthetic Backs and is left for the router to replace.\n if (disposingIslands) {\n issued.delete(entry.historyId);\n forgotten.add(entry.historyId);\n entry.historyId = undefined;\n return;\n }\n if (historySyncScheduled) return;\n historySyncScheduled = true;\n queueMicrotask(syncHistory);\n };\n\n /** Traversals this core already handled: a page swap router also reports the ones it hides from listeners. */\n const handled = new WeakSet<PopStateEvent>();\n /** Back or Forward moved to another entry: close dialogs and holders opened after the one it shows. */\n const onPopState = (event: PopStateEvent) => {\n if (handled.has(event)) return;\n handled.add(event);\n const resolveBack = resolveReturning;\n // Without the Navigation API, only our synthetic Back has a known departure.\n const from = typeof navigation !== \"undefined\" ? traversalFrom : resolveBack ? syntheticFrom : undefined;\n traversalFrom = undefined;\n syntheticFrom = undefined;\n resolveReturning = undefined;\n try {\n const marker = historyMarker();\n if (from && from.href === location.href && from.marker !== marker && (ownMarker(from.marker) || ownMarker(marker))) {\n event.stopImmediatePropagation();\n }\n // Own entries are ordered by id. A retired entry reached by Forward stays tracked, so closing the dialogs\n // beneath it also removes it. A forgotten entry keeps the holders opened before it and stays a barrier.\n historyIds = ownMarker(marker) || deadMarker(marker) ? [...historyIds.filter((id) => id < marker), marker] : [];\n const gone = (entry: DialogStackEntry) => entry.historyId !== undefined && !historyIds.includes(entry.historyId);\n while (state.stack.some(gone)) popTop(undefined);\n for (const holder of [...historyHolders].reverse()) {\n if (holder.historyId === undefined || historyIds.includes(holder.historyId)) continue;\n historyHolders.delete(holder);\n releaseHistory(holder);\n holder.onBack();\n }\n } finally {\n seen = historySnapshot();\n resolveBack?.();\n }\n };\n\n /**\n * Island disposal means the page content changes, as a document load would. Every dialog closes, top first, whichever\n * code opened it: which island calls open() is not knowable after an await, in onMount or from a timer, and a modal\n * left over the new content would block it.\n */\n const onIslandDispose = () => {\n if (!disposingIslands) {\n disposingIslands = true;\n queueMicrotask(() => {\n disposingIslands = false;\n });\n // Entries released just before, whose Back has not started yet, stay as well: the router owns history now.\n // A Back already on its way still settles through `returning`.\n historySyncScheduled = false;\n const live = new Set([...state.stack, ...historyHolders].map((entry) => entry.historyId));\n for (const id of historyIds) {\n if (live.has(id) || !issued.delete(id)) continue;\n forgotten.add(id);\n }\n }\n disposals++;\n while (state.stack.length > 0) popTop(undefined);\n };\n\n /** `@k2b/ssr/nav` stops a traversal to another server page before later listeners and reports it here. */\n const onHiddenPopState = (event: Event) => {\n const detail: unknown = \"detail\" in event ? event.detail : undefined;\n if (isPopState(detail)) onPopState(detail);\n };\n const onNavigate = (event: NavigateEvent) => {\n if (event.navigationType === \"traverse\") traversalFrom = { href: location.href, marker: historyMarker() };\n };\n /** The window whose history this core listens to; a test harness may replace the window between dialogs. */\n let listening: { window: Window; navigation?: Navigation } | undefined;\n const listen = () => {\n if (listening?.window === window) return;\n listening?.window.removeEventListener(\"popstate\", onPopState, { capture: true });\n listening?.window.removeEventListener(\"ssr:nav-popstate\", onHiddenPopState, { capture: true });\n listening?.window.removeEventListener(\"ssr:island-dispose\", onIslandDispose, { capture: true });\n listening?.navigation?.removeEventListener(\"navigate\", onNavigate);\n window.addEventListener(\"popstate\", onPopState, { capture: true });\n window.addEventListener(\"ssr:nav-popstate\", onHiddenPopState, { capture: true });\n // Capture opens the disposal window before target listeners can release history holders.\n window.addEventListener(\"ssr:island-dispose\", onIslandDispose, { capture: true });\n const current = typeof navigation !== \"undefined\" ? navigation : undefined;\n current?.addEventListener(\"navigate\", onNavigate);\n listening = { window, navigation: current };\n };\n // Chromium runs a window's popstate listeners in the order they were added, capture or not. The shared core is\n // created before islands mount and add their navigation listeners, so it listens from the start.\n if (typeof window !== \"undefined\") listen();\n\n const pushHistory = (entry: HistoryEntry) => {\n listen();\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 issued.add(entry.historyId);\n historyIds.push(entry.historyId);\n history.pushState({ ...previous, [HISTORY_MARKER]: entry.historyId }, \"\");\n seen = historySnapshot();\n };\n\n /** Internal non-dialog participation in the same history stack. Releasing never calls onBack. */\n const holdHistory = (onBack: () => void): (() => void) => {\n const holder: HistoryHolder = { onBack };\n historyHolders.add(holder);\n const pushWhenReady = () => {\n if (!historyHolders.has(holder)) return;\n // Just like open(): remove closed entries before adding another one.\n if (historySyncScheduled) syncHistory();\n if (returning) void returning.then(pushWhenReady);\n else pushHistory(holder);\n };\n pushWhenReady();\n return () => {\n if (!historyHolders.delete(holder)) return;\n releaseHistory(holder);\n };\n };\n\n /**\n * Settles once released entries have left history or were forgotten during island disposal. A caller that navigates waits\n * for it, as a dialog's result waits: a Back still on its way would otherwise land behind the new entry.\n */\n const historySettled = async (): Promise<void> => {\n while (historySyncScheduled || returning) {\n if (!returning) syncHistory();\n if (returning) await returning;\n }\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 dialog.removeAttribute(\"aria-describedby\");\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 return openAfter(view, options, disposals);\n };\n\n const openAfter = <T>(view: DialogRender<T>, options: OpenDialogOptions, requested: number): 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(() => openAfter(view, options, requested));\n }\n // A dialog that waited for history while islands were disposed would open over content it was never meant for.\n if (disposals !== requested) return Promise.resolve(undefined);\n const dialog = ensureDialogElement();\n listen();\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 ariaDescribedBy: options.ariaDescribedBy,\n role: options.role ?? \"dialog\",\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 (!options.history) {\n resolve(value as T | undefined);\n return;\n }\n // After every pending history sync, so a caller that navigates or opens the next dialog finds the history settled.\n // This holds for a marker forgotten during island disposal too, while an earlier synthetic Back is on its way.\n queueMicrotask(() => void historySettled().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 holdHistory,\n historySettled,\n };\n};\n\nconst { holdHistory, historySettled, ...publicDialogCore } = createDialogCore();\nexport const dialogCore: DialogCore = publicDialogCore;\n\n/**\n * Internal: transient UI shares dialogs' Back handling without exposing another public dialog capability.\n * Same-URL traversals are suppressed with the Navigation API; without it, only the synthetic Back on release is suppressed.\n * Release during island disposal forgets the marker without traversing; the router may replace the remaining entry.\n */\nexport const holdDialogHistory = holdHistory;\n/** Internal: waits until released holders have left history or were forgotten during island disposal. */\nexport const dialogHistorySettled = historySettled;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** A dialog's outcome or risk: a 2 px edge in its colour inside the frame and its icon in the header. */
|
|
2
|
+
|
|
3
|
+
const tones = {
|
|
4
|
+
success: {
|
|
5
|
+
icon: "ti ti-circle-check",
|
|
6
|
+
label: "dialogToneSuccess"
|
|
7
|
+
},
|
|
8
|
+
warning: {
|
|
9
|
+
icon: "ti ti-alert-triangle",
|
|
10
|
+
label: "dialogToneWarning"
|
|
11
|
+
},
|
|
12
|
+
danger: {
|
|
13
|
+
icon: "ti ti-alert-octagon",
|
|
14
|
+
label: "dialogToneDanger"
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** The header icon of a toned dialog; it replaces the dialog's own icon. */
|
|
19
|
+
export const dialogToneIcon = tone => tones[tone].icon;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The tone's word for screen readers, so the tone is not carried by colour alone. Headers render it hidden with
|
|
23
|
+
* `data-dialog-tone-label`; the dialog core makes it the dialog's description, and the heading keeps the title alone.
|
|
24
|
+
*/
|
|
25
|
+
export const dialogToneLabel = (messages, tone) => messages[tones[tone].label];
|
|
26
|
+
//# sourceMappingURL=dialog-tone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["feedback/dialog-tone.ts"],"sourcesContent":["import type { UiMessages } from \"../intl/messages\";\n\n/** A dialog's outcome or risk: a 2 px edge in its colour inside the frame and its icon in the header. */\nexport type DialogTone = \"success\" | \"warning\" | \"danger\";\n\nconst tones = {\n success: { icon: \"ti ti-circle-check\", label: \"dialogToneSuccess\" },\n warning: { icon: \"ti ti-alert-triangle\", label: \"dialogToneWarning\" },\n danger: { icon: \"ti ti-alert-octagon\", label: \"dialogToneDanger\" },\n} as const satisfies Record<DialogTone, { icon: string; label: keyof UiMessages }>;\n\n/** The header icon of a toned dialog; it replaces the dialog's own icon. */\nexport const dialogToneIcon = (tone: DialogTone): string => tones[tone].icon;\n\n/**\n * The tone's word for screen readers, so the tone is not carried by colour alone. Headers render it hidden with\n * `data-dialog-tone-label`; the dialog core makes it the dialog's description, and the heading keeps the title alone.\n */\nexport const dialogToneLabel = (messages: UiMessages, tone: DialogTone): string => messages[tones[tone].label];\n"],"mappings":"AAEA;;AAGA,MAAM,KAAK,GAAG;EACZ,OAAO,EAAE;IAAE,IAAI,EAAE,oBAAoB;IAAE,KAAK,EAAE;EAAoB,CAAC;EACnE,OAAO,EAAE;IAAE,IAAI,EAAE,sBAAsB;IAAE,KAAK,EAAE;EAAoB,CAAC;EACrE,MAAM,EAAE;IAAE,IAAI,EAAE,qBAAqB;IAAE,KAAK,EAAE;EAAmB;AACnE,CAAkF;;AAElF;AACA,OAAO,MAAM,cAAc,GAAI,IAAgB,IAAa,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI;;AAE5E;AACA;AACA;AACA;AACA,OAAO,MAAM,eAAe,GAAG,CAAC,QAAoB,EAAE,IAAgB,KAAa,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["feedback/index.ts"],"sourcesContent":["export type { AnnounceOptions, AnnouncePoliteness } from \"./announce\";\nexport { announce } from \"./announce\";\nexport type { DialogClose, DialogCore, DialogRender, OpenDialogOptions } from \"./dialog-core\";\nexport { dialogCore } from \"./dialog-core\";\nexport type { HoverPreviewController, HoverPreviewOptions, HoverPreviewPlacement, HoverPreviewProps } from \"./HoverPreview\";\nexport { createHoverPreview, HoverPreview } from \"./HoverPreview\";\nexport type { InlineGuidanceProps } from \"./InlineGuidance\";\nexport { default as InlineGuidance } from \"./InlineGuidance\";\nexport type { InstallGuideProps } from \"./InstallGuide\";\nexport { default as InstallGuide } from \"./InstallGuide\";\nexport type { InstallationPlatform, InstallPrompt } from \"./install\";\nexport { createInstallPrompt, installationPlatform } from \"./install\";\nexport type { MovedHintAction, MovedHintProps } from \"./MovedHint\";\nexport { MovedHint } from \"./MovedHint\";\nexport type {\n ConfirmOptions,\n DialogOptions,\n FieldSchema,\n PromptFieldBase,\n PromptSearchInput,\n PromptSearchItem,\n PromptSearchOptions,\n} from \"./prompts\";\nexport { createFormState, DialogHeader, prompts } from \"./prompts\";\nexport type { TooltipAnchorProps, TooltipPlacement, TooltipProps, TooltipTriggerProps } from \"./Tooltip\";\nexport { Tooltip } from \"./Tooltip\";\nexport { syncThemeColor } from \"./theme-color\";\nexport type { ToastAction, ToastFn, ToastHandle, ToastOptions, ToastSlot, ToastVariant } from \"./toast\";\nexport { isPointInsideToast, toast } from \"./toast\";\n"],"mappings":"AACA,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,UAAU,QAAQ,eAAe;
|
|
1
|
+
{"version":3,"names":[],"sources":["feedback/index.ts"],"sourcesContent":["export type { AnnounceOptions, AnnouncePoliteness } from \"./announce\";\nexport { announce } from \"./announce\";\nexport type { DialogClose, DialogCore, DialogRender, OpenDialogOptions } from \"./dialog-core\";\nexport { dialogCore } from \"./dialog-core\";\nexport type { DialogTone } from \"./dialog-tone\";\nexport type { HoverPreviewController, HoverPreviewOptions, HoverPreviewPlacement, HoverPreviewProps } from \"./HoverPreview\";\nexport { createHoverPreview, HoverPreview } from \"./HoverPreview\";\nexport type { InlineGuidanceProps } from \"./InlineGuidance\";\nexport { default as InlineGuidance } from \"./InlineGuidance\";\nexport type { InstallGuideProps } from \"./InstallGuide\";\nexport { default as InstallGuide } from \"./InstallGuide\";\nexport type { InstallationPlatform, InstallPrompt } from \"./install\";\nexport { createInstallPrompt, installationPlatform } from \"./install\";\nexport type { MovedHintAction, MovedHintProps } from \"./MovedHint\";\nexport { MovedHint } from \"./MovedHint\";\nexport type {\n ConfirmOptions,\n DialogOptions,\n FieldSchema,\n PromptFieldBase,\n PromptSearchInput,\n PromptSearchItem,\n PromptSearchOptions,\n} from \"./prompts\";\nexport { createFormState, DialogHeader, prompts } from \"./prompts\";\nexport type { TooltipAnchorProps, TooltipPlacement, TooltipProps, TooltipTriggerProps } from \"./Tooltip\";\nexport { Tooltip } from \"./Tooltip\";\nexport { syncThemeColor } from \"./theme-color\";\nexport type { ToastAction, ToastFn, ToastHandle, ToastOptions, ToastSlot, ToastVariant } from \"./toast\";\nexport { isPointInsideToast, toast } from \"./toast\";\n"],"mappings":"AACA,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,UAAU,QAAQ,eAAe;AAG1C,SAAS,kBAAkB,EAAE,YAAY,QAAQ,gBAAgB;AAEjE,SAAS,OAAO,IAAI,cAAc,QAAQ,kBAAkB;AAE5D,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,mBAAmB,EAAE,oBAAoB,QAAQ,WAAW;AAErE,SAAS,SAAS,QAAQ,aAAa;AAUvC,SAAS,eAAe,EAAE,YAAY,EAAE,OAAO,QAAQ,WAAW;AAElE,SAAS,OAAO,QAAQ,WAAW;AACnC,SAAS,cAAc,QAAQ,eAAe;AAE9C,SAAS,kBAAkB,EAAE,KAAK,QAAQ,SAAS","ignoreList":[]}
|