@reddb-io/ui 0.4.0 → 0.4.2

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/build/_app/immutable/assets/0.TxVXAdoK.css +1 -0
  2. package/build/_app/immutable/chunks/{CQUazLlV.js → Bg2aBORB.js} +1 -1
  3. package/build/_app/immutable/chunks/{DEXJoNrJ.js → DWeEt273.js} +4 -4
  4. package/build/_app/immutable/chunks/{DxlrWGyf.js → Dc8lKBnh.js} +6 -6
  5. package/build/_app/immutable/chunks/{DkihsTT_.js → VaQj2UQI.js} +1 -1
  6. package/build/_app/immutable/chunks/{kA3Jql_0.js → kV8hsQzl.js} +1 -1
  7. package/build/_app/immutable/chunks/{Bf0kgHHV.js → mhMQ-ayQ.js} +1 -1
  8. package/build/_app/immutable/entry/{app.DsWyVHHY.js → app.DtscMa2D.js} +2 -2
  9. package/build/_app/immutable/entry/start.SL1PrWY_.js +1 -0
  10. package/build/_app/immutable/nodes/{0.B3B9dr1W.js → 0.DoZdQbvH.js} +1 -1
  11. package/build/_app/immutable/nodes/{1.BRHK3-aW.js → 1.DSd6_zVJ.js} +1 -1
  12. package/build/_app/immutable/nodes/{10.DO83djGy.js → 10.BlwKpXKq.js} +1 -1
  13. package/build/_app/immutable/nodes/15.BRAG9k6m.js +60 -0
  14. package/build/_app/version.json +1 -1
  15. package/build/index.html +11 -11
  16. package/dist/embed/{AnalyticsView-C_h8ScpB.js → AnalyticsView-ClS9XXRu.js} +4 -4
  17. package/dist/embed/{AnalyticsView-C_h8ScpB.js.map → AnalyticsView-ClS9XXRu.js.map} +1 -1
  18. package/dist/embed/{RedUiEmbedRoot-BlduSCNM.js → RedUiEmbedRoot-MOdYaz6g.js} +5 -5
  19. package/dist/embed/{RedUiEmbedRoot-BlduSCNM.js.map → RedUiEmbedRoot-MOdYaz6g.js.map} +1 -1
  20. package/dist/embed/index-EW_M_YFX.js +3269 -0
  21. package/dist/embed/{index-BSBRHtH4.js.map → index-EW_M_YFX.js.map} +1 -1
  22. package/dist/embed/{index-client-DelkELqi.js → index-client-6cYPkViG.js} +2 -2
  23. package/dist/embed/{index-client-DelkELqi.js.map → index-client-6cYPkViG.js.map} +1 -1
  24. package/dist/embed/index.js +1 -1
  25. package/dist/embed/{sigma.esm-D9VpQHRm.js → sigma.esm-Dfzi-wY0.js} +2 -2
  26. package/dist/embed/{sigma.esm-D9VpQHRm.js.map → sigma.esm-Dfzi-wY0.js.map} +1 -1
  27. package/package.json +3 -3
  28. package/src/lib/reddb/client.ts +20 -14
  29. package/vendor/ds/design-system.receipt.json +44 -19
  30. package/vendor/ds/kits/app/README.md +38 -0
  31. package/vendor/ds/kits/app/src/change-review.variants.ts +27 -0
  32. package/vendor/ds/kits/app/src/composites/ChangeReview.svelte +110 -0
  33. package/vendor/ds/kits/app/src/composites/ErrorBoundary.svelte +50 -0
  34. package/vendor/ds/kits/app/src/composites/ShortcutHelp.svelte +50 -0
  35. package/vendor/ds/kits/app/src/composites/WorkspaceTabs.svelte +150 -0
  36. package/vendor/ds/kits/app/src/core/change-review.ts +37 -0
  37. package/vendor/ds/kits/app/src/core/contracts/changereview.ts +38 -0
  38. package/vendor/ds/kits/app/src/core/contracts/errorboundary.ts +15 -0
  39. package/vendor/ds/kits/app/src/core/contracts/shortcuthelp.ts +16 -0
  40. package/vendor/ds/kits/app/src/core/contracts/workspacetabs.ts +22 -0
  41. package/vendor/ds/kits/app/src/core/shortcut-help.ts +40 -0
  42. package/vendor/ds/kits/app/src/core/workspace-tabs.ts +69 -0
  43. package/vendor/ds/kits/app/src/error-boundary.variants.ts +12 -0
  44. package/vendor/ds/kits/app/src/index.ts +21 -0
  45. package/vendor/ds/kits/app/src/recipes.ts +8 -0
  46. package/vendor/ds/kits/app/src/shortcut-help.variants.ts +17 -0
  47. package/vendor/ds/kits/app/src/workspace-tabs.variants.ts +30 -0
  48. package/vendor/ds/kits/app/test/coherence.test.ts +2 -2
  49. package/vendor/ds/kits/app/test/density.test.ts +3 -3
  50. package/vendor/ds/kits/app/test/fixtures/ChangeReview.svelte +11 -0
  51. package/vendor/ds/kits/app/test/fixtures/ShortcutHelp.svelte +11 -0
  52. package/vendor/ds/kits/app/test/fixtures/WorkspaceTabs.svelte +11 -0
  53. package/vendor/ds/kits/app/test/react-consumer.tsx +3 -0
  54. package/vendor/ds/kits/app/test/speed-dial.test.ts +1 -1
  55. package/vendor/ds/kits/app/test/tree-shaking.test.ts +6 -0
  56. package/vendor/ds/kits/app/test/workspace-harvest.test.ts +187 -0
  57. package/vendor/ds/kits/base/README.md +16 -0
  58. package/vendor/ds/kits/base/src/SecretValue.svelte +86 -0
  59. package/vendor/ds/kits/base/src/button.variants.ts +6 -4
  60. package/vendor/ds/kits/base/src/core/contracts/secretvalue.ts +27 -0
  61. package/vendor/ds/kits/base/src/core/secret-value.ts +78 -0
  62. package/vendor/ds/kits/base/src/index.ts +6 -0
  63. package/vendor/ds/kits/base/src/recipes.ts +2 -0
  64. package/vendor/ds/kits/base/src/secret-value.variants.ts +16 -0
  65. package/vendor/ds/kits/base/test/components.test.ts +1 -0
  66. package/vendor/ds/kits/base/test/control-size.test.ts +1 -1
  67. package/vendor/ds/kits/base/test/disclosure.test.ts +1 -1
  68. package/vendor/ds/kits/base/test/dropdown-menu.test.ts +1 -1
  69. package/vendor/ds/kits/base/test/fixtures/SecretValue.svelte +11 -0
  70. package/vendor/ds/kits/base/test/navbar.test.ts +1 -1
  71. package/vendor/ds/kits/base/test/secret-value.test.ts +94 -0
  72. package/build/_app/immutable/assets/0.kZZvCfcb.css +0 -1
  73. package/build/_app/immutable/entry/start.JTS2dMkh.js +0 -1
  74. package/build/_app/immutable/nodes/15.BMQezBh7.js +0 -60
  75. package/dist/embed/index-BSBRHtH4.js +0 -3264
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reddb-io/ui",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "private": false,
5
5
  "description": "RedDB UI components and standalone web application.",
6
6
  "type": "module",
@@ -47,8 +47,8 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "@aflsolutions/graphology-communities-leiden": "^1.1.1",
50
- "@reddb-io/ui-kit": "0.4.0",
51
- "@reddb-io/ui-mcp": "0.4.0",
50
+ "@reddb-io/ui-kit": "0.4.2",
51
+ "@reddb-io/ui-mcp": "0.4.2",
52
52
  "@sigma/edge-curve": "^3.1.0",
53
53
  "@sigma/node-border": "^3.0.0",
54
54
  "@tauri-apps/api": "^2.5.0",
@@ -223,17 +223,10 @@ function isUnsupportedCollectionMetadataRoute(e: unknown): boolean {
223
223
  return message.includes("route not found: GET /collections/");
224
224
  }
225
225
 
226
- /**
227
- * Generalised "the server doesn't have this route" check (#22). `json()`
228
- * throws `<METHOD> <path> → <status> <body>`, so a 404 or a "route not found"
229
- * body both signal an unsupported route. Distinct from auth/5xx/network errors
230
- * — but capability negotiation treats *any* probe failure as unsupported
231
- * (fail safe), so this is only used to tell "route absent" from "signal
232
- * present" when reading the stable `/capabilities` endpoint.
233
- */
226
+ /** Missing or unimplemented discovery routes may use compatibility probes. */
234
227
  function isUnsupportedRoute(e: unknown): boolean {
235
228
  const message = e instanceof Error ? e.message : String(e);
236
- return / → 404\b/.test(message) || message.includes("route not found");
229
+ return / → (404|405|501)\b/.test(message);
237
230
  }
