@ai-matrx/design-system 0.86.365 → 0.86.367

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 (75) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/carousel.js +3 -3
  3. package/dist/{chunk-RO5CRIOL.js → chunk-3JEAXZKX.js} +2 -2
  4. package/dist/{chunk-HS6GMHKZ.js → chunk-CZGTZJPS.js} +3 -3
  5. package/dist/chunk-CZGTZJPS.js.map +1 -0
  6. package/dist/{chunk-5Z5GTXKL.js → chunk-FEITX4L3.js} +2 -2
  7. package/dist/{chunk-GUGBVQ4T.js → chunk-OAK4ENIP.js} +3 -3
  8. package/dist/{chunk-UGUVTE77.js → chunk-QEQDJBNK.js} +2 -2
  9. package/dist/{chunk-QJ6SQNXD.js → chunk-TBWKBTPM.js} +2 -2
  10. package/dist/{chunk-2QFA6CK4.js → chunk-UAIBCPMB.js} +2 -2
  11. package/dist/{chunk-VOLSYNJY.js → chunk-VG765KBC.js} +2 -2
  12. package/dist/content-transfer.css +3 -1
  13. package/dist/controls.cjs +2 -2
  14. package/dist/controls.cjs.map +1 -1
  15. package/dist/controls.css +7 -2
  16. package/dist/controls.js +3 -3
  17. package/dist/data-table/data-row-inspector.cjs +2 -2
  18. package/dist/data-table/data-row-inspector.cjs.map +1 -1
  19. package/dist/data-table/data-row-inspector.js +3 -3
  20. package/dist/data-table/data-row-window.cjs +2 -2
  21. package/dist/data-table/data-row-window.cjs.map +1 -1
  22. package/dist/data-table/data-row-window.js +4 -4
  23. package/dist/data-table/drill-chart.cjs +2 -2
  24. package/dist/data-table/drill-chart.cjs.map +1 -1
  25. package/dist/data-table/drill-chart.js +2 -2
  26. package/dist/data-table/index.cjs +8 -3
  27. package/dist/data-table/index.cjs.map +1 -1
  28. package/dist/data-table/index.d.cts +7 -0
  29. package/dist/data-table/index.d.ts +7 -0
  30. package/dist/data-table/index.js +11 -6
  31. package/dist/data-table/index.js.map +1 -1
  32. package/dist/data-table/types.cjs.map +1 -1
  33. package/dist/data-table/types.d.cts +7 -0
  34. package/dist/data-table/types.d.ts +7 -0
  35. package/dist/data-table/uuid-cell.cjs +2 -2
  36. package/dist/data-table/uuid-cell.cjs.map +1 -1
  37. package/dist/data-table/uuid-cell.js +2 -2
  38. package/dist/desktop.cjs +2 -2
  39. package/dist/desktop.cjs.map +1 -1
  40. package/dist/desktop.js +3 -3
  41. package/dist/email-input-dialog.cjs +2 -2
  42. package/dist/email-input-dialog.cjs.map +1 -1
  43. package/dist/email-input-dialog.js +2 -2
  44. package/dist/error-sentence.cjs +2 -2
  45. package/dist/error-sentence.cjs.map +1 -1
  46. package/dist/error-sentence.js +1 -1
  47. package/dist/index.cjs +55 -31
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +19 -4
  50. package/dist/index.d.ts +19 -4
  51. package/dist/index.js +59 -35
  52. package/dist/index.js.map +1 -1
  53. package/dist/lite-table.cjs +2 -2
  54. package/dist/lite-table.cjs.map +1 -1
  55. package/dist/lite-table.js +3 -3
  56. package/dist/record-list.cjs +2 -2
  57. package/dist/record-list.cjs.map +1 -1
  58. package/dist/record-list.js +3 -3
  59. package/dist/swipe-deck.cjs +3 -3
  60. package/dist/swipe-deck.cjs.map +1 -1
  61. package/dist/swipe-deck.css +9 -0
  62. package/dist/swipe-deck.js +3 -3
  63. package/dist/swipe-deck.js.map +1 -1
  64. package/dist/text-input-dialog.cjs +2 -2
  65. package/dist/text-input-dialog.cjs.map +1 -1
  66. package/dist/text-input-dialog.js +2 -2
  67. package/package.json +2 -2
  68. package/dist/chunk-HS6GMHKZ.js.map +0 -1
  69. /package/dist/{chunk-RO5CRIOL.js.map → chunk-3JEAXZKX.js.map} +0 -0
  70. /package/dist/{chunk-5Z5GTXKL.js.map → chunk-FEITX4L3.js.map} +0 -0
  71. /package/dist/{chunk-GUGBVQ4T.js.map → chunk-OAK4ENIP.js.map} +0 -0
  72. /package/dist/{chunk-UGUVTE77.js.map → chunk-QEQDJBNK.js.map} +0 -0
  73. /package/dist/{chunk-QJ6SQNXD.js.map → chunk-TBWKBTPM.js.map} +0 -0
  74. /package/dist/{chunk-2QFA6CK4.js.map → chunk-UAIBCPMB.js.map} +0 -0
  75. /package/dist/{chunk-VOLSYNJY.js.map → chunk-VG765KBC.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,7 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.86.367
4
+
5
+ - `SwipeDeck`: the answered list's "Show me how" is its own quiet button (`matrx-sd-review-help`, 40px, one line, 16px icon) beside "Back to cards"; it borrowed the legend-chip style, which sizes no icon, so the icon drew full size and the words wrapped. No consumer action required.
6
+ - **Contact values: "Search the web" runs in the host's own search, prefetched.** `ContactValuesHost` takes `searchWeb(query)` (open the host's search in place instead of an outbound Google link) and `prefetchWebSearch(query)` → `WebSearchPrefetch` (`get` / `subscribe`; `get` returns the same object until the status changes). The peek starts the prefetch when it opens and the row shows "Searching…", then "N results" / "No results"; the row always sits last in Actions, built by the shell from each value's `webSearch` words, and closes the peek when pressed. Phones search as `949-404-4444`. Peek rows (`PeekRow`, `PeekCardRowsItem`) gain `onSelect`, an in-place action drawn like a link that wins over `href`. Guards: `contact-values.test.tsx` "searches the web in the host's own search", "starts the host's search when the peek opens". Consumer action: pass `searchWeb` (and optionally `prefetchWebSearch`) to keep searches in-app; without them the row stays an outbound link.
7
+
8
+ ## 0.86.366
9
+
10
+ SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
11
+ so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
12
+ Diff: `git diff 19ee9cd304 5fa3da8c6c -- apps/shared/design-system/src`
13
+
14
+ Changed shipped source files (2):
15
+ - `apps/shared/design-system/src/desktop/errors.ts`
16
+ - `apps/shared/design-system/src/error-sentence.ts`
17
+
3
18
  ## 0.86.365
