@ai-matrx/design-system 0.86.356 → 0.86.357

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 (82) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/auth-gate-dialog.js +2 -2
  3. package/dist/carousel.js +7 -6
  4. package/dist/carousel.js.map +1 -1
  5. package/dist/{chunk-UWTODOMD.js → chunk-2BQAHLU3.js} +4 -4
  6. package/dist/chunk-5Z5GTXKL.js +79 -0
  7. package/dist/chunk-5Z5GTXKL.js.map +1 -0
  8. package/dist/{chunk-2PO3N42Q.js → chunk-ACZALXD6.js} +3 -3
  9. package/dist/{chunk-4WSXAP24.js → chunk-BB5LA7FQ.js} +3 -1
  10. package/dist/chunk-BB5LA7FQ.js.map +1 -0
  11. package/dist/{chunk-RLM4RSED.js → chunk-GUGBVQ4T.js} +6 -4
  12. package/dist/{chunk-RLM4RSED.js.map → chunk-GUGBVQ4T.js.map} +1 -1
  13. package/dist/{chunk-LJKF267O.js → chunk-HS6GMHKZ.js} +18 -76
  14. package/dist/chunk-HS6GMHKZ.js.map +1 -0
  15. package/dist/{chunk-ZMUPFGQO.js → chunk-TV2IDHPZ.js} +2 -2
  16. package/dist/{chunk-CFUXEGW2.js → chunk-XZGYKKCE.js} +2 -2
  17. package/dist/clipboard-fallback-dialog.js +2 -2
  18. package/dist/controls.cjs +15 -3
  19. package/dist/controls.cjs.map +1 -1
  20. package/dist/controls.js +5 -4
  21. package/dist/data-table/data-row-window.js +3 -3
  22. package/dist/data-table/drill-chart.cjs +15 -3
  23. package/dist/data-table/drill-chart.cjs.map +1 -1
  24. package/dist/data-table/drill-chart.js +2 -1
  25. package/dist/data-table/drill-chart.js.map +1 -1
  26. package/dist/data-table/index.cjs +15 -3
  27. package/dist/data-table/index.cjs.map +1 -1
  28. package/dist/data-table/index.js +8 -7
  29. package/dist/data-table/index.js.map +1 -1
  30. package/dist/desktop.cjs +26 -5
  31. package/dist/desktop.cjs.map +1 -1
  32. package/dist/desktop.js +15 -7
  33. package/dist/desktop.js.map +1 -1
  34. package/dist/email-input-dialog.cjs +15 -3
  35. package/dist/email-input-dialog.cjs.map +1 -1
  36. package/dist/email-input-dialog.js +4 -3
  37. package/dist/email-input-dialog.js.map +1 -1
  38. package/dist/error-sentence.cjs +130 -0
  39. package/dist/error-sentence.cjs.map +1 -0
  40. package/dist/error-sentence.d.cts +49 -0
  41. package/dist/error-sentence.d.ts +49 -0
  42. package/dist/error-sentence.js +22 -0
  43. package/dist/error-sentence.js.map +1 -0
  44. package/dist/index.cjs +16 -4
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.cts +3 -1
  47. package/dist/index.d.ts +3 -1
  48. package/dist/index.js +17 -15
  49. package/dist/index.js.map +1 -1
  50. package/dist/item.js +2 -2
  51. package/dist/lite-table.cjs +15 -3
  52. package/dist/lite-table.cjs.map +1 -1
  53. package/dist/lite-table.js +3 -2
  54. package/dist/lite-table.js.map +1 -1
  55. package/dist/notice-stack.cjs +2 -0
  56. package/dist/notice-stack.cjs.map +1 -1
  57. package/dist/notice-stack.d.cts +11 -1
  58. package/dist/notice-stack.d.ts +11 -1
  59. package/dist/notice-stack.js +3 -1
  60. package/dist/record-list.cjs +15 -3
  61. package/dist/record-list.cjs.map +1 -1
  62. package/dist/record-list.js +3 -2
  63. package/dist/record-list.js.map +1 -1
  64. package/dist/sandbox-gate-dialog.js +2 -2
  65. package/dist/scope-mismatch-dialog.js +2 -2
  66. package/dist/swipe-deck.cjs +15 -3
  67. package/dist/swipe-deck.cjs.map +1 -1
  68. package/dist/swipe-deck.js +2 -1
  69. package/dist/swipe-deck.js.map +1 -1
  70. package/dist/text-input-dialog.cjs +15 -3
  71. package/dist/text-input-dialog.cjs.map +1 -1
  72. package/dist/text-input-dialog.js +4 -3
  73. package/dist/text-input-dialog.js.map +1 -1
  74. package/dist/value-prompts-dialog.js +2 -2
  75. package/dist/writing-field.js +2 -2
  76. package/package.json +12 -2
  77. package/dist/chunk-4WSXAP24.js.map +0 -1
  78. package/dist/chunk-LJKF267O.js.map +0 -1
  79. /package/dist/{chunk-UWTODOMD.js.map → chunk-2BQAHLU3.js.map} +0 -0
  80. /package/dist/{chunk-2PO3N42Q.js.map → chunk-ACZALXD6.js.map} +0 -0
  81. /package/dist/{chunk-ZMUPFGQO.js.map → chunk-TV2IDHPZ.js.map} +0 -0
  82. /package/dist/{chunk-CFUXEGW2.js.map → chunk-XZGYKKCE.js.map} +0 -0
