@zyncat/ui 0.8.0 → 0.9.1

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.
Files changed (78) hide show
  1. package/README.md +2 -2
  2. package/dist/alert.js +6 -7
  3. package/dist/alert.js.map +1 -1
  4. package/dist/button.css +10 -2
  5. package/dist/button.d.ts +2 -6
  6. package/dist/button.js +1 -1
  7. package/dist/{chunk-U5QQZC3U.js → chunk-2F5PITAO.js} +2 -6
  8. package/dist/chunk-2F5PITAO.js.map +1 -0
  9. package/dist/chunk-2QWJ6FAX.js +78 -0
  10. package/dist/chunk-2QWJ6FAX.js.map +1 -0
  11. package/dist/{chunk-MXOPCFWR.js → chunk-356HZMT4.js} +25 -4
  12. package/dist/chunk-356HZMT4.js.map +1 -0
  13. package/dist/{chunk-QMSJZCK3.js → chunk-45XJ75GZ.js} +9 -9
  14. package/dist/chunk-45XJ75GZ.js.map +1 -0
  15. package/dist/{chunk-4R2GQO43.js → chunk-FLO4A6BI.js} +4 -4
  16. package/dist/{chunk-4R2GQO43.js.map → chunk-FLO4A6BI.js.map} +1 -1
  17. package/dist/{chunk-XZAEIQDR.js → chunk-GLT5IKQY.js} +5 -5
  18. package/dist/{chunk-XZAEIQDR.js.map → chunk-GLT5IKQY.js.map} +1 -1
  19. package/dist/{chunk-O4N2OBTR.js → chunk-W5YM2FV4.js} +4 -4
  20. package/dist/{chunk-O4N2OBTR.js.map → chunk-W5YM2FV4.js.map} +1 -1
  21. package/dist/{chunk-MKIQFK7S.js → chunk-WM5J5TDI.js} +3 -3
  22. package/dist/{chunk-MKIQFK7S.js.map → chunk-WM5J5TDI.js.map} +1 -1
  23. package/dist/{chunk-W3SHPKSB.js → chunk-XWUWYSCT.js} +16 -6
  24. package/dist/chunk-XWUWYSCT.js.map +1 -0
  25. package/dist/{chunk-2HORSLXJ.js → chunk-Y7AJQVWJ.js} +17 -8
  26. package/dist/chunk-Y7AJQVWJ.js.map +1 -0
  27. package/dist/{chunk-L3Q3VDIW.js → chunk-YGCVWGUG.js} +6 -32
  28. package/dist/chunk-YGCVWGUG.js.map +1 -0
  29. package/dist/date-field.js +8 -8
  30. package/dist/date-range-field.js +32 -13
  31. package/dist/date-range-field.js.map +1 -1
  32. package/dist/datetime-field.js +8 -8
  33. package/dist/dialog.js +4 -4
  34. package/dist/glide.js +2 -2
  35. package/dist/motion-devtools.js +2 -2
  36. package/dist/multi-select.js +6 -6
  37. package/dist/pagination.js +2 -2
  38. package/dist/popover.js +4 -4
  39. package/dist/radio-group.js +36 -9
  40. package/dist/radio-group.js.map +1 -1
  41. package/dist/select.js +6 -6
  42. package/dist/sheet.js +5 -5
  43. package/dist/table.js +7 -7
  44. package/dist/table.js.map +1 -1
  45. package/dist/tabs.js +2 -2
  46. package/dist/tag.js +7 -7
  47. package/dist/tag.js.map +1 -1
  48. package/dist/toast.js +5 -6
  49. package/dist/toast.js.map +1 -1
  50. package/dist/tooltip.js +3 -3
  51. package/llms.txt +9 -8
  52. package/package.json +11 -10
  53. package/src/components/composites/date-picker/calendar-panel.tsx +12 -3
  54. package/src/components/composites/date-picker/range-panel.tsx +19 -5
  55. package/src/components/composites/select/core/trigger.tsx +8 -12
  56. package/src/components/composites/table/Table.tsx +4 -2
  57. package/src/components/primitives/button/Button.tsx +0 -16
  58. package/src/components/primitives/button/button.css +10 -2
  59. package/src/components/primitives/radio-group/RadioGroup.tsx +26 -7
  60. package/src/components/primitives/tag/Tag.tsx +2 -1
  61. package/src/engine/ease.ts +7 -39
  62. package/src/engine/index.ts +1 -11
  63. package/src/motion/element.tsx +9 -9
  64. package/src/motion/flip.ts +61 -0
  65. package/src/motion/presence-context.ts +4 -3
  66. package/src/motion/presence.tsx +25 -1
  67. package/src/motion/use-motion.ts +13 -2
  68. package/dist/chunk-2HORSLXJ.js.map +0 -1
  69. package/dist/chunk-36WVAQKL.js +0 -40
  70. package/dist/chunk-36WVAQKL.js.map +0 -1
  71. package/dist/chunk-JSKXZMLH.js +0 -67
  72. package/dist/chunk-JSKXZMLH.js.map +0 -1
  73. package/dist/chunk-L3Q3VDIW.js.map +0 -1
  74. package/dist/chunk-MXOPCFWR.js.map +0 -1
  75. package/dist/chunk-QMSJZCK3.js.map +0 -1
  76. package/dist/chunk-U5QQZC3U.js.map +0 -1
  77. package/dist/chunk-W3SHPKSB.js.map +0 -1
  78. package/src/motion/flip.tsx +0 -87