4
19
 
20
+ - Icon tile labels (`Tile layout="icon"`) wrap only at spaces — never inside a word — and a word wider than its tile ends in an ellipsis; the Alchemy copy palette widens 15.5rem → 16.5rem so "Markdown" and "Formatted" fit on one line. No consumer action required.
5
21
  - `SwipeDeck` gains `titleSize` (`"fit"` default | `"page"`: the card text at a page-title size in a 760px reading column, top-aligned; the stage still scrolls when the card is taller) and `moreOnCard` (default `true`; `false` drops the deck's own row of off-edge answers so the host draws every answer through `context.answer` — their shortcuts still answer). No consumer action required.
6
22
 
7
23
  ## 0.86.364
package/dist/carousel.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  IconButton
4
- } from "./chunk-VOLSYNJY.js";
4
+ } from "./chunk-VG765KBC.js";
5
5
  import "./chunk-6NOLVA4E.js";
6
6
  import "./chunk-5IR3BZOS.js";
7
7
  import "./chunk-AV5C4YLL.js";
@@ -10,7 +10,7 @@ import "./chunk-WQ2QCMMA.js";
10
10
  import "./chunk-YRF22M5S.js";
11
11
  import "./chunk-WLKHQGX5.js";
12
12
  import "./chunk-K4XCB576.js";
13
- import "./chunk-5Z5GTXKL.js";
13
+ import "./chunk-FEITX4L3.js";
14
14
  import "./chunk-DRSBLHOF.js";
15
15
  import "./chunk-TH6DDCWF.js";
16
16
  import "./chunk-2BQAHLU3.js";
@@ -36,7 +36,7 @@ import {
36
36
  import "./chunk-MOZRIHJF.js";
37
37
  import "./chunk-AKSKVT2M.js";
38
38
  import "./chunk-BNXNIN2S.js";
39
- import "./chunk-HS6GMHKZ.js";
39
+ import "./chunk-CZGTZJPS.js";
40
40
  import "./chunk-WFITMVDB.js";
41
41
  import "./chunk-WAT2XW7L.js";
42
42
  import "./chunk-7IOSA55D.js";
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-PIQJULQB.js";
11
11
  import {
12
12
  peopleErrorSentence
13
- } from "./chunk-HS6GMHKZ.js";
13
+ } from "./chunk-CZGTZJPS.js";
14
14
  import {
15
15
  useMatrxDataTableHost
16
16
  } from "./chunk-B5D3VIMC.js";
@@ -295,4 +295,4 @@ export {
295
295
  displayId,
296
296
  RecordId
297
297
  };
