@openspecui/web 7.0.0 → 7.0.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 (71) hide show
  1. package/dist/assets/{App-D04w0rKO.js → App-DZbK_VKF.js} +96 -96
  2. package/dist/assets/App-Ddx3wr17.css +1 -0
  3. package/dist/assets/{main-Bh5BqDEB.js → main-DvWl4ArY.js} +2 -2
  4. package/dist/assets/{trpc-vqcD0NTx.js → trpc-CUrXyPaH.js} +1 -1
  5. package/dist/index.html +1 -1
  6. package/dist-ssg/client/.vite/ssr-manifest.json +89 -29
  7. package/dist-ssg/client/assets/CanvasRenderer-DbReVIDE.js +1 -0
  8. package/dist-ssg/client/assets/WebGLRenderer-DYji4Hjk.js +1 -0
  9. package/dist-ssg/client/assets/WebGPURenderer-DCzgl3HP.js +1 -0
  10. package/dist-ssg/client/assets/browserAll-DyJwsAsx.js +1 -0
  11. package/dist-ssg/client/assets/{config-guide-presentation-BEF34WAK.js → config-guide-presentation-PYNWYVfd.js} +1 -1
  12. package/dist-ssg/client/assets/{dist-DU7FOddi.js → dist-B6_zeP9X.js} +1 -1
  13. package/dist-ssg/client/assets/{dist-CBT1FQBi.js → dist-BXD-ZTAM.js} +1 -1
  14. package/dist-ssg/client/assets/{dist-BRX0vHHj.js → dist-BxLfQE_c.js} +1 -1
  15. package/dist-ssg/client/assets/{dist-XQwsfb9S.js → dist-C8koIGSO.js} +1 -1
  16. package/dist-ssg/client/assets/{dist-BzOaRFB5.js → dist-CD337m0H.js} +1 -1
  17. package/dist-ssg/client/assets/{dist-CQfLbMfn.js → dist-Cb1nIvKO.js} +1 -1
  18. package/dist-ssg/client/assets/dist-DOqQmBHc.js +1 -0
  19. package/dist-ssg/client/assets/dist-DUhJ59_2.js +1 -0
  20. package/dist-ssg/client/assets/{dist-DwdkRYfv.js → dist-DZMoaNp9.js} +1 -1
  21. package/dist-ssg/client/assets/{dist-gcj7KpQ7.js → dist-f2vnkzi9.js} +1 -1
  22. package/dist-ssg/client/assets/{dist-C7ncT3z3.js → dist-n_0I1u31.js} +1 -1
  23. package/dist-ssg/client/assets/dist-osbHiFDv.js +1 -0
  24. package/dist-ssg/client/assets/{ghostty-web-BuKlD9v-.js → ghostty-web-DEm8ZrOM.js} +1 -1
  25. package/dist-ssg/client/assets/index-Dcu2Vogo.css +1 -0
  26. package/dist-ssg/client/assets/{index.ssg-DRSFMaRS.js → index.ssg-5ak0Ru-F.js} +153 -153
  27. package/dist-ssg/client/assets/{init-Cna88xtL.js → init-mhU1_WMm.js} +1 -1
  28. package/dist-ssg/client/assets/{trpc-5KfqD8Sg.js → trpc-DcBLtyHb.js} +1 -1
  29. package/dist-ssg/client/assets/webworkerAll-BZhOzVEX.js +1 -0
  30. package/dist-ssg/client/index.ssg.html +2 -2
  31. package/dist-ssg/server/assets/CanvasRenderer-2gUSLPR3.js +3 -0
  32. package/dist-ssg/server/assets/WebGLRenderer-VYeMuiRZ.js +3 -0
  33. package/dist-ssg/server/assets/WebGPURenderer-CzqH7K0F.js +3 -0
  34. package/dist-ssg/server/assets/{browserAll-Br-Ym0s3.js → browserAll-C3TgySxy.js} +2 -2
  35. package/dist-ssg/server/assets/{config-guide-presentation-BNsPtfSX.js → config-guide-presentation-DluN0NgQ.js} +1 -1
  36. package/dist-ssg/server/assets/{dist-DLLg4uMo.js → dist-BQhB00FX.js} +1 -1
  37. package/dist-ssg/server/assets/{dist-tmI1Vtui.js → dist-BQopLPgi.js} +1 -1
  38. package/dist-ssg/server/assets/{dist-C-ifGdHx.js → dist-BSYA61e0.js} +1 -1
  39. package/dist-ssg/server/assets/{dist-BKolbUhu.js → dist-C0UE33e7.js} +1 -1
  40. package/dist-ssg/server/assets/{dist-D4wdS9IG.js → dist-CcweeoW2.js} +1 -1
  41. package/dist-ssg/server/assets/{dist-2q5MBzNz.js → dist-CqznyH3C.js} +1 -1
  42. package/dist-ssg/server/assets/dist-Cr2VaH_X.js +3 -0
  43. package/dist-ssg/server/assets/dist-CuufxmlH.js +3 -0
  44. package/dist-ssg/server/assets/dist-D-tZhX9W.js +3 -0
  45. package/dist-ssg/server/assets/{dist-BXMtMtrz.js → dist-DHRASvmg.js} +1 -1
  46. package/dist-ssg/server/assets/{dist-jJ40WsNS.js → dist-DukPjaq8.js} +1 -1
  47. package/dist-ssg/server/assets/{dist-DkcAEJix.js → dist-DxUyXTq1.js} +1 -1
  48. package/dist-ssg/server/assets/{entry-server-BrAwgnce.js → entry-server-CByGxb_0.js} +323 -163
  49. package/dist-ssg/server/assets/{init-d-mn_N98.js → init-C33dwfW5.js} +1 -1
  50. package/dist-ssg/server/assets/trpc-BZ-LKmoQ.js +3 -0
  51. package/dist-ssg/server/assets/webworkerAll-jouzdRxg.js +4 -0
  52. package/dist-ssg/server/ssr-entry-manifest.json +25 -25
  53. package/package.json +5 -5
  54. package/dist/assets/App-J7QMKvLP.css +0 -1
  55. package/dist-ssg/client/assets/CanvasRenderer-Dgiuwgmn.js +0 -1
  56. package/dist-ssg/client/assets/WebGLRenderer-BlOEHuOZ.js +0 -1
  57. package/dist-ssg/client/assets/WebGPURenderer-P8I2K_Xf.js +0 -1
  58. package/dist-ssg/client/assets/browserAll-D8-fUgsu.js +0 -1
  59. package/dist-ssg/client/assets/dist-BOrzLvBw.js +0 -1
  60. package/dist-ssg/client/assets/dist-D-Qw6bA0.js +0 -1
  61. package/dist-ssg/client/assets/dist-kaLCvHyA.js +0 -1
  62. package/dist-ssg/client/assets/index-BvRDTcR7.css +0 -1
  63. package/dist-ssg/client/assets/webworkerAll-CortW4j-.js +0 -1
  64. package/dist-ssg/server/assets/CanvasRenderer-BddS1srD.js +0 -3
  65. package/dist-ssg/server/assets/WebGLRenderer-CI_abbD1.js +0 -3
  66. package/dist-ssg/server/assets/WebGPURenderer-CGD9VYdm.js +0 -3
  67. package/dist-ssg/server/assets/dist-BuMA6YKx.js +0 -3
  68. package/dist-ssg/server/assets/dist-DHm81glc.js +0 -3
  69. package/dist-ssg/server/assets/dist-DweGKZ3K.js +0 -3
  70. package/dist-ssg/server/assets/trpc-DUmUqj4-.js +0 -3
  71. package/dist-ssg/server/assets/webworkerAll-BE4Faerg.js +0 -4