package/dist/table.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/table/Table.tsx"],"names":[],"mappings":"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","file":"table.js","sourcesContent":["'use client';\n\nimport './table.css';\nimport { useMemo, useRef, useState, type HTMLAttributes, type ReactNode } from 'react';\nimport { Motion } from '../../../motion/element';\nimport { UIMotion } from '../../../tokens/motion-tokens';\nimport { Icon } from '../../internal/icon/Icon';\nimport type { DataAttributes } from '../../../dom-props';\nimport { Button } from '../../primitives/button/Button';\nimport { Checkbox } from '../../primitives/checkbox/Checkbox';\nimport { Odometer } from '../../primitives/badge/odometer';\nimport { useScrollEdges } from '../../internal/hooks/use-scroll-edges';\nimport { cx } from '../../internal/utils/cx';\n\nexport type TableAlign = 'start' | 'end' | 'center';\nexport type TableHideBelow = 'sm' | 'md';\n\nexport interface TableColumn<Row = any> {\n /** Unique column id; also the default data accessor (row[key]). */\n key: string;\n /** Header cell content; omit for a header-less column (e.g. an actions column). */\n label?: ReactNode;\n /** Cell + header alignment. Default 'start'. */\n align?: TableAlign;\n /** Mono + tabular numerals (timestamps, counts, IDs - section E). */\n mono?: boolean;\n /** Identity emphasis: strong text, medium weight. */\n strong?: boolean;\n /** The one greedy column - absorbs slack width. Others size to content. */\n grow?: boolean;\n /** Header becomes a sort control. Sort is local; asc - desc, no third state. */\n sortable?: boolean;\n /** Sort accessor: a row property name, or a function. Defaults to row[key]. */\n sortBy?: string | ((row: Row) => unknown);\n /** Collapse this column below a container breakpoint (30rem / 42rem). */\n hideBelow?: TableHideBelow;\n /** Custom cell renderer. Defaults to row[key]. */\n render?: (row: Row) => ReactNode;\n}\n\nexport interface TableSort {\n /** `key` of the column being sorted by. */\n key: string;\n /** Sort direction - `asc` or `desc`. */\n dir: 'asc' | 'desc';\n}\n\nexport interface TableProps<Row = any> {\n /** Column defs, rendered left to right. */\n columns: TableColumn<Row>[];\n /** The row data; sorted locally per the active sort before render. */\n rows: Row[];\n /** Row identity property. Default 'id'. Must be unique and stable. */\n rowKey?: string;\n /** Accessible name for the <table>. */\n ariaLabel?: string;\n\n /** Checkbox column + bulk bar. Selection is a Set of row keys, owned here. */\n selectable?: boolean;\n /** Fires with the selected row keys after every selection change. */\n onSelectionChange?: (keys: Array<string | number>) => void;\n /** Rendered in the bulk bar between the count and the built-in Clear. */\n bulkActions?: (keys: Array<string | number>, clear: () => void) => ReactNode;\n /** Per-row checkbox aria-label. Default 'Select row'. */\n selectionLabel?: (row: Row) => string;\n\n /** Initial sort; sorting stays local and uncontrolled after that. */\n defaultSort?: TableSort | null;\n /** Notification only - fires after the local sort updates. */\n onSortChange?: (sort: TableSort) => void;\n\n /** Row rhythm. Default 'cozy' (46px rows); 'compact' is 38px. */\n density?: 'cozy' | 'compact';\n /** Pin checkbox + first column under horizontal overflow. Default true. */\n pinFirst?: boolean;\n\n /** Rows recede and go inert (list-fetch convention). */\n loading?: boolean;\n /** Shown when rows is empty and not loading. Default 'Nothing to show'. */\n empty?: ReactNode;\n /** Footer strip - pagination, summaries. */\n footer?: ReactNode;\n\n /** Makes rows clickable (checkbox cell excluded). */\n onRowClick?: (row: Row) => void;\n /** Size the table here - the internal scroller absorbs the constraint. */\n className?: string;\n /** Standard <div> attributes (style, data-*, aria-*, ...) forwarded to the table wrapper. */\n htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, 'className'> & DataAttributes;\n}\n\nfunction tblCompare(a: unknown, b: unknown) {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });\n}\n\nexport function Table<Row = any>({\n columns = [],\n rows = [],\n rowKey = 'id',\n ariaLabel,\n selectable = false,\n onSelectionChange,\n bulkActions,\n selectionLabel,\n defaultSort = null,\n onSortChange,\n density = 'cozy',\n pinFirst = true,\n loading = false,\n empty,\n footer,\n onRowClick,\n className = '',\n htmlProps,\n}: TableProps<Row>) {\n const [sort, setSort] = useState<TableSort | null>(defaultSort);\n const [selected, setSelected] = useState<Set<string | number>>(() => new Set());\n const wrapRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const lastIdxRef = useRef(-1);\n const shiftRef = useRef(false);\n const lastCountRef = useRef(0);\n\n const keyOf = (row: Row): string | number => (row as Record<string, string | number>)[rowKey];\n\n const sortedRows = useMemo(() => {\n if (!sort) return rows;\n const col = columns.find((c) => c.key === sort.key);\n if (!col) return rows;\n const get =\n typeof col.sortBy === 'function'\n ? col.sortBy\n : col.sortBy\n ? (r: Row) => (r as Record<string, unknown>)[col.sortBy as string]\n : (r: Row) => (r as Record<string, unknown>)[col.key];\n const dir = sort.dir === 'desc' ? -1 : 1;\n return rows.slice().sort((a, b) => dir * tblCompare(get(a), get(b)));\n }, [rows, columns, sort]);\n\n function cycleSort(col: TableColumn<Row>) {\n const next: TableSort =\n sort && sort.key === col.key\n ? { key: col.key, dir: sort.dir === 'asc' ? 'desc' : 'asc' }\n : { key: col.key, dir: 'asc' };\n setSort(next);\n if (onSortChange) onSortChange(next);\n }\n\n const allSelected = sortedRows.length > 0 && sortedRows.every((r) => selected.has(keyOf(r)));\n const someSelected = selected.size > 0 && !allSelected;\n\n function commitSelection(next: Set<string | number>) {\n setSelected(next);\n if (onSelectionChange) onSelectionChange(Array.from(next));\n }\n function clearSelection() {\n lastIdxRef.current = -1;\n commitSelection(new Set());\n }\n function toggleAll() {\n const next = new Set<string | number>();\n if (!allSelected) sortedRows.forEach((r) => next.add(keyOf(r)));\n commitSelection(next);\n }\n function toggleRow(idx: number) {\n const next = new Set(selected);\n const on = !next.has(keyOf(sortedRows[idx]));\n if (shiftRef.current && lastIdxRef.current >= 0 && lastIdxRef.current !== idx) {\n const lo = Math.min(lastIdxRef.current, idx);\n const hi = Math.max(lastIdxRef.current, idx);\n for (let i = lo; i <= hi; i++) {\n const k = keyOf(sortedRows[i]);\n if (on) next.add(k);\n else next.delete(k);\n }\n } else if (on) {\n next.add(keyOf(sortedRows[idx]));\n } else {\n next.delete(keyOf(sortedRows[idx]));\n }\n lastIdxRef.current = idx;\n shiftRef.current = false;\n commitSelection(next);\n }\n\n useScrollEdges(\n scrollRef,\n (edges, el) => {\n const w = wrapRef.current;\n if (!w) return;\n const set = (attr: string, on: boolean) => {\n if (on) w.setAttribute(attr, '');\n else w.removeAttribute(attr);\n };\n set('data-scrolled', el.scrollTop > 0);\n set('data-x-back', edges.left);\n set('data-x-more', edges.right);\n },\n { content: true },\n );\n\n function cellMods(col: TableColumn<Row>, i: number) {\n const a: string[] = [];\n if (col.align === 'end') a.push('tbl__cell--end');\n if (col.align === 'center') a.push('tbl__cell--center');\n if (col.grow) a.push('tbl__cell--grow');\n if (col.hideBelow) a.push('tbl__cell--hide-' + col.hideBelow);\n if (pinFirst && i === 0) {\n a.push('tbl__cell--pin', 'tbl__cell--pinEdge');\n if (selectable) a.push('tbl__cell--pinOff');\n }\n return a;\n }\n\n const t = UIMotion.t;\n const colCount = columns.length + (selectable ? 1 : 0);\n const showEmpty = !loading && sortedRows.length === 0;\n const checkCellCls = 'tbl__cell--check' + (pinFirst ? ' tbl__cell--pin' : '');\n\n const checkSize = density === 'compact' ? 'sm' : 'md';\n const bulkOpen = selectable && selected.size > 0;\n if (selected.size > 0) lastCountRef.current = selected.size;\n\n const rootCls = cx(\n 'tbl',\n density === 'compact' && 'tbl--compact',\n pinFirst && 'tbl--pin',\n loading && 'tbl--loading',\n onRowClick && 'tbl--clickable',\n className,\n );\n\n return (\n <div ref={wrapRef} className={rootCls} {...htmlProps}>\n {selectable ? (\n <div\n className=\"tbl__bulk\"\n data-open={bulkOpen ? '' : undefined}\n aria-hidden={bulkOpen ? undefined : true}\n role=\"toolbar\"\n aria-label=\"Selection actions\"\n >\n <Checkbox\n className=\"tbl__cbx\"\n size={checkSize}\n checked={allSelected}\n indeterminate={someSelected}\n htmlProps={{ 'aria-label': 'Select all rows' }}\n onChange={toggleAll}\n />\n <span className=\"tbl__bulkCount\" aria-live=\"polite\" aria-atomic=\"true\">\n <Odometer value={bulkOpen ? selected.size : lastCountRef.current} />\n <span> selected</span>\n </span>\n <span className=\"tbl__bulkSpacer\"></span>\n {bulkActions ? bulkActions(Array.from(selected), clearSelection) : null}\n <Button variant=\"ghost\" size=\"sm\" onClick={clearSelection}>\n Clear\n </Button>\n </div>\n ) : null}\n\n <div className=\"tbl__viewport\">\n <div className=\"tbl__scroll\" ref={scrollRef}>\n <table className=\"tbl__table\" aria-label={ariaLabel} aria-busy={loading || undefined}>\n <thead>\n <tr>\n {selectable ? (\n <th scope=\"col\" className={checkCellCls}>\n <Checkbox\n className=\"tbl__cbx\"\n size={checkSize}\n checked={allSelected}\n indeterminate={someSelected}\n htmlProps={{ 'aria-label': 'Select all rows' }}\n onChange={toggleAll}\n />\n </th>\n ) : null}\n {columns.map((c, i) => {\n const active = sort && sort.key === c.key;\n const cls = (c.sortable ? ['tbl__cell--sortable'] : []).concat(cellMods(c, i));\n return (\n <th\n key={c.key}\n scope=\"col\"\n className={cls.join(' ')}\n aria-sort={active ? (sort.dir === 'asc' ? 'ascending' : 'descending') : undefined}\n >\n {c.sortable ? (\n <button type=\"button\" className=\"tbl__sort\" onClick={() => cycleSort(c)}>\n <span className=\"tbl__sortLbl\">{c.label}</span>\n <span\n className={\n 'tbl__sortIcon' +\n (active ? ' is-on' : '') +\n (active && sort.dir === 'desc' ? ' is-desc' : '')\n }\n aria-hidden=\"true\"\n >\n <Icon name=\"arrow-up\" size=\"sm\" />\n </span>\n </button>\n ) : c.label != null ? (\n <span className=\"tbl__hLbl\">{c.label}</span>\n ) : null}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {showEmpty ? (\n <tr>\n <td colSpan={colCount} className=\"tbl__emptyCell\">\n {empty != null ? empty : 'Nothing to show'}\n </td>\n </tr>\n ) : (\n sortedRows.map((row, idx) => {\n const k = keyOf(row);\n const isSel = selected.has(k);\n return (\n <Motion\n as=\"tr\"\n key={k}\n layout={{ timing: t.layout }}\n className=\"tbl__row\"\n data-selected={isSel ? '' : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {selectable ? (\n <td className={checkCellCls} onClick={(e) => e.stopPropagation()}>\n <Checkbox\n className=\"tbl__cbx\"\n size={checkSize}\n checked={isSel}\n htmlProps={{\n 'aria-label': selectionLabel ? selectionLabel(row) : 'Select row',\n onClick: (e) => {\n shiftRef.current = e.shiftKey;\n },\n }}\n onChange={() => toggleRow(idx)}\n />\n </td>\n ) : null}\n {columns.map((c, i) => (\n <td\n key={c.key}\n className={cellMods(c, i)\n .concat(c.mono ? ['tbl__cell--mono'] : [])\n .concat(c.strong ? ['tbl__cell--strong'] : [])\n .join(' ')}\n >\n {c.render ? c.render(row) : (row as Record<string, ReactNode>)[c.key]}\n </td>\n ))}\n </Motion>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n <div className=\"tbl__edge tbl__edge--l\" aria-hidden=\"true\"></div>\n <div className=\"tbl__edge tbl__edge--r\" aria-hidden=\"true\"></div>\n </div>\n\n {footer ? <div className=\"tbl__foot\">{footer}</div> : null}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/composites/table/Table.tsx"],"names":[],"mappings":"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","file":"table.js","sourcesContent":["'use client';\n\nimport './table.css';\nimport { useMemo, useRef, useState, type HTMLAttributes, type ReactNode } from 'react';\nimport { Motion } from '../../../motion/element';\nimport { UIMotion } from '../../../tokens/motion-tokens';\nimport { Icon } from '../../internal/icon/Icon';\nimport type { DataAttributes } from '../../../dom-props';\nimport { Button } from '../../primitives/button/Button';\nimport { Checkbox } from '../../primitives/checkbox/Checkbox';\nimport { Odometer } from '../../primitives/badge/odometer';\nimport { useScrollEdges } from '../../internal/hooks/use-scroll-edges';\nimport { cx } from '../../internal/utils/cx';\n\nconst ROW_FLIP = { timing: UIMotion.t.layout };\n\nexport type TableAlign = 'start' | 'end' | 'center';\nexport type TableHideBelow = 'sm' | 'md';\n\nexport interface TableColumn<Row = any> {\n /** Unique column id; also the default data accessor (row[key]). */\n key: string;\n /** Header cell content; omit for a header-less column (e.g. an actions column). */\n label?: ReactNode;\n /** Cell + header alignment. Default 'start'. */\n align?: TableAlign;\n /** Mono + tabular numerals (timestamps, counts, IDs - section E). */\n mono?: boolean;\n /** Identity emphasis: strong text, medium weight. */\n strong?: boolean;\n /** The one greedy column - absorbs slack width. Others size to content. */\n grow?: boolean;\n /** Header becomes a sort control. Sort is local; asc - desc, no third state. */\n sortable?: boolean;\n /** Sort accessor: a row property name, or a function. Defaults to row[key]. */\n sortBy?: string | ((row: Row) => unknown);\n /** Collapse this column below a container breakpoint (30rem / 42rem). */\n hideBelow?: TableHideBelow;\n /** Custom cell renderer. Defaults to row[key]. */\n render?: (row: Row) => ReactNode;\n}\n\nexport interface TableSort {\n /** `key` of the column being sorted by. */\n key: string;\n /** Sort direction - `asc` or `desc`. */\n dir: 'asc' | 'desc';\n}\n\nexport interface TableProps<Row = any> {\n /** Column defs, rendered left to right. */\n columns: TableColumn<Row>[];\n /** The row data; sorted locally per the active sort before render. */\n rows: Row[];\n /** Row identity property. Default 'id'. Must be unique and stable. */\n rowKey?: string;\n /** Accessible name for the <table>. */\n ariaLabel?: string;\n\n /** Checkbox column + bulk bar. Selection is a Set of row keys, owned here. */\n selectable?: boolean;\n /** Fires with the selected row keys after every selection change. */\n onSelectionChange?: (keys: Array<string | number>) => void;\n /** Rendered in the bulk bar between the count and the built-in Clear. */\n bulkActions?: (keys: Array<string | number>, clear: () => void) => ReactNode;\n /** Per-row checkbox aria-label. Default 'Select row'. */\n selectionLabel?: (row: Row) => string;\n\n /** Initial sort; sorting stays local and uncontrolled after that. */\n defaultSort?: TableSort | null;\n /** Notification only - fires after the local sort updates. */\n onSortChange?: (sort: TableSort) => void;\n\n /** Row rhythm. Default 'cozy' (46px rows); 'compact' is 38px. */\n density?: 'cozy' | 'compact';\n /** Pin checkbox + first column under horizontal overflow. Default true. */\n pinFirst?: boolean;\n\n /** Rows recede and go inert (list-fetch convention). */\n loading?: boolean;\n /** Shown when rows is empty and not loading. Default 'Nothing to show'. */\n empty?: ReactNode;\n /** Footer strip - pagination, summaries. */\n footer?: ReactNode;\n\n /** Makes rows clickable (checkbox cell excluded). */\n onRowClick?: (row: Row) => void;\n /** Size the table here - the internal scroller absorbs the constraint. */\n className?: string;\n /** Standard <div> attributes (style, data-*, aria-*, ...) forwarded to the table wrapper. */\n htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, 'className'> & DataAttributes;\n}\n\nfunction tblCompare(a: unknown, b: unknown) {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });\n}\n\nexport function Table<Row = any>({\n columns = [],\n rows = [],\n rowKey = 'id',\n ariaLabel,\n selectable = false,\n onSelectionChange,\n bulkActions,\n selectionLabel,\n defaultSort = null,\n onSortChange,\n density = 'cozy',\n pinFirst = true,\n loading = false,\n empty,\n footer,\n onRowClick,\n className = '',\n htmlProps,\n}: TableProps<Row>) {\n const [sort, setSort] = useState<TableSort | null>(defaultSort);\n const [selected, setSelected] = useState<Set<string | number>>(() => new Set());\n const wrapRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const lastIdxRef = useRef(-1);\n const shiftRef = useRef(false);\n const lastCountRef = useRef(0);\n\n const keyOf = (row: Row): string | number => (row as Record<string, string | number>)[rowKey];\n\n const sortedRows = useMemo(() => {\n if (!sort) return rows;\n const col = columns.find((c) => c.key === sort.key);\n if (!col) return rows;\n const get =\n typeof col.sortBy === 'function'\n ? col.sortBy\n : col.sortBy\n ? (r: Row) => (r as Record<string, unknown>)[col.sortBy as string]\n : (r: Row) => (r as Record<string, unknown>)[col.key];\n const dir = sort.dir === 'desc' ? -1 : 1;\n return rows.slice().sort((a, b) => dir * tblCompare(get(a), get(b)));\n }, [rows, columns, sort]);\n\n function cycleSort(col: TableColumn<Row>) {\n const next: TableSort =\n sort && sort.key === col.key\n ? { key: col.key, dir: sort.dir === 'asc' ? 'desc' : 'asc' }\n : { key: col.key, dir: 'asc' };\n setSort(next);\n if (onSortChange) onSortChange(next);\n }\n\n const allSelected = sortedRows.length > 0 && sortedRows.every((r) => selected.has(keyOf(r)));\n const someSelected = selected.size > 0 && !allSelected;\n\n function commitSelection(next: Set<string | number>) {\n setSelected(next);\n if (onSelectionChange) onSelectionChange(Array.from(next));\n }\n function clearSelection() {\n lastIdxRef.current = -1;\n commitSelection(new Set());\n }\n function toggleAll() {\n const next = new Set<string | number>();\n if (!allSelected) sortedRows.forEach((r) => next.add(keyOf(r)));\n commitSelection(next);\n }\n function toggleRow(idx: number) {\n const next = new Set(selected);\n const on = !next.has(keyOf(sortedRows[idx]));\n if (shiftRef.current && lastIdxRef.current >= 0 && lastIdxRef.current !== idx) {\n const lo = Math.min(lastIdxRef.current, idx);\n const hi = Math.max(lastIdxRef.current, idx);\n for (let i = lo; i <= hi; i++) {\n const k = keyOf(sortedRows[i]);\n if (on) next.add(k);\n else next.delete(k);\n }\n } else if (on) {\n next.add(keyOf(sortedRows[idx]));\n } else {\n next.delete(keyOf(sortedRows[idx]));\n }\n lastIdxRef.current = idx;\n shiftRef.current = false;\n commitSelection(next);\n }\n\n useScrollEdges(\n scrollRef,\n (edges, el) => {\n const w = wrapRef.current;\n if (!w) return;\n const set = (attr: string, on: boolean) => {\n if (on) w.setAttribute(attr, '');\n else w.removeAttribute(attr);\n };\n set('data-scrolled', el.scrollTop > 0);\n set('data-x-back', edges.left);\n set('data-x-more', edges.right);\n },\n { content: true },\n );\n\n function cellMods(col: TableColumn<Row>, i: number) {\n const a: string[] = [];\n if (col.align === 'end') a.push('tbl__cell--end');\n if (col.align === 'center') a.push('tbl__cell--center');\n if (col.grow) a.push('tbl__cell--grow');\n if (col.hideBelow) a.push('tbl__cell--hide-' + col.hideBelow);\n if (pinFirst && i === 0) {\n a.push('tbl__cell--pin', 'tbl__cell--pinEdge');\n if (selectable) a.push('tbl__cell--pinOff');\n }\n return a;\n }\n\n const colCount = columns.length + (selectable ? 1 : 0);\n const showEmpty = !loading && sortedRows.length === 0;\n const checkCellCls = 'tbl__cell--check' + (pinFirst ? ' tbl__cell--pin' : '');\n\n const checkSize = density === 'compact' ? 'sm' : 'md';\n const bulkOpen = selectable && selected.size > 0;\n if (selected.size > 0) lastCountRef.current = selected.size;\n\n const rootCls = cx(\n 'tbl',\n density === 'compact' && 'tbl--compact',\n pinFirst && 'tbl--pin',\n loading && 'tbl--loading',\n onRowClick && 'tbl--clickable',\n className,\n );\n\n return (\n <div ref={wrapRef} className={rootCls} {...htmlProps}>\n {selectable ? (\n <div\n className=\"tbl__bulk\"\n data-open={bulkOpen ? '' : undefined}\n aria-hidden={bulkOpen ? undefined : true}\n role=\"toolbar\"\n aria-label=\"Selection actions\"\n >\n <Checkbox\n className=\"tbl__cbx\"\n size={checkSize}\n checked={allSelected}\n indeterminate={someSelected}\n htmlProps={{ 'aria-label': 'Select all rows' }}\n onChange={toggleAll}\n />\n <span className=\"tbl__bulkCount\" aria-live=\"polite\" aria-atomic=\"true\">\n <Odometer value={bulkOpen ? selected.size : lastCountRef.current} />\n <span> selected</span>\n </span>\n <span className=\"tbl__bulkSpacer\"></span>\n {bulkActions ? bulkActions(Array.from(selected), clearSelection) : null}\n <Button variant=\"ghost\" size=\"sm\" onClick={clearSelection}>\n Clear\n </Button>\n </div>\n ) : null}\n\n <div className=\"tbl__viewport\">\n <div className=\"tbl__scroll\" ref={scrollRef}>\n <table className=\"tbl__table\" aria-label={ariaLabel} aria-busy={loading || undefined}>\n <thead>\n <tr>\n {selectable ? (\n <th scope=\"col\" className={checkCellCls}>\n <Checkbox\n className=\"tbl__cbx\"\n size={checkSize}\n checked={allSelected}\n indeterminate={someSelected}\n htmlProps={{ 'aria-label': 'Select all rows' }}\n onChange={toggleAll}\n />\n </th>\n ) : null}\n {columns.map((c, i) => {\n const active = sort && sort.key === c.key;\n const cls = (c.sortable ? ['tbl__cell--sortable'] : []).concat(cellMods(c, i));\n return (\n <th\n key={c.key}\n scope=\"col\"\n className={cls.join(' ')}\n aria-sort={active ? (sort.dir === 'asc' ? 'ascending' : 'descending') : undefined}\n >\n {c.sortable ? (\n <button type=\"button\" className=\"tbl__sort\" onClick={() => cycleSort(c)}>\n <span className=\"tbl__sortLbl\">{c.label}</span>\n <span\n className={\n 'tbl__sortIcon' +\n (active ? ' is-on' : '') +\n (active && sort.dir === 'desc' ? ' is-desc' : '')\n }\n aria-hidden=\"true\"\n >\n <Icon name=\"arrow-up\" size=\"sm\" />\n </span>\n </button>\n ) : c.label != null ? (\n <span className=\"tbl__hLbl\">{c.label}</span>\n ) : null}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {showEmpty ? (\n <tr>\n <td colSpan={colCount} className=\"tbl__emptyCell\">\n {empty != null ? empty : 'Nothing to show'}\n </td>\n </tr>\n ) : (\n sortedRows.map((row, idx) => {\n const k = keyOf(row);\n const isSel = selected.has(k);\n return (\n <Motion\n as=\"tr\"\n key={k}\n layout\n layoutTransition={ROW_FLIP}\n className=\"tbl__row\"\n data-selected={isSel ? '' : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {selectable ? (\n <td className={checkCellCls} onClick={(e) => e.stopPropagation()}>\n <Checkbox\n className=\"tbl__cbx\"\n size={checkSize}\n checked={isSel}\n htmlProps={{\n 'aria-label': selectionLabel ? selectionLabel(row) : 'Select row',\n onClick: (e) => {\n shiftRef.current = e.shiftKey;\n },\n }}\n onChange={() => toggleRow(idx)}\n />\n </td>\n ) : null}\n {columns.map((c, i) => (\n <td\n key={c.key}\n className={cellMods(c, i)\n .concat(c.mono ? ['tbl__cell--mono'] : [])\n .concat(c.strong ? ['tbl__cell--strong'] : [])\n .join(' ')}\n >\n {c.render ? c.render(row) : (row as Record<string, ReactNode>)[c.key]}\n </td>\n ))}\n </Motion>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n <div className=\"tbl__edge tbl__edge--l\" aria-hidden=\"true\"></div>\n <div className=\"tbl__edge tbl__edge--r\" aria-hidden=\"true\"></div>\n </div>\n\n {footer ? <div className=\"tbl__foot\">{footer}</div> : null}\n </div>\n );\n}\n"]}
package/dist/tabs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use client';import { useScrollEdges } from './chunk-BIDVNLJO.js';
2
- import { useGlide, GlidePill } from './chunk-MKIQFK7S.js';
2
+ import { useGlide, GlidePill } from './chunk-WM5J5TDI.js';
3
3
  import { resolveMotionTiming } from './chunk-NEF5XAHG.js';
4
- import { animate } from './chunk-L3Q3VDIW.js';
4
+ import { animate } from './chunk-YGCVWGUG.js';
5
5
  import { IconSlot } from './chunk-2ERBBFZS.js';
6
6
  import { UIMotion } from './chunk-S5ZTZANS.js';
7
7
  import './chunk-VTJTGVZZ.js';
package/dist/tag.js CHANGED
@@ -1,9 +1,8 @@
1
- 'use client';import { Motion } from './chunk-36WVAQKL.js';
2
- import { resolveMotionTiming } from './chunk-NEF5XAHG.js';
3
- import { Presence } from './chunk-MXOPCFWR.js';
4
- import './chunk-W3SHPKSB.js';
5
- import './chunk-JSKXZMLH.js';
6
- import './chunk-L3Q3VDIW.js';
1
+ 'use client';import { resolveMotionTiming } from './chunk-NEF5XAHG.js';
2
+ import { Presence } from './chunk-356HZMT4.js';
3
+ import { Motion } from './chunk-2QWJ6FAX.js';
4
+ import './chunk-XWUWYSCT.js';
5
+ import './chunk-YGCVWGUG.js';
7
6
  import { IconSlot } from './chunk-2ERBBFZS.js';
8
7
  import './chunk-S5ZTZANS.js';
9
8
  import './chunk-VTJTGVZZ.js';
@@ -43,7 +42,8 @@ function Tag({
43
42
  ref,
44
43
  animate: group?.animate,
45
44
  exit: group?.exit,
46
- layout: group?.layout,
45
+ layout: !!group,
46
+ layoutTransition: group?.layout,
47
47
  className: cls,
48
48
  style,
49
49
  "data-disabled": disabled ? "true" : void 0,
package/dist/tag.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/tag/Tag.tsx"],"names":[],"mappings":"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","file":"tag.js","sourcesContent":["'use client';\n\nimport './tag.css';\nimport { createContext, useContext, type CSSProperties, type HTMLAttributes, type ReactNode, type Ref } from 'react';\nimport { Presence } from '../../../motion/presence';\nimport { Motion } from '../../../motion/element';\nimport { resolveMotionTiming } from '../../../motion/motion-timing';\nimport type { DisableableAnimation } from '../../../motion/timing';\nimport type { FlipTuning } from '../../../motion/flip';\nimport type { Layer } from '../../../engine';\nimport { IconSlot } from '../../internal/icon/IconSlot';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nconst TAG_TIMING = { open: { duration: 'base', ease: 'entrance' }, close: { duration: 'fast', ease: 'exit' } } as const;\nconst TAG_LAYOUT_TIMING = {\n open: { duration: 'slow', ease: 'entrance' },\n close: { duration: 'slow', ease: 'entrance' },\n} as const;\n\ninterface TagGroupMotion {\n animate: Layer;\n exit: Layer;\n layout: FlipTuning;\n}\n\nconst TagGroupContext = createContext<TagGroupMotion | null>(null);\n\ninterface TagOwnProps {\n /** Tag content; a string label also seeds the default remove-button `aria-label`. */\n children: ReactNode;\n /** Your own icon node, sized small and tinted to the tag's text. */\n icon?: ReactNode | null;\n /** Presence adds the remove button; called on click - remove the item yourself. */\n onRemove?: (() => void) | null;\n /** Accessible label for the remove button. Defaults to \"Remove {label}\" for string labels. */\n removeLabel?: string;\n /** 'md' = 28px (default) - 'sm' = 24px for dense rows. */\n size?: 'md' | 'sm';\n /** Set `data-disabled` on the tag and disable its remove button. @default false */\n disabled?: boolean;\n /** Extra class(es) merged onto the root element. */\n className?: string;\n /** Inline styles merged onto the root element. */\n style?: CSSProperties;\n}\n\n/** Tag - the removable, editable label (stateless; the parent owns the list). */\nexport interface TagProps extends TagOwnProps {\n /** Standard <span> attributes forwarded to the tag root. */\n htmlProps?: Omit<HTMLAttributes<HTMLSpanElement>, keyof TagOwnProps> & DataAttributes;\n /** Ref to the tag root span. */\n ref?: Ref<HTMLSpanElement>;\n}\n\ninterface TagGroupOwnProps {\n /** Accessible name for the group (role=\"group\"). */\n ariaLabel?: string;\n /** The `Tag`s; adds, removals and reflow are animated. */\n children?: ReactNode;\n /** Extra class(es) merged onto the group wrapper. */\n className?: string;\n /** Inline styles merged onto the group wrapper. */\n style?: CSSProperties;\n /** Add/remove/reflow timing for the member tags - motion tokens only, or `null` to disable. */\n animation?: DisableableAnimation;\n}\n\n/** TagGroup - wrapping flex row + removal/insertion choreography. */\nexport interface TagGroupProps extends TagGroupOwnProps {\n /** Standard <div> attributes forwarded to the group wrapper. */\n htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, keyof TagGroupOwnProps> & DataAttributes;\n}\n\nfunction TagRemoveGlyph() {\n return (\n <svg viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 3 L9 9 M9 3 L3 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function Tag({\n children,\n icon = null,\n onRemove = null,\n removeLabel,\n size = 'md',\n disabled = false,\n className = '',\n style,\n htmlProps,\n ref,\n}: TagProps) {\n const cls = cx('tag', size === 'sm' && 'tag--sm', className);\n const xLabel = removeLabel || (typeof children === 'string' ? 'Remove ' + children : 'Remove');\n const group = useContext(TagGroupContext);\n\n return (\n <Motion\n as=\"span\"\n ref={ref}\n animate={group?.animate}\n exit={group?.exit}\n layout={group?.layout}\n className={cls}\n style={style}\n data-disabled={disabled ? 'true' : undefined}\n {...htmlProps}\n >\n {icon && (\n <span className=\"tag__icon\">\n <IconSlot size=\"sm\">{icon}</IconSlot>\n </span>\n )}\n <span className=\"tag__label\">{children}</span>\n {onRemove && (\n <button type=\"button\" className=\"tag__remove\" aria-label={xLabel} disabled={disabled} onClick={onRemove}>\n <TagRemoveGlyph />\n </button>\n )}\n </Motion>\n );\n}\n\nexport function TagGroup({ ariaLabel, className = '', style, children, htmlProps, animation }: TagGroupProps) {\n const step = resolveMotionTiming(animation, TAG_TIMING);\n const layout = resolveMotionTiming(animation, TAG_LAYOUT_TIMING).open;\n\n const motion = {\n animate: { opacity: [0, 1], scale: [0.9, 1], timing: step.open },\n exit: { opacity: [1, 0], scale: [1, 0.9], timing: step.close },\n layout: { timing: layout },\n };\n\n return (\n <div className={cx('tag-group', className)} style={style} role=\"group\" aria-label={ariaLabel} {...htmlProps}>\n <TagGroupContext.Provider value={motion}>\n <Presence initial={false}>{children}</Presence>\n </TagGroupContext.Provider>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/tag/Tag.tsx"],"names":[],"mappings":"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","file":"tag.js","sourcesContent":["'use client';\n\nimport './tag.css';\nimport { createContext, useContext, type CSSProperties, type HTMLAttributes, type ReactNode, type Ref } from 'react';\nimport { Presence } from '../../../motion/presence';\nimport { Motion } from '../../../motion/element';\nimport { resolveMotionTiming } from '../../../motion/motion-timing';\nimport type { DisableableAnimation } from '../../../motion/timing';\nimport type { FlipTuning } from '../../../motion/flip';\nimport type { Layer } from '../../../engine';\nimport { IconSlot } from '../../internal/icon/IconSlot';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nconst TAG_TIMING = { open: { duration: 'base', ease: 'entrance' }, close: { duration: 'fast', ease: 'exit' } } as const;\nconst TAG_LAYOUT_TIMING = {\n open: { duration: 'slow', ease: 'entrance' },\n close: { duration: 'slow', ease: 'entrance' },\n} as const;\n\ninterface TagGroupMotion {\n animate: Layer;\n exit: Layer;\n layout: FlipTuning;\n}\n\nconst TagGroupContext = createContext<TagGroupMotion | null>(null);\n\ninterface TagOwnProps {\n /** Tag content; a string label also seeds the default remove-button `aria-label`. */\n children: ReactNode;\n /** Your own icon node, sized small and tinted to the tag's text. */\n icon?: ReactNode | null;\n /** Presence adds the remove button; called on click - remove the item yourself. */\n onRemove?: (() => void) | null;\n /** Accessible label for the remove button. Defaults to \"Remove {label}\" for string labels. */\n removeLabel?: string;\n /** 'md' = 28px (default) - 'sm' = 24px for dense rows. */\n size?: 'md' | 'sm';\n /** Set `data-disabled` on the tag and disable its remove button. @default false */\n disabled?: boolean;\n /** Extra class(es) merged onto the root element. */\n className?: string;\n /** Inline styles merged onto the root element. */\n style?: CSSProperties;\n}\n\n/** Tag - the removable, editable label (stateless; the parent owns the list). */\nexport interface TagProps extends TagOwnProps {\n /** Standard <span> attributes forwarded to the tag root. */\n htmlProps?: Omit<HTMLAttributes<HTMLSpanElement>, keyof TagOwnProps> & DataAttributes;\n /** Ref to the tag root span. */\n ref?: Ref<HTMLSpanElement>;\n}\n\ninterface TagGroupOwnProps {\n /** Accessible name for the group (role=\"group\"). */\n ariaLabel?: string;\n /** The `Tag`s; adds, removals and reflow are animated. */\n children?: ReactNode;\n /** Extra class(es) merged onto the group wrapper. */\n className?: string;\n /** Inline styles merged onto the group wrapper. */\n style?: CSSProperties;\n /** Add/remove/reflow timing for the member tags - motion tokens only, or `null` to disable. */\n animation?: DisableableAnimation;\n}\n\n/** TagGroup - wrapping flex row + removal/insertion choreography. */\nexport interface TagGroupProps extends TagGroupOwnProps {\n /** Standard <div> attributes forwarded to the group wrapper. */\n htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, keyof TagGroupOwnProps> & DataAttributes;\n}\n\nfunction TagRemoveGlyph() {\n return (\n <svg viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 3 L9 9 M9 3 L3 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function Tag({\n children,\n icon = null,\n onRemove = null,\n removeLabel,\n size = 'md',\n disabled = false,\n className = '',\n style,\n htmlProps,\n ref,\n}: TagProps) {\n const cls = cx('tag', size === 'sm' && 'tag--sm', className);\n const xLabel = removeLabel || (typeof children === 'string' ? 'Remove ' + children : 'Remove');\n const group = useContext(TagGroupContext);\n\n return (\n <Motion\n as=\"span\"\n ref={ref}\n animate={group?.animate}\n exit={group?.exit}\n layout={!!group}\n layoutTransition={group?.layout}\n className={cls}\n style={style}\n data-disabled={disabled ? 'true' : undefined}\n {...htmlProps}\n >\n {icon && (\n <span className=\"tag__icon\">\n <IconSlot size=\"sm\">{icon}</IconSlot>\n </span>\n )}\n <span className=\"tag__label\">{children}</span>\n {onRemove && (\n <button type=\"button\" className=\"tag__remove\" aria-label={xLabel} disabled={disabled} onClick={onRemove}>\n <TagRemoveGlyph />\n </button>\n )}\n </Motion>\n );\n}\n\nexport function TagGroup({ ariaLabel, className = '', style, children, htmlProps, animation }: TagGroupProps) {\n const step = resolveMotionTiming(animation, TAG_TIMING);\n const layout = resolveMotionTiming(animation, TAG_LAYOUT_TIMING).open;\n\n const motion = {\n animate: { opacity: [0, 1], scale: [0.9, 1], timing: step.open },\n exit: { opacity: [1, 0], scale: [1, 0.9], timing: step.close },\n layout: { timing: layout },\n };\n\n return (\n <div className={cx('tag-group', className)} style={style} role=\"group\" aria-label={ariaLabel} {...htmlProps}>\n <TagGroupContext.Provider value={motion}>\n <Presence initial={false}>{children}</Presence>\n </TagGroupContext.Provider>\n </div>\n );\n}\n"]}
package/dist/toast.js CHANGED
@@ -1,15 +1,14 @@
1
1
  'use client';import { DEFAULT_TOASTER_CONFIG, UIToast } from './chunk-TYHR4VNM.js';
2
2
  export { toast } from './chunk-TYHR4VNM.js';
3
3
  import { tokenPx } from './chunk-UE63OOVG.js';
4
- import { Motion } from './chunk-36WVAQKL.js';
5
- import { Presence } from './chunk-MXOPCFWR.js';
6
- import './chunk-W3SHPKSB.js';
7
- import './chunk-JSKXZMLH.js';
8
- import { animate, startDrag } from './chunk-L3Q3VDIW.js';
4
+ import { Presence } from './chunk-356HZMT4.js';
5
+ import { Motion } from './chunk-2QWJ6FAX.js';
6
+ import './chunk-XWUWYSCT.js';
7
+ import { animate, startDrag } from './chunk-YGCVWGUG.js';
9
8
  import { Icon } from './chunk-3SBCBYB7.js';
10
9
  import { fireGlint } from './chunk-S7B34VGN.js';
11
10
  import { UIMotion } from './chunk-S5ZTZANS.js';
12
- import { Button } from './chunk-U5QQZC3U.js';
11
+ import { Button } from './chunk-2F5PITAO.js';
13
12
  import { cx } from './chunk-QGNC7LH5.js';
14
13
  import './toast.css';
15
14
  import { useEffect, useSyncExternalStore, useState, useRef, useLayoutEffect } from 'react';
package/dist/toast.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/toast/Toast.tsx"],"names":[],"mappings":"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","file":"toast.js","sourcesContent":["'use client';\n\nimport './toast.css';\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type FocusEvent as ReactFocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { animate, startDrag, type Layer, type Playback } from '../../../engine';\nimport { Presence } from '../../../motion/presence';\nimport { Motion } from '../../../motion/element';\nimport { UIMotion } from '../../../tokens/motion-tokens';\nimport { fireGlint } from '../../internal/glass/glint';\nimport { tokenPx } from '../../internal/utils/token-px';\nimport { Icon, type IconName } from '../../internal/icon/Icon';\nimport { Button } from '../../primitives/button/Button';\nimport { UIToast, DEFAULT_TOASTER_CONFIG, type ToastRecord, type ToastTone, type ToasterConfig } from './toast-store';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nconst SM = UIMotion;\nconst store = UIToast;\n\nconst COLLAPSE_GRACE = 140;\nconst SWIPE_X = 64;\nconst SWIPE_V = 480;\n\nlet GAP = 0;\nfunction stackGap() {\n if (!GAP) GAP = tokenPx('--space-3') || 12;\n return GAP;\n}\n\nconst TONE_ICON: Partial<Record<ToastTone, IconName>> = {\n success: 'check-circle',\n danger: 'warning-circle',\n warning: 'warning',\n info: 'info',\n};\n\nfunction useToneGesture(tone: ToastTone, ref: RefObject<HTMLElement>) {\n const prevTone = useRef<ToastTone | null>(null);\n useEffect(() => {\n const prev = prevTone.current;\n prevTone.current = tone;\n if (tone === prev) return;\n if (tone === 'success') return fireGlint(ref.current);\n if (tone === 'danger' && ref.current) {\n const shake = ref.current.firstElementChild as HTMLElement | null;\n if (!shake) return;\n const fall = animate(shake, {\n x: [0, -7, 5, -2, 0],\n timing: { duration: SM.dur.slow, ease: SM.ease.standard, delay: SM.dur.base },\n });\n fall.finished.then(() => fall.stop());\n return () => fall.stop();\n }\n }, [tone]);\n}\n\nfunction useReplay<T extends HTMLElement>(token: unknown, build: () => Layer[]) {\n const ref = useRef<T>(null);\n const latest = useRef(build);\n latest.current = build;\n useLayoutEffect(() => {\n if (ref.current) animate(ref.current, ...latest.current());\n }, [token]);\n return ref;\n}\n\nfunction ToastItem({\n t,\n depth,\n offset,\n hidden,\n behind,\n frameHeight,\n isTop,\n onHeight,\n}: {\n t: ToastRecord;\n depth: number;\n offset: number;\n hidden: boolean;\n behind: boolean;\n frameHeight: number | null;\n isTop: boolean;\n onHeight: (id: string, h: number) => void;\n}) {\n const ref = useRef<HTMLLIElement>(null);\n const settled = useRef(false);\n const swipeBack = useRef<Playback | null>(null);\n useToneGesture(t.tone, ref);\n\n useLayoutEffect(() => {\n if (ref.current && ref.current.firstElementChild)\n onHeight(t.id, (ref.current.firstElementChild as HTMLElement).offsetHeight);\n });\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.style.pointerEvents = hidden ? 'none' : 'auto';\n const y = isTop ? offset : -offset;\n const scale = 1 - depth * 0.05;\n if (settled.current) {\n animate(\n el,\n { y: [y], scale: [scale], height: [frameHeight ?? 'auto'], timing: SM.t.settle },\n { opacity: [hidden ? 0 : 1], timing: SM.t.enter },\n );\n return;\n }\n settled.current = true;\n animate(\n el,\n { y: [isTop ? -24 : 24, y], scale: [0.97, scale], timing: SM.t.settle },\n { opacity: [0, hidden ? 0 : 1], timing: SM.t.enter },\n );\n }, [offset, depth, hidden, frameHeight, isTop]);\n\n const onPointerDown = (e: ReactPointerEvent) => {\n const inner = ref.current?.firstElementChild as HTMLElement | null;\n if (!t.dismissible || e.button !== 0 || !inner) return;\n swipeBack.current?.stop();\n startDrag(e, {\n onMove: (info) => {\n const dx = info.offset.x;\n inner.style.translate = `${dx > 0 ? dx * 0.9 : dx * 0.04}px 0px`;\n },\n onEnd: (info) => {\n if (info.offset.x > SWIPE_X || info.velocity.x > SWIPE_V) {\n animate(inner, { x: [420], timing: SM.t.exit }).finished.then(() => store.dismiss(t.id));\n return;\n }\n const back = animate(inner, { x: [0], timing: SM.t.settle });\n swipeBack.current = back;\n back.finished.then(() => back.stop());\n },\n });\n };\n\n return (\n <Motion\n as=\"li\"\n ref={ref}\n exit={{ opacity: [0], scale: [0.96], timing: SM.t.exit }}\n className=\"toast glass\"\n data-tone={t.tone}\n data-behind={behind ? '' : undefined}\n role={t.tone === 'danger' ? 'alert' : 'status'}\n aria-atomic=\"true\"\n onPointerDown={onPointerDown}\n onKeyDown={(e: ReactKeyboardEvent) => {\n if (e.key === 'Escape' && t.dismissible) store.dismiss(t.id);\n }}\n >\n {t.node ? <div className=\"toast__custom\">{t.node as ReactNode}</div> : <ToastBody t={t} />}\n </Motion>\n );\n}\n\nfunction ToastBody({ t }: { t: ToastRecord }) {\n const glyphRef = useReplay<HTMLSpanElement>(t.tone, () => [\n { scale: [0.5, 1], timing: SM.t.settle },\n { opacity: [0, 1], timing: SM.t.enter },\n ]);\n const textRef = useReplay<HTMLDivElement>(String(t.message) + '-' + String(t.description), () => [\n { opacity: [0, 1], timing: SM.t.enter },\n ]);\n const countRef = useReplay<HTMLSpanElement>(t.count, () => [{ scale: [0.6, 1], timing: SM.t.settle }]);\n\n return (\n <div className=\"toast__inner\">\n {(t.tone !== 'default' || isFinite(t.duration)) && (\n <span className=\"toast__icon\">\n {t.tone !== 'default' && (\n <span ref={glyphRef} className=\"toast__icon-glyph\">\n {t.tone === 'loading' ? (\n <span className=\"toast__spinner\" aria-hidden=\"true\"></span>\n ) : (\n <Icon name={TONE_ICON[t.tone] || 'info'} weight=\"fill\" />\n )}\n </span>\n )}\n {isFinite(t.duration) && (\n <svg key={'ring-' + t.timerKey} className=\"toast__ring\" viewBox=\"0 0 36 36\" aria-hidden=\"true\">\n <circle className=\"toast__ring-track\" cx=\"18\" cy=\"18\" r=\"16.5\"></circle>\n <circle\n className=\"toast__ring-arc\"\n cx=\"18\"\n cy=\"18\"\n r=\"16.5\"\n pathLength={1}\n style={{ animationDuration: t.duration + 'ms' }}\n ></circle>\n </svg>\n )}\n </span>\n )}\n <div ref={textRef} className=\"toast__text\">\n <p className=\"toast__message\">{t.message}</p>\n {t.description != null && <p className=\"toast__desc\">{t.description}</p>}\n </div>\n {t.count > 1 && (\n <span ref={countRef} className=\"toast__count\">\n ×{t.count}\n </span>\n )}\n {t.action && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n className=\"toast__action\"\n onClick={() => {\n if (t.action.onClick) t.action.onClick();\n store.dismiss(t.id);\n }}\n >\n {t.action.label}\n </Button>\n )}\n {t.dismissible && (\n <button type=\"button\" className=\"toast__close\" aria-label=\"Dismiss\" onClick={() => store.dismiss(t.id)}>\n <Icon name=\"close\" size=\"sm\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction ToastHost({ config, htmlProps }: { config: ToasterConfig; htmlProps?: HTMLAttributes<HTMLOListElement> }) {\n const { toasts, paused, expanded: hoverExpanded } = useSyncExternalStore(store.subscribe, store.get, store.get);\n const [heights, setHeights] = useState<Record<string, number>>({});\n const [ready, setReady] = useState(false);\n const collapseTimer = useRef<ReturnType<typeof setTimeout> | 0>(0);\n const hovering = useRef(false);\n\n useEffect(() => setReady(true), []);\n\n const onHeight = (id: string, h: number) => setHeights((prev) => (prev[id] === h ? prev : { ...prev, [id]: h }));\n\n const onHold = () => {\n hovering.current = true;\n clearTimeout(collapseTimer.current);\n store.setExpanded(true);\n store.pause();\n };\n const onRelease = (graced: boolean) => {\n hovering.current = false;\n clearTimeout(collapseTimer.current);\n collapseTimer.current = setTimeout(\n () => {\n store.setExpanded(false);\n store.resume();\n },\n graced ? COLLAPSE_GRACE : 0,\n );\n };\n\n useEffect(() => {\n const onVis = () => {\n if (document.hidden) store.pause();\n else if (!hovering.current) store.resume();\n };\n document.addEventListener('visibilitychange', onVis);\n return () => document.removeEventListener('visibilitychange', onVis);\n }, []);\n\n useEffect(() => {\n if (toasts.length === 0) {\n hovering.current = false;\n clearTimeout(collapseTimer.current);\n store.setExpanded(false);\n store.resume();\n }\n }, [toasts.length]);\n\n if (!ready) return null;\n\n const isTop = config.position.startsWith('top');\n const visible = config.visibleToasts;\n const rendered = visible * 2;\n const gap = config.gap || stackGap();\n const expanded = config.expand || hoverExpanded;\n\n const slice = toasts.slice(-rendered);\n const n = slice.length;\n const frontH = n ? heights[slice[n - 1].id] || 0 : 0;\n\n return createPortal(\n <ol\n {...htmlProps}\n className={cx('toast-viewport', paused && 'is-paused', htmlProps?.className)}\n data-position={config.position}\n style={\n config.offset\n ? ({ ...htmlProps?.style, '--toast-offset': `${config.offset}px` } as CSSProperties)\n : htmlProps?.style\n }\n aria-label=\"Notifications\"\n onPointerOver={(e: ReactPointerEvent<HTMLOListElement>) => {\n if (e.pointerType !== 'touch') onHold();\n }}\n onPointerOut={(e: ReactPointerEvent<HTMLOListElement>) => {\n if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget as Node)) onRelease(true);\n }}\n onFocus={onHold}\n onBlur={(e: ReactFocusEvent<HTMLOListElement>) => {\n if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget as Node)) onRelease(false);\n }}\n >\n <Presence>\n {slice.map((t, i) => {\n const depth = n - 1 - i;\n let offset = depth * gap;\n if (expanded) {\n offset = 0;\n for (let j = i + 1; j < n; j++) offset += (heights[slice[j].id] || 0) + gap;\n }\n return (\n <ToastItem\n key={t.id}\n t={t}\n depth={expanded ? 0 : depth}\n offset={offset}\n hidden={!expanded && depth >= visible}\n behind={!expanded && depth > 0}\n frameHeight={!expanded && depth > 0 && frontH ? frontH : null}\n isTop={isTop}\n onHeight={onHeight}\n />\n );\n })}\n </Presence>\n </ol>,\n document.body,\n );\n}\n\nfunction stripUndefined<T extends object>(o: T): Partial<T> {\n const out: Partial<T> = {};\n (Object.keys(o) as (keyof T)[]).forEach((k) => {\n if (o[k] !== undefined) out[k] = o[k];\n });\n return out;\n}\n\nexport interface ToasterProps extends Partial<ToasterConfig> {\n /** Standard <ol> attributes (className, style, data-*, ...) forwarded to the toast viewport. */\n htmlProps?: HTMLAttributes<HTMLOListElement> & DataAttributes;\n}\n\nexport function Toaster({ htmlProps, ...props }: ToasterProps): ReactElement {\n const config: ToasterConfig = { ...DEFAULT_TOASTER_CONFIG, ...stripUndefined(props) };\n\n useEffect(() => {\n store.config = config;\n store.mounted = true;\n if (config.expand) store.setExpanded(true);\n return () => {\n store.mounted = false;\n };\n }, [config.position, config.duration, config.visibleToasts, config.gap, config.offset, config.expand]);\n\n return <ToastHost config={config} htmlProps={htmlProps} />;\n}\n\nexport { toast } from './toast-store';\n"]}
1
+ {"version":3,"sources":["../src/components/composites/toast/Toast.tsx"],"names":[],"mappings":"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","file":"toast.js","sourcesContent":["'use client';\n\nimport './toast.css';\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type FocusEvent as ReactFocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { animate, startDrag, type Layer, type Playback } from '../../../engine';\nimport { Presence } from '../../../motion/presence';\nimport { Motion } from '../../../motion/element';\nimport { UIMotion } from '../../../tokens/motion-tokens';\nimport { fireGlint } from '../../internal/glass/glint';\nimport { tokenPx } from '../../internal/utils/token-px';\nimport { Icon, type IconName } from '../../internal/icon/Icon';\nimport { Button } from '../../primitives/button/Button';\nimport { UIToast, DEFAULT_TOASTER_CONFIG, type ToastRecord, type ToastTone, type ToasterConfig } from './toast-store';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nconst SM = UIMotion;\nconst store = UIToast;\n\nconst COLLAPSE_GRACE = 140;\nconst SWIPE_X = 64;\nconst SWIPE_V = 480;\n\nlet GAP = 0;\nfunction stackGap() {\n if (!GAP) GAP = tokenPx('--space-3') || 12;\n return GAP;\n}\n\nconst TONE_ICON: Partial<Record<ToastTone, IconName>> = {\n success: 'check-circle',\n danger: 'warning-circle',\n warning: 'warning',\n info: 'info',\n};\n\nfunction useToneGesture(tone: ToastTone, ref: RefObject<HTMLElement>) {\n const prevTone = useRef<ToastTone | null>(null);\n useEffect(() => {\n const prev = prevTone.current;\n prevTone.current = tone;\n if (tone === prev) return;\n if (tone === 'success') return fireGlint(ref.current);\n if (tone === 'danger' && ref.current) {\n const shake = ref.current.firstElementChild as HTMLElement | null;\n if (!shake) return;\n const fall = animate(shake, {\n x: [0, -7, 5, -2, 0],\n timing: { duration: SM.dur.slow, ease: SM.ease.standard, delay: SM.dur.base },\n });\n fall.finished.then(() => fall.stop());\n return () => fall.stop();\n }\n }, [tone]);\n}\n\nfunction useReplay<T extends HTMLElement>(token: unknown, build: () => Layer[]) {\n const ref = useRef<T>(null);\n const latest = useRef(build);\n latest.current = build;\n useLayoutEffect(() => {\n if (ref.current) animate(ref.current, ...latest.current());\n }, [token]);\n return ref;\n}\n\nfunction ToastItem({\n t,\n depth,\n offset,\n hidden,\n behind,\n frameHeight,\n isTop,\n onHeight,\n}: {\n t: ToastRecord;\n depth: number;\n offset: number;\n hidden: boolean;\n behind: boolean;\n frameHeight: number | null;\n isTop: boolean;\n onHeight: (id: string, h: number) => void;\n}) {\n const ref = useRef<HTMLLIElement>(null);\n const settled = useRef(false);\n const swipeBack = useRef<Playback | null>(null);\n useToneGesture(t.tone, ref);\n\n useLayoutEffect(() => {\n if (ref.current && ref.current.firstElementChild)\n onHeight(t.id, (ref.current.firstElementChild as HTMLElement).offsetHeight);\n });\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.style.pointerEvents = hidden ? 'none' : 'auto';\n const y = isTop ? offset : -offset;\n const scale = 1 - depth * 0.05;\n if (settled.current) {\n animate(\n el,\n { y: [y], scale: [scale], height: [frameHeight ?? 'auto'], timing: SM.t.settle },\n { opacity: [hidden ? 0 : 1], timing: SM.t.enter },\n );\n return;\n }\n settled.current = true;\n animate(\n el,\n { y: [isTop ? -24 : 24, y], scale: [0.97, scale], timing: SM.t.settle },\n { opacity: [0, hidden ? 0 : 1], timing: SM.t.enter },\n );\n }, [offset, depth, hidden, frameHeight, isTop]);\n\n const onPointerDown = (e: ReactPointerEvent) => {\n const inner = ref.current?.firstElementChild as HTMLElement | null;\n if (!t.dismissible || e.button !== 0 || !inner) return;\n swipeBack.current?.stop();\n startDrag(e, {\n onMove: (info) => {\n const dx = info.offset.x;\n inner.style.translate = `${dx > 0 ? dx * 0.9 : dx * 0.04}px 0px`;\n },\n onEnd: (info) => {\n if (info.offset.x > SWIPE_X || info.velocity.x > SWIPE_V) {\n animate(inner, { x: [420], timing: SM.t.exit }).finished.then(() => store.dismiss(t.id));\n return;\n }\n const back = animate(inner, { x: [0], timing: SM.t.settle });\n swipeBack.current = back;\n back.finished.then(() => back.stop());\n },\n });\n };\n\n return (\n <Motion\n as=\"li\"\n ref={ref}\n exit={{ opacity: [0], scale: [0.96], timing: SM.t.exit }}\n className=\"toast glass\"\n data-tone={t.tone}\n data-behind={behind ? '' : undefined}\n role={t.tone === 'danger' ? 'alert' : 'status'}\n aria-atomic=\"true\"\n onPointerDown={onPointerDown}\n onKeyDown={(e: ReactKeyboardEvent) => {\n if (e.key === 'Escape' && t.dismissible) store.dismiss(t.id);\n }}\n >\n {t.node ? <div className=\"toast__custom\">{t.node as ReactNode}</div> : <ToastBody t={t} />}\n </Motion>\n );\n}\n\nfunction ToastBody({ t }: { t: ToastRecord }) {\n const glyphRef = useReplay<HTMLSpanElement>(t.tone, () => [\n { scale: [0.5, 1], timing: SM.t.settle },\n { opacity: [0, 1], timing: SM.t.enter },\n ]);\n const textRef = useReplay<HTMLDivElement>(String(t.message) + '-' + String(t.description), () => [\n { opacity: [0, 1], timing: SM.t.enter },\n ]);\n const countRef = useReplay<HTMLSpanElement>(t.count, () => [{ scale: [0.6, 1], timing: SM.t.settle }]);\n\n return (\n <div className=\"toast__inner\">\n {(t.tone !== 'default' || isFinite(t.duration)) && (\n <span className=\"toast__icon\">\n {t.tone !== 'default' && (\n <span ref={glyphRef} className=\"toast__icon-glyph\">\n {t.tone === 'loading' ? (\n <span className=\"toast__spinner\" aria-hidden=\"true\"></span>\n ) : (\n <Icon name={TONE_ICON[t.tone] || 'info'} weight=\"fill\" />\n )}\n </span>\n )}\n {isFinite(t.duration) && (\n <svg key={'ring-' + t.timerKey} className=\"toast__ring\" viewBox=\"0 0 36 36\" aria-hidden=\"true\">\n <circle className=\"toast__ring-track\" cx=\"18\" cy=\"18\" r=\"16.5\"></circle>\n <circle\n className=\"toast__ring-arc\"\n cx=\"18\"\n cy=\"18\"\n r=\"16.5\"\n pathLength={1}\n style={{ animationDuration: t.duration + 'ms' }}\n ></circle>\n </svg>\n )}\n </span>\n )}\n <div ref={textRef} className=\"toast__text\">\n <p className=\"toast__message\">{t.message}</p>\n {t.description != null && <p className=\"toast__desc\">{t.description}</p>}\n </div>\n {t.count > 1 && (\n <span ref={countRef} className=\"toast__count\">\n ×{t.count}\n </span>\n )}\n {t.action && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n className=\"toast__action\"\n onClick={() => {\n if (t.action.onClick) t.action.onClick();\n store.dismiss(t.id);\n }}\n >\n {t.action.label}\n </Button>\n )}\n {t.dismissible && (\n <button type=\"button\" className=\"toast__close\" aria-label=\"Dismiss\" onClick={() => store.dismiss(t.id)}>\n <Icon name=\"close\" size=\"sm\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction ToastHost({ config, htmlProps }: { config: ToasterConfig; htmlProps?: HTMLAttributes<HTMLOListElement> }) {\n const { toasts, paused, expanded: hoverExpanded } = useSyncExternalStore(store.subscribe, store.get, store.get);\n const [heights, setHeights] = useState<Record<string, number>>({});\n const [ready, setReady] = useState(false);\n const collapseTimer = useRef<ReturnType<typeof setTimeout> | 0>(0);\n const hovering = useRef(false);\n\n useEffect(() => setReady(true), []);\n\n const onHeight = (id: string, h: number) => setHeights((prev) => (prev[id] === h ? prev : { ...prev, [id]: h }));\n\n const onHold = () => {\n hovering.current = true;\n clearTimeout(collapseTimer.current);\n store.setExpanded(true);\n store.pause();\n };\n const onRelease = (graced: boolean) => {\n hovering.current = false;\n clearTimeout(collapseTimer.current);\n collapseTimer.current = setTimeout(\n () => {\n store.setExpanded(false);\n store.resume();\n },\n graced ? COLLAPSE_GRACE : 0,\n );\n };\n\n useEffect(() => {\n const onVis = () => {\n if (document.hidden) store.pause();\n else if (!hovering.current) store.resume();\n };\n document.addEventListener('visibilitychange', onVis);\n return () => document.removeEventListener('visibilitychange', onVis);\n }, []);\n\n useEffect(() => {\n if (toasts.length === 0) {\n hovering.current = false;\n clearTimeout(collapseTimer.current);\n store.setExpanded(false);\n store.resume();\n }\n }, [toasts.length]);\n\n if (!ready) return null;\n\n const isTop = config.position.startsWith('top');\n const visible = config.visibleToasts;\n const rendered = visible * 2;\n const gap = config.gap || stackGap();\n const expanded = config.expand || hoverExpanded;\n\n const slice = toasts.slice(-rendered);\n const n = slice.length;\n const frontH = n ? heights[slice[n - 1].id] || 0 : 0;\n\n return createPortal(\n <ol\n {...htmlProps}\n className={cx('toast-viewport', paused && 'is-paused', htmlProps?.className)}\n data-position={config.position}\n style={\n config.offset\n ? ({ ...htmlProps?.style, '--toast-offset': `${config.offset}px` } as CSSProperties)\n : htmlProps?.style\n }\n aria-label=\"Notifications\"\n onPointerOver={(e: ReactPointerEvent<HTMLOListElement>) => {\n if (e.pointerType !== 'touch') onHold();\n }}\n onPointerOut={(e: ReactPointerEvent<HTMLOListElement>) => {\n if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget as Node)) onRelease(true);\n }}\n onFocus={onHold}\n onBlur={(e: ReactFocusEvent<HTMLOListElement>) => {\n if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget as Node)) onRelease(false);\n }}\n >\n <Presence>\n {slice.map((t, i) => {\n const depth = n - 1 - i;\n let offset = depth * gap;\n if (expanded) {\n offset = 0;\n for (let j = i + 1; j < n; j++) offset += (heights[slice[j].id] || 0) + gap;\n }\n return (\n <ToastItem\n key={t.id}\n t={t}\n depth={expanded ? 0 : depth}\n offset={offset}\n hidden={!expanded && depth >= visible}\n behind={!expanded && depth > 0}\n frameHeight={!expanded && depth > 0 && frontH ? frontH : null}\n isTop={isTop}\n onHeight={onHeight}\n />\n );\n })}\n </Presence>\n </ol>,\n document.body,\n );\n}\n\nfunction stripUndefined<T extends object>(o: T): Partial<T> {\n const out: Partial<T> = {};\n (Object.keys(o) as (keyof T)[]).forEach((k) => {\n if (o[k] !== undefined) out[k] = o[k];\n });\n return out;\n}\n\nexport interface ToasterProps extends Partial<ToasterConfig> {\n /** Standard <ol> attributes (className, style, data-*, ...) forwarded to the toast viewport. */\n htmlProps?: HTMLAttributes<HTMLOListElement> & DataAttributes;\n}\n\nexport function Toaster({ htmlProps, ...props }: ToasterProps): ReactElement {\n const config: ToasterConfig = { ...DEFAULT_TOASTER_CONFIG, ...stripUndefined(props) };\n\n useEffect(() => {\n store.config = config;\n store.mounted = true;\n if (config.expand) store.setExpanded(true);\n return () => {\n store.mounted = false;\n };\n }, [config.position, config.duration, config.visibleToasts, config.gap, config.offset, config.expand]);\n\n return <ToastHost config={config} htmlProps={htmlProps} />;\n}\n\nexport { toast } from './toast-store';\n"]}
package/dist/tooltip.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use client';import { tokenPx } from './chunk-UE63OOVG.js';
2
- import { Presence } from './chunk-MXOPCFWR.js';
3
- import { useMotion } from './chunk-W3SHPKSB.js';
4
- import { animate } from './chunk-L3Q3VDIW.js';
2
+ import { Presence } from './chunk-356HZMT4.js';
3
+ import { useMotion } from './chunk-XWUWYSCT.js';
4
+ import { animate } from './chunk-YGCVWGUG.js';
5
5
  import { UIMotion } from './chunk-S5ZTZANS.js';
6
6
  import { cx } from './chunk-QGNC7LH5.js';
7
7
  import './tooltip.css';
package/llms.txt CHANGED
@@ -27,8 +27,9 @@ Agents: prefer the bundled MCP server over scanning this file or node_modules -
27
27
  ============================================================ PRIMITIVES
28
28
 
29
29
  Button - @zyncat/ui/button
30
- One control for every click; exactly one primary per view. variant primary|secondary|ghost|danger|link, size sm|md|lg, iconLeft/iconRight (ReactNode), loading, disabled.
31
- <Button variant="primary" iconLeft={<Icon name="plus" size="sm" />}>Schedule post</Button>
30
+ One control for every click; exactly one primary per view. variant primary|secondary|ghost|danger|link, size sm|md|lg|icon, loading, disabled. Icons are plain children - Button lays them out in a centered row with gap, no iconLeft/iconRight slots.
31
+ <Button variant="primary"><Icon name="plus" size="sm" />Schedule post</Button>
32
+ <Button size="icon" aria-label="Close"><Icon name="x" size="sm" /></Button>
32
33
 
33
34
  Collapse - @zyncat/ui/collapse
34
35
  Layout-transition primitive; eases height open/closed, never teleports. Closed content also
@@ -39,9 +40,9 @@ Collapse - @zyncat/ui/collapse
39
40
 
40
41
  Glide / GlidePill - @zyncat/ui/glide
41
42
  A persistent background pill that glides smoothly between hovered/active elements. Container must be `position: relative`.
42
- const glide = useGlide(containerRef);
43
+ const glide = useGlide(containerRef); // { ref, enter, leave } - pass the whole thing to GlidePill
43
44
  <nav ref={containerRef} onPointerLeave={glide.leave}>
44
- <GlidePill rect={glide.rect} active={glide.active} className="my-pill" />
45
+ <GlidePill glide={glide} className="my-pill" />
45
46
  <button onPointerEnter={(e) => glide.enter(e.currentTarget)}>Item 1</button>
46
47
  </nav>
47
48
 
@@ -119,11 +120,11 @@ ToggleTag - @zyncat/ui/toggle-tag
119
120
 
120
121
  Table - @zyncat/ui/table
121
122
  Declare columns + rows; owns sort, selection, stickiness, overflow. columns: TableColumn<T>[] ({ key, label, render?, sortable?, sortBy?, align?, mono?, strong?, grow? }); selectable, defaultSort, footer.
122
- <Table<Invoice> label="Invoices" columns={COLUMNS} rows={INVOICES} selectable defaultSort={{ key: 'amount', dir: 'desc' }} />
123
+ <Table<Invoice> ariaLabel="Invoices" columns={COLUMNS} rows={INVOICES} selectable defaultSort={{ key: 'amount', dir: 'desc' }} />
123
124
 
124
125
  Pagination - @zyncat/ui/pagination
125
- Cursor strip: mono range readout + prev/next pair. range: [from,to], total?, hasPrev/hasNext, onPrev/onNext.
126
- <Pagination label="Rows" range={[from, to]} total={312} hasPrev hasNext onPrev={...} onNext={...} />
126
+ Cursor strip: mono range readout + prev/next pair. range: [from,to], total?, hasPrev/hasNext, onPrev/onNext, ariaLabel.
127
+ <Pagination ariaLabel="Rows" range={[from, to]} total={312} hasPrev hasNext onPrev={...} onNext={...} />
127
128
 
128
129
  ============================================================ DATE, TIME & TABS
129
130
  (value is a string; onChange(value | null); timezone, min/max, disabled)
@@ -146,7 +147,7 @@ TimeField - @zyncat/ui/time-field
146
147
 
147
148
  Tabs / TabPanel - @zyncat/ui/tabs
148
149
  Line tabs; the ink reaches then releases; panels enter from the side you moved toward. items: TabItem[]; value/onChange(value, dir). Pair with <TabPanel name tab dir>.
149
- <Tabs name="views" label="Workspace views" value={view} onChange={(v, d) => { setView(v); setDir(d); }} items={items} />
150
+ <Tabs name="views" ariaLabel="Workspace views" value={view} onChange={(v, d) => { setView(v); setDir(d); }} items={items} />
150
151
  <TabPanel name="views" tab={view} dir={dir}>...</TabPanel>
151
152
 
152
153
  ============================================================ OVERLAYS & FEEDBACK
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zyncat/ui",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "description": "A React 19 design system: accessible, animated UI components built on a small, closed CSS design-token vocabulary. No Tailwind, no CSS-in-JS.",
5
5
  "keywords": [
6
6
  "react",
@@ -230,14 +230,6 @@
230
230
  "next.mjs",
231
231
  "next.d.mts"
232
232
  ],
233
- "scripts": {
234
- "build": "tsup",
235
- "typecheck": "tsc --noEmit && tsc -p tsconfig.node.json",
236
- "check:css": "node scripts/check-css-graph.mjs",
237
- "format": "prettier --write .",
238
- "format:check": "prettier --check .",
239
- "prepublishOnly": "pnpm build"
240
- },
241
233
  "peerDependencies": {
242
234
  "react": "^19",
243
235
  "react-dom": "^19"
@@ -253,5 +245,14 @@
253
245
  "react-dom": "^19.2.7",
254
246
  "tsup": "^8.5.0",
255
247
  "typescript": "~6.0.3"
248
+ },
249
+ "scripts": {
250
+ "build": "tsup",
251
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.node.json",
252
+ "check:css": "node scripts/check-css-graph.mjs",
253
+ "check:llms": "node scripts/check-llms.mjs",
254
+ "format": "prettier --write .",
255
+ "format:check": "prettier --check .",
256
+ "dev": "cd playground && pnpm dev"
256
257
  }
257
- }
258
+ }
@@ -7,11 +7,13 @@ import { UIMotion } from '../../../tokens/motion-tokens';
7
7
  import { Icon } from '../../internal/icon/Icon';
8
8
  import { Button } from '../../primitives/button/Button';
9
9
  import { GlidePill, useGlide } from '../../../motion/glide';
10
- import { useSharedFlip } from '../../../motion/flip';
10
+ import { Motion } from '../../../motion/element';
11
11
  import { useDayFocus } from './use-day-focus';
12
12
  import { MONTHS, DOW, toKey, parse, col, today, grid, tzLabel, within } from './date-utils';
13
13
  import { cx } from '../../internal/utils/cx';
14
14
 
15
+ const PILL_FLIP = { timing: UIMotion.t.settle };
16
+
15
17
  interface DtpPanelProps {
16
18
  val: string | null;
17
19
  commit: (key: string) => void;
@@ -34,7 +36,6 @@ export function DtpPanel({ val, commit, min, max, timezone, label, close, slot }
34
36
  const pillId = 'dtp-pill-' + uid;
35
37
 
36
38
  const glide = useGlide(daysRef);
37
- const pillRef = useSharedFlip<HTMLSpanElement>(pillId, { timing: UIMotion.t.settle });
38
39
 
39
40
  const inRange = (key: string): boolean => within(key, min, max);
40
41
 
@@ -190,7 +191,15 @@ export function DtpPanel({ val, commit, min, max, timezone, label, close, slot }
190
191
  onClick={() => pickDay(key)}
191
192
  onPointerEnter={(e) => glide.enter(e.currentTarget)}
192
193
  >
193
- {sel ? <span className="dtp__pill" aria-hidden="true" ref={pillRef}></span> : null}
194
+ {sel ? (
195
+ <Motion
196
+ as="span"
197
+ layoutId={pillId}
198
+ layoutTransition={PILL_FLIP}
199
+ className="dtp__pill"
200
+ aria-hidden="true"
201
+ />
202
+ ) : null}
194
203
  <span className="dtp__num">{d.getDate()}</span>
195
204
  {key === todayKey ? <span className="dtp__dot" aria-hidden="true"></span> : null}
196
205
  </button>
@@ -6,10 +6,12 @@ import { UIMotion } from '../../../tokens/motion-tokens';
6
6
  import { Icon } from '../../internal/icon/Icon';
7
7
  import { Button } from '../../primitives/button/Button';
8
8
  import { GlidePill, useGlide } from '../../../motion/glide';
9
- import { useSharedFlip } from '../../../motion/flip';
9
+ import { Motion } from '../../../motion/element';
10
10
  import { useDayFocus } from './use-day-focus';
11
11
  import { MONTHS, DOW, pad, toKey, parse, today, add, col, grid, tzLabel, within } from './date-utils';
12
12
 
13
+ const CAP_FLIP = { timing: UIMotion.t.settle };
14
+
13
15
  /** A date range as wall-clock 'YYYY-MM-DD' endpoints, inclusive. */
14
16
  export interface DateRange {
15
17
  /** Range start, inclusive - `'YYYY-MM-DD'`. */
@@ -87,8 +89,8 @@ export function DrpPanel({ value, commit, close, min, max, timezone, label, mont
87
89
  const uid = useId();
88
90
  const gridGlide = useGlide(daysRef);
89
91
  const presetGlide = useGlide(presetsRef);
90
- const capLoRef = useSharedFlip<HTMLSpanElement>('drp-cap-lo-' + uid, { timing: UIMotion.t.settle });
91
- const capHiRef = useSharedFlip<HTMLSpanElement>('drp-cap-hi-' + uid, { timing: UIMotion.t.settle });
92
+ const capLoId = 'drp-cap-lo-' + uid;
93
+ const capHiId = 'drp-cap-hi-' + uid;
92
94
 
93
95
  const inBounds = (key: string): boolean => within(key, min, max);
94
96
 
@@ -227,10 +229,22 @@ export function DrpPanel({ value, commit, close, min, max, timezone, label, mont
227
229
  >
228
230
  {band ? <span className={bandCls.join(' ')} aria-hidden="true"></span> : null}
229
231
  {loCap ? (
230
- <span className={'drp__cap' + (loGhost ? ' drp__cap--ghost' : '')} aria-hidden="true" ref={capLoRef}></span>
232
+ <Motion
233
+ as="span"
234
+ layoutId={capLoId}
235
+ layoutTransition={CAP_FLIP}
236
+ className={'drp__cap' + (loGhost ? ' drp__cap--ghost' : '')}
237
+ aria-hidden="true"
238
+ />
231
239
  ) : null}
232
240
  {hiCap ? (
233
- <span className={'drp__cap' + (hiGhost ? ' drp__cap--ghost' : '')} aria-hidden="true" ref={capHiRef}></span>
241
+ <Motion
242
+ as="span"
243
+ layoutId={capHiId}
244
+ layoutTransition={CAP_FLIP}
245
+ className={'drp__cap' + (hiGhost ? ' drp__cap--ghost' : '')}
246
+ aria-hidden="true"
247
+ />
234
248
  ) : null}
235
249
  <span className="dtp__num">{d.getDate()}</span>
236
250
  {key === todayKey ? <span className="dtp__dot" aria-hidden="true"></span> : null}
@@ -51,24 +51,20 @@ export function SelectTrigger({
51
51
  ...htmlProps,
52
52
  }}
53
53
  onClick={() => (open ? requestClose() : show())}
54
- iconRight={
55
- <span className="select__caret">
56
- <Icon name="caret-down" size="sm" />
57
- </span>
58
- }
59
- iconLeft={
60
- leading && (
61
- <span className="select__leading">
62
- <IconSlot size="sm">{leading}</IconSlot>
63
- </span>
64
- )
65
- }
66
54
  {...rest}
67
55
  >
56
+ {leading && (
57
+ <span className="select__leading">
58
+ <IconSlot size="sm">{leading}</IconSlot>
59
+ </span>
60
+ )}
68
61
  <span className="select__value" data-placeholder={isPlaceholder ? 'true' : undefined}>
69
62
  {text}
70
63
  </span>
71
64
  {count != null && count > 0 && <span className="select__count">+{count}</span>}
65
+ <span className="select__caret">
66
+ <Icon name="caret-down" size="sm" />
67
+ </span>
72
68
  </Button>
73
69
  );
74
70
  }
@@ -12,6 +12,8 @@ import { Odometer } from '../../primitives/badge/odometer';
12
12
  import { useScrollEdges } from '../../internal/hooks/use-scroll-edges';
13
13
  import { cx } from '../../internal/utils/cx';
14
14
 
15
+ const ROW_FLIP = { timing: UIMotion.t.layout };
16
+
15
17
  export type TableAlign = 'start' | 'end' | 'center';
16
18
  export type TableHideBelow = 'sm' | 'md';
17
19
 
@@ -216,7 +218,6 @@ export function Table<Row = any>({
216
218
  return a;
217
219
  }
218
220
 
219
- const t = UIMotion.t;
220
221
  const colCount = columns.length + (selectable ? 1 : 0);
221
222
  const showEmpty = !loading && sortedRows.length === 0;
222
223
  const checkCellCls = 'tbl__cell--check' + (pinFirst ? ' tbl__cell--pin' : '');
@@ -328,7 +329,8 @@ export function Table<Row = any>({
328
329
  <Motion
329
330
  as="tr"
330
331
  key={k}
331
- layout={{ timing: t.layout }}
332
+ layout
333
+ layoutTransition={ROW_FLIP}
332
334
  className="tbl__row"
333
335
  data-selected={isSel ? '' : undefined}
334
336
  onClick={onRowClick ? () => onRowClick(row) : undefined}