298
- //# sourceMappingURL=chunk-RO5CRIOL.js.map
298
+ //# sourceMappingURL=chunk-3JEAXZKX.js.map
@@ -6,7 +6,7 @@ var RULES = [
6
6
  { code: "EACCES", test: /\bEACCES\b|\bEPERM\b|permission denied|operation not permitted|not authori[sz]ed by the user/i, cause: "Matrx isn't allowed to do that. Grant access in System Settings \u203A Privacy & Security, then try again." },
7
7
  { code: "EADDRINUSE", test: /\bEADDRINUSE\b|address already in use|port .* (is )?(already )?in use/i, cause: "Another program is already using that port. Stop it, or choose another port." },
8
8
  { code: "ECONNREFUSED", test: /\bECONNREFUSED\b|connection refused/i, cause: "The service isn't answering. It may have stopped; start it again." },
9
- { code: "OFFLINE", test: /\bENOTFOUND\b|\bEAI_AGAIN\b|\bENETUNREACH\b|getaddrinfo|network (is )?unreachable|failed to fetch|offline/i, cause: "Can't reach the internet. Check the connection and try again." },
9
+ { code: "OFFLINE", test: /\bENOTFOUND\b|\bEAI_AGAIN\b|\bENETUNREACH\b|getaddrinfo|network (is )?unreachable|failed to fetch|offline|(?:could ?n[o']t|cannot|can't) be reached/i, cause: "Can't reach the internet. Check the connection and try again." },
10
10
  { code: "TIMEOUT", test: /\bETIMEDOUT\b|timed? ?out|\bTIMEOUT\b|deadline exceeded/i, cause: "It took too long to answer. Try again in a moment." },
11
11
  { code: "ENOSPC", test: /\bENOSPC\b|no space left/i, cause: "The disk is full. Free some space, then try again." },
12
12
  { code: "ENOMEM", test: /\bENOMEM\b|out of memory|cannot allocate memory/i, cause: "The computer ran out of memory. Close something and try again." },
@@ -74,7 +74,7 @@ function offlineText(text) {
74
74
  return t !== "" && (describeError(t).code === "OFFLINE" || /networkerror|network request failed|load failed/i.test(t));
75
75
  }
76
76
  var ANY_HOST_CODES = /* @__PURE__ */ new Set(["OFFLINE", "TIMEOUT", "UNAUTHORIZED", "FORBIDDEN", "NOT_FOUND", "RATE_LIMIT", "SERVER"]);
77
- var MACHINE_PREFIX = /^\s*(?:\[[\w./-]+\]\s*|[a-z][\w]*(?:[._][\w]+)+:\s+)/;
77
+ var MACHINE_PREFIX = /^\s*(?:\[[\w./-]+\]\s*|[a-z][\w]*(?:[._][\w]+)+:\s+|[a-z]+(?:[A-Z][a-z0-9]*)+:\s+)/;
78
78
  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;
79
79
  function isRawErrorText(text) {
80
80
  return MACHINE_PREFIX.test(text) || RAW_TEXT.test(text);
@@ -107,4 +107,4 @@ export {
107
107
  isRawErrorText,
108
108
  peopleErrorSentence
109
109
  };
110
- //# sourceMappingURL=chunk-HS6GMHKZ.js.map
110
+ //# sourceMappingURL=chunk-CZGTZJPS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/desktop/errors.ts","../src/error-sentence.ts"],"sourcesContent":["/**\n * THE error-wording layer. A failure is shown as a cause the person can act on (\"A program it\n * needs isn't installed\"), never as the raw text a process threw (\"spawn uv ENOENT\"). The raw text\n * is kept, whole, as `detail` — the banner offers it behind Copy details and a tooltip, for a bug\n * report or an agent. One table, so every screen and every service says the same thing.\n */\n\nexport interface DescribedError {\n /** One plain sentence: what went wrong and, where it helps, what to do. */\n cause: string;\n /** The raw text, unedited (empty when it would only repeat `cause`). */\n detail: string;\n /** A short machine code when one was recognized (\"ENOENT\", \"TIMEOUT\"). */\n code?: string;\n}\n\ninterface Rule {\n code: string;\n test: RegExp;\n cause: string;\n}\n\n/** Ordered: the first rule whose pattern matches the raw text wins. */\nconst RULES: ReadonlyArray<Rule> = [\n { code: \"ENOENT\", test: /\\b(spawn\\s+\\S+\\s+)?ENOENT\\b|command not found|no such file or directory/i, cause: \"A program or file it needs isn't on this computer. Install it or update Matrx, then try again.\" },\n { code: \"EACCES\", test: /\\bEACCES\\b|\\bEPERM\\b|permission denied|operation not permitted|not authori[sz]ed by the user/i, cause: \"Matrx isn't allowed to do that. Grant access in System Settings › Privacy & Security, then try again.\" },\n { code: \"EADDRINUSE\", test: /\\bEADDRINUSE\\b|address already in use|port .* (is )?(already )?in use/i, cause: \"Another program is already using that port. Stop it, or choose another port.\" },\n { code: \"ECONNREFUSED\", test: /\\bECONNREFUSED\\b|connection refused/i, cause: \"The service isn't answering. It may have stopped; start it again.\" },\n { code: \"OFFLINE\", test: /\\bENOTFOUND\\b|\\bEAI_AGAIN\\b|\\bENETUNREACH\\b|getaddrinfo|network (is )?unreachable|failed to fetch|offline|(?:could ?n[o']t|cannot|can't) be reached/i, cause: \"Can't reach the internet. Check the connection and try again.\" },\n { code: \"TIMEOUT\", test: /\\bETIMEDOUT\\b|timed? ?out|\\bTIMEOUT\\b|deadline exceeded/i, cause: \"It took too long to answer. Try again in a moment.\" },\n { code: \"ENOSPC\", test: /\\bENOSPC\\b|no space left/i, cause: \"The disk is full. Free some space, then try again.\" },\n { code: \"ENOMEM\", test: /\\bENOMEM\\b|out of memory|cannot allocate memory/i, cause: \"The computer ran out of memory. Close something and try again.\" },\n { code: \"UNAUTHORIZED\", test: /\\b401\\b|unauthori[sz]ed|invalid (api )?key|not signed in|jwt expired|session expired/i, cause: \"You're signed out, or the key was refused. Sign in again.\" },\n { code: \"FORBIDDEN\", test: /\\b403\\b|forbidden/i, cause: \"This account isn't allowed to do that.\" },\n { code: \"NOT_FOUND\", test: /\\b404\\b|not found/i, cause: \"It isn't there any more. Refresh and try again.\" },\n { code: \"RATE_LIMIT\", test: /\\b429\\b|rate.?limit|too many requests/i, cause: \"Too many requests just now. Wait a moment and try again.\" },\n { code: \"SERVER\", test: /\\b5\\d\\d\\b|internal server error|bad gateway|service unavailable/i, cause: \"The server had a problem. Try again in a moment.\" },\n { code: \"EXITED\", test: /exited with code|process exited|crashed|SIGKILL|SIGSEGV|SIGTERM/i, cause: \"The service stopped unexpectedly. Start it again; Copy details if it keeps happening.\" },\n];\n\nconst RAW = /\\b[A-Z]{2,}[A-Z_]*\\b|[\\\\/][\\w.-]+[\\\\/]|\\bat \\S+ \\(|\\{|\\}|errno|stack|undefined|null|\\bspawn\\b/;\n\nfunction rawText(error: unknown): string {\n if (error instanceof Error) return error.message || error.name;\n if (typeof error === \"string\") return error;\n if (error && typeof error === \"object\" && \"message\" in error && typeof (error as { message: unknown }).message === \"string\") {\n return (error as { message: string }).message;\n }\n return \"\";\n}\n\n/**\n * Turn any thrown or returned error into words a person can act on. Already-humane text (a full\n * sentence the app wrote itself, with no codes, paths or stack) passes through unchanged.\n */\nexport function describeError(error: unknown, fallback = \"Something went wrong. Try again.\"): DescribedError {\n const detail = rawText(error).trim();\n if (!detail) return { cause: fallback, detail: \"\" };\n for (const rule of RULES) {\n if (rule.test.test(detail)) return { cause: rule.cause, detail, code: rule.code };\n }\n if (!RAW.test(detail) && detail.length <= 160) return { cause: detail, detail: \"\" };\n return { cause: fallback, detail };\n}\n","/**\n * THE SENTENCE A PERSON READS FOR AN ERROR — the one funnel every error surface draws through\n * (ErrorNotice, ErrorBox, the desktop Banner). Raw error text never reaches the screen: no\n * \"TypeError: Failed to fetch\", no `sidebar_conversations:` RPC prefix, no stack frame or file\n * path (Arman, 2026-10-24: notices are small and plain). The raw error still travels to the\n * Alchemy Menu / AI payload through the `error` prop; only the screen gets the sentence.\n *\n * The wording table is desktop/errors.ts `describeError` (one table for every screen); this file\n * adds what decides WHEN a sentence must go through it, narrow enough that an app's own sentence\n * (\"PDF too large\") passes untouched.\n */\nimport { describeError } from \"./desktop/errors\";\n\n/**\n * The sentence an error carries: its own message (string, Error, or any\n * object with a `message`). Empty when it has none.\n */\nexport function errorSentenceOf(error: unknown): string {\n if (error == null || error === true || error === false) return \"\";\n if (typeof error === \"string\") return error;\n if (typeof error !== \"object\") return String(error);\n const message = (error as { message?: unknown }).message;\n return typeof message === \"string\" ? message : \"\";\n}\n\n/**\n * What a person reads when the store cancelled a call at its statement timeout\n * (SQLSTATE 57014). Postgres' own \"canceling statement due to statement\n * timeout\" is about the database, not the person; the cancelled call rolled\n * back, so nothing was written (lane AT-SLOW, 2026-10-19). The same sentence\n * @ai-matrx/records' `TIMED_OUT_MESSAGE` gives.\n */\nexport const TIMED_OUT_SENTENCE = \"That took too long. Nothing was lost; try again.\";\n\n/** What a person reads when an error says nothing a person can use. */\nexport const FALLBACK_ERROR_SENTENCE = \"Something went wrong. Try again.\";\n\n/**\n * A notice CARD's words (the web toast, Matrx 2's floating card): a card is ~22 rem at most and its\n * action shares the row, so a line is a few words (notice-stack.ts NOTICE_TEXT_BUDGET). The same\n * causes as the sentences above, said short enough to fit at the smallest window, never cut by \"…\".\n */\nexport const CARD_ERROR_LINE = {\n OFFLINE: \"No connection\",\n TIMEOUT: \"Took too long. Nothing was lost.\",\n UNAUTHORIZED: \"Signed out. Sign in again.\",\n FORBIDDEN: \"Not allowed for this account\",\n NOT_FOUND: \"Not found. Refresh and retry.\",\n RATE_LIMIT: \"Too many requests. Wait a moment.\",\n SERVER: \"Server problem. Try again soon.\",\n FALLBACK: \"Something went wrong\",\n} as const;\n\n/** True when an error, its code, or its sentence is the store's statement timeout. */\nexport function isTimedOutError(error: unknown, message?: string | null, code?: string | number): boolean {\n if (code === \"57014\" || code === \"timed_out\") return true;\n if (error && typeof error === \"object\") {\n const o = error as { code?: unknown; sqlstate?: unknown };\n if (o.code === \"57014\" || o.code === \"timed_out\" || o.sqlstate === \"57014\") return true;\n }\n const text = `${message ?? \"\"} ${errorSentenceOf(error)}`;\n return /canceling statement due to statement timeout/i.test(text);\n}\n\n/** True when the call failed because the device is offline or the network never answered. */\nexport function isOfflineError(error: unknown, message?: string | null): boolean {\n if (typeof navigator !== \"undefined\" && navigator.onLine === false) return true;\n return offlineText(`${message ?? \"\"} ${errorSentenceOf(error)}`);\n}\n\nfunction offlineText(text: string): boolean {\n const t = text.trim();\n return t !== \"\" && (describeError(t).code === \"OFFLINE\" || /networkerror|network request failed|load failed/i.test(t));\n}\n\n/** describeError's causes that hold on every host (its process codes — ENOENT, EACCES, ports — are\n * the desktop's words for a local program and would mislead on a database refusal). */\nconst ANY_HOST_CODES = new Set([\"OFFLINE\", \"TIMEOUT\", \"UNAUTHORIZED\", \"FORBIDDEN\", \"NOT_FOUND\", \"RATE_LIMIT\", \"SERVER\"]);\n\n/** A leading machine label: `sidebar_conversations: …`, `chat.rpc_name: …`, `[chat-sidebar] …`,\n * or a camelCase operation name (`unreadByKind: …`, `pendingSoftExpiries: …`). */\nconst MACHINE_PREFIX = /^\\s*(?:\\[[\\w./-]+\\]\\s*|[a-z][\\w]*(?:[._][\\w]+)+:\\s+|[a-z]+(?:[A-Z][a-z0-9]*)+:\\s+)/;\n/** Text no person should read: JS error class names, stack frames, source paths. */\nconst RAW_TEXT =\n /\\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;\n\n/** True when a sentence carries raw error text or a code path (what the guard refuses on screen). */\nexport function isRawErrorText(text: string): boolean {\n return MACHINE_PREFIX.test(text) || RAW_TEXT.test(text);\n}\n\n/**\n * `card: true` = the short CARD_ERROR_LINE words for a notice card. Otherwise:\n * the sentence for the screen: the timeout sentence for a statement timeout; a caller's plain\n * sentence as is; a machine label stripped from the front; anything raw or offline worded by\n * `describeError` (its table, else `fallback`).\n */\nexport function peopleErrorSentence(\n error: unknown,\n message?: string | null,\n options: { code?: string | number | undefined; fallback?: string | undefined; card?: boolean | undefined } = {},\n): string {\n const card = options.card === true;\n if (isTimedOutError(error, message, options.code)) return card ? CARD_ERROR_LINE.TIMEOUT : TIMED_OUT_SENTENCE;\n const fallback = options.fallback ?? (card ? CARD_ERROR_LINE.FALLBACK : FALLBACK_ERROR_SENTENCE);\n const raw = message?.trim() || errorSentenceOf(error).trim();\n if (!raw) return fallback;\n let text = raw;\n for (let i = 0; i < 3 && MACHINE_PREFIX.test(text); i++) text = text.replace(MACHINE_PREFIX, \"\").trim();\n if (!text) return fallback;\n if (offlineText(text) || RAW_TEXT.test(text) || text !== raw) {\n const said = describeError(text, fallback);\n if (!said.code || !ANY_HOST_CODES.has(said.code)) return fallback;\n return card ? CARD_ERROR_LINE[said.code as keyof typeof CARD_ERROR_LINE] : said.cause;\n }\n return text;\n}\n"],"mappings":";;;AAuBA,IAAM,QAA6B;AAAA,EACjC,EAAE,MAAM,UAAU,MAAM,4EAA4E,OAAO,iGAAiG;AAAA,EAC5M,EAAE,MAAM,UAAU,MAAM,iGAAiG,OAAO,6GAAwG;AAAA,EACxO,EAAE,MAAM,cAAc,MAAM,0EAA0E,OAAO,+EAA+E;AAAA,EAC5L,EAAE,MAAM,gBAAgB,MAAM,wCAAwC,OAAO,oEAAoE;AAAA,EACjJ,EAAE,MAAM,WAAW,MAAM,wJAAwJ,OAAO,gEAAgE;AAAA,EACxP,EAAE,MAAM,WAAW,MAAM,4DAA4D,OAAO,qDAAqD;AAAA,EACjJ,EAAE,MAAM,UAAU,MAAM,6BAA6B,OAAO,qDAAqD;AAAA,EACjH,EAAE,MAAM,UAAU,MAAM,oDAAoD,OAAO,iEAAiE;AAAA,EACpJ,EAAE,MAAM,gBAAgB,MAAM,yFAAyF,OAAO,4DAA4D;AAAA,EAC1L,EAAE,MAAM,aAAa,MAAM,sBAAsB,OAAO,yCAAyC;AAAA,EACjG,EAAE,MAAM,aAAa,MAAM,sBAAsB,OAAO,kDAAkD;AAAA,EAC1G,EAAE,MAAM,cAAc,MAAM,0CAA0C,OAAO,2DAA2D;AAAA,EACxI,EAAE,MAAM,UAAU,MAAM,oEAAoE,OAAO,mDAAmD;AAAA,EACtJ,EAAE,MAAM,UAAU,MAAM,oEAAoE,OAAO,wFAAwF;AAC7L;AAEA,IAAM,MAAM;AAEZ,SAAS,QAAQ,OAAwB;AACvC,MAAI,iBAAiB,MAAO,QAAO,MAAM,WAAW,MAAM;AAC1D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,SAAS,OAAO,UAAU,YAAY,aAAa,SAAS,OAAQ,MAA+B,YAAY,UAAU;AAC3H,WAAQ,MAA8B;AAAA,EACxC;AACA,SAAO;AACT;AAMO,SAAS,cAAc,OAAgB,WAAW,oCAAoD;AAC3G,QAAM,SAAS,QAAQ,KAAK,EAAE,KAAK;AACnC,MAAI,CAAC,OAAQ,QAAO,EAAE,OAAO,UAAU,QAAQ,GAAG;AAClD,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,KAAK,KAAK,MAAM,EAAG,QAAO,EAAE,OAAO,KAAK,OAAO,QAAQ,MAAM,KAAK,KAAK;AAAA,EAClF;AACA,MAAI,CAAC,IAAI,KAAK,MAAM,KAAK,OAAO,UAAU,IAAK,QAAO,EAAE,OAAO,QAAQ,QAAQ,GAAG;AAClF,SAAO,EAAE,OAAO,UAAU,OAAO;AACnC;;;AC9CO,SAAS,gBAAgB,OAAwB;AACtD,MAAI,SAAS,QAAQ,UAAU,QAAQ,UAAU,MAAO,QAAO;AAC/D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAClD,QAAM,UAAW,MAAgC;AACjD,SAAO,OAAO,YAAY,WAAW,UAAU;AACjD;AASO,IAAM,qBAAqB;AAG3B,IAAM,0BAA0B;AAOhC,IAAM,kBAAkB;AAAA,EAC7B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AACZ;AAGO,SAAS,gBAAgB,OAAgB,SAAyB,MAAiC;AACxG,MAAI,SAAS,WAAW,SAAS,YAAa,QAAO;AACrD,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,WAAW,EAAE,SAAS,eAAe,EAAE,aAAa,QAAS,QAAO;AAAA,EACrF;AACA,QAAM,OAAO,GAAG,WAAW,EAAE,IAAI,gBAAgB,KAAK,CAAC;AACvD,SAAO,gDAAgD,KAAK,IAAI;AAClE;AAGO,SAAS,eAAe,OAAgB,SAAkC;AAC/E,MAAI,OAAO,cAAc,eAAe,UAAU,WAAW,MAAO,QAAO;AAC3E,SAAO,YAAY,GAAG,WAAW,EAAE,IAAI,gBAAgB,KAAK,CAAC,EAAE;AACjE;AAEA,SAAS,YAAY,MAAuB;AAC1C,QAAM,IAAI,KAAK,KAAK;AACpB,SAAO,MAAM,OAAO,cAAc,CAAC,EAAE,SAAS,aAAa,mDAAmD,KAAK,CAAC;AACtH;AAIA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,WAAW,WAAW,gBAAgB,aAAa,aAAa,cAAc,QAAQ,CAAC;AAIvH,IAAM,iBAAiB;AAEvB,IAAM,WACJ;AAGK,SAAS,eAAe,MAAuB;AACpD,SAAO,eAAe,KAAK,IAAI,KAAK,SAAS,KAAK,IAAI;AACxD;AAQO,SAAS,oBACd,OACA,SACA,UAA6G,CAAC,GACtG;AACR,QAAM,OAAO,QAAQ,SAAS;AAC9B,MAAI,gBAAgB,OAAO,SAAS,QAAQ,IAAI,EAAG,QAAO,OAAO,gBAAgB,UAAU;AAC3F,QAAM,WAAW,QAAQ,aAAa,OAAO,gBAAgB,WAAW;AACxE,QAAM,MAAM,SAAS,KAAK,KAAK,gBAAgB,KAAK,EAAE,KAAK;AAC3D,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,KAAK,eAAe,KAAK,IAAI,GAAG,IAAK,QAAO,KAAK,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AACtG,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,YAAY,IAAI,KAAK,SAAS,KAAK,IAAI,KAAK,SAAS,KAAK;AAC5D,UAAM,OAAO,cAAc,MAAM,QAAQ;AACzC,QAAI,CAAC,KAAK,QAAQ,CAAC,eAAe,IAAI,KAAK,IAAI,EAAG,QAAO;AACzD,WAAO,OAAO,gBAAgB,KAAK,IAAoC,IAAI,KAAK;AAAA,EAClF;AACA,SAAO;AACT;","names":[]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  peopleErrorSentence
4
- } from "./chunk-HS6GMHKZ.js";
4
+ } from "./chunk-CZGTZJPS.js";
5
5
 
6
6
  // src/error-box.tsx
7
7
  import * as React from "react";
@@ -76,4 +76,4 @@ export {
76
76
  ErrorActions,
77
77
  ErrorBox
78
78
  };
79
- //# sourceMappingURL=chunk-5Z5GTXKL.js.map
79
+ //# sourceMappingURL=chunk-FEITX4L3.js.map
@@ -2,11 +2,11 @@
2
2
  import {
3
3
  ErrorActions,
4
4
  useErrorCardMenus
5
- } from "./chunk-5Z5GTXKL.js";
5
+ } from "./chunk-FEITX4L3.js";
6
6
  import {
7
7
  isTimedOutError,
8
8
  peopleErrorSentence
9
- } from "./chunk-HS6GMHKZ.js";
9
+ } from "./chunk-CZGTZJPS.js";
10
10
  import {
11
11
  Button
12
12
  } from "./chunk-7IOSA55D.js";
