@zyncat/ui 0.8.0 → 0.9.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/alert.js +5 -6
- package/dist/alert.js.map +1 -1
- package/dist/chunk-2QWJ6FAX.js +78 -0
- package/dist/chunk-2QWJ6FAX.js.map +1 -0
- package/dist/{chunk-MXOPCFWR.js → chunk-356HZMT4.js} +25 -4
- package/dist/chunk-356HZMT4.js.map +1 -0
- package/dist/{chunk-2HORSLXJ.js → chunk-7RNRLIKT.js} +16 -7
- package/dist/chunk-7RNRLIKT.js.map +1 -0
- package/dist/{chunk-4R2GQO43.js → chunk-FLO4A6BI.js} +4 -4
- package/dist/{chunk-4R2GQO43.js.map → chunk-FLO4A6BI.js.map} +1 -1
- package/dist/{chunk-XZAEIQDR.js → chunk-GLT5IKQY.js} +5 -5
- package/dist/{chunk-XZAEIQDR.js.map → chunk-GLT5IKQY.js.map} +1 -1
- package/dist/{chunk-QMSJZCK3.js → chunk-Q5B7JTSR.js} +5 -5
- package/dist/{chunk-QMSJZCK3.js.map → chunk-Q5B7JTSR.js.map} +1 -1
- package/dist/{chunk-O4N2OBTR.js → chunk-W5YM2FV4.js} +4 -4
- package/dist/{chunk-O4N2OBTR.js.map → chunk-W5YM2FV4.js.map} +1 -1
- package/dist/{chunk-MKIQFK7S.js → chunk-WM5J5TDI.js} +3 -3
- package/dist/{chunk-MKIQFK7S.js.map → chunk-WM5J5TDI.js.map} +1 -1
- package/dist/{chunk-W3SHPKSB.js → chunk-XWUWYSCT.js} +16 -6
- package/dist/chunk-XWUWYSCT.js.map +1 -0
- package/dist/{chunk-L3Q3VDIW.js → chunk-YGCVWGUG.js} +6 -32
- package/dist/chunk-YGCVWGUG.js.map +1 -0
- package/dist/date-field.js +7 -7
- package/dist/date-range-field.js +31 -12
- package/dist/date-range-field.js.map +1 -1
- package/dist/datetime-field.js +7 -7
- package/dist/dialog.js +4 -4
- package/dist/glide.js +2 -2
- package/dist/motion-devtools.js +1 -1
- package/dist/multi-select.js +5 -5
- package/dist/pagination.js +1 -1
- package/dist/popover.js +4 -4
- package/dist/radio-group.js +36 -9
- package/dist/radio-group.js.map +1 -1
- package/dist/select.js +5 -5
- package/dist/sheet.js +5 -5
- package/dist/table.js +6 -6
- package/dist/table.js.map +1 -1
- package/dist/tabs.js +2 -2
- package/dist/tag.js +7 -7
- package/dist/tag.js.map +1 -1
- package/dist/toast.js +4 -5
- package/dist/toast.js.map +1 -1
- package/dist/tooltip.js +3 -3
- package/llms.txt +6 -6
- package/package.json +2 -1
- package/src/components/composites/date-picker/calendar-panel.tsx +12 -3
- package/src/components/composites/date-picker/range-panel.tsx +19 -5
- package/src/components/composites/table/Table.tsx +4 -2
- package/src/components/primitives/radio-group/RadioGroup.tsx +26 -7
- package/src/components/primitives/tag/Tag.tsx +2 -1
- package/src/engine/ease.ts +7 -39
- package/src/engine/index.ts +1 -11
- package/src/motion/element.tsx +9 -9
- package/src/motion/flip.ts +61 -0
- package/src/motion/presence-context.ts +4 -3
- package/src/motion/presence.tsx +25 -1
- package/src/motion/use-motion.ts +13 -2
- package/dist/chunk-2HORSLXJ.js.map +0 -1
- package/dist/chunk-36WVAQKL.js +0 -40
- package/dist/chunk-36WVAQKL.js.map +0 -1
- package/dist/chunk-JSKXZMLH.js +0 -67
- package/dist/chunk-JSKXZMLH.js.map +0 -1
- package/dist/chunk-L3Q3VDIW.js.map +0 -1
- package/dist/chunk-MXOPCFWR.js.map +0 -1
- package/dist/chunk-W3SHPKSB.js.map +0 -1
- 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-
|
|
2
|
+
import { useGlide, GlidePill } from './chunk-WM5J5TDI.js';
|
|
3
3
|
import { resolveMotionTiming } from './chunk-NEF5XAHG.js';
|
|
4
|
-
import { animate } from './chunk-
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
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
|
|
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":"
|
|
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,11 +1,10 @@
|
|
|
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 {
|
|
5
|
-
import {
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
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';
|
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-
|
|
3
|
-
import { useMotion } from './chunk-
|
|
4
|
-
import { animate } from './chunk-
|
|
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
|
@@ -39,9 +39,9 @@ Collapse - @zyncat/ui/collapse
|
|
|
39
39
|
|
|
40
40
|
Glide / GlidePill - @zyncat/ui/glide
|
|
41
41
|
A persistent background pill that glides smoothly between hovered/active elements. Container must be `position: relative`.
|
|
42
|
-
const glide = useGlide(containerRef);
|
|
42
|
+
const glide = useGlide(containerRef); // { ref, enter, leave } - pass the whole thing to GlidePill
|
|
43
43
|
<nav ref={containerRef} onPointerLeave={glide.leave}>
|
|
44
|
-
<GlidePill
|
|
44
|
+
<GlidePill glide={glide} className="my-pill" />
|
|
45
45
|
<button onPointerEnter={(e) => glide.enter(e.currentTarget)}>Item 1</button>
|
|
46
46
|
</nav>
|
|
47
47
|
|
|
@@ -119,11 +119,11 @@ ToggleTag - @zyncat/ui/toggle-tag
|
|
|
119
119
|
|
|
120
120
|
Table - @zyncat/ui/table
|
|
121
121
|
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>
|
|
122
|
+
<Table<Invoice> ariaLabel="Invoices" columns={COLUMNS} rows={INVOICES} selectable defaultSort={{ key: 'amount', dir: 'desc' }} />
|
|
123
123
|
|
|
124
124
|
Pagination - @zyncat/ui/pagination
|
|
125
|
-
Cursor strip: mono range readout + prev/next pair. range: [from,to], total?, hasPrev/hasNext, onPrev/onNext.
|
|
126
|
-
<Pagination
|
|
125
|
+
Cursor strip: mono range readout + prev/next pair. range: [from,to], total?, hasPrev/hasNext, onPrev/onNext, ariaLabel.
|
|
126
|
+
<Pagination ariaLabel="Rows" range={[from, to]} total={312} hasPrev hasNext onPrev={...} onNext={...} />
|
|
127
127
|
|
|
128
128
|
============================================================ DATE, TIME & TABS
|
|
129
129
|
(value is a string; onChange(value | null); timezone, min/max, disabled)
|
|
@@ -146,7 +146,7 @@ TimeField - @zyncat/ui/time-field
|
|
|
146
146
|
|
|
147
147
|
Tabs / TabPanel - @zyncat/ui/tabs
|
|
148
148
|
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"
|
|
149
|
+
<Tabs name="views" ariaLabel="Workspace views" value={view} onChange={(v, d) => { setView(v); setDir(d); }} items={items} />
|
|
150
150
|
<TabPanel name="views" tab={view} dir={dir}>...</TabPanel>
|
|
151
151
|
|
|
152
152
|
============================================================ OVERLAYS & FEEDBACK
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zyncat/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
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",
|
|
@@ -234,6 +234,7 @@
|
|
|
234
234
|
"build": "tsup",
|
|
235
235
|
"typecheck": "tsc --noEmit && tsc -p tsconfig.node.json",
|
|
236
236
|
"check:css": "node scripts/check-css-graph.mjs",
|
|
237
|
+
"check:llms": "node scripts/check-llms.mjs",
|
|
237
238
|
"format": "prettier --write .",
|
|
238
239
|
"format:check": "prettier --check .",
|
|
239
240
|
"prepublishOnly": "pnpm build"
|
|
@@ -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 {
|
|
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 ?
|
|
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 {
|
|
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
|
|
91
|
-
const
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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}
|
|
@@ -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
|
|
332
|
+
layout
|
|
333
|
+
layoutTransition={ROW_FLIP}
|
|
332
334
|
className="tbl__row"
|
|
333
335
|
data-selected={isSel ? '' : undefined}
|
|
334
336
|
onClick={onRowClick ? () => onRowClick(row) : undefined}
|
|
@@ -6,13 +6,15 @@ import { Icon } from '../../internal/icon/Icon';
|
|
|
6
6
|
import { IconSlot } from '../../internal/icon/IconSlot';
|
|
7
7
|
import { Collapse } from '../collapse/Collapse';
|
|
8
8
|
import { GlidePill, useGlide } from '../../../motion/glide';
|
|
9
|
-
import {
|
|
9
|
+
import { Motion } from '../../../motion/element';
|
|
10
10
|
import { UIMotion } from '../../../tokens/motion-tokens';
|
|
11
11
|
import type { DataAttributes } from '../../../dom-props';
|
|
12
12
|
import { cx } from '../../internal/utils/cx';
|
|
13
13
|
import type { FieldRequirementProps } from '../input/field-chrome';
|
|
14
14
|
|
|
15
15
|
const SM = UIMotion;
|
|
16
|
+
const LAYOUT_FLIP = { timing: SM.t.layout };
|
|
17
|
+
const HOVER_FLIP = { scale: false, timing: SM.t.layout };
|
|
16
18
|
|
|
17
19
|
export interface RadioOption {
|
|
18
20
|
/** The stored value - what `onChange` returns and `value` matches. */
|
|
@@ -83,9 +85,6 @@ export function RadioGroup({
|
|
|
83
85
|
const [hovered, setHovered] = useState<string | null>(null);
|
|
84
86
|
const optionsRef = useRef<HTMLDivElement>(null);
|
|
85
87
|
const glide = useGlide(optionsRef);
|
|
86
|
-
const markerRef = useSharedFlip<HTMLSpanElement>(groupId + ':marker', { timing: SM.t.layout });
|
|
87
|
-
const fillRef = useSharedFlip<HTMLSpanElement>(groupId + ':card-fill', { timing: SM.t.layout });
|
|
88
|
-
const cardHoverRef = useSharedFlip<HTMLSpanElement>(groupId + ':card-hover', { scale: false, timing: SM.t.layout });
|
|
89
88
|
|
|
90
89
|
const cls = cx(
|
|
91
90
|
'rg',
|
|
@@ -148,10 +147,22 @@ export function RadioGroup({
|
|
|
148
147
|
onChange={() => onChange && onChange(opt.value)}
|
|
149
148
|
/>
|
|
150
149
|
{variant === 'cards' && hovered === opt.value && !selected && (
|
|
151
|
-
<
|
|
150
|
+
<Motion
|
|
151
|
+
as="span"
|
|
152
|
+
layoutId={groupId + ':card-hover'}
|
|
153
|
+
layoutTransition={HOVER_FLIP}
|
|
154
|
+
className="rg__card-hover"
|
|
155
|
+
aria-hidden="true"
|
|
156
|
+
/>
|
|
152
157
|
)}
|
|
153
158
|
{variant === 'cards' && selected && (
|
|
154
|
-
<
|
|
159
|
+
<Motion
|
|
160
|
+
as="span"
|
|
161
|
+
layoutId={groupId + ':card-fill'}
|
|
162
|
+
layoutTransition={LAYOUT_FLIP}
|
|
163
|
+
className="rg__card-fill"
|
|
164
|
+
aria-hidden="true"
|
|
165
|
+
/>
|
|
155
166
|
)}
|
|
156
167
|
{variant === 'cards' && opt.icon && (
|
|
157
168
|
<span className="rg-opt__icon">
|
|
@@ -160,7 +171,15 @@ export function RadioGroup({
|
|
|
160
171
|
)}
|
|
161
172
|
<span className="rg-opt__control">
|
|
162
173
|
<span className="rg-opt__dot">
|
|
163
|
-
{selected &&
|
|
174
|
+
{selected && (
|
|
175
|
+
<Motion
|
|
176
|
+
as="span"
|
|
177
|
+
layoutId={groupId + ':marker'}
|
|
178
|
+
layoutTransition={LAYOUT_FLIP}
|
|
179
|
+
className="rg__marker"
|
|
180
|
+
aria-hidden="true"
|
|
181
|
+
/>
|
|
182
|
+
)}
|
|
164
183
|
</span>
|
|
165
184
|
</span>
|
|
166
185
|
<span className="rg-opt__body">
|