@ai-matrx/design-system 0.86.334 → 0.86.336

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 (79) hide show
  1. package/CHANGELOG.md +28 -68
  2. package/dist/carousel.cjs.map +1 -1
  3. package/dist/carousel.js +4 -4
  4. package/dist/{chunk-MFUNGDHO.js → chunk-B24DLFWR.js} +2 -2
  5. package/dist/{chunk-CSSD6NS4.js → chunk-DQUCOMAC.js} +2 -2
  6. package/dist/chunk-L5OACQXS.js +409 -0
  7. package/dist/chunk-L5OACQXS.js.map +1 -0
  8. package/dist/{chunk-6YZMGSQY.js → chunk-M34WPTPX.js} +2 -2
  9. package/dist/{chunk-7NEVJKDZ.js → chunk-MAMZGJJ3.js} +36 -7
  10. package/dist/chunk-MAMZGJJ3.js.map +1 -0
  11. package/dist/{chunk-VV6WZTH5.js → chunk-PBDQZPKV.js} +2 -2
  12. package/dist/{chunk-E4GS5QH7.js → chunk-Q2HWDJED.js} +2 -2
  13. package/dist/{chunk-ZOQ2XKXF.js → chunk-QOEKPR37.js} +5 -5
  14. package/dist/chunk-QOEKPR37.js.map +1 -0
  15. package/dist/{chunk-MEJVHDYJ.js → chunk-RGJPHRU3.js} +2 -2
  16. package/dist/{chunk-3MQMVPKO.js → chunk-VQ3G6AFN.js} +4 -4
  17. package/dist/{chunk-677JS6TX.js → chunk-WZC3K7SO.js} +75 -158
  18. package/dist/chunk-WZC3K7SO.js.map +1 -0
  19. package/dist/clipboard-fallback-dialog.cjs.map +1 -1
  20. package/dist/clipboard-fallback-dialog.js +1 -1
  21. package/dist/controls.cjs +4 -4
  22. package/dist/controls.cjs.map +1 -1
  23. package/dist/controls.css +6 -0
  24. package/dist/controls.js +4 -4
  25. package/dist/data-table/data-row-inspector.cjs.map +1 -1
  26. package/dist/data-table/data-row-inspector.js +4 -4
  27. package/dist/data-table/data-row-window.cjs.map +1 -1
  28. package/dist/data-table/data-row-window.js +5 -5
  29. package/dist/data-table/index.cjs +4 -4
  30. package/dist/data-table/index.cjs.map +1 -1
  31. package/dist/data-table/index.js +7 -7
  32. package/dist/data-table/pagination.cjs +4 -4
  33. package/dist/data-table/pagination.cjs.map +1 -1
  34. package/dist/data-table/pagination.js +2 -2
  35. package/dist/data-table/uuid-cell.cjs.map +1 -1
  36. package/dist/data-table/uuid-cell.js +2 -2
  37. package/dist/desktop.cjs.map +1 -1
  38. package/dist/desktop.js +9 -8
  39. package/dist/desktop.js.map +1 -1
  40. package/dist/index.cjs +1508 -1187
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +7 -3
  43. package/dist/index.d.ts +7 -3
  44. package/dist/index.js +24 -23
  45. package/dist/index.js.map +1 -1
  46. package/dist/item.cjs +646 -372
  47. package/dist/item.cjs.map +1 -1
  48. package/dist/item.d.cts +1 -3
  49. package/dist/item.d.ts +1 -3
  50. package/dist/item.js +26 -34
  51. package/dist/item.js.map +1 -1
  52. package/dist/lite-table.cjs.map +1 -1
  53. package/dist/lite-table.js +1 -1
  54. package/dist/menu-look.cjs +521 -36
  55. package/dist/menu-look.cjs.map +1 -1
  56. package/dist/menu-look.css +96 -1
  57. package/dist/menu-look.d.cts +320 -37
  58. package/dist/menu-look.d.ts +320 -37
  59. package/dist/menu-look.js +60 -121
  60. package/dist/menu-look.js.map +1 -1
  61. package/dist/record-list.cjs +533 -253
  62. package/dist/record-list.cjs.map +1 -1
  63. package/dist/record-list.js +4 -2
  64. package/dist/record-list.js.map +1 -1
  65. package/dist/settings.cjs.map +1 -1
  66. package/dist/settings.js +2 -2
  67. package/dist/writing-field.cjs.map +1 -1
  68. package/dist/writing-field.js +2 -2
  69. package/package.json +2 -2
  70. package/dist/chunk-677JS6TX.js.map +0 -1
  71. package/dist/chunk-7NEVJKDZ.js.map +0 -1
  72. package/dist/chunk-ZOQ2XKXF.js.map +0 -1
  73. /package/dist/{chunk-MFUNGDHO.js.map → chunk-B24DLFWR.js.map} +0 -0
  74. /package/dist/{chunk-CSSD6NS4.js.map → chunk-DQUCOMAC.js.map} +0 -0
  75. /package/dist/{chunk-6YZMGSQY.js.map → chunk-M34WPTPX.js.map} +0 -0
  76. /package/dist/{chunk-VV6WZTH5.js.map → chunk-PBDQZPKV.js.map} +0 -0
  77. /package/dist/{chunk-E4GS5QH7.js.map → chunk-Q2HWDJED.js.map} +0 -0
  78. /package/dist/{chunk-MEJVHDYJ.js.map → chunk-RGJPHRU3.js.map} +0 -0
  79. /package/dist/{chunk-3MQMVPKO.js.map → chunk-VQ3G6AFN.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  ItemRow
4
- } from "./chunk-677JS6TX.js";
4
+ } from "./chunk-WZC3K7SO.js";
5
5
  import {
6
6
  ListEmptyView
7
7
  } from "./chunk-PRJW34R6.js";