@@ -335,4 +335,4 @@ export {
335
335
  ReadEmpty,
336
336
  ReadStaleNotice
337
337
  };
338
- //# sourceMappingURL=chunk-GUGBVQ4T.js.map
338
+ //# sourceMappingURL=chunk-OAK4ENIP.js.map
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  DataRowInspector,
23
23
  columnId
24
- } from "./chunk-2QFA6CK4.js";
24
+ } from "./chunk-UAIBCPMB.js";
25
25
  import {
26
26
  useMatrxDataTableHost
27
27
  } from "./chunk-B5D3VIMC.js";
@@ -305,4 +305,4 @@ export {
305
305
  withMacLookDefaults,
306
306
  DataRowWindow
307
307
  };
308
- //# sourceMappingURL=chunk-UGUVTE77.js.map
308
+ //# sourceMappingURL=chunk-QEQDJBNK.js.map
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-WLKHQGX5.js";
13
13
  import {
14
14
  ErrorBox
15
- } from "./chunk-5Z5GTXKL.js";
15
+ } from "./chunk-FEITX4L3.js";
16
16
  import {
17
17
  Skeleton
18
18
  } from "./chunk-DRSBLHOF.js";
@@ -778,4 +778,4 @@ export {
778
778
  CanvasLayout,
779
779
  ModeSwitch
780
780
  };