238
231
 
239
232
  function unsupportedCollectionMetadataError(baseUrl: string): Error {
@@ -586,17 +579,30 @@ export class RedClient {
586
579
 
587
580
  /**
588
581
  * Resolve the server's capability map (#22). Prefers the stable
589
- * `/capabilities` signal; when that route is absent (older server), infers
590
- * from lightweight, side-effect-free GET probes. Any non-404 failure
591
- * (network, auth, 5xx) fails safe to the empty map, so the UI hides controls
582
+ * `/capabilities` signal; when that route is absent or returns structured
583
+ * discovery without UI feature flags, infers from lightweight, side-effect-free
584
+ * GET probes. Compatibility follows working APIs, not the server version.
585
+ * Other failures (network, authentication, unexpected HTTP status) fail safe
586
+ * to the empty map, so the UI hides controls
592
587
  * rather than showing ones the server can't honour.
593
588
  */
594
589
  async capabilities(): Promise<ServerCapabilities> {
595
590
  try {
596
591
  const raw = await this.json<RawCapabilities>("/capabilities");
597
- return capabilitiesFromSignal(raw);
592
+ if (
593
+ !raw ||
594
+ typeof raw !== "object" ||
595
+ Array.isArray(raw) ||
596
+ raw.ok === false
597
+ )
598
+ return { ...EMPTY_SERVER_CAPABILITIES };
599
+ // A flat declaration is authoritative, including explicit false/empty
600
+ // flags. Structured discovery reports build/deployment state instead;
601
+ // prove optional UI routes with read-only probes before enabling them.
602
+ if ("features" in raw || "capabilities" in raw)
603
+ return capabilitiesFromSignal(raw);
598
604
  } catch (e) {
599
- // Only an absent route falls through to inference; anything else (a
605
+ // Only an absent/unimplemented route falls through; anything else (a
600
606
  // flaky network, an auth wall, a 5xx) hides everything.
601
607
  if (!isUnsupportedRoute(e)) return { ...EMPTY_SERVER_CAPABILITIES };
602
608
  }
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "v2026.10.29",
3
- "revision": "0586a0630257f7a2930135e3c9710ca6254bc1bf",
2
+ "version": "v2026.10.30",
3
+ "revision": "c43cc0341a26418135d83c20435908ea2e8ba2d3",
4
4
  "distribution": {
5
5
  "format": "source",
6
6
  "minify": false,
@@ -13,9 +13,10 @@
13
13
  ],
14
14
  "layers": [],
15
15
  "files": {
16
- "kits/app/README.md": "4ae4dabc264f52a64f098e537105ece040b21ea0a2150565c42743053417dd67",
16
+ "kits/app/README.md": "9c28755693a1b384b87eb8dce650f2609aab64643a10f459ab811f1af1031158",
17
17
  "kits/app/interaction-allowlist.json": "7d29216392231a4e0950b53d996d4a00b45d6272b2c0a387f45f6df58e362712",
18
18
  "kits/app/kit.json": "63edaf308e400305dab1dedf1220307cc9fe0f8dce2dfb7e0e1407933c5a96b8",
19
+ "kits/app/src/change-review.variants.ts": "4c11a06cf19a0cbf5cdd493c43c29f954f103997f73018efbac51fd48a0d4a42",
19
20
  "kits/app/src/composites/ActionPanel.svelte": "6a8af6485572711e95cb4fcf7e297d19fd541b7432ef9b25823f199da6b29a92",
20
21
  "kits/app/src/composites/ActivityFeed.svelte": "e047cfb0c1bdee3658b63f6b98eccdcec09901e2c7c1248c62a5f57a96830592",
21
22
  "kits/app/src/composites/ApplicationShell.svelte": "610dfd1a0f6da9eaed52705c0bb26ecb5ece43001bffa16504c6e121ad480e7a",
@@ -23,6 +24,7 @@
23
24
  "kits/app/src/composites/CardHeading.svelte": "3199e8bffa86af7d03d7bcc6818b03c2eac0e455ddb0961dd725f28bec997863",
24
25
  "kits/app/src/composites/CategoryFilter.svelte": "13c41c33d59c50b8e7621415c0486fe842ab95856577739b7b7053a75c0e33c8",
25
26
  "kits/app/src/composites/CategoryPreview.svelte": "887561f30a6496a48730d75126961defd9f4f9cae7aa8b4271afac8fe187164c",
27
+ "kits/app/src/composites/ChangeReview.svelte": "48a5015d797e0ba4bc42a967fce37996cb54a2a054d2e5cd89c5722d85ccca26",
26
28
  "kits/app/src/composites/ChatMessage.svelte": "4482e8b942c6e601264e8ba543908cec5c4c97642bb53c0e9681b166411fb639",
27
29
  "kits/app/src/composites/CheckoutForm.svelte": "fe247e1bfa2632fb3c6943163fc3970becf16d2fff0c9cfb914bae6b05bd9e58",
28
30
  "kits/app/src/composites/CommandPalette.svelte": "544c02c72de8a5c495e4c48d5ae8a630a10573bcf79d459223a754a5c1a921c6",
@@ -30,6 +32,7 @@
30
32
  "kits/app/src/composites/Diff.svelte": "87806476bee89ddb7f97ac2b783f2ab9d0a015c17914a3f20e4e03a1eff838a7",
31
33
  "kits/app/src/composites/EntityInspector.svelte": "16c6a0fe92e55ce93b208fb57fae5e8c720d8aa92a8310f5bed5378ae06fce60",
32
34
  "kits/app/src/composites/EntityJourney.svelte": "647a06af3a9e2320cd06dc43d3857a41b337063e2dd6a881570b6bdb672257ad",
35
+ "kits/app/src/composites/ErrorBoundary.svelte": "f739c716868e55382bd5aebb392cb2f5aa9234b77148d47789875aef3c59ec8e",
33
36
  "kits/app/src/composites/Filter.svelte": "bb75448d036f4c982f6ddce853e0236d664b58647b3b9df3d69f9bd6796628c8",
34
37
  "kits/app/src/composites/Incentive.svelte": "7dc2c2ac4ec03e614dfe99bfb73c734bd8ae2ceaf220d5b55d2ee34612ed5763",
35
38
  "kits/app/src/composites/Menubar.svelte": "a6a3ab32596d58e4f2f033eab41c6b563e0a1f1f63c0f0ef6ca63d925ebcf1be",
@@ -47,6 +50,7 @@
47
50
  "kits/app/src/composites/Review.svelte": "db4c646365b18243d589421e6a24009553446c5bb1d26772d2a0a6ef1e9a80cf",
48
51
  "kits/app/src/composites/SettingsRow.svelte": "7a7ecaca75379d2b8f179da4f169732655b1a5c9051355541e18d0bf99dd2777",
49
52
  "kits/app/src/composites/ShoppingCart.svelte": "c9779d8e0063beea4ca65e542f65387df19cd9af054562988f952644ad8f9d71",
53
+ "kits/app/src/composites/ShortcutHelp.svelte": "3e91b8c57cc8b8869391116b550b6bee0c0e4aea2ca9686b339b6fe77e98abf7",
50
54
  "kits/app/src/composites/SidebarLayout.svelte": "7c79b1e4bf017ab2e8bc98b79153925f7123d84355a306ada8dcfae3b7d3cabd",
51
55
  "kits/app/src/composites/SidebarNavigation.svelte": "ab2ca2d40a226fae0cc992b173896b1c3ba15b4fe1927d49c41ac9f88c73b93e",
52
56
  "kits/app/src/composites/SidebarPanel.svelte": "b0d7ce110d07f4556d43b1fa5c2e1977c988c1dcce77d2bf827aeb153d1d5319",
@@ -57,6 +61,7 @@
57
61
  "kits/app/src/composites/TaskList.svelte": "5019fa41a0436502718b8eacb57edfd2844d48df2f84fa4dc483f9c83ff05c19",
58
62
  "kits/app/src/composites/TelemetryRow.svelte": "17753a5dbbea25df48a85491634ac560f6c2643e87d0c792ed95d8b81f190395",
59
63
  "kits/app/src/composites/Toolbar.svelte": "ac2679c1734a8abbba02c02094d1141cfb4da4505788f7f8f83f8cbe05a18654",
64
+ "kits/app/src/composites/WorkspaceTabs.svelte": "b3750cd4f0fe347319c458619520f1b4b764b5d661fcefa1160749c325a924d5",
60
65
  "kits/app/src/composites/action-panel.variants.ts": "9804a4bba9b24ab86ce5e43a03f16bdce21c604f29adbbd648f1fad1610ca44c",
61
66
  "kits/app/src/composites/activity-feed.variants.ts": "1954f7122b0453358979a02122688545ec047d3ba274b4e4f39fcc85f62d7cb7",
62
67
  "kits/app/src/composites/application-shell.behavior.ts": "c386eef32b57fa8a18542d97309cf08485672c40c3dc540dfecd1202d6d104c6",
@@ -101,6 +106,7 @@
101
106
  "kits/app/src/composites/task-list.variants.ts": "42c3e21a0ee84f6dad27bfd57a98cbd766d46ece63c3e65e2010713089597c9d",
102
107
  "kits/app/src/composites/toolbar.variants.ts": "92901b6539d4d8a92ecd398257497413446e08d97d3d23d42fbf48cb9285e118",
103
108
  "kits/app/src/core/category-filter.ts": "00c2d5475a1153d39f75096b07045de0209c6a997abc1cefb3cdba33a154fcd2",
109
+ "kits/app/src/core/change-review.ts": "f729222a8c944f331a1ba511759b996fb10bd0ef9538dff953183dfe7bdeaa07",
104
110
  "kits/app/src/core/checkout-form.ts": "a8dfc592cfcc9bf4cbb12ff3ef8f51f88a33f0f7ad5dd7f95891b9ab2e89cc6d",
105
111
  "kits/app/src/core/contracts/actionpanel.ts": "f1bd0d48ff93df525dcd4963bc8e22fd541cf186e51da70e9a3e5274e3c82a78",
106
112
  "kits/app/src/core/contracts/activityfeed.ts": "c11273afdd4983f584a7890e9e2f2ee03a53545af924351a8093bd30b5f1b4a3",
@@ -109,6 +115,7 @@
109
115
  "kits/app/src/core/contracts/cardheading.ts": "e0813823d8dfeb81f15f2b9528a36dfb061821168e66c350b8ec59a6e3171985",
110
116
  "kits/app/src/core/contracts/categoryfilter.ts": "1ef318a26b465394f958a33990c8846f95d626f509acfb6b3f658d75148ce383",
111
117
  "kits/app/src/core/contracts/categorypreview.ts": "5fa80b0ea5f050358deefedd14bd6cda192e03e06a9653a748beba5bfe0c7560",
118
+ "kits/app/src/core/contracts/changereview.ts": "aa0a763b7369a6a2f2c97b0013e4c9280becd1941a023e617fe7d9931d65017a",
112
119
  "kits/app/src/core/contracts/chatmessage.ts": "34bf33524c76f929b56cc2f8b914195200fd26ba9d348c22ffe1e859329760b9",
113
120
  "kits/app/src/core/contracts/checkoutform.ts": "da759c06cdf37055bd8f10e853b8fcbab15ec33825fb0b284ad59a2bb53be5ed",
114
121
  "kits/app/src/core/contracts/commandpalette.ts": "12e8f5386705065de791bb3bd6c852f86334310762f3bc0ba6e78e60faae152e",
@@ -116,6 +123,7 @@
116
123
  "kits/app/src/core/contracts/diff.ts": "87150a7b1e8dbe741c83527a433a3f1c49eac00dadc429fc90f4c7cc902173fc",
117
124
  "kits/app/src/core/contracts/entityinspector.ts": "ff075123b1b4e039662f87b83a3197473e584031b38419eeece52fa70166d638",
118
125
  "kits/app/src/core/contracts/entityjourney.ts": "c178e3415ac94cc1fa3021ff665fa4c4fc945461e1a1a52c14fd5a1aebb5e9ac",
126
+ "kits/app/src/core/contracts/errorboundary.ts": "23ff57c8ae985a6ab7672e805f988664aed6d40426c3436bca15dd0ed2996aef",
119
127
  "kits/app/src/core/contracts/filter.ts": "bd842b247dba8e069399514bff2d873734bc00d07817aedb64aa14c040e80f92",
120
128
  "kits/app/src/core/contracts/incentive.ts": "6ea277b31a1961d61b5b0caac0b9b1ff8bb76c3ba0ba11eb987f61062c4b0605",
121
129
  "kits/app/src/core/contracts/listrow.ts": "643a56c8e9b2dde000f2cd4239c47446471e239e4a5bb40fe5d0bd8fd0f628c6",
@@ -137,6 +145,7 @@
137
145
  "kits/app/src/core/contracts/review.ts": "ab20ac86c17a6a619866cf9529402034038308acc68ec657f87f136acddfe9c2",
138
146
  "kits/app/src/core/contracts/settingsrow.ts": "c5c136ccae009dd705df46b19d930a01a0810d5fb4b6fd79f35dd3e68985e726",
139
147
  "kits/app/src/core/contracts/shoppingcart.ts": "d8ca27d12257eae8ba880a1d59b7c5e1021997e92a9cd4c17217c3dbe2bd0b2d",
148
+ "kits/app/src/core/contracts/shortcuthelp.ts": "d7fe4ffbf4d209d4fb5c60b81bc91c4cf718e8e7b89e4e38b468f14e13513a18",
140
149
  "kits/app/src/core/contracts/sidebarlayout.ts": "5110b390766beb3d5e7d558b6f730c6017c86a2d97a86ed0f1fabb971ed0c453",
141
150
  "kits/app/src/core/contracts/sidebarnavigation.ts": "593052dbfa3edbe0aa9c07199e52c550966f9fca867448a89d52f3951d0220ae",
142
151
  "kits/app/src/core/contracts/sidebarpanel.ts": "ab79755d1a37c6a80965334a1df5e4b824f46374e189c9441be8c2d2c18e19db",
@@ -148,6 +157,7 @@
148
157
  "kits/app/src/core/contracts/tasklist.ts": "b36a5b36e2a0be68f282f8dde82981cdc69562c408031ed55dcec37d50102081",
149
158
  "kits/app/src/core/contracts/telemetryrow.ts": "bb7c0b6d60c2ae479ece2a3e0174558deafb89cacd3a562b9083945718896a8c",
150
159
  "kits/app/src/core/contracts/toolbar.ts": "48ff3d6156a95f3ee39bd32a3a9fac7cd464adaf8b1591c65d25bcc21ee33620",
160
+ "kits/app/src/core/contracts/workspacetabs.ts": "45b258ef1834d5845f6bbd53504d9155908874aa9038a124c4de653284aad176",
151
161
  "kits/app/src/core/diff.ts": "e02899db28588d153d6161d88d5739490e2decda4093a2d11f9158766c3ef35f",
152
162
  "kits/app/src/core/entity-inspector.ts": "c69a7ba4b8f0f945df4fc5d247377f08436b8bb03e2038bbd2f737d8656859fe",
153
163
  "kits/app/src/core/entity-journey.ts": "294c7cc7ab991fa6c43dafce4b1d96bb7fb91a8afefc9c9685c835598a0a5a0e",
@@ -156,10 +166,13 @@
156
166
  "kits/app/src/core/product-list.ts": "f276b6ad75096589a7d2ab03a23db805f1a5a97c03dae6ee47ba8e5154bc8ffc",
157
167
  "kits/app/src/core/settings-row.ts": "5c17df84bcb31cc1b075bf28111cc7b78377cff004750c7031bd3c05de938f1a",
158
168
  "kits/app/src/core/shopping-cart.ts": "c1fee770952c7dc0e1e7f19d14978570424d4eefc1c9c680fe2cfeee014601bb",
169
+ "kits/app/src/core/shortcut-help.ts": "47a35a51ad03481c0f9988a1d5c02eab67cf0863bd85c6f165f7d367828f40fd",
159
170
  "kits/app/src/core/sidebar-rail.ts": "332d112a05b0606e3dba80b5b5948c5899dbd744717025c7fc26716acdcbd3c1",
171
+ "kits/app/src/core/workspace-tabs.ts": "da1a69f707f93eec66958327fc57dd87e37ad088be5b3c6ba23ca16a0bdacbf8",
160
172
  "kits/app/src/entity-inspector.variants.ts": "5319410c213891c54b25b362af6e80ad81b49ba09533284ed98d2738d376b549",
161
173
  "kits/app/src/entity-journey.variants.ts": "15d2e75c4ba1afbd091a97b86bbf3ff81735e0dec762658e6c459885c1514848",
162
- "kits/app/src/index.ts": "ba352335cf04ffbd956d206024d2c0ea1a5e135f66a1b6cf66fccf24d12d6f74",
174
+ "kits/app/src/error-boundary.variants.ts": "eafffb7d43581f5d2d3688f27a06d08ecb8589ee6732f25bd77416e08470cf5a",
175
+ "kits/app/src/index.ts": "a7ccd87d692a7a9057b7fd3f6eddad1196a23e81bc40b5c75030e583750b4694",
163
176
  "kits/app/src/operational.variants.ts": "31ee8e65c8debb0063db78dec7e65e8fabea65190004b10c071c64b97f1ed7dc",
164
177
  "kits/app/src/primitives/ListRow.svelte": "d095651fc9f9bd1af61133df1358f831779571538ac55bb062bef15bbe6d02b0",
165
178
  "kits/app/src/primitives/NavItem.svelte": "1c98def2bf6c28dd92cb835afbaf6705e57cca0f0e85b7802e305cd6997e64f0",
@@ -172,7 +185,9 @@
172
185
  "kits/app/src/primitives/pill.variants.ts": "9ea2e941419d798bce136161f6a804d8394e906a79dd26f0058fd6b79aa692f5",
173
186
  "kits/app/src/primitives/split-view.behavior.ts": "708b7b244de783d9c780d751f5e71d0a626e71cd0ac4796508ac6b6e9da9179d",
174
187
  "kits/app/src/primitives/split-view.variants.ts": "b2ff91b2a24e3176782b9b98882111287eb3e38359b882c5fda52022a05f49b3",
175
- "kits/app/src/recipes.ts": "711fb832630543f5231ab9025cc8c8a635d9eda0acc7c08866af5312e815361f",
188
+ "kits/app/src/recipes.ts": "1687134027ffee494f56e1c805028efe3e64fbe5296e80d08c59412feefda0b9",
189
+ "kits/app/src/shortcut-help.variants.ts": "59ae405960eac0732adc439adb29ae3a2e3514b0a1cb5e71f98029426a5f408e",
190
+ "kits/app/src/workspace-tabs.variants.ts": "dac4c85fcc14a2fe4b7b036cf1cf87cb022b587a6ae57927b8593a10f1e91c29",
176
191
  "kits/app/svelte.config.js": "f33819c6794b38086e540e929c6392d844e4513b7332cb7e00e4aa9d6e66d026",
177
192
  "kits/app/test/action-panel.test.ts": "5ac4a0ef04b74a788a980096bd0545b430013c0b66fa7bc74d4977afcd5f4b5a",
178
193
  "kits/app/test/activity-feed.test.ts": "afd9704235c9cabe2ac43a678e5a8bd1dbccd51c9aae4cc9df4d1ca89cd80a2b",
@@ -184,13 +199,13 @@
184
199
  "kits/app/test/category-preview.test.ts": "44d48acd02bad07cfff01a47eb994d1658be85c3b11d32774721ef056dce4e80",
185
200
  "kits/app/test/chat-message.test.ts": "a082f8efd6bf96bb0bb989f7ec3c162fa11720ae0bb13e00087772136b8685ee",
186
201
  "kits/app/test/checkout-form.test.ts": "1cdf628f1572210701fec1fa987700f26ee1e7deb75bf6ed8356d1cb1fd3b66f",
187
- "kits/app/test/coherence.test.ts": "4cb58115a5f1a9c2998bda8963fa7fe4730e7bf6e9a9575bd228ec0aec973bec",
202
+ "kits/app/test/coherence.test.ts": "3c2a4919c32ed447906c764219d87a8d592af680e97fbb6167e07f3950bf1054",
188
203
  "kits/app/test/command-palette.test.ts": "ad4ff516b1f194407cda175f9f25cfa724bfca3550fc7089fec5b20bac6a4ea5",
189
204
  "kits/app/test/command-surface-failures.test.ts": "4b73b055cd9d100548ad4042daa0ea3556d75ab500368ef27e3886247dd50f41",
190
205
  "kits/app/test/commerce-readiness.ts": "58f30f9474cc67f34b00f7a79a14662332faf5099694f0b28a1672dbca20ccde",
191
206
  "kits/app/test/consumer-check.test.ts": "a6833fd1883106e431a2c79d9eb1065ad9c4341d21634c2983fd0b5496bc21fd",
192
207
  "kits/app/test/context-menu.test.ts": "aa720c1ca6f3db5f7890510d388ba53a8e974356e2a749ca67284d6f798117d2",
193
- "kits/app/test/density.test.ts": "e234c1e231a3687986eace3b407b4cac29965ba19c2765e66196bc09a3149aaf",
208
+ "kits/app/test/density.test.ts": "bb53c205fd46529ad2a781215c2a0daa02a93fcb7fce69f071673274e54df1c1",
194
209
  "kits/app/test/diff.test.ts": "62893c699946aced2cf62b95a6dec0a25ff90e366a02b498feb7f6d11941517b",
195
210
  "kits/app/test/elevation.test.ts": "e88103cadee1b645c4534ef8e9812eb8f9a12f69fbf3c8adce7233dbc8e5d881",
196
211
  "kits/app/test/entity-inspector.test.ts": "005fefb7f8bb833080936c3bdd69b0e9b8556f44e1b506ff8d40e97ac4250cb7",
@@ -199,6 +214,7 @@
199
214
  "kits/app/test/filter.test.ts": "055d52e3460bf5895c0e31c46c252dfc963ada280166d86696ed0c6986bb371f",
200
215
  "kits/app/test/fixtures/ApplicationLayoutsConsumer.svelte": "d27b2ffd187ede0a80025a1c74576fa744b190c5bb2d67261d96ddb0f8babfc8",
201
216
  "kits/app/test/fixtures/ApplicationLayoutsContractFailures.svelte": "6315b5cfde7291882d5a79dd7e3be8aa58491dbcc75138965fb68eccecf4bf51",
217
+ "kits/app/test/fixtures/ChangeReview.svelte": "edac6a6ef459104d2ee8dca8f9d78c905b70329f2b08ae252dd35a16b0e3407e",
202
218
  "kits/app/test/fixtures/CommandPaletteConsumer.svelte": "149f896cb22001edde5746c6a48ec6612170d052285988a5f4b8880c79900016",
203
219
  "kits/app/test/fixtures/CommandPaletteContractFailures.svelte": "f16393d7d21721b6f7faa66238a3abcfd8b4e9810d3355349dc050ed575ce05c",
204
220
  "kits/app/test/fixtures/CommandSurfaceContractFailures.svelte": "05cc4abe403d1db7eda7be08c273bca258e151d1126de748aa361683c9311480",
@@ -223,10 +239,12 @@
223
239
  "kits/app/test/fixtures/ProductCatalogueContractFailures.svelte": "6da0af11e3256c34d44c03bb0878051942084ae1e98f6b412dd7bb45b6f38fe1",
224
240
  "kits/app/test/fixtures/SettingsRows.svelte": "d5e7cca8c219027ad3d85bd1fe2b97aa96a768d33c55a4a769f0b25accffe526",
225
241
  "kits/app/test/fixtures/ShellBrandComposition.svelte": "4e2e3752a89e3141744459b07316071150bb2eaa125aed8e5e57ae6370963152",
242
+ "kits/app/test/fixtures/ShortcutHelp.svelte": "80db8f5cac3a3539a19eff0be600d827c96161bdaf0e9f21efb06a7fd67f319c",
226
243
  "kits/app/test/fixtures/SocialContractFailures.svelte": "45cdb5823fa2c792784b11725eb7f327832781e8775eed5e186b6672e9b0e1dd",
227
244
  "kits/app/test/fixtures/SocialSurfacesConsumer.svelte": "cdd3fadd8ba93b708d7494d8e45866acd2ca662c921bec05af2fe5c49313dd0f",
228
245
  "kits/app/test/fixtures/TestGlyph.svelte": "d3612c520ae5c981f27d21278b0132caad80c191f134933542e7b8bcb9643911",
229
246
  "kits/app/test/fixtures/TitlingSurfacesConsumer.svelte": "ac99e11ce7b48d91e7e5ecfe6d240700ff9632a3e84edf6109d65e153fe31f60",
247
+ "kits/app/test/fixtures/WorkspaceTabs.svelte": "4661fd20ff3ccba968c39aaa8aede877104b4a3cc79e3ad460dc1c2dd55a5e88",
230
248
  "kits/app/test/fixtures/command-surfaces-consumer.ts": "9c531222cd22ecc8201ba7ded7ca6c05c7c1d510442ae00211470fdbc75533f0",
231
249
  "kits/app/test/fixtures/consumer-check/Unfixed.svelte": "9745f7b159756e43c4e0a6fb2d644c58ce9fcfa0e480cd7796f0e58aec722553",
232
250
  "kits/app/test/fixtures/consumer-check/tsconfig.json": "1fd566a79c97371140a18a37f76a9e10b57481d6f8c55d0f8446696bb88b913c",
@@ -261,7 +279,7 @@
261
279
  "kits/app/test/product-list.test.ts": "a2269cff89df91dd23a931e9418ecf60b94382ede06ad60e83c8ca1c16828ded",
262
280
  "kits/app/test/product-overview.test.ts": "daf6b3cabc6c53eeff868b567ed08f7646b0b8b2559fabedc0f1f0a0e21b4bf5",
263
281
  "kits/app/test/product-quickview.test.ts": "68cebe3c28920bfc322a965157a6064d00fe68a5fc237e9cd7b52e3df63a8d32",
264
- "kits/app/test/react-consumer.tsx": "2ae35f786eea0484c3a01af948110922e1cffc0f71a89f022e2ba2087a0a652c",
282
+ "kits/app/test/react-consumer.tsx": "2da5afd76c12ea1fbe3b72252cb74dcea5bb372657d75588cdb011e08a483562",
265
283
  "kits/app/test/review.test.ts": "3395faa189300f311110098b7cf990192187e2f1eb5e7721f4dd7b84572235e9",
266
284
  "kits/app/test/settings-row.test.ts": "9bf6d7489e71643785a8387818986fe6d44b48f4368b5479748e5cf2d85dc304",
267
285
  "kits/app/test/shell-brand.test.ts": "5acf9d9e15d0b3548af0e75a9dde0ea07c69ddaca4eb3e137a779bf9c0c6c834",
@@ -270,15 +288,16 @@
270
288
  "kits/app/test/sidebar-navigation-bottom-navigation-store-navigation.test.ts": "3d1f7770981da632a4afc53bd6f771dc92263e063c658edd92ad5159eda9382a",
271
289
  "kits/app/test/sidebar-panel.test.ts": "bfacce51ded8eeaa1da04c7254c20057e001a0a792114b8a0bd4a664249203ff",
272
290
  "kits/app/test/sidebar-rail.test.ts": "32c98f854f9f3d99a3218ce5bde4462d51afea6416953ead002786d7767b34e9",
273
- "kits/app/test/speed-dial.test.ts": "bcf73665627db24906a6fc158e2d26ccdbde31d93481d04e90a783f048d9dba3",
291
+ "kits/app/test/speed-dial.test.ts": "1a94c38458e5f2cd73b2d708096a727f3f07a8843167d42cc45009124b305d30",
274
292
  "kits/app/test/split-view.behavior.test.ts": "f477527e9b844b13c9a3e3d93cfcc16662167d2949df3bafd6eda2c4a002f00c",
275
293
  "kits/app/test/split-view.dense-tooling.test.ts": "21c92af7a3e16014981cf8b2ea89d587a64cbd3dc074bd9d6564ca8da463a31f",
276
294
  "kits/app/test/split-view.test.ts": "3a1be08bc8a34a6533e24680df9fc16962afd69ee9730ed70e18c587bc542466",
277
295
  "kits/app/test/task-list.test.ts": "6376b81d5692508040447e376da48e9499ba8dc78fc52bbaffc80ab49c09eda6",
278
296
  "kits/app/test/taxonomy.test.ts": "01f43b41b1215320290c6b8ee20c5dde0ca3427d867ce323971dac7dcbc5f4c1",
279
297
  "kits/app/test/toolbar.test.ts": "36e7afb1887453d1af33ea7167cb76b448540c7409598f50d5efb038a6ef785e",
280
- "kits/app/test/tree-shaking.test.ts": "478bbf848cb525f7c7f273fe70355f3d9ce2f835da626d9b06f6fb7121093669",
298
+ "kits/app/test/tree-shaking.test.ts": "dad02dad0e7acb20f160991985878ce79a5de91ce795ed28f1d8a89123975272",
281
299
  "kits/app/test/vocabulary.test.ts": "10bc9f33b9c9f78d82c0764ad1520613b681d087fd95cae90f1aed2f1b227e16",
300
+ "kits/app/test/workspace-harvest.test.ts": "30c6d85fcf022e01a14624fa241012d81d59e78b5ae7a4f5afd7335161ba17ea",
282
301
  "kits/app/tools/build-cli.ts": "6eb6af540f61451c124fe0359c59fcd2a2a8d11cc84bc0c234f4ad3ee46e4e2f",
283
302
  "kits/app/tools/check-cli.ts": "f979a35023c7babf4bb60a07cf5e8df2f045e585c644c9be8e61947f87e2701b",
284
303
  "kits/app/tools/consumer-check.ts": "5d68f640c68020baa03a6a6dda2226eb2220b1e90cb7555d6d4866b7fbf8a91d",
@@ -288,7 +307,7 @@
288
307
  "kits/app/tsconfig.json": "9d25d26a6af9b534d6e62c377272d3063eb8585fbbc232be57ea6f6a1330c760",
289
308
  "kits/app/type-ledger.json": "0b9168917a9617f83c2a8131f497a0a121de10e8114c7c428af2f57b1e69fbc8",
290
309
  "kits/app/vite.config.ts": "11c69feca8bf6bfed34da0ccbe0f2d1e032ea02f6fc6f25a562323e4643455e1",
291
- "kits/base/README.md": "0394fed626075f46fae5382b475cd14aefc679eecdd46a6d6665a3681066d2b9",
310
+ "kits/base/README.md": "32fea7e9222d3281503fe509b8024deabb1cc403753c8c76a37ba27b5bdba64e",
292
311
  "kits/base/interaction-allowlist.json": "b950882520c482566f2de6739913b616be300cc5825fd02bfda1389243183258",
293
312
  "kits/base/kit.json": "79699254e48d3e3b3d813c134934a665d6aad113efa908297af05a43674a1e7c",
294
313
  "kits/base/src/Accordion.svelte": "265973192e2ee6ddf278f9a5aff5771f5ec404b70214e3b8546f1b240c074def",
@@ -367,6 +386,7 @@
367
386
  "kits/base/src/Reveal.svelte": "fddee97c2e5169b986a1e13b5f81c6f4d0486fa2aec8721940e8db5c6e9417c0",
368
387
  "kits/base/src/ScrollArea.svelte": "7c33f7c76187807eb6d888833063daf97675d45eaf4d97aa8c6d293f8218b3f9",
369
388
  "kits/base/src/SearchSelect.svelte": "e8ce5262ea0791197ffded4aeda8397c70ba256b21cee4cd9d03146d8a67369f",
389
+ "kits/base/src/SecretValue.svelte": "f0910e992b7c6ccc57a604197e009bc280c617fceca6d8556875d1a5210677cd",
370
390
  "kits/base/src/SectionHeading.svelte": "a2a5ae15bf0211cd4cd02bcdaf1aa835a77e52c4c06a026bd1feb1193addce1a",
371
391
  "kits/base/src/SectionSlide.svelte": "88ebdb6b1b93bdabe52f5c99f7443bd61484bb4787971822b1e1cc756b534622",
372
392
  "kits/base/src/Select.svelte": "a6df8fb1e57179522df960ea5a04f316c842f5708c57f27a400f3983998e21d5",
@@ -404,7 +424,7 @@
404
424
  "kits/base/src/badge.variants.ts": "6733e283628a5f10f3318523c42a971147b7cdd2760779927cb183d32766b5c1",
405
425
  "kits/base/src/breadcrumbs.variants.ts": "256ae95d6f3562258abadd821bc5a56f40c6954c9687d95d8cf1947717ec5b10",
406
426
  "kits/base/src/browser-mockup.variants.ts": "7c7f8ee0c090245025dfa43ed6e7e731c50dc37d6ef7cd6cca6595d1a2372f95",
407
- "kits/base/src/button.variants.ts": "49d470d793f9f91cd734a548291f731f318588c331cd38fb3fb5b5f40c3ac492",
427
+ "kits/base/src/button.variants.ts": "6f74579122c226b75c6a2133ccea7b06af752876113dc2c7669af3b75c0ec86e",
408
428
  "kits/base/src/calendar.variants.ts": "8f5a12b914b233ca3bb6930091302ceb32604e540ebf29e8280f29ffd2a7c310",
409
429
  "kits/base/src/card.variants.ts": "aa223ec2d905fa0c45c617a80b6002e5f4bc573e765065b67d9255f0889f4ad6",
410
430
  "kits/base/src/carousel.variants.ts": "63296ac2100234d508036f6ae4cacc68fb81a91fdbfe4ef1edc38589f4024193",
@@ -439,6 +459,7 @@
439
459
  "kits/base/src/core/contracts/phoneinput.ts": "62e5ec109a00e872f206c4e3f62014932a403177a5145caa91dfaa31a97a038d",
440
460
  "kits/base/src/core/contracts/popover.ts": "180ccba317b27fb4288852202d409083b75081d50952ea621339b8f5d3726751",
441
461
  "kits/base/src/core/contracts/searchselect.ts": "fdc8e4520a13781351e4ae62f7e506a1250274a4d4ce68e81e4aef7a037ee889",
462
+ "kits/base/src/core/contracts/secretvalue.ts": "f48eeb80a4982a1d89a4c4973bce6e2a510a9c396893d259f2d718e9d6d9caaf",
442
463
  "kits/base/src/core/contracts/tabs.ts": "009e0207e903c5d1f67341ce4a3e67bfad59e9dc0c9244ee2a2749d4b07e2e33",
443
464
  "kits/base/src/core/contracts/timefield.ts": "5ccb662ca716be48964d0b980a44abd33c75c398414f9f805dc7b87b67e3d824",
444
465
  "kits/base/src/core/contracts/timerangefield.ts": "31654fbd2ee20ec8e62c07851beaf8b53bd32fd06b05422d8e1ce86b2576031c",
@@ -467,6 +488,7 @@
467
488
  "kits/base/src/core/phone-input.ts": "666f8ddde688a0a2c719da9bdb555f6c11e519f5a315856837c9f8e8f17e018a",
468
489
  "kits/base/src/core/portal-appearance.ts": "267173c785152e0226393e4eac2a9f481d965744ac0dd3a618916921a1f24a25",
469
490
  "kits/base/src/core/reveal.ts": "f3fc94ffdf681927f3c5c0f96477e2bec573266adaf4427c7059e409c76496d4",
491
+ "kits/base/src/core/secret-value.ts": "6bddb1b63b7522426c226e09ab3438fb2c821934d5a0dd4dc48127ac0cfe15b0",
470
492
  "kits/base/src/core/segments.ts": "55666499873f793b0be355be6bf54f711b6526500d88cb364db209701b44488c",
471
493
  "kits/base/src/core/skip-link.ts": "37786b2c3ebd1046293c3ce64f66265f10cd664f2fd1f175bdd102593058da9d",
472
494
  "kits/base/src/core/slider.ts": "5e82c65447124f63a82fd9155041bf561f9ae1d12c0bdb5175ba26e2e3571120",
@@ -499,7 +521,7 @@
499
521
  "kits/base/src/grid-list.variants.ts": "7a5d724dcb60e83fe9567ac94a06549ef9848bc58f765fd0489b1dde90fcc81a",
500
522
  "kits/base/src/heading.variants.ts": "90807222b5713aa32aacaac40cffec1900afa910229e239e853676512604d087",
501
523
  "kits/base/src/image.variants.ts": "098c5f87b6a04f399828d2738d95ef97a7e48416a4d24b882e92f5ae2615c8a5",
502
- "kits/base/src/index.ts": "1ef8353bf801c9c2ffd8de509f1db327003234c3eb54b3217246de0a47ecbe65",
524
+ "kits/base/src/index.ts": "62f665a6a77e5cdc4517d07d7fda368c747284dbc542050891c98ba0f0b7d19b",
503
525
  "kits/base/src/indicator.variants.ts": "3e0c66f4bb20d83c2bd1e5a7799603c5a2b1591c3689a42c6801d4d9fb34f1c7",
504
526
  "kits/base/src/inline-edit.variants.ts": "9c1579d43ef4205849e1546da3a6d90483c2aa3d0be4fec91b790f0cc845829d",
505
527
  "kits/base/src/input.variants.ts": "75ef9ea6e478ed335514b007b80c3c320cf6c18b0a4673386e5a987ceda58e1e",
@@ -546,11 +568,12 @@
546
568
  "kits/base/src/radial-progress.variants.ts": "8a38e84c4c2406bd4b407299ce8803f8dec8ca049609b66364fee57121f01ba4",
547
569
  "kits/base/src/radio-group.variants.ts": "3bcf3f996cd87897f7d1f57b3da6d83edc5e6515a210481b582c7ea42d812e21",
548
570
  "kits/base/src/rating.variants.ts": "fae1e4f508620494e9460b0c6a1c8d6d3b7b0d0eae0e2e2d8dceaa3ce6f9133b",
549
- "kits/base/src/recipes.ts": "7d2a4e5d610d270e1ac94a9a6a88af638af14e821eacd89f1497aff45f5b2623",
571
+ "kits/base/src/recipes.ts": "2789febca0fb23a9ce835fd432535c257d70e9f81c7d7f323fa2fca804ff6d16",
550
572
  "kits/base/src/reduced-motion.svelte.ts": "827a8cb4ed4f2982f73a75612618ef28a7c2cc4da676bcfeebdb7cfd41a2117c",
551
573
  "kits/base/src/reveal.variants.ts": "c3c1aa271c574a9c64fda349443d1dd1fae1960da29fe03cf89256e7ec354770",
552
574
  "kits/base/src/scroll-area.variants.ts": "3db796233a08fe611a4a83b2cd8dff2f3c1a79a92df05465d88c07b52a7055f2",
553
575
  "kits/base/src/search-select.variants.ts": "e92e8d86fffe245ca70e4c7e33e44e52a581b912bfe41a992b370db7cc7f8ad8",
576
+ "kits/base/src/secret-value.variants.ts": "f844b5ad92569ac53886d821afe6b4dcefcb196363149f9b371f336b03aa2a01",
554
577
  "kits/base/src/section-heading.variants.ts": "187bea723747e8c39e66805714fe03881f4aebd3463f6aaa3438e99ebd1cd91c",
555
578
  "kits/base/src/segments.variants.ts": "b2422c3e640e3b545d9c8f3c19b08aa8ff757346d4c299a5000b5ebe3a60ca45",
556
579
  "kits/base/src/select.variants.ts": "25f6a4ceebb83527479aaebd6f1c6f07ec32850427fde619e55aa59afa93b644",
@@ -606,14 +629,14 @@
606
629
  "kits/base/test/code-block.test.ts": "06f4f3c8c6fa2c3492375e9ebc456c0dce760dbfdb95ee1ac89327b493ad570e",
607
630
  "kits/base/test/coherence.test.ts": "cb998b287ef0adf04f39ee02b81a98ff02f4cfe64a198877e82d63f32ab3862a",
608
631
  "kits/base/test/combobox.test.ts": "f51e69ecdb5163baa71f339b1214dec5a03449f9a75bea62033541b3bedf2c6c",
609
- "kits/base/test/components.test.ts": "b09d8144c0afd2d795e107eb10b27e1575546a02027adbe506f27ae3d56afabd",
632
+ "kits/base/test/components.test.ts": "c7cb1f152aeea375c90fb3a75f027bcfe147ba27072618489f4bf53e8055ab21",
610
633
  "kits/base/test/consumer-check.test.ts": "9052bff01905f6fcc4d86166aaa1019fa35644b2797726ea787af447ea8e4b0f",
611
634
  "kits/base/test/container-stack-skip-link-failures.test.ts": "789581e995c1cf504629d11b5d334cfbc790d4affd152f49cdf9df418284c39b",
612
635
  "kits/base/test/container.test.ts": "b801ec6b068979ba48d533225514bc4682760f85813025efe259db16db5396ac",
613
636
  "kits/base/test/content-mask-failures.test.ts": "54cdd94775db1b9d8b4ebd0fdaf9cc755edbe38d6e5550cc31df77b2ab4014b0",
614
637
  "kits/base/test/content-mask.test.ts": "7fa377a1d7970f205cce090f6e4998c52d3a3ee64274f82ca6cdfb41c3d44f90",
615
638
  "kits/base/test/control-group.test.ts": "5850baab597d687250839db4186abe4babb3eb361a2a0dfca54ae3b2b5e38785",
616
- "kits/base/test/control-size.test.ts": "f92e1d14a6ab0f0835e862784de4c6aacb0d218594ace37dc62b31c400ee5a48",
639
+ "kits/base/test/control-size.test.ts": "4cfd6b693aee973619df7f2e329a0084eb498bb4ef8310f14bff48f4ce3cc122",
617
640
  "kits/base/test/countdown.test.ts": "e5c3005f2c86d91f39cca5a2cdbeaeed5d676247c87c502b22c86462fb4969f1",
618
641
  "kits/base/test/date-field.test.ts": "491f3c06c1bea05a85437eaab2480aaa782be1235a99d2197be63586bbecdcf6",
619
642
  "kits/base/test/date-picker.test.ts": "0b5ac89d3223ba99bd4552b8e30e68f3bf3d5e97db50b760f482de15379457ce",
@@ -622,11 +645,11 @@
622
645
  "kits/base/test/description-list.test.ts": "e7b169eaba09bfa2a5a15561289d5a8b079a5a5f2a36a198ffee50ea1647a6a0",
623
646
  "kits/base/test/dialog-tooltip-failures.test.ts": "000b803806f1e6b56c2b5867ad501418afc6e59661e96e7c4a4cc148ac4dcc97",
624
647
  "kits/base/test/dialog.test.ts": "bb2cb2bfe7356491f0385bd89ba64fa4e289e3bc9a9a1e26ee737f5c391666a8",
625
- "kits/base/test/disclosure.test.ts": "8c36b60129003ca49a41516b1d7ae76d145e84c9852c63587b6ddfd02c398ff7",
648
+ "kits/base/test/disclosure.test.ts": "3c70aa208d0b21020e408cb1d92b07d9c01369951fad83d6db4c7c9dbbeea7a0",
626
649
  "kits/base/test/drawer-alert-dialog-appearance.test.ts": "67a0300a33efd2bea38e24b701d24622f0c52acc1ad88de5389b88da38547f78",
627
650
  "kits/base/test/drawer-alert-dialog-failures.test.ts": "daa78ed9a1ddf9711f3171cccfe805e967a178ff3a6455a78d2a81e205751644",
628
651
  "kits/base/test/drawer.test.ts": "5bf8402906e0f82183b27362c9a8e789dcd189536ab56d6e5caa065030a10566",
629
- "kits/base/test/dropdown-menu.test.ts": "d23660e4f0bf72d61ded4bd1dbd46d9f82f5bce95368e9a0e3b3debd919a4aed",
652
+ "kits/base/test/dropdown-menu.test.ts": "b4e2b54319760d084ff3da1d0e0a2457b871923678e47a85297b8644a6be4c2d",
630
653
  "kits/base/test/dropdown-navigation-menu-failures.test.ts": "61b1ffbe6c39426d391c4407adb87e9aaf14fa8f8e147d5b696bf325eed97ee2",
631
654
  "kits/base/test/elevation.test.ts": "46fa7eaa23782f78db8c19778f6d4bcb369fde728610d5f14179c71bc93ee588",
632
655
  "kits/base/test/empty-state.test.ts": "19ac01d723c456ec035055a0a3b98360cb9b7dee6cd1fabed253c5726e16d7a7",
@@ -701,6 +724,7 @@
701
724
  "kits/base/test/fixtures/RangePressedConsumer.svelte": "9e0ab75e0c27c419cdf8c5d2f713e01207b56d502e3fd8dcc41e8e21fe7738ea",
702
725
  "kits/base/test/fixtures/RangePressedContractFailures.svelte": "7f7018ba0464f061ac5d8f444a9e3c5597c58699e21d4bbacea61cc4fa513681",
703
726
  "kits/base/test/fixtures/RevealAppearanceConsumer.svelte": "96d7561144d384fa7091a05007f49c7a90c0b099dc1305caf50483e74ba5df73",
727
+ "kits/base/test/fixtures/SecretValue.svelte": "ac4050187a20afbc9fff1e1a1af1b7f6e079adb245d947993c073abc8225870c",
704
728
  "kits/base/test/fixtures/SpecializedEntryConsumer.svelte": "165442a36765130aafb393319b959ae08efc38e35cdfee7c635359a9e6fe53a6",
705
729
  "kits/base/test/fixtures/SpecializedEntryContractFailures.svelte": "ddf589b5ba53a64d4c2611a5097d1212980a5be266477abcc65bc3259a2f43dd",
706
730
  "kits/base/test/fixtures/StatusVocabularyConsumer.svelte": "85ed2b95605c20e34687d6fd99f158cbd637df8969e5bc7508a4adc7e6513dd8",
@@ -787,7 +811,7 @@
787
811
  "kits/base/test/media-object.test.ts": "5b8ed0f4d416a426b3a421b2a9fbc62853aa14d2a92e80284f89a056746e7643",
788
812
  "kits/base/test/meter.test.ts": "eda84c7fe37995bd1339efc94df1216292b43a243c7b392c1913283d5540a915",
789
813
  "kits/base/test/mount.ts": "507c5d569bfd3afd94dd5e814bb0a82dbdc820475d0eedeb5217932a2d1538cc",
790
- "kits/base/test/navbar.test.ts": "1ff94ec7b8a54e24510b89296a92424a2b425d55b25dd23207f836330e56b37f",
814
+ "kits/base/test/navbar.test.ts": "218aecf9fa60508232da76b5a4d2eaf7410e897bfa3a9aaa00d09902347d2e72",
791
815
  "kits/base/test/navigation-menu.test.ts": "6a56d9db648cc3f303632e9610e00210ae153ee2de5394f7176a3e99da9ae214",
792
816
  "kits/base/test/navigation-scope.test.ts": "58cb414bd7a18849b0dd0d9997fcf88b7170971af7cf6a9d5e2367cad51f96ac",
793
817
  "kits/base/test/notification.test.ts": "ac783b0cdccf6eaa3c916de7cabcf4bbaee9343344a072cac23ff7cecb4e7e6e",
@@ -813,6 +837,7 @@
813
837
  "kits/base/test/reveal.test.ts": "7cf34ee0922741ea5bb37be9d7148a996a0fff5906c29f46a682abd73f90cfc2",
814
838
  "kits/base/test/scroll-area.test.ts": "35663a5ce9e5da93c47dad2753cb7c4595adaaa6fb2f7d438ba2ada6595f9267",
815
839
  "kits/base/test/search-select.test.ts": "65c28f4809f885bec1d4897a7d73d3853daf402bd9e6156e2862f2b171e2bf63",
840
+ "kits/base/test/secret-value.test.ts": "32fd65df0b81f266a7bf87149c77c7f500f44ef62cccc0fbcf64fde39ecd189a",
816
841
  "kits/base/test/section-heading.test.ts": "64da5e69a50062bb75a7b8cbfd68089d605d0605a6a84a9bbe2bfbd8de0dc21f",
817
842
  "kits/base/test/select.test.ts": "14bba9b08e98bec7df3c642878899e1bbfc05de078e1c2dc82fa1fa49c3674ef",
818
843
  "kits/base/test/setup-storage.ts": "7e224c529bfd0bce5f97b9ca2bd139f97efccbb18e4f2ab8fe034b5eea1dde7e",
@@ -599,3 +599,41 @@ long labels stay readable and interactive stages keep native button semantics.
599
599
 
600
600
  Use the same ids with `EntityInspector` and `SceneViewport` annotations. See
601
601
  `/examples/entity-follow` for the linked APM composition in both native flavors.
602
+
603
+ ## Document workspaces and recovery
604
+
605
+ `WorkspaceTabs` takes stable `items: { id, label, closable?, dirty?, busy?,
606
+ disabled? }[]`, optional controlled `selected`, and `onselectedchange`. Without
607
+ `selected` it keeps local selection. Dirty drafts and execution are independent
608
+ caller-observed flags. Inactive panels stay mounted and hidden. Arrow/Home/End
609
+ keys follow native tab semantics; Delete or the separate Close button calls
610
+ `oncloserequest(id)` without removing anything. The application confirms drafts, cancels
611
+ work, persists documents and removes accepted ids. Removing a focused tab
612
+ restores focus to the surviving active tab. If an application opens a separate
613
+ confirmation overlay, it owns the return path after accepting the removal.
614
+
615
+ `ChangeReview` takes explicit caller-formatted `before`/`after` strings and
616
+ observed `pending | applying | applied | failed` states. Batch `onapplyrequest(ids)`
617
+ and `ondiscardrequest(ids)` exclude applied entries; per-item discard names one id.
618
+ Actions are requests only: keep failed changes and safe errors in `items` after
619
+ partial results. `applying` disables actions; `blockedReason` explains an apply
620
+ restriction while retaining review/discard. It executes no operation or SQL.
621
+
622
+ `ErrorBoundary` wraps a region using each framework's native client render
623
+ boundary. A failure shows safe default copy and Retry; raw exception text and
624
+ stacks are absent. `onfailure` observes the exception for application-owned logging;
625
+ `onretry` can repair state before resetting. Changing `resetKey` remounts the
626
+ region. A native `fallback({ error, retry })` projection replaces the recovery
627
+ content. Event-handler exceptions, rejected asynchronous work, and server render
628
+ failures are outside this contract and must be handled by the application.
629
+
630
+ `ShortcutHelp` composes the canonical Dialog and Kbd into a keyboard reference.
631
+ Supply contextual `groups`, platform-specific `keys`, optional `triggerLabel`
632
+ and `open` / `onopenchange`. It registers no shortcuts or global listeners.
633
+ Escape, focus containment and return use the canonical modal lifecycle.
634
+
635
+ `/examples/operations-workbench` combines all four with Base SecretValue, an
636
+ editable draft and Data EventLog. The recorded sample preserves canceled drafts,
637
+ shows explicit partial apply results, supports recovery and masks sample values
638
+ after five seconds. Its console can collapse, filter, clear and copy safe events.
639
+ Both native flavors share the example's transition functions and visual recipe.
@@ -0,0 +1,27 @@
1
+ import { tv } from "tailwind-variants";
2
+ import { typeRoleMerge } from "@reddb-io/design-system/base/recipes";
3
+ export const changeReview = tv(
4
+ {
5
+ slots: {
6
+ root: "@container/change-review flex min-w-0 flex-col gap-[var(--reddb-spatial-layout-gap-sm)] text-foreground",
7
+ title: "m-0 text-heading",
8
+ list: "m-0 grid min-w-0 list-none divide-y divide-muted p-0",
9
+ item: "grid min-w-0 gap-[var(--reddb-spatial-gap-md)] py-[var(--reddb-spatial-inset-md)]",
10
+ header:
11
+ "flex min-w-0 flex-wrap items-start justify-between gap-[var(--reddb-spatial-gap-sm)]",
12
+ name: "min-w-0 flex-1 text-body font-medium [overflow-wrap:anywhere]",
13
+ context: "m-0 text-caption text-ink-muted [overflow-wrap:anywhere]",
14
+ comparison:
15
+ "m-0 grid min-w-0 gap-[var(--reddb-spatial-gap-sm)] @md/change-review:grid-cols-2",
16
+ pair: "grid min-w-0 content-start gap-[var(--reddb-spatial-gap-sm)]",
17
+ term: "text-caption text-ink-muted",
18
+ value:
19
+ "m-0 whitespace-pre-wrap rounded-[var(--reddb-radius-sm)] bg-elevation-sunken-surface p-[var(--reddb-spatial-inset-sm)] font-mono text-body [overflow-wrap:anywhere]",
20
+ error:
21
+ "m-0 text-body text-feedback-danger-foreground [overflow-wrap:anywhere]",
22
+ actions:
23
+ "flex flex-wrap items-center justify-end gap-[var(--reddb-spatial-gap-sm)] border-t border-muted pt-[var(--reddb-spatial-inset-md)]",
24
+ },
25
+ },
26
+ typeRoleMerge,
27
+ );
@@ -0,0 +1,110 @@
1
+ <script module lang="ts">
2
+ export type { ReviewChange, ReviewState } from "../core/change-review";
3
+ </script>
4
+
5
+ <script lang="ts">
6
+ import { Button, StatusIndicator } from "@reddb-io/design-system/base";
7
+ import { changeReview } from "../change-review.variants";
8
+ import { reviewChanges } from "../core/change-review";
9
+ import type { ChangeReviewContract } from "../core/contracts/changereview";
10
+ interface Props extends ChangeReviewContract {
11
+ /** Additional composition classes. */
12
+ class?: string;
13
+ }
14
+ let {
15
+ title,
16
+ items,
17
+ applying = false,
18
+ blockedReason,
19
+ onapplyrequest,
20
+ ondiscardrequest,
21
+ beforeLabel = "Before",
22
+ afterLabel = "After",
23
+ applyLabel = "Apply changes",
24
+ discardLabel = "Discard all",
25
+ discardItemLabel = "Discard",
26
+ emptyLabel = "No pending changes",
27
+ pendingLabel = "Pending",
28
+ applyingLabel = "Applying",
29
+ appliedLabel = "Applied",
30
+ failedLabel = "Failed",
31
+ headingLevel = 2,
32
+ class: className,
33
+ }: Props = $props();
34
+ const s = changeReview();
35
+ const review = $derived(reviewChanges(items));
36
+ const busy = $derived(applying || review.applying);
37
+ const states = $derived({
38
+ pending: pendingLabel,
39
+ applying: applyingLabel,
40
+ applied: appliedLabel,
41
+ failed: failedLabel,
42
+ });
43
+ </script>
44
+
45
+ <section
46
+ data-change-review
47
+ aria-label={title}
48
+ aria-busy={busy}
49
+ class={s.root({ class: className })}
50
+ >
51
+ <svelte:element this={`h${headingLevel}`} class={s.title()}
52
+ >{title}</svelte:element
53
+ >
54
+ <ol class={s.list()}>
55
+ {#each review.items as item (item.id)}
56
+ <li
57
+ data-review-change={item.id}
58
+ data-state={item.state ?? "pending"}
59
+ class={s.item()}
60
+ >
61
+ <div class={s.header()}>
62
+ <span class={s.name()}>{item.label}</span><StatusIndicator
63
+ label={states[item.state ?? "pending"]}
64
+ tone={item.state === "failed"
65
+ ? "danger"
66
+ : item.state === "applied"
67
+ ? "success"
68
+ : "neutral"}
69
+ />
70
+ {#if ondiscardrequest && item.state !== "applied"}<Button
71
+ variant="ghost"
72
+ size="sm"
73
+ disabled={busy}
74
+ aria-label={`${discardItemLabel} ${item.label}`}
75
+ onclick={() => ondiscardrequest?.([item.id])}
76
+ >{discardItemLabel}</Button
77
+ >{/if}
78
+ </div>
79
+ {#if item.description}<p class={s.context()}>{item.description}</p>{/if}
80
+ <dl class={s.comparison()}>
81
+ <div class={s.pair()}>
82
+ <dt class={s.term()}>{beforeLabel}</dt>
83
+ <dd class={s.value()}>{item.before}</dd>
84
+ </div>
85
+ <div class={s.pair()}>
86
+ <dt class={s.term()}>{afterLabel}</dt>
87
+ <dd class={s.value()}>{item.after}</dd>
88
+ </div>
89
+ </dl>
90
+ {#if item.error}<p role="alert" class={s.error()}>{item.error}</p>{/if}
91
+ </li>
92
+ {/each}
93
+ </ol>
94
+ {#if !items.length}<p class={s.context()}>{emptyLabel}</p>{/if}
95
+ {#if blockedReason}<p class={s.context()}>{blockedReason}</p>{/if}
96
+ {#if onapplyrequest || ondiscardrequest}<div class={s.actions()}>
97
+ {#if ondiscardrequest}<Button
98
+ variant="ghost"
99
+ disabled={busy || !review.actionable.length}
100
+ onclick={() => ondiscardrequest?.([...review.actionable])}
101
+ >{discardLabel}</Button
102
+ >{/if}
103
+ {#if onapplyrequest}<Button
104
+ disabled={busy || !!blockedReason || !review.actionable.length}
105
+ loading={busy}
106
+ onclick={() => onapplyrequest?.([...review.actionable])}
107
+ >{applyLabel}</Button
108
+ >{/if}
109
+ </div>{/if}
110
+ </section>
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import { tick, type Snippet } from "svelte";
3
+ import { Button } from "@reddb-io/design-system/base";
4
+ import { errorBoundary } from "../error-boundary.variants";
5
+ import type { ErrorBoundaryContract } from "../core/contracts/errorboundary";
6
+ interface Props extends ErrorBoundaryContract {
7
+ /** Native child region; client render failures are contained here. */
8
+ children?: Snippet;
9
+ /** Optional caller-owned safe recovery content, receiving the error and retry operation. */
10
+ fallback?: Snippet<[{ error: unknown; retry: () => void }]>;
11
+ /** Additional classes on the failed region. */
12
+ class?: string;
13
+ }
14
+ let {
15
+ title = "This section could not be displayed",
16
+ description = "Try again to recover this section.",
17
+ retryLabel = "Try again",
18
+ resetKey,
19
+ onfailure,
20
+ onretry,
21
+ children,
22
+ fallback,
23
+ class: className,
24
+ }: Props = $props();
25
+ const s = errorBoundary();
26
+ </script>
27
+
28
+ {#key resetKey}
29
+ <svelte:boundary onerror={(error) => onfailure?.(error)}>
30
+ {@render children?.()}
31
+ {#snippet failed(error, reset)}
32
+ {@const retry = () => {
33
+ onretry?.();
34
+ void tick().then(reset);
35
+ }}
36
+ <section
37
+ data-error-boundary
38
+ role="alert"
39
+ aria-label={title}
40
+ class={s.root({ class: className })}
41
+ >
42
+ {#if fallback}{@render fallback({ error, retry })}{:else}
43
+ <p class={s.title()}>{title}</p>
44
+ <p class={s.description()}>{description}</p>
45
+ <Button onclick={retry}>{retryLabel}</Button>
46
+ {/if}
47
+ </section>
48
+ {/snippet}
49
+ </svelte:boundary>
50
+ {/key}