@@ -10,14 +10,15 @@ import {
10
10
  ReadEmpty,
11
11
  ReadStaleNotice,
12
12
  readOf
13
- } from "./chunk-RLM4RSED.js";
13
+ } from "./chunk-GUGBVQ4T.js";
14
14
  import "./chunk-T4D7WAV7.js";
15
15
  import "./chunk-HEFTQUJ5.js";
16
16
  import {
17
17
  MAC_LIST_ATTRIBUTE
18
18
  } from "./chunk-5JZSBNEY.js";
19
19
  import "./chunk-K4XCB576.js";
20
- import "./chunk-LJKF267O.js";
20
+ import "./chunk-5Z5GTXKL.js";
21
+ import "./chunk-HS6GMHKZ.js";
21
22
  import {
22
23
  Checkbox
23
24
  } from "./chunk-VLLUUOYJ.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":[]}
@@ -6,14 +6,14 @@ import {
6
6
  DialogFooter,
7
7
  DialogHeader,
8
8
  DialogTitle
9
- } from "./chunk-UWTODOMD.js";
9
+ } from "./chunk-2BQAHLU3.js";
10
+ import "./chunk-LEPD6TV7.js";
10
11
  import {
11
12
  UNCONFIGURED,
12
13
  announceStandIn
13
14
  } from "./chunk-IMQ3RX35.js";
14
15
  import "./chunk-U24MOJWK.js";
15
16
  import "./chunk-NDTDBBMM.js";
16
- import "./chunk-LEPD6TV7.js";
17
17
  import "./chunk-MOZRIHJF.js";
18
18
  import {
19
19
  Button
@@ -6,14 +6,14 @@ import {
6
6
  DialogFooter,
7
7
  DialogHeader,
8
8
  DialogTitle
9
- } from "./chunk-UWTODOMD.js";
9
+ } from "./chunk-2BQAHLU3.js";
10
+ import "./chunk-LEPD6TV7.js";
10
11
  import {
11
12
  UNCONFIGURED,
12
13
  announceStandIn
13
14
  } from "./chunk-IMQ3RX35.js";
14
15
  import "./chunk-U24MOJWK.js";
15
16
  import "./chunk-NDTDBBMM.js";
16
- import "./chunk-LEPD6TV7.js";
17
17
  import "./chunk-MOZRIHJF.js";
18
18
  import {
19
19
  Button
@@ -149,6 +149,16 @@ function errorSentenceOf(error) {
149
149
  }
150
150
  var TIMED_OUT_SENTENCE = "That took too long. Nothing was lost; try again.";
151
151
  var FALLBACK_ERROR_SENTENCE = "Something went wrong. Try again.";
152
+ var CARD_ERROR_LINE = {
153
+ OFFLINE: "No connection",
154
+ TIMEOUT: "Took too long. Nothing was lost.",
155
+ UNAUTHORIZED: "Signed out. Sign in again.",
156
+ FORBIDDEN: "Not allowed for this account",
157
+ NOT_FOUND: "Not found. Refresh and retry.",
158
+ RATE_LIMIT: "Too many requests. Wait a moment.",
159
+ SERVER: "Server problem. Try again soon.",
160
+ FALLBACK: "Something went wrong"
161
+ };
152
162
  function isTimedOutError(error, message, code) {
153
163
  if (code === "57014" || code === "timed_out") return true;
154
164
  if (error && typeof error === "object") {
@@ -166,8 +176,9 @@ var ANY_HOST_CODES = /* @__PURE__ */ new Set(["OFFLINE", "TIMEOUT", "UNAUTHORIZE
166
176
  var MACHINE_PREFIX = /^\s*(?:\[[\w./-]+\]\s*|[a-z][\w]*(?:[._][\w]+)+:\s+)/;
167
177
  var RAW_TEXT = /\b(?:Type|Reference|Syntax|Range|Internal|Eval|URI)Error\b|\bat\s+[\w$.<>]+\s*\(|\.(?:[cm]?[jt]sx?|py):\d+|(?:^|[\s(])(?:\/[\w.@-]+){2,}|\bundefined is not\b|\bcannot read propert(?:y|ies)\b|\bis not a function\b|\bunexpected token\b/i;
168
178
  function peopleErrorSentence(error, message, options = {}) {
169
- if (isTimedOutError(error, message, options.code)) return TIMED_OUT_SENTENCE;
170
- const fallback = options.fallback ?? FALLBACK_ERROR_SENTENCE;
179
+ const card = options.card === true;
180
+ if (isTimedOutError(error, message, options.code)) return card ? CARD_ERROR_LINE.TIMEOUT : TIMED_OUT_SENTENCE;
181
+ const fallback = options.fallback ?? (card ? CARD_ERROR_LINE.FALLBACK : FALLBACK_ERROR_SENTENCE);
171
182
  const raw = message?.trim() || errorSentenceOf(error).trim();
172
183
  if (!raw) return fallback;
173
184
  let text2 = raw;
@@ -175,7 +186,8 @@ function peopleErrorSentence(error, message, options = {}) {
175
186
  if (!text2) return fallback;
176
187
  if (offlineText(text2) || RAW_TEXT.test(text2) || text2 !== raw) {
177
188
  const said = describeError(text2, fallback);
178
- return said.code && ANY_HOST_CODES.has(said.code) ? said.cause : fallback;
189
+ if (!said.code || !ANY_HOST_CODES.has(said.code)) return fallback;
190
+ return card ? CARD_ERROR_LINE[said.code] : said.cause;
179
191
  }
180
192
  return text2;
181
193
  }