781
- //# sourceMappingURL=chunk-QJ6SQNXD.js.map
781
+ //# sourceMappingURL=chunk-TBWKBTPM.js.map
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-7ZCD4AZS.js";
18
18
  import {
19
19
  RecordId
20
- } from "./chunk-RO5CRIOL.js";
20
+ } from "./chunk-3JEAXZKX.js";
21
21
  import {
22
22
  Button
23
23
  } from "./chunk-KOUHF4JC.js";
@@ -671,4 +671,4 @@ export {
671
671
  isUuidValue,
672
672
  DataRowInspector
673
673
  };
674
- //# sourceMappingURL=chunk-2QFA6CK4.js.map
674
+ //# sourceMappingURL=chunk-UAIBCPMB.js.map
@@ -26,7 +26,7 @@ import {
26
26
  } from "./chunk-YRF22M5S.js";
27
27
  import {
28
28
  ErrorActions
29
- } from "./chunk-5Z5GTXKL.js";
29
+ } from "./chunk-FEITX4L3.js";
30
30
  import {
31
31
  HostLink
32
32
  } from "./chunk-TH6DDCWF.js";
@@ -4007,4 +4007,4 @@ export {
4007
4007
  TileCard,
4008
4008
  TileCardGrid
4009
4009
  };
4010
- //# sourceMappingURL=chunk-VOLSYNJY.js.map
4010
+ //# sourceMappingURL=chunk-VG765KBC.js.map
@@ -55,7 +55,9 @@ button[data-alchemy-trigger="icon"] > svg { width: 0.875rem; height: 0.875rem; s
55
55
  /* THE PALETTE (Arman, 2026-10-14): one surface — no bordered box inside it — small rows, no hint
56
56
  text on screen (a row's hint is its tooltip), one row of at most four copy tiles. */
57
57
  .matrx-alchemy-menu.matrx-alchemy-palette {
58
- width: min(15.5rem, calc(100vw - 2rem));
58
+ /* 16.5rem: each of the four tiles leaves ~58px for its 11px label — "Markdown" and "Formatted" are
59
+ 55px, and at 15.5rem (54px) they broke mid-word (2026-10-24). */
60
+ width: min(16.5rem, calc(100vw - 2rem));
59
61
  min-width: 0;
60
62
  padding: 0.25rem;
61
63
  max-height: var(--radix-popover-content-available-height, 80dvh);
package/dist/controls.cjs CHANGED
@@ -6161,7 +6161,7 @@ var RULES = [
6161
6161
  { code: "EACCES", test: /\bEACCES\b|\bEPERM\b|permission denied|operation not permitted|not authori[sz]ed by the user/i, cause: "Matrx isn't allowed to do that. Grant access in System Settings \u203A Privacy & Security, then try again." },
6162
6162
  { code: "EADDRINUSE", test: /\bEADDRINUSE\b|address already in use|port .* (is )?(already )?in use/i, cause: "Another program is already using that port. Stop it, or choose another port." },
6163
6163
  { code: "ECONNREFUSED", test: /\bECONNREFUSED\b|connection refused/i, cause: "The service isn't answering. It may have stopped; start it again." },
6164
- { code: "OFFLINE", test: /\bENOTFOUND\b|\bEAI_AGAIN\b|\bENETUNREACH\b|getaddrinfo|network (is )?unreachable|failed to fetch|offline/i, cause: "Can't reach the internet. Check the connection and try again." },
6164
+ { code: "OFFLINE", test: /\bENOTFOUND\b|\bEAI_AGAIN\b|\bENETUNREACH\b|getaddrinfo|network (is )?unreachable|failed to fetch|offline|(?:could ?n[o']t|cannot|can't) be reached/i, cause: "Can't reach the internet. Check the connection and try again." },
6165
6165
  { code: "TIMEOUT", test: /\bETIMEDOUT\b|timed? ?out|\bTIMEOUT\b|deadline exceeded/i, cause: "It took too long to answer. Try again in a moment." },
6166
6166
  { code: "ENOSPC", test: /\bENOSPC\b|no space left/i, cause: "The disk is full. Free some space, then try again." },
6167
6167
  { code: "ENOMEM", test: /\bENOMEM\b|out of memory|cannot allocate memory/i, cause: "The computer ran out of memory. Close something and try again." },
@@ -6225,7 +6225,7 @@ function offlineText(text) {
6225
6225
  return t !== "" && (describeError(t).code === "OFFLINE" || /networkerror|network request failed|load failed/i.test(t));
6226
6226
  }
6227
6227
  var ANY_HOST_CODES = /* @__PURE__ */ new Set(["OFFLINE", "TIMEOUT", "UNAUTHORIZED", "FORBIDDEN", "NOT_FOUND", "RATE_LIMIT", "SERVER"]);
6228
- var MACHINE_PREFIX = /^\s*(?:\[[\w./-]+\]\s*|[a-z][\w]*(?:[._][\w]+)+:\s+)/;
6228
+ var MACHINE_PREFIX = /^\s*(?:\[[\w./-]+\]\s*|[a-z][\w]*(?:[._][\w]+)+:\s+|[a-z]+(?:[A-Z][a-z0-9]*)+:\s+)/;
6229
6229
  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;
6230
6230
  function peopleErrorSentence(error, message, options = {}) {
6231
6231
  const card = options.card === true;