@@ -11,6 +11,7 @@ import {
11
11
  ReadStaleNotice,
12
12
  readOf
13
13
  } from "./chunk-CFCWQDGC.js";
14
+ import "./chunk-L5OACQXS.js";
14
15
  import "./chunk-HEFTQUJ5.js";
15
16
  import {
16
17
  MAC_LIST_ATTRIBUTE
@@ -23,7 +24,8 @@ import {
23
24
  import "./chunk-NDTDBBMM.js";
24
25
  import "./chunk-KPZX2M2C.js";
25
26
  import "./chunk-WFBPCMPF.js";
26
- import "./chunk-ZOQ2XKXF.js";
27
+ import "./chunk-OPF265PU.js";
28
+ import "./chunk-QOEKPR37.js";
27
29
  import "./chunk-BD77DHUO.js";
28
30
  import "./chunk-BKCJUFD3.js";
29
31
  import "./chunk-MOZRIHJF.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/record-list/RecordList.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * RecordList — THE LIGHT RECORD LIST (2026-10-17). A list of records, each an\n * `ItemRow`: title, an optional second line, muted meta, leading icon,\n * trailing indicators, actions and the row's menu; a row that links or opens;\n * optional selection (checkboxes) and a current row; arrow-key navigation; and\n * the honest read states (`read` / `ReadGate`: the empty view only after a\n * read that succeeded, the failure with its retry, stale rows kept with a notice).\n *\n * Use it instead of mapping bordered hover `<div>`s. When a list needs columns,\n * sorting or filters, it is a table: `LiteTable`, then `MatrxDataTable`.\n *\n * THE MAC LIST (2026-10-17): its rows wear the desktop app's `ListRow` — 36 pt, 13 pt title and\n * secondary line, a 7 pt corner, the pointer's fill, the gray selection (the accent while the list\n * has focus); `framed` is System Settings' grouped box with hairlines between. Values from\n * `../mac-table/tokens.ts`, drawn by `mac-table.css`; `mac-table-parity.test.ts` keeps them equal.\n */\n\nimport { useRef, type KeyboardEvent, type ReactNode } from \"react\";\nimport type { MatrxDataTableEmptyState } from \"../data-table/types\";\nimport { ReadEmpty, ReadStaleNotice, type ReadOutcome } from \"../read-state/read-gate\";\nimport { ListEmptyView } from \"../read-state/list-empty-view\";\nimport { ItemRow } from \"../item/ItemRow\";\nimport type { ItemEntityRef, ItemMenuConfigInput, ItemRowSize } from \"../item/types\";\nimport { Checkbox } from \"../checkbox\";\nimport { cn } from \"../cn\";\nimport { MAC_LIST_ATTRIBUTE } from \"../mac-table/tokens\";\n\nexport interface RecordListProps<T> {\n items: T[];\n getKey: (item: T) => string;\n /** The row's name (plain text: it is also the tooltip and the accessible name). */\n title: (item: T) => string;\n /** A second line under the title. */\n subtitle?: ((item: T) => ReactNode) | undefined;\n /** Muted text at the trailing edge (a date, a count). */\n meta?: ((item: T) => string | undefined) | undefined;\n /** Icon / avatar / status dot before the title. */\n leading?: ((item: T) => ReactNode) | undefined;\n /** Indicators inside the row, after the meta (badges, a lock). Never buttons. */\n trailing?: ((item: T) => ReactNode) | undefined;\n /** Buttons at the trailing edge, outside the row's own link. */\n actions?: ((item: T) => ReactNode) | undefined;\n /** The row's kebab + right-click menu. */\n menu?: ((item: T) => ItemMenuConfigInput | undefined) | undefined;\n /** The row's page: the row is a real link (new tab, copy link). */\n href?: ((item: T) => string | undefined) | undefined;\n /** Plain click / Enter. With `href`, a side effect unless `openInPlace`. */\n onOpen?: ((item: T) => void) | undefined;\n openInPlace?: boolean | undefined;\n /** The current row (drawn selected). */\n activeKey?: string | null | undefined;\n /** Checkbox selection. Present → each row gets a checkbox. */\n selectedKeys?: readonly string[] | undefined;\n onSelectedKeysChange?: ((keys: string[]) => void) | undefined;\n disabled?: ((item: T) => boolean) | undefined;\n /** The read behind `items`. */\n read?: ReadOutcome | undefined;\n emptyState?: MatrxDataTableEmptyState | ReactNode;\n size?: ItemRowSize | undefined;\n /** Hairlines between rows inside a bordered box. Default true; false = bare rows (a sidebar). */\n framed?: boolean | undefined;\n /** Who owns the rows' menus (the item menu's registry name). */\n sourceFeature: string;\n surfaceName?: string | undefined;\n entity?: ((item: T) => ItemEntityRef | undefined) | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n}\n\nexport function RecordList<T>({\n items,\n getKey,\n title,\n subtitle,\n meta,\n leading,\n trailing,\n actions,\n menu,\n href,\n onOpen,\n openInPlace,\n activeKey,\n selectedKeys,\n onSelectedKeysChange,\n disabled,\n read,\n emptyState = { title: \"Nothing here yet\" },\n size = \"md\",\n framed = true,\n sourceFeature,\n surfaceName,\n entity,\n ariaLabel,\n className,\n}: RecordListProps<T>) {\n const listRef = useRef<HTMLUListElement | null>(null);\n\n if (items.length === 0) {\n return (\n <div className={className} data-record-list=\"\" {...{ [MAC_LIST_ATTRIBUTE]: \"\" }}>\n <ReadEmpty read={read}>\n <ListEmptyView emptyState={emptyState} />\n </ReadEmpty>\n </div>\n );\n }\n\n const selectable = selectedKeys !== undefined;\n const selected = new Set(selectedKeys ?? []);\n const toggle = (key: string, on: boolean) => {\n const next = new Set(selected);\n if (on) next.add(key);\n else next.delete(key);\n onSelectedKeysChange?.(items.map(getKey).filter((k) => next.has(k)));\n };\n\n // Up/Down/Home/End move between rows; Enter and Space stay the row's own.\n const onKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) return;\n const target = event.target as HTMLElement;\n if (target.closest(\"input,textarea,[contenteditable=true],[role=menu]\")) return;\n const rows = Array.from(listRef.current?.querySelectorAll<HTMLElement>(\"[data-item-primary]\") ?? []);\n const at = rows.findIndex((row) => row === target || row.contains(target) || target.closest(\"li\")?.contains(row));\n const to =\n event.key === \"Home\" ? 0 : event.key === \"End\" ? rows.length - 1 : event.key === \"ArrowDown\" ? at + 1 : at - 1;\n const next = rows[Math.max(0, Math.min(rows.length - 1, to))];\n if (next) {\n event.preventDefault();\n next.focus();\n }\n };\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)} data-record-list=\"\" {...{ [MAC_LIST_ATTRIBUTE]: \"\" }}>\n <ReadStaleNotice read={read} />\n <ul\n ref={listRef}\n aria-label={ariaLabel}\n onKeyDown={onKeyDown}\n data-mac-list-body=\"\"\n data-framed={framed ? \"\" : undefined}\n className={cn(\"flex flex-col\", !framed && \"gap-0.5\")}\n >\n {items.map((item) => {\n const key = getKey(item);\n const name = title(item);\n const metaText = meta?.(item);\n const rowHref = href?.(item);\n const rowMenu = menu?.(item);\n const rowEntity = entity?.(item);\n const rowActions = actions?.(item);\n const lead = leading?.(item);\n const trail = trailing?.(item);\n const sub = subtitle?.(item);\n return (\n <li key={key} data-record-key={key}>\n <ItemRow\n label={name}\n sourceFeature={sourceFeature}\n size={size}\n active={activeKey === key}\n {...(metaText ? { secondaryLabel: metaText } : {})}\n {...(sub != null ? { subtitle: sub } : {})}\n {...(lead != null ? { leading: lead } : {})}\n {...(trail != null ? { trailing: trail } : {})}\n {...(rowActions != null ? { actions: rowActions } : {})}\n {...(rowMenu ? { menu: rowMenu } : {})}\n {...(rowHref ? { href: rowHref } : {})}\n {...(onOpen ? { onOpen: () => onOpen(item) } : {})}\n {...(openInPlace ? { openInPlace } : {})}\n {...(disabled?.(item) ? { disabled: true } : {})}\n {...(surfaceName ? { surfaceName } : {})}\n {...(rowEntity ? { entity: rowEntity } : {})}\n {...(selectable\n ? {\n leadingControl: (\n <Checkbox\n size=\"sm\"\n aria-label={`Select ${name}`}\n checked={selected.has(key)}\n onCheckedChange={(on) => toggle(key, on === true)}\n />\n ),\n }\n : {})}\n />\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/record-list/RecordList.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * RecordList — THE LIGHT RECORD LIST (2026-10-17). A list of records, each an\n * `ItemRow`: title, an optional second line, muted meta, leading icon,\n * trailing indicators, actions and the row's menu; a row that links or opens;\n * optional selection (checkboxes) and a current row; arrow-key navigation; and\n * the honest read states (`read` / `ReadGate`: the empty view only after a\n * read that succeeded, the failure with its retry, stale rows kept with a notice).\n *\n * Use it instead of mapping bordered hover `<div>`s. When a list needs columns,\n * sorting or filters, it is a table: `LiteTable`, then `MatrxDataTable`.\n *\n * THE MAC LIST (2026-10-17): its rows wear the desktop app's `ListRow` — 36 pt, 13 pt title and\n * secondary line, a 7 pt corner, the pointer's fill, the gray selection (the accent while the list\n * has focus); `framed` is System Settings' grouped box with hairlines between. Values from\n * `../mac-table/tokens.ts`, drawn by `mac-table.css`; `mac-table-parity.test.ts` keeps them equal.\n */\n\nimport { useRef, type KeyboardEvent, type ReactNode } from \"react\";\nimport type { MatrxDataTableEmptyState } from \"../data-table/types\";\nimport { ReadEmpty, ReadStaleNotice, type ReadOutcome } from \"../read-state/read-gate\";\nimport { ListEmptyView } from \"../read-state/list-empty-view\";\nimport { ItemRow } from \"../item/ItemRow\";\nimport type { ItemEntityRef, ItemMenuConfigInput, ItemRowSize } from \"../item/types\";\nimport { Checkbox } from \"../checkbox\";\nimport { cn } from \"../cn\";\nimport { MAC_LIST_ATTRIBUTE } from \"../mac-table/tokens\";\n\nexport interface RecordListProps<T> {\n items: T[];\n getKey: (item: T) => string;\n /** The row's name (plain text: it is also the tooltip and the accessible name). */\n title: (item: T) => string;\n /** A second line under the title. */\n subtitle?: ((item: T) => ReactNode) | undefined;\n /** Muted text at the trailing edge (a date, a count). */\n meta?: ((item: T) => string | undefined) | undefined;\n /** Icon / avatar / status dot before the title. */\n leading?: ((item: T) => ReactNode) | undefined;\n /** Indicators inside the row, after the meta (badges, a lock). Never buttons. */\n trailing?: ((item: T) => ReactNode) | undefined;\n /** Buttons at the trailing edge, outside the row's own link. */\n actions?: ((item: T) => ReactNode) | undefined;\n /** The row's kebab + right-click menu. */\n menu?: ((item: T) => ItemMenuConfigInput | undefined) | undefined;\n /** The row's page: the row is a real link (new tab, copy link). */\n href?: ((item: T) => string | undefined) | undefined;\n /** Plain click / Enter. With `href`, a side effect unless `openInPlace`. */\n onOpen?: ((item: T) => void) | undefined;\n openInPlace?: boolean | undefined;\n /** The current row (drawn selected). */\n activeKey?: string | null | undefined;\n /** Checkbox selection. Present → each row gets a checkbox. */\n selectedKeys?: readonly string[] | undefined;\n onSelectedKeysChange?: ((keys: string[]) => void) | undefined;\n disabled?: ((item: T) => boolean) | undefined;\n /** The read behind `items`. */\n read?: ReadOutcome | undefined;\n emptyState?: MatrxDataTableEmptyState | ReactNode;\n size?: ItemRowSize | undefined;\n /** Hairlines between rows inside a bordered box. Default true; false = bare rows (a sidebar). */\n framed?: boolean | undefined;\n /** Who owns the rows' menus (the item menu's registry name). */\n sourceFeature: string;\n surfaceName?: string | undefined;\n entity?: ((item: T) => ItemEntityRef | undefined) | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n}\n\nexport function RecordList<T>({\n items,\n getKey,\n title,\n subtitle,\n meta,\n leading,\n trailing,\n actions,\n menu,\n href,\n onOpen,\n openInPlace,\n activeKey,\n selectedKeys,\n onSelectedKeysChange,\n disabled,\n read,\n emptyState = { title: \"Nothing here yet\" },\n size = \"md\",\n framed = true,\n sourceFeature,\n surfaceName,\n entity,\n ariaLabel,\n className,\n}: RecordListProps<T>) {\n const listRef = useRef<HTMLUListElement | null>(null);\n\n if (items.length === 0) {\n return (\n <div className={className} data-record-list=\"\" {...{ [MAC_LIST_ATTRIBUTE]: \"\" }}>\n <ReadEmpty read={read}>\n <ListEmptyView emptyState={emptyState} />\n </ReadEmpty>\n </div>\n );\n }\n\n const selectable = selectedKeys !== undefined;\n const selected = new Set(selectedKeys ?? []);\n const toggle = (key: string, on: boolean) => {\n const next = new Set(selected);\n if (on) next.add(key);\n else next.delete(key);\n onSelectedKeysChange?.(items.map(getKey).filter((k) => next.has(k)));\n };\n\n // Up/Down/Home/End move between rows; Enter and Space stay the row's own.\n const onKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) return;\n const target = event.target as HTMLElement;\n if (target.closest(\"input,textarea,[contenteditable=true],[role=menu]\")) return;\n const rows = Array.from(listRef.current?.querySelectorAll<HTMLElement>(\"[data-item-primary]\") ?? []);\n const at = rows.findIndex((row) => row === target || row.contains(target) || target.closest(\"li\")?.contains(row));\n const to =\n event.key === \"Home\" ? 0 : event.key === \"End\" ? rows.length - 1 : event.key === \"ArrowDown\" ? at + 1 : at - 1;\n const next = rows[Math.max(0, Math.min(rows.length - 1, to))];\n if (next) {\n event.preventDefault();\n next.focus();\n }\n };\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)} data-record-list=\"\" {...{ [MAC_LIST_ATTRIBUTE]: \"\" }}>\n <ReadStaleNotice read={read} />\n <ul\n ref={listRef}\n aria-label={ariaLabel}\n onKeyDown={onKeyDown}\n data-mac-list-body=\"\"\n data-framed={framed ? \"\" : undefined}\n className={cn(\"flex flex-col\", !framed && \"gap-0.5\")}\n >\n {items.map((item) => {\n const key = getKey(item);\n const name = title(item);\n const metaText = meta?.(item);\n const rowHref = href?.(item);\n const rowMenu = menu?.(item);\n const rowEntity = entity?.(item);\n const rowActions = actions?.(item);\n const lead = leading?.(item);\n const trail = trailing?.(item);\n const sub = subtitle?.(item);\n return (\n <li key={key} data-record-key={key}>\n <ItemRow\n label={name}\n sourceFeature={sourceFeature}\n size={size}\n active={activeKey === key}\n {...(metaText ? { secondaryLabel: metaText } : {})}\n {...(sub != null ? { subtitle: sub } : {})}\n {...(lead != null ? { leading: lead } : {})}\n {...(trail != null ? { trailing: trail } : {})}\n {...(rowActions != null ? { actions: rowActions } : {})}\n {...(rowMenu ? { menu: rowMenu } : {})}\n {...(rowHref ? { href: rowHref } : {})}\n {...(onOpen ? { onOpen: () => onOpen(item) } : {})}\n {...(openInPlace ? { openInPlace } : {})}\n {...(disabled?.(item) ? { disabled: true } : {})}\n {...(surfaceName ? { surfaceName } : {})}\n {...(rowEntity ? { entity: rowEntity } : {})}\n {...(selectable\n ? {\n leadingControl: (\n <Checkbox\n size=\"sm\"\n aria-label={`Select ${name}`}\n checked={selected.has(key)}\n onCheckedChange={(on) => toggle(key, on === true)}\n />\n ),\n }\n : {})}\n />\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n"],"mappings":"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","names":[]}