@@ -8,9 +8,9 @@ import { a as uniformParsers, c as ensureAttributes, d as localUniformBit, f as
8
8
  import { $ as keymap, A as indentUnit, At as IterMode, B as Direction, C as foldNodeProp, Ct as Transaction, D as indentNodeProp, Dt as countColumn, E as getIndentation, Et as combineConfig, F as syntaxTree, Ft as Parser, G as drawSelection, H as ViewPlugin, I as Tag$1, It as Tree, K as dropCursor, L as styleTags, Lt as parseMixed, M as matchBrackets, Mt as NodeSet, Nt as NodeType, O as indentOnInput, Ot as findClusterBreak, P as syntaxHighlighting, Pt as NodeWeakMap, Q as hoverTooltip, R as tags$1, S as foldKeymap, St as Text$2, T as getIndentUnit, Tt as codePointSize, U as WidgetType, V as EditorView, W as crosshairCursor, X as highlightActiveLineGutter, Y as highlightActiveLine, Z as highlightSpecialChars, _ as defineLanguageFacet, a as HighlightStyle, at as showPanel, b as foldGutter, bt as StateEffect, c as Language, ct as Annotation, d as ParseContext, dt as CharCategory, et as lineNumbers, f as StreamLanguage, ft as EditorSelection, g as defaultHighlightStyle, gt as Prec, h as continuedIndent, i as LocalTokenGroup, it as runScopeHandlers, j as languageDataProp, jt as NodeProp, k as indentString, kt as fromCodePoint, l as LanguageDescription, lt as ChangeDesc, m as bracketMatchingHandle, mt as Facet, n as ExternalTokenizer, nt as placeholder, o as IndentContext, p as bracketMatching, pt as EditorState, q as getPanel, r as LRParser, rt as rectangularSelection, s as LRLanguage, st as crelt, t as ContextTracker, u as LanguageSupport, ut as ChangeSet, v as delimitedIndent, vt as RangeSetBuilder, w as foldService, wt as codePointAt, x as foldInside, xt as StateField, z as Decoration } from "./dist-5X8O7Rwc.js";
9
9
  import { a as tsxLanguage, i as jsxLanguage, n as javascript, o as typescriptLanguage, r as javascriptLanguage } from "./dist-CCduGocE.js";
10
10
  import { i as closeBracketsKeymap, n as autocompletion, o as completionKeymap, r as closeBrackets, t as CompletionContext } from "./dist-CxThVo3w.js";
11
+ import { fileURLToPath as urlToPath } from "node:url";
11
12
  import minpath from "node:path";
12
13
  import minproc from "node:process";
13
- import { fileURLToPath as urlToPath } from "node:url";
14
14
  //#region ../../node_modules/.pnpm/@tanstack+query-core@5.90.10/node_modules/@tanstack/query-core/build/modern/subscribable.js
15
15
  var Subscribable = class {
16
16
  constructor() {
@@ -30908,7 +30908,7 @@ var NavController = class {
30908
30908
  this.storageKey = scopedStorageKey;
30909
30909
  this.rebindProjectScopedLayout(scopedStorageKey);
30910
30910
  }
30911
- const { trpcClient } = await import("./trpc-DUmUqj4-.js");
30911
+ const { trpcClient } = await import("./trpc-BZ-LKmoQ.js");
30912
30912
  const remote = parsePersistedLayout(await trpcClient.kv.get.query({ key: this.storageKey }));
30913
30913
  if (remote) {
30914
30914
  if (remote.updatedAt > this.state.updatedAt) this.dispatch({
@@ -31051,7 +31051,7 @@ var NavController = class {
31051
31051
  this.cancelPersistTimer();
31052
31052
  this.persistTimer = setTimeout(() => {
31053
31053
  this.persistTimer = null;
31054
- import("./trpc-DUmUqj4-.js").then(({ trpcClient }) => trpcClient.kv.set.mutate({
31054
+ import("./trpc-BZ-LKmoQ.js").then(({ trpcClient }) => trpcClient.kv.set.mutate({
31055
31055
  key: this.storageKey,
31056
31056
  value: {
31057
31057
  mainTabs: this.state.mainTabs,
@@ -58360,6 +58360,12 @@ function DesktopSidebar() {
58360
58360
  }
58361
58361
  //#endregion
58362
58362
  //#region src/lib/use-server-status.ts
58363
+ function directoryName(projectDir) {
58364
+ const normalized = projectDir.replace(/[\\/]+$/, "");
58365
+ if (!normalized) return projectDir;
58366
+ const segments = normalized.split(/[\\/]+/);
58367
+ return segments[segments.length - 1] || normalized;
58368
+ }
58363
58369
  /**
58364
58370
  * Hook to monitor server connection status and get project info
58365
58371
  */
@@ -58431,7 +58437,7 @@ function useServerStatus() {
58431
58437
  onData: (data) => {
58432
58438
  if (!isCurrentGeneration()) return;
58433
58439
  const projectDir = data.projectDir;
58434
- const dirName = projectDir.split("/").pop() || projectDir;
58440
+ const dirName = directoryName(projectDir);
58435
58441
  const connected = wsStateRef.current === "pending";
58436
58442
  setStatus((prev) => ({
58437
58443
  ...prev,
@@ -71013,7 +71019,7 @@ var browserExt = {
71013
71019
  },
71014
71020
  test: () => true,
71015
71021
  load: async () => {
71016
- await import("./browserAll-Br-Ym0s3.js");
71022
+ await import("./browserAll-C3TgySxy.js");
71017
71023
  }
71018
71024
  };
71019
71025
  //#endregion
@@ -71026,7 +71032,7 @@ var webworkerExt = {
71026
71032
  },
71027
71033
  test: () => typeof self !== "undefined" && self.WorkerGlobalScope !== void 0,
71028
71034
  load: async () => {
71029
- await import("./webworkerAll-BE4Faerg.js");
71035
+ await import("./webworkerAll-jouzdRxg.js");
71030
71036
  }
71031
71037
  };
71032
71038
  //#endregion
@@ -73620,7 +73626,7 @@ async function autoDetectRenderer(options) {
73620
73626
  for (let i = 0; i < preferredOrder.length; i++) {
73621
73627
  const rendererType = preferredOrder[i];
73622
73628
  if (rendererType === "webgpu" && await isWebGPUSupported()) {
73623
- const { WebGPURenderer } = await import("./WebGPURenderer-CGD9VYdm.js");
73629
+ const { WebGPURenderer } = await import("./WebGPURenderer-CzqH7K0F.js");
73624
73630
  RendererClass = WebGPURenderer;
73625
73631
  finalOptions = {
73626
73632
  ...options,
@@ -73628,7 +73634,7 @@ async function autoDetectRenderer(options) {
73628
73634
  };
73629
73635
  break;
73630
73636
  } else if (rendererType === "webgl" && isWebGLSupported(options.failIfMajorPerformanceCaveat ?? AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat)) {
73631
- const { WebGLRenderer } = await import("./WebGLRenderer-CI_abbD1.js");
73637
+ const { WebGLRenderer } = await import("./WebGLRenderer-VYeMuiRZ.js");
73632
73638
  RendererClass = WebGLRenderer;
73633
73639
  finalOptions = {
73634
73640
  ...options,
@@ -73636,7 +73642,7 @@ async function autoDetectRenderer(options) {
73636
73642
  };
73637
73643
  break;
73638
73644
  } else if (rendererType === "canvas") {
73639
- const { CanvasRenderer } = await import("./CanvasRenderer-BddS1srD.js");
73645
+ const { CanvasRenderer } = await import("./CanvasRenderer-2gUSLPR3.js");
73640
73646
  RendererClass = CanvasRenderer;
73641
73647
  finalOptions = {
73642
73648
  ...options,
@@ -93155,6 +93161,15 @@ function buildShortcutPages(platform) {
93155
93161
  }
93156
93162
  //#endregion
93157
93163
  //#region ../xterm-input-panel/src/shortcut-tab.ts
93164
+ /**
93165
+ * Orthogonal intents (updated 2026-08-06 Asia/Shanghai):
93166
+ * 1. Render platform-aware shortcut pages through Pixi.
93167
+ * 2. Own shortcut page selection and command dispatch.
93168
+ * 3. Keep shortcut layout, resize, and theme projection synchronized.
93169
+ * 4. Retire late Pixi initialization after disconnect so detached render loops cannot survive.
93170
+ *
93171
+ * Original request (2026-08-04): "Make pnpm openspecui start and equivalent package scripts work on Windows, then handle similar portability failures."
93172
+ */
93158
93173
  var GRID_GAP = 8;
93159
93174
  var GRID_PADDING = 10;
93160
93175
  var CARD_RADIUS = 8;
@@ -93277,6 +93292,7 @@ var ShortcutTab = class extends i {
93277
93292
  _resizeObserver = null;
93278
93293
  _theme = resolvePixiTheme(this);
93279
93294
  _unsubTheme = null;
93295
+ _connectionGeneration = 0;
93280
93296
  _renderedItems = [];
93281
93297
  constructor() {
93282
93298
  super();
@@ -93285,6 +93301,7 @@ var ShortcutTab = class extends i {
93285
93301
  }
93286
93302
  async connectedCallback() {
93287
93303
  super.connectedCallback();
93304
+ const connectionGeneration = ++this._connectionGeneration;
93288
93305
  this._theme = resolvePixiTheme(this);
93289
93306
  this._unsubTheme = onThemeChange((theme) => {
93290
93307
  this._theme = theme;
@@ -93292,9 +93309,10 @@ var ShortcutTab = class extends i {
93292
93309
  }, this);
93293
93310
  this._ensureActivePage();
93294
93311
  await this.updateComplete;
93295
- await this._initPixi();
93312
+ await this._initPixi(connectionGeneration);
93296
93313
  }
93297
93314
  disconnectedCallback() {
93315
+ this._connectionGeneration += 1;
93298
93316
  super.disconnectedCallback();
93299
93317
  this._resizeObserver?.disconnect();
93300
93318
  this._resizeObserver = null;
@@ -93329,7 +93347,7 @@ var ShortcutTab = class extends i {
93329
93347
  if (!pages.length) return;
93330
93348
  if (!pages.some((page) => page.id === this.activePageId)) this.activePageId = pages[0].id;
93331
93349
  }
93332
- async _initPixi() {
93350
+ async _initPixi(connectionGeneration) {
93333
93351
  const host = this.shadowRoot?.querySelector(".pixi-host");
93334
93352
  if (!host) return;
93335
93353
  const app = new Application();
@@ -93339,6 +93357,10 @@ var ShortcutTab = class extends i {
93339
93357
  resolution: window.devicePixelRatio || 1,
93340
93358
  autoDensity: false
93341
93359
  });
93360
+ if (!this.isConnected || connectionGeneration !== this._connectionGeneration) {
93361
+ app.destroy();
93362
+ return;
93363
+ }
93342
93364
  host.appendChild(app.canvas);
93343
93365
  this._app = app;
93344
93366
  const canvas = app.canvas;
@@ -94001,6 +94023,15 @@ var LAYOUTS = {
94001
94023
  };
94002
94024
  //#endregion
94003
94025
  //#region ../xterm-input-panel/src/virtual-keyboard-tab.ts
94026
+ /**
94027
+ * Orthogonal intents (updated 2026-08-06 Asia/Shanghai):
94028
+ * 1. Render the platform-aware Pixi virtual keyboard surface.
94029
+ * 2. Translate key, modifier, repeat, and swipe gestures into typed panel events.
94030
+ * 3. Keep layout, resize, and theme projection synchronized with the host element.
94031
+ * 4. Retire late Pixi initialization after disconnect so detached render loops cannot survive.
94032
+ *
94033
+ * Original request (2026-08-04): "Make pnpm openspecui start and equivalent package scripts work on Windows, then handle similar portability failures."
94034
+ */
94004
94035
  var KEY_PADDING = 3;
94005
94036
  var KEY_RADIUS = 4;
94006
94037
  var REPEAT_DELAY_MS = 400;
@@ -94039,6 +94070,7 @@ var VirtualKeyboardTab = class extends i {
94039
94070
  _resizeObserver = null;
94040
94071
  _theme = resolvePixiTheme(this);
94041
94072
  _unsubTheme = null;
94073
+ _connectionGeneration = 0;
94042
94074
  _repeatTimer = null;
94043
94075
  _repeatInterval = null;
94044
94076
  _activeKey = null;
@@ -94053,15 +94085,17 @@ var VirtualKeyboardTab = class extends i {
94053
94085
  }
94054
94086
  async connectedCallback() {
94055
94087
  super.connectedCallback();
94088
+ const connectionGeneration = ++this._connectionGeneration;
94056
94089
  this._theme = resolvePixiTheme(this);
94057
94090
  this._unsubTheme = onThemeChange((theme) => {
94058
94091
  this._theme = theme;
94059
94092
  this._layoutKeys();
94060
94093
  }, this);
94061
94094
  await this.updateComplete;
94062
- await this._initPixi();
94095
+ await this._initPixi(connectionGeneration);
94063
94096
  }
94064
94097
  disconnectedCallback() {
94098
+ this._connectionGeneration += 1;
94065
94099
  super.disconnectedCallback();
94066
94100
  this._cancelRepeat();
94067
94101
  this._resizeObserver?.disconnect();
@@ -94080,7 +94114,7 @@ var VirtualKeyboardTab = class extends i {
94080
94114
  getRows() {
94081
94115
  return LAYOUTS[this._hostPlatform()];
94082
94116
  }
94083
- async _initPixi() {
94117
+ async _initPixi(connectionGeneration) {
94084
94118
  const host = this.shadowRoot?.querySelector(".pixi-host");
94085
94119
  if (!host) return;
94086
94120
  const app = new Application();
@@ -94091,6 +94125,10 @@ var VirtualKeyboardTab = class extends i {
94091
94125
  resolution: window.devicePixelRatio || 1,
94092
94126
  autoDensity: false
94093
94127
  });
94128
+ if (!this.isConnected || connectionGeneration !== this._connectionGeneration) {
94129
+ app.destroy();
94130
+ return;
94131
+ }
94094
94132
  host.appendChild(app.canvas);
94095
94133
  this._app = app;
94096
94134
  const canvas = app.canvas;
@@ -94509,6 +94547,15 @@ var VirtualKeyboardTab = class extends i {
94509
94547
  customElements.define("virtual-keyboard-tab", VirtualKeyboardTab);
94510
94548
  //#endregion
94511
94549
  //#region ../xterm-input-panel/src/virtual-trackpad-tab.ts
94550
+ /**
94551
+ * Orthogonal intents (updated 2026-08-06 Asia/Shanghai):
94552
+ * 1. Render the Pixi virtual trackpad and its gesture feedback.
94553
+ * 2. Translate pointer, touch, long-press, drag, scroll, and edge gestures into panel events.
94554
+ * 3. Keep trackpad layout, resize, accent, and theme projection synchronized.
94555
+ * 4. Retire late Pixi initialization after disconnect so detached render loops cannot survive.
94556
+ *
94557
+ * Original request (2026-08-04): "Make pnpm openspecui start and equivalent package scripts work on Windows, then handle similar portability failures."
94558
+ */
94512
94559
  var DRAG_THRESHOLD = 8;
94513
94560
  var LONG_PRESS_MS = 500;
94514
94561
  var DOUBLE_TAP_MS = 300;
@@ -94575,6 +94622,7 @@ var VirtualTrackpadTab = class extends i {
94575
94622
  _resizeObserver = null;
94576
94623
  _theme = resolvePixiTheme(this);
94577
94624
  _unsubTheme = null;
94625
+ _connectionGeneration = 0;
94578
94626
  _touchStart = null;
94579
94627
  _isDragging = false;
94580
94628
  _longPressTimer = null;
@@ -94591,6 +94639,7 @@ var VirtualTrackpadTab = class extends i {
94591
94639
  _edgeSlideInterval = null;
94592
94640
  async connectedCallback() {
94593
94641
  super.connectedCallback();
94642
+ const connectionGeneration = ++this._connectionGeneration;
94594
94643
  this._theme = resolvePixiTheme(this);
94595
94644
  this._syncAccentRgb();
94596
94645
  this._unsubTheme = onThemeChange((theme) => {
@@ -94599,9 +94648,10 @@ var VirtualTrackpadTab = class extends i {
94599
94648
  this._drawSurface();
94600
94649
  }, this);
94601
94650
  await this.updateComplete;
94602
- await this._initPixi();
94651
+ await this._initPixi(connectionGeneration);
94603
94652
  }
94604
94653
  disconnectedCallback() {
94654
+ this._connectionGeneration += 1;
94605
94655
  super.disconnectedCallback();
94606
94656
  if (this._longPressTimer) clearTimeout(this._longPressTimer);
94607
94657
  this._stopEdgeSlide();
@@ -94618,7 +94668,7 @@ var VirtualTrackpadTab = class extends i {
94618
94668
  const hex = this._theme.accent;
94619
94669
  this._accentRgb = `${hex >> 16 & 255},${hex >> 8 & 255},${hex & 255}`;
94620
94670
  }
94621
- async _initPixi() {
94671
+ async _initPixi(connectionGeneration) {
94622
94672
  const host = this.shadowRoot?.querySelector(".pixi-host");
94623
94673
  if (!host) return;
94624
94674
  this._edgeOverlay = this.shadowRoot?.querySelector(".edge-glow");
@@ -94630,6 +94680,10 @@ var VirtualTrackpadTab = class extends i {
94630
94680
  resolution: window.devicePixelRatio || 1,
94631
94681
  autoDensity: false
94632
94682
  });
94683
+ if (!this.isConnected || connectionGeneration !== this._connectionGeneration) {
94684
+ app.destroy();
94685
+ return;
94686
+ }
94633
94687
  host.appendChild(app.canvas);
94634
94688
  this._app = app;
94635
94689
  const canvas = app.canvas;
@@ -97337,7 +97391,7 @@ var TerminalController = class {
97337
97391
  if (this.configPersistTimer) clearTimeout(this.configPersistTimer);
97338
97392
  this.configPersistTimer = setTimeout(() => {
97339
97393
  this.configPersistTimer = null;
97340
- import("./trpc-DUmUqj4-.js").then(({ trpcClient }) => {
97394
+ import("./trpc-BZ-LKmoQ.js").then(({ trpcClient }) => {
97341
97395
  trpcClient.config.update.mutate({ terminal: { fontSize: this.config.fontSize } });
97342
97396
  }).catch(() => {});
97343
97397
  }, CONFIG_PERSIST_DEBOUNCE);
@@ -107862,7 +107916,7 @@ var languages = [
107862
107916
  name: "CSS",
107863
107917
  extensions: ["css"],
107864
107918
  load() {
107865
- return import("./dist-BuMA6YKx.js").then((m) => m.css());
107919
+ return import("./dist-Cr2VaH_X.js").then((m) => m.css());
107866
107920
  }
107867
107921
  }),
107868
107922
  /* @__PURE__ */ LanguageDescription.of({
@@ -107882,7 +107936,7 @@ var languages = [
107882
107936
  "hbs"
107883
107937
  ],
107884
107938
  load() {
107885
- return import("./dist-D4wdS9IG.js").then((m) => m.html());
107939
+ return import("./dist-CcweeoW2.js").then((m) => m.html());
107886
107940
  }
107887
107941
  }),
107888
107942
  /* @__PURE__ */ LanguageDescription.of({
@@ -107916,7 +107970,7 @@ var languages = [
107916
107970
  "jinja2"
107917
107971
  ],
107918
107972
  load() {
107919
- return import("./dist-DkcAEJix.js").then((m) => m.jinja());
107973
+ return import("./dist-DxUyXTq1.js").then((m) => m.jinja());
107920
107974
  }
107921
107975
  }),
107922
107976
  /* @__PURE__ */ LanguageDescription.of({
@@ -107924,7 +107978,7 @@ var languages = [
107924
107978
  alias: ["json5"],
107925
107979
  extensions: ["json", "map"],
107926
107980
  load() {
107927
- return import("./dist-DweGKZ3K.js").then((m) => m.json());
107981
+ return import("./dist-CuufxmlH.js").then((m) => m.json());
107928
107982
  }
107929
107983
  }),
107930
107984
  /* @__PURE__ */ LanguageDescription.of({
@@ -107938,14 +107992,14 @@ var languages = [
107938
107992
  name: "LESS",
107939
107993
  extensions: ["less"],
107940
107994
  load() {
107941
- return import("./dist-BKolbUhu.js").then((m) => m.less());
107995
+ return import("./dist-C0UE33e7.js").then((m) => m.less());
107942
107996
  }
107943
107997
  }),
107944
107998
  /* @__PURE__ */ LanguageDescription.of({
107945
107999
  name: "Liquid",
107946
108000
  extensions: ["liquid"],
107947
108001
  load() {
107948
- return import("./dist-tmI1Vtui.js").then((m) => m.liquid());
108002
+ return import("./dist-BQopLPgi.js").then((m) => m.liquid());
107949
108003
  }
107950
108004
  }),
107951
108005
  /* @__PURE__ */ LanguageDescription.of({
@@ -107962,7 +108016,7 @@ var languages = [
107962
108016
  "mkd"
107963
108017
  ],
107964
108018
  load() {
107965
- return import("./dist-BXMtMtrz.js").then((m) => m.markdown());
108019
+ return import("./dist-DHRASvmg.js").then((m) => m.markdown());
107966
108020
  }
107967
108021
  }),
107968
108022
  /* @__PURE__ */ LanguageDescription.of({
@@ -107988,7 +108042,7 @@ var languages = [
107988
108042
  "phtml"
107989
108043
  ],
107990
108044
  load() {
107991
- return import("./dist-2q5MBzNz.js").then((m) => m.php());
108045
+ return import("./dist-CqznyH3C.js").then((m) => m.php());
107992
108046
  }
107993
108047
  }),
107994
108048
  /* @__PURE__ */ LanguageDescription.of({
@@ -108028,14 +108082,14 @@ var languages = [
108028
108082
  name: "Sass",
108029
108083
  extensions: ["sass"],
108030
108084
  load() {
108031
- return import("./dist-jJ40WsNS.js").then((m) => m.sass({ indented: true }));
108085
+ return import("./dist-DukPjaq8.js").then((m) => m.sass({ indented: true }));
108032
108086
  }
108033
108087
  }),
108034
108088
  /* @__PURE__ */ LanguageDescription.of({
108035
108089
  name: "SCSS",
108036
108090
  extensions: ["scss"],
108037
108091
  load() {
108038
- return import("./dist-jJ40WsNS.js").then((m) => m.sass());
108092
+ return import("./dist-DukPjaq8.js").then((m) => m.sass());
108039
108093
  }
108040
108094
  }),
108041
108095
  /* @__PURE__ */ LanguageDescription.of({
@@ -108102,7 +108156,7 @@ var languages = [
108102
108156
  alias: ["yml"],
108103
108157
  extensions: ["yaml", "yml"],
108104
108158
  load() {
108105
- return import("./dist-DHm81glc.js").then((m) => m.yaml());
108159
+ return import("./dist-D-tZhX9W.js").then((m) => m.yaml());
108106
108160
  }
108107
108161
  }),
108108
108162
  /* @__PURE__ */ LanguageDescription.of({
@@ -108989,13 +109043,13 @@ var languages = [
108989
109043
  name: "Vue",
108990
109044
  extensions: ["vue"],
108991
109045
  load() {
108992
- return import("./dist-C-ifGdHx.js").then((m) => m.vue());
109046
+ return import("./dist-BSYA61e0.js").then((m) => m.vue());
108993
109047
  }
108994
109048
  }),
108995
109049
  /* @__PURE__ */ LanguageDescription.of({
108996
109050
  name: "Angular Template",
108997
109051
  load() {
108998
- return import("./dist-DLLg4uMo.js").then((m) => m.angular());
109052
+ return import("./dist-BQhB00FX.js").then((m) => m.angular());
108999
109053
  }
109000
109054
  })
109001
109055
  ];
@@ -168623,6 +168677,113 @@ var motion = /* @__PURE__ */ createMotionProxy({
168623
168677
  ...layout
168624
168678
  }, createDomVisualElement);
168625
168679
  //#endregion
168680
+ //#region src/components/progressive-blur.tsx
168681
+ /**
168682
+ * Orthogonal intents (created 2026-08-04 Asia/Shanghai):
168683
+ * 1. Render a direction-aware progressive backdrop blur from a bounded level tuple.
168684
+ * 2. Scale overlapping mask bands from the actual level count instead of assuming eight levels.
168685
+ * 3. Preserve positioning-free Grid composition and expose one theme-owned surface layer.
168686
+ *
168687
+ * Original request (2026-08-04): refine Kanban edge fusion from Magic UI Progressive Blur while reducing blurLevels because eight instances render together.
168688
+ */
168689
+ var DEFAULT_BLUR_LEVELS = [
168690
+ .5,
168691
+ 2,
168692
+ 6
168693
+ ];
168694
+ function formatPercent(value) {
168695
+ return Number(value.toFixed(4)).toString();
168696
+ }
168697
+ function createLayerMask(index, layerCount, position) {
168698
+ const direction = position === "bottom" ? "to bottom" : "to top";
168699
+ const step = 100 / layerCount;
168700
+ if (index === layerCount - 1) return `linear-gradient(${direction}, transparent ${formatPercent(100 - step)}%, black 100%)`;
168701
+ const transparentStart = index * step;
168702
+ const opaqueStart = (index + 1) * step;
168703
+ const opaqueEnd = (index + 2) * step;
168704
+ const transparentEnd = (index + 3) * step;
168705
+ return `linear-gradient(${direction}, transparent ${formatPercent(transparentStart)}%, black ${formatPercent(opaqueStart)}%, black ${formatPercent(opaqueEnd)}%, transparent ${formatPercent(transparentEnd)}%)`;
168706
+ }
168707
+ /** Progressive backdrop blur whose overlapping bands scale with its blur-level count. */
168708
+ function ProgressiveBlur({ position, blurLevels = DEFAULT_BLUR_LEVELS, surfaceClassName, className, ...divProps }) {
168709
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
168710
+ ...divProps,
168711
+ "aria-hidden": "true",
168712
+ "data-progressive-blur": position,
168713
+ "data-progressive-blur-levels": blurLevels.length,
168714
+ className: cn$1("progressive-blur grid", className),
168715
+ children: [blurLevels.map((blur, index) => {
168716
+ const maskImage = createLayerMask(index, blurLevels.length, position);
168717
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168718
+ "data-progressive-blur-layer": index,
168719
+ className: "progressive-blur__layer",
168720
+ style: {
168721
+ zIndex: index + 1,
168722
+ backdropFilter: `blur(${blur}px)`,
168723
+ WebkitBackdropFilter: `blur(${blur}px)`,
168724
+ maskImage,
168725
+ WebkitMaskImage: maskImage
168726
+ }
168727
+ }, `${blur}:${index}`);
168728
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168729
+ "data-progressive-blur-surface": "",
168730
+ className: cn$1("progressive-blur__surface", surfaceClassName),
168731
+ style: { zIndex: blurLevels.length + 1 }
168732
+ })]
168733
+ });
168734
+ }
168735
+ //#endregion
168736
+ //#region src/components/kanban/kanban-lane-viewport.tsx
168737
+ /**
168738
+ * Orthogonal intents (updated 2026-08-04 Asia/Shanghai):
168739
+ * 1. Layer one semantic lane header and two visual edge veils over a full-height row scroller.
168740
+ * 2. Reserve readable header/footer landing space through density-owned scroll padding.
168741
+ * 3. Forward native section interactions without owning Kanban data or operations.
168742
+ *
168743
+ * Original request (2026-08-03): layer title and bottom space over a padded list with Grid, gradients, and progressive backdrop blur.
168744
+ * Owner refinement (2026-08-04): follow Magic UI Progressive Blur with fewer blur levels because eight lane-edge instances render together.
168745
+ */
168746
+ var KANBAN_BLUR_LEVELS = [
168747
+ .5,
168748
+ 2,
168749
+ 6
168750
+ ];
168751
+ /** Grid-layered lane viewport with one independent block-axis scroll owner. */
168752
+ function KanbanLaneViewport({ laneId, density, header, children, className, ...sectionProps }) {
168753
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
168754
+ ...sectionProps,
168755
+ "data-kanban-lane": laneId,
168756
+ "data-kanban-lane-density": density,
168757
+ className: cn$1("kanban-lane-viewport border-border/70 grid min-h-0 min-w-0 overflow-hidden border-t", className),
168758
+ children: [
168759
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168760
+ "data-kanban-lane-scroll": laneId,
168761
+ className: "kanban-lane-viewport__scroll scrollbar-thin scrollbar-track-transparent scrollbar-thumb-[color-mix(in_srgb,currentColor,transparent_78%)] min-h-0 overflow-y-auto overflow-x-hidden overscroll-contain pr-1",
168762
+ children
168763
+ }),
168764
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProgressiveBlur, {
168765
+ position: "top",
168766
+ blurLevels: KANBAN_BLUR_LEVELS,
168767
+ "data-kanban-lane-veil": "top",
168768
+ className: "kanban-lane-viewport__veil kanban-lane-viewport__veil--top",
168769
+ surfaceClassName: "kanban-lane-viewport__veil-surface kanban-lane-viewport__veil-surface--top"
168770
+ }),
168771
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", {
168772
+ "data-kanban-lane-header": laneId,
168773
+ className: "kanban-lane-viewport__header",
168774
+ children: header
168775
+ }),
168776
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProgressiveBlur, {
168777
+ position: "bottom",
168778
+ blurLevels: KANBAN_BLUR_LEVELS,
168779
+ "data-kanban-lane-veil": "bottom",
168780
+ className: "kanban-lane-viewport__veil kanban-lane-viewport__veil--bottom",
168781
+ surfaceClassName: "kanban-lane-viewport__veil-surface kanban-lane-viewport__veil-surface--bottom"
168782
+ })
168783
+ ]
168784
+ });
168785
+ }
168786
+ //#endregion
168626
168787
  //#region src/components/kanban/kanban-model.ts
168627
168788
  /**
168628
168789
  * Orthogonal intents (created 2026-07-28 Asia/Shanghai):
@@ -168687,14 +168848,15 @@ function getKanbanArchiveTimestamp(item) {
168687
168848
  //#endregion
168688
168849
  //#region src/components/kanban/interactive-kanban.tsx
168689
168850
  /**
168690
- * Orthogonal intents (created 2026-07-28 Asia/Shanghai):
168851
+ * Orthogonal intents (updated 2026-08-03 Asia/Shanghai):
168691
168852
  * 1. Render live objective lanes with independent active/archive lifecycle evidence.
168692
168853
  * 2. Expose accessible Apply/Archive launchers without mutating projected state.
168693
168854
  * 3. Resolve archive drops through DataTransfer identity and current-row authority.
168694
- * 4. Preserve progressive evidence while assigning one inline scroller and independent lane block scrollers.
168855
+ * 4. Preserve progressive evidence while assigning one inline scroller and layered lane block scrollers.
168695
168856
  *
168696
168857
  * Original request (2026-07-28): implement the reviewed interactive Kanban rewrite.
168697
168858
  * Owner correction (2026-07-28): remove double horizontal scrolling and let each lane scroll vertically.
168859
+ * Original request (2026-08-03): layer title and bottom space over a padded list with Grid, gradients, and progressive backdrop blur.
168698
168860
  */
168699
168861
  var CHANGE_DRAG_MIME = "application/x-openspecui-change-id";
168700
168862
  var RANGE_OPTIONS$1 = [
@@ -168753,7 +168915,9 @@ function InteractiveKanban({ activeItems, archivedItems, statuses, range, onRang
168753
168915
  const rowCount = archived ? archiveRows.length : activeRows.length;
168754
168916
  const initialLoading = archived ? archiveState.initialLoading : activeState.initialLoading;
168755
168917
  const updating = archived ? archiveState.updating : activeState.updating;
168756
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
168918
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KanbanLaneViewport, {
168919
+ laneId: lane.id,
168920
+ density: "full",
168757
168921
  "data-lane": lane.id,
168758
168922
  onDragOver: archived ? (event) => {
168759
168923
  if (!archiveDropCurrent || !event.dataTransfer.types.includes(CHANGE_DRAG_MIME)) return;
@@ -168765,9 +168929,9 @@ function InteractiveKanban({ activeItems, archivedItems, statuses, range, onRang
168765
168929
  if (!event.currentTarget.contains(event.relatedTarget)) setDropActive(false);
168766
168930
  } : void 0,
168767
168931
  onDrop: archived ? handleArchiveDrop : void 0,
168768
- className: cn$1("border-border/70 flex min-h-0 min-w-0 flex-col overflow-hidden border-t transition-colors", archived && dropActive && "border-primary bg-primary/5"),
168769
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
168770
- className: "flex h-11 min-w-0 shrink-0 items-center justify-between gap-2 px-1",
168932
+ className: cn$1("transition-colors", archived && dropActive && "border-primary bg-primary/5"),
168933
+ header: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
168934
+ className: "flex h-full min-w-0 items-center justify-between gap-2 px-1",
168771
168935
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
168772
168936
  className: "flex min-w-0 items-center gap-2",
168773
168937
  children: [
@@ -168788,79 +168952,76 @@ function InteractiveKanban({ activeItems, archivedItems, statuses, range, onRang
168788
168952
  options: RANGE_OPTIONS$1,
168789
168953
  onValueChange: onRangeChange,
168790
168954
  ariaLabel: "Archived time range",
168791
- className: "h-7 min-w-0 gap-1 px-2 text-xs"
168955
+ className: "pointer-events-auto h-7 min-w-0 gap-1 px-2 text-xs"
168792
168956
  }) : null]
168793
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168794
- "data-lane-scroll": true,
168795
- className: "scrollbar-thin scrollbar-track-transparent scrollbar-thumb-[color-mix(in_srgb,currentColor,transparent_78%)] min-h-0 flex-1 overflow-y-auto overflow-x-hidden overscroll-contain pb-2 pr-1",
168796
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RealtimeRevalidateCue, {
168797
- active: updating && rowCount > 0,
168798
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(motion.div, {
168799
- layout: true,
168800
- className: "min-h-24 space-y-2",
168801
- children: [
168802
- initialLoading && rowCount === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChangeListSkeleton, { count: 2 }) : null,
168803
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AnimatePresence, {
168804
- initial: false,
168805
- mode: "popLayout",
168806
- children: [archiveRows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
168807
- layout: true,
168808
- layoutId: `live-kanban:${item.id}`,
168809
- initial: {
168810
- opacity: 0,
168811
- y: 4
168812
- },
168813
- animate: {
168814
- opacity: 1,
168815
- y: 0
168816
- },
168817
- exit: {
168818
- opacity: 0,
168819
- scale: .98
168820
- },
168821
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArchivedRow, { item })
168822
- }, `archived:${item.id}`)), activeRows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
168823
- layout: true,
168824
- layoutId: `live-kanban:${item.id}`,
168825
- initial: {
168826
- opacity: 0,
168827
- y: 4
168828
- },
168829
- animate: {
168830
- opacity: 1,
168831
- y: 0
168832
- },
168833
- exit: {
168834
- opacity: 0,
168835
- scale: .98
168836
- },
168837
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ActiveRow, {
168838
- item,
168839
- status: statusById.get(item.id),
168840
- canApply: activeOperationsCurrent && applyStatusCurrent,
168841
- canArchive: activeOperationsCurrent,
168842
- canDragArchive: archiveDropCurrent,
168843
- applyBlockedReason: rootBlockedReason ?? (applyStatusCurrent ? null : "Apply availability is not current."),
168844
- archiveBlockedReason: rootBlockedReason,
168845
- onApply,
168846
- onArchive
168847
- })
168848
- }, `active:${item.id}`))]
168849
- }),
168850
- !initialLoading && rowCount === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168851
- className: "border-border/60 text-muted-foreground flex h-20 items-center justify-center rounded-md border border-dashed",
168852
- children: lane.id === "no-tasks" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileQuestion, {
168853
- className: "h-4 w-4",
168854
- "aria-label": "No entries"
168855
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListChecks, {
168856
- className: "h-4 w-4",
168857
- "aria-label": "No entries"
168957
+ }),
168958
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RealtimeRevalidateCue, {
168959
+ active: updating && rowCount > 0,
168960
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(motion.div, {
168961
+ layout: true,
168962
+ className: "min-h-24 space-y-2",
168963
+ children: [
168964
+ initialLoading && rowCount === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChangeListSkeleton, { count: 2 }) : null,
168965
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AnimatePresence, {
168966
+ initial: false,
168967
+ mode: "popLayout",
168968
+ children: [archiveRows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
168969
+ layout: true,
168970
+ layoutId: `live-kanban:${item.id}`,
168971
+ initial: {
168972
+ opacity: 0,
168973
+ y: 4
168974
+ },
168975
+ animate: {
168976
+ opacity: 1,
168977
+ y: 0
168978
+ },
168979
+ exit: {
168980
+ opacity: 0,
168981
+ scale: .98
168982
+ },
168983
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArchivedRow, { item })
168984
+ }, `archived:${item.id}`)), activeRows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
168985
+ layout: true,
168986
+ layoutId: `live-kanban:${item.id}`,
168987
+ initial: {
168988
+ opacity: 0,
168989
+ y: 4
168990
+ },
168991
+ animate: {
168992
+ opacity: 1,
168993
+ y: 0
168994
+ },
168995
+ exit: {
168996
+ opacity: 0,
168997
+ scale: .98
168998
+ },
168999
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ActiveRow, {
169000
+ item,
169001
+ status: statusById.get(item.id),
169002
+ canApply: activeOperationsCurrent && applyStatusCurrent,
169003
+ canArchive: activeOperationsCurrent,
169004
+ canDragArchive: archiveDropCurrent,
169005
+ applyBlockedReason: rootBlockedReason ?? (applyStatusCurrent ? null : "Apply availability is not current."),
169006
+ archiveBlockedReason: rootBlockedReason,
169007
+ onApply,
169008
+ onArchive
168858
169009
  })
168859
- }) : null
168860
- ]
168861
- })
169010
+ }, `active:${item.id}`))]
169011
+ }),
169012
+ !initialLoading && rowCount === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169013
+ className: "border-border/60 text-muted-foreground flex h-20 items-center justify-center rounded-md border border-dashed",
169014
+ children: lane.id === "no-tasks" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileQuestion, {
169015
+ className: "h-4 w-4",
169016
+ "aria-label": "No entries"
169017
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListChecks, {
169018
+ className: "h-4 w-4",
169019
+ "aria-label": "No entries"
169020
+ })
169021
+ }) : null
169022
+ ]
168862
169023
  })
168863
- })]
169024
+ })
168864
169025
  }, lane.id);
168865
169026
  })
168866
169027
  })]
@@ -169013,15 +169174,16 @@ function ProjectionEvidence({ activeError, archiveError, applyStatusError, rowEr
169013
169174
  //#endregion
169014
169175
  //#region src/components/kanban/readonly-kanban.tsx
169015
169176
  /**
169016
- * Orthogonal intents (updated 2026-07-31 Asia/Shanghai):
169177
+ * Orthogonal intents (updated 2026-08-03 Asia/Shanghai):
169017
169178
  * 1. Render objective Change lanes with navigation and no operation callbacks.
169018
169179
  * 2. Share one compact/full presentation while compact Pending geometry stays fixed.
169019
- * 3. Own a 1/2/4-column container-responsive topology with independent lane scrolling.
169180
+ * 3. Own a 1/2/4-column container-responsive topology composed from layered lane viewports.
169020
169181
  * 4. Preserve list continuity through motion layout transitions and stable identities.
169021
169182
  *
169022
169183
  * Original request (2026-07-28): add ReadonlyKanban to Dashboard and keep static mode objective.
169023
169184
  * Owner correction (2026-07-28): use container queries for 4x1, 2x2, and 1x4 without horizontal scrolling.
169024
169185
  * Original request (2026-07-31): "Kanban 的高度可以固定下来,并且要让每个group都可以独立滚动"
169186
+ * Original request (2026-08-03): layer title and bottom space over a padded list with Grid, gradients, and progressive backdrop blur.
169025
169187
  */
169026
169188
  /** Readonly objective Kanban with navigation but no mutation capability. */
169027
169189
  function ReadonlyKanban({ activeItems, archivedItems, activeCounts, archivedCount, variant = "full", pending = false, className }) {
@@ -169033,14 +169195,15 @@ function ReadonlyKanban({ activeItems, archivedItems, activeCounts, archivedCoun
169033
169195
  className: cn$1("@container min-w-0 max-w-full overflow-x-clip", compact && "@[32rem]:h-[32rem] @[64rem]:h-72 h-[46rem]", className),
169034
169196
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169035
169197
  "data-testid": "readonly-kanban-grid",
169036
- className: cn$1("@[32rem]:grid-cols-2 @[64rem]:grid-cols-4 grid w-full min-w-0 max-w-full grid-cols-1 gap-3 overflow-x-clip pb-6", compact && "@[32rem]:grid-rows-2 @[64rem]:grid-rows-1 h-full min-h-0 grid-rows-4"),
169198
+ className: cn$1("@[32rem]:grid-cols-2 @[64rem]:grid-cols-4 grid w-full min-w-0 max-w-full grid-cols-1 gap-3 overflow-x-clip", compact && "@[32rem]:grid-rows-2 @[64rem]:grid-rows-1 h-full min-h-0 grid-rows-4"),
169037
169199
  children: KANBAN_LANES.map((lane) => {
169038
169200
  const rows = lane.id === "archived" ? archivedItems : grouped[lane.id];
169039
169201
  const count = lane.id === "archived" ? archivedCount : activeCounts[lane.id];
169040
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
169041
- className: "border-border/70 flex min-h-0 min-w-0 flex-col overflow-hidden border-t",
169042
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
169043
- className: "flex h-10 min-w-0 items-center justify-between gap-2 px-1",
169202
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KanbanLaneViewport, {
169203
+ laneId: lane.id,
169204
+ density: compact ? "compact" : "full",
169205
+ header: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
169206
+ className: "flex h-full min-w-0 items-center justify-between gap-2 px-1",
169044
169207
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
169045
169208
  className: "flex min-w-0 items-center gap-2",
169046
169209
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: cn$1("h-2 w-2 shrink-0 rounded-full", lane.accentClass) }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
@@ -169053,57 +169216,54 @@ function ReadonlyKanban({ activeItems, archivedItems, activeCounts, archivedCoun
169053
169216
  size: "xs",
169054
169217
  shape: "pill"
169055
169218
  })]
169056
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169057
- "data-kanban-lane-scroll": lane.id,
169058
- className: "scrollbar-thin scrollbar-track-transparent scrollbar-thumb-[color-mix(in_srgb,currentColor,transparent_78%)] min-h-0 flex-1 overflow-y-auto overflow-x-hidden overscroll-contain pb-1 pr-1",
169059
- children: pending ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169060
- className: "space-y-2",
169061
- "aria-hidden": "true",
169062
- children: Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
169063
- className: "border-border/70 bg-card space-y-2 rounded-md border px-2.5 py-2",
169064
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RealtimeSkeleton, { className: "h-3 w-3/4" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RealtimeSkeleton, { className: "h-2.5 w-1/2" })]
169065
- }, index))
169066
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(motion.div, {
169067
- layout: true,
169068
- className: "space-y-2",
169069
- "data-lane": lane.id,
169070
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(AnimatePresence, {
169071
- initial: false,
169072
- mode: "popLayout",
169073
- children: rows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
169074
- layout: true,
169075
- layoutId: `readonly-kanban:${item.id}`,
169076
- initial: {
169077
- opacity: 0,
169078
- y: 4
169079
- },
169080
- animate: {
169081
- opacity: 1,
169082
- y: 0
169083
- },
169084
- exit: {
169085
- opacity: 0,
169086
- scale: .98
169087
- },
169088
- transition: { duration: .16 },
169089
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReadonlyKanbanRow, {
169090
- item,
169091
- laneId: lane.id,
169092
- compact
169093
- })
169094
- }, `${lane.id}:${item.id}`))
169095
- }), rows.length === 0 && count === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169096
- className: "border-border/60 text-muted-foreground flex h-16 items-center justify-center rounded-md border border-dashed",
169097
- children: lane.id === "no-tasks" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileQuestion, {
169098
- className: "h-4 w-4",
169099
- "aria-label": "No entries"
169100
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListChecks, {
169101
- className: "h-4 w-4",
169102
- "aria-label": "No entries"
169219
+ }),
169220
+ children: pending ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169221
+ className: "space-y-2",
169222
+ "aria-hidden": "true",
169223
+ children: Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
169224
+ className: "border-border/70 bg-card space-y-2 rounded-md border px-2.5 py-2",
169225
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RealtimeSkeleton, { className: "h-3 w-3/4" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RealtimeSkeleton, { className: "h-2.5 w-1/2" })]
169226
+ }, index))
169227
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(motion.div, {
169228
+ layout: true,
169229
+ className: "space-y-2",
169230
+ "data-lane": lane.id,
169231
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(AnimatePresence, {
169232
+ initial: false,
169233
+ mode: "popLayout",
169234
+ children: rows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
169235
+ layout: true,
169236
+ layoutId: `readonly-kanban:${item.id}`,
169237
+ initial: {
169238
+ opacity: 0,
169239
+ y: 4
169240
+ },
169241
+ animate: {
169242
+ opacity: 1,
169243
+ y: 0
169244
+ },
169245
+ exit: {
169246
+ opacity: 0,
169247
+ scale: .98
169248
+ },
169249
+ transition: { duration: .16 },
169250
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReadonlyKanbanRow, {
169251
+ item,
169252
+ laneId: lane.id,
169253
+ compact
169103
169254
  })
169104
- }) : null]
169105
- })
169106
- })]
169255
+ }, `${lane.id}:${item.id}`))
169256
+ }), rows.length === 0 && count === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169257
+ className: "border-border/60 text-muted-foreground flex h-16 items-center justify-center rounded-md border border-dashed",
169258
+ children: lane.id === "no-tasks" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileQuestion, {
169259
+ className: "h-4 w-4",
169260
+ "aria-label": "No entries"
169261
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListChecks, {
169262
+ className: "h-4 w-4",
169263
+ "aria-label": "No entries"
169264
+ })
169265
+ }) : null]
169266
+ })
169107
169267
  }, lane.id);
169108
169268
  })
169109
169269
  })
@@ -171752,7 +171912,7 @@ var CONFIG_GUIDE_STAGE_META = {
171752
171912
  //#region src/components/config/config-guide.tsx
171753
171913
  var ConfigGuideContext = (0, import_react.createContext)(null);
171754
171914
  (0, import_react.lazy)(async () => {
171755
- return { default: (await import("./config-guide-presentation-BNsPtfSX.js")).ConfigGuidePresentationLayer };
171915
+ return { default: (await import("./config-guide-presentation-DluN0NgQ.js")).ConfigGuidePresentationLayer };
171756
171916
  });
171757
171917
  /** Access the root-owned adaptive Guide runtime. */
171758
171918
  function useConfigGuide() {