@openspecui/web 7.0.0 → 7.0.1

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-CdCpY5Oi.js} +80 -80
  2. package/dist/assets/App-Ddx3wr17.css +1 -0
  3. package/dist/assets/{main-Bh5BqDEB.js → main-BJ6w67mJ.js} +2 -2
  4. package/dist/assets/{trpc-vqcD0NTx.js → trpc-DkR_dtsV.js} +1 -1
  5. package/dist/index.html +1 -1
  6. package/dist-ssg/client/.vite/ssr-manifest.json +69 -29
  7. package/dist-ssg/client/assets/CanvasRenderer-SxkLA4OO.js +1 -0
  8. package/dist-ssg/client/assets/WebGLRenderer-BlVqxY1i.js +1 -0
  9. package/dist-ssg/client/assets/WebGPURenderer-B3sn-S62.js +1 -0
  10. package/dist-ssg/client/assets/browserAll-Bq1Uo1-9.js +1 -0
  11. package/dist-ssg/client/assets/{config-guide-presentation-BEF34WAK.js → config-guide-presentation-m4L_6Aw1.js} +1 -1
  12. package/dist-ssg/client/assets/{dist-BzOaRFB5.js → dist-BINRJsSD.js} +1 -1
  13. package/dist-ssg/client/assets/{dist-DwdkRYfv.js → dist-Bg_7PXKP.js} +1 -1
  14. package/dist-ssg/client/assets/dist-Bh5C-oZl.js +1 -0
  15. package/dist-ssg/client/assets/{dist-gcj7KpQ7.js → dist-BhVT4aPf.js} +1 -1
  16. package/dist-ssg/client/assets/{dist-CQfLbMfn.js → dist-CQkg2GXo.js} +1 -1
  17. package/dist-ssg/client/assets/dist-CzUl1_ZX.js +1 -0
  18. package/dist-ssg/client/assets/{dist-BRX0vHHj.js → dist-D9y725wE.js} +1 -1
  19. package/dist-ssg/client/assets/{dist-C7ncT3z3.js → dist-D_dL7IEq.js} +1 -1
  20. package/dist-ssg/client/assets/{dist-DU7FOddi.js → dist-DaBfRE0W.js} +1 -1
  21. package/dist-ssg/client/assets/dist-Do7XHNay.js +1 -0
  22. package/dist-ssg/client/assets/{dist-XQwsfb9S.js → dist-Dy8gt0Ib.js} +1 -1
  23. package/dist-ssg/client/assets/{dist-CBT1FQBi.js → dist-JPSLeMZt.js} +1 -1
  24. package/dist-ssg/client/assets/{ghostty-web-BuKlD9v-.js → ghostty-web-BfmV5WPs.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-CTvsWc75.js} +153 -153
  27. package/dist-ssg/client/assets/{init-Cna88xtL.js → init-ExESwXkv.js} +1 -1
  28. package/dist-ssg/client/assets/{trpc-5KfqD8Sg.js → trpc-aDW3YZC2.js} +1 -1
  29. package/dist-ssg/client/assets/webworkerAll-DPGdqK5A.js +1 -0
  30. package/dist-ssg/client/index.ssg.html +2 -2
  31. package/dist-ssg/server/assets/CanvasRenderer-CwiiSPbH.js +3 -0
  32. package/dist-ssg/server/assets/WebGLRenderer-DZq9g4pY.js +3 -0
  33. package/dist-ssg/server/assets/WebGPURenderer-CC9srvlc.js +3 -0
  34. package/dist-ssg/server/assets/{browserAll-Br-Ym0s3.js → browserAll-CbppWmmr.js} +2 -2
  35. package/dist-ssg/server/assets/{config-guide-presentation-BNsPtfSX.js → config-guide-presentation-BysIO8oY.js} +1 -1
  36. package/dist-ssg/server/assets/{dist-D4wdS9IG.js → dist-9eozfPDO.js} +1 -1
  37. package/dist-ssg/server/assets/{dist-jJ40WsNS.js → dist-BL9BN3bD.js} +1 -1
  38. package/dist-ssg/server/assets/{dist-DLLg4uMo.js → dist-BvJegMAu.js} +1 -1
  39. package/dist-ssg/server/assets/{dist-BKolbUhu.js → dist-Bxv0KpK2.js} +1 -1
  40. package/dist-ssg/server/assets/{dist-DkcAEJix.js → dist-C3YYTwOF.js} +1 -1
  41. package/dist-ssg/server/assets/{dist-C-ifGdHx.js → dist-CBWX0qVQ.js} +1 -1
  42. package/dist-ssg/server/assets/{dist-tmI1Vtui.js → dist-CWgzRN8l.js} +1 -1
  43. package/dist-ssg/server/assets/dist-D3UkzXNJ.js +3 -0
  44. package/dist-ssg/server/assets/{dist-2q5MBzNz.js → dist-DLmT_-xD.js} +1 -1
  45. package/dist-ssg/server/assets/dist-X54KSZxt.js +3 -0
  46. package/dist-ssg/server/assets/dist-qBAal1ou.js +3 -0
  47. package/dist-ssg/server/assets/{dist-BXMtMtrz.js → dist-uy4rKjdF.js} +1 -1
  48. package/dist-ssg/server/assets/{entry-server-BrAwgnce.js → entry-server-C1flMDyD.js} +261 -155
  49. package/dist-ssg/server/assets/{init-d-mn_N98.js → init-CzleJ4fV.js} +1 -1
  50. package/dist-ssg/server/assets/trpc-4lRaWiqp.js +3 -0
  51. package/dist-ssg/server/assets/webworkerAll-Boyd6QDj.js +4 -0
  52. package/dist-ssg/server/ssr-entry-manifest.json +25 -25
  53. package/package.json +4 -4
  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
@@ -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-4lRaWiqp.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-4lRaWiqp.js").then(({ trpcClient }) => trpcClient.kv.set.mutate({
31055
31055
  key: this.storageKey,
31056
31056
  value: {
31057
31057
  mainTabs: this.state.mainTabs,
@@ -71013,7 +71013,7 @@ var browserExt = {
71013
71013
  },
71014
71014
  test: () => true,
71015
71015
  load: async () => {
71016
- await import("./browserAll-Br-Ym0s3.js");
71016
+ await import("./browserAll-CbppWmmr.js");
71017
71017
  }
71018
71018
  };
71019
71019
  //#endregion
@@ -71026,7 +71026,7 @@ var webworkerExt = {
71026
71026
  },
71027
71027
  test: () => typeof self !== "undefined" && self.WorkerGlobalScope !== void 0,
71028
71028
  load: async () => {
71029
- await import("./webworkerAll-BE4Faerg.js");
71029
+ await import("./webworkerAll-Boyd6QDj.js");
71030
71030
  }
71031
71031
  };
71032
71032
  //#endregion
@@ -73620,7 +73620,7 @@ async function autoDetectRenderer(options) {
73620
73620
  for (let i = 0; i < preferredOrder.length; i++) {
73621
73621
  const rendererType = preferredOrder[i];
73622
73622
  if (rendererType === "webgpu" && await isWebGPUSupported()) {
73623
- const { WebGPURenderer } = await import("./WebGPURenderer-CGD9VYdm.js");
73623
+ const { WebGPURenderer } = await import("./WebGPURenderer-CC9srvlc.js");
73624
73624
  RendererClass = WebGPURenderer;
73625
73625
  finalOptions = {
73626
73626
  ...options,
@@ -73628,7 +73628,7 @@ async function autoDetectRenderer(options) {
73628
73628
  };
73629
73629
  break;
73630
73630
  } else if (rendererType === "webgl" && isWebGLSupported(options.failIfMajorPerformanceCaveat ?? AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat)) {
73631
- const { WebGLRenderer } = await import("./WebGLRenderer-CI_abbD1.js");
73631
+ const { WebGLRenderer } = await import("./WebGLRenderer-DZq9g4pY.js");
73632
73632
  RendererClass = WebGLRenderer;
73633
73633
  finalOptions = {
73634
73634
  ...options,
@@ -73636,7 +73636,7 @@ async function autoDetectRenderer(options) {
73636
73636
  };
73637
73637
  break;
73638
73638
  } else if (rendererType === "canvas") {
73639
- const { CanvasRenderer } = await import("./CanvasRenderer-BddS1srD.js");
73639
+ const { CanvasRenderer } = await import("./CanvasRenderer-CwiiSPbH.js");
73640
73640
  RendererClass = CanvasRenderer;
73641
73641
  finalOptions = {
73642
73642
  ...options,
@@ -97337,7 +97337,7 @@ var TerminalController = class {
97337
97337
  if (this.configPersistTimer) clearTimeout(this.configPersistTimer);
97338
97338
  this.configPersistTimer = setTimeout(() => {
97339
97339
  this.configPersistTimer = null;
97340
- import("./trpc-DUmUqj4-.js").then(({ trpcClient }) => {
97340
+ import("./trpc-4lRaWiqp.js").then(({ trpcClient }) => {
97341
97341
  trpcClient.config.update.mutate({ terminal: { fontSize: this.config.fontSize } });
97342
97342
  }).catch(() => {});
97343
97343
  }, CONFIG_PERSIST_DEBOUNCE);
@@ -107862,7 +107862,7 @@ var languages = [
107862
107862
  name: "CSS",
107863
107863
  extensions: ["css"],
107864
107864
  load() {
107865
- return import("./dist-BuMA6YKx.js").then((m) => m.css());
107865
+ return import("./dist-D3UkzXNJ.js").then((m) => m.css());
107866
107866
  }
107867
107867
  }),
107868
107868
  /* @__PURE__ */ LanguageDescription.of({
@@ -107882,7 +107882,7 @@ var languages = [
107882
107882
  "hbs"
107883
107883
  ],
107884
107884
  load() {
107885
- return import("./dist-D4wdS9IG.js").then((m) => m.html());
107885
+ return import("./dist-9eozfPDO.js").then((m) => m.html());
107886
107886
  }
107887
107887
  }),
107888
107888
  /* @__PURE__ */ LanguageDescription.of({
@@ -107916,7 +107916,7 @@ var languages = [
107916
107916
  "jinja2"
107917
107917
  ],
107918
107918
  load() {
107919
- return import("./dist-DkcAEJix.js").then((m) => m.jinja());
107919
+ return import("./dist-C3YYTwOF.js").then((m) => m.jinja());
107920
107920
  }
107921
107921
  }),
107922
107922
  /* @__PURE__ */ LanguageDescription.of({
@@ -107924,7 +107924,7 @@ var languages = [
107924
107924
  alias: ["json5"],
107925
107925
  extensions: ["json", "map"],
107926
107926
  load() {
107927
- return import("./dist-DweGKZ3K.js").then((m) => m.json());
107927
+ return import("./dist-qBAal1ou.js").then((m) => m.json());
107928
107928
  }
107929
107929
  }),
107930
107930
  /* @__PURE__ */ LanguageDescription.of({
@@ -107938,14 +107938,14 @@ var languages = [
107938
107938
  name: "LESS",
107939
107939
  extensions: ["less"],
107940
107940
  load() {
107941
- return import("./dist-BKolbUhu.js").then((m) => m.less());
107941
+ return import("./dist-Bxv0KpK2.js").then((m) => m.less());
107942
107942
  }
107943
107943
  }),
107944
107944
  /* @__PURE__ */ LanguageDescription.of({
107945
107945
  name: "Liquid",
107946
107946
  extensions: ["liquid"],
107947
107947
  load() {
107948
- return import("./dist-tmI1Vtui.js").then((m) => m.liquid());
107948
+ return import("./dist-CWgzRN8l.js").then((m) => m.liquid());
107949
107949
  }
107950
107950
  }),
107951
107951
  /* @__PURE__ */ LanguageDescription.of({
@@ -107962,7 +107962,7 @@ var languages = [
107962
107962
  "mkd"
107963
107963
  ],
107964
107964
  load() {
107965
- return import("./dist-BXMtMtrz.js").then((m) => m.markdown());
107965
+ return import("./dist-uy4rKjdF.js").then((m) => m.markdown());
107966
107966
  }
107967
107967
  }),
107968
107968
  /* @__PURE__ */ LanguageDescription.of({
@@ -107988,7 +107988,7 @@ var languages = [
107988
107988
  "phtml"
107989
107989
  ],
107990
107990
  load() {
107991
- return import("./dist-2q5MBzNz.js").then((m) => m.php());
107991
+ return import("./dist-DLmT_-xD.js").then((m) => m.php());
107992
107992
  }
107993
107993
  }),
107994
107994
  /* @__PURE__ */ LanguageDescription.of({
@@ -108028,14 +108028,14 @@ var languages = [
108028
108028
  name: "Sass",
108029
108029
  extensions: ["sass"],
108030
108030
  load() {
108031
- return import("./dist-jJ40WsNS.js").then((m) => m.sass({ indented: true }));
108031
+ return import("./dist-BL9BN3bD.js").then((m) => m.sass({ indented: true }));
108032
108032
  }
108033
108033
  }),
108034
108034
  /* @__PURE__ */ LanguageDescription.of({
108035
108035
  name: "SCSS",
108036
108036
  extensions: ["scss"],
108037
108037
  load() {
108038
- return import("./dist-jJ40WsNS.js").then((m) => m.sass());
108038
+ return import("./dist-BL9BN3bD.js").then((m) => m.sass());
108039
108039
  }
108040
108040
  }),
108041
108041
  /* @__PURE__ */ LanguageDescription.of({
@@ -108102,7 +108102,7 @@ var languages = [
108102
108102
  alias: ["yml"],
108103
108103
  extensions: ["yaml", "yml"],
108104
108104
  load() {
108105
- return import("./dist-DHm81glc.js").then((m) => m.yaml());
108105
+ return import("./dist-X54KSZxt.js").then((m) => m.yaml());
108106
108106
  }
108107
108107
  }),
108108
108108
  /* @__PURE__ */ LanguageDescription.of({
@@ -108989,13 +108989,13 @@ var languages = [
108989
108989
  name: "Vue",
108990
108990
  extensions: ["vue"],
108991
108991
  load() {
108992
- return import("./dist-C-ifGdHx.js").then((m) => m.vue());
108992
+ return import("./dist-CBWX0qVQ.js").then((m) => m.vue());
108993
108993
  }
108994
108994
  }),
108995
108995
  /* @__PURE__ */ LanguageDescription.of({
108996
108996
  name: "Angular Template",
108997
108997
  load() {
108998
- return import("./dist-DLLg4uMo.js").then((m) => m.angular());
108998
+ return import("./dist-BvJegMAu.js").then((m) => m.angular());
108999
108999
  }
109000
109000
  })
109001
109001
  ];
@@ -168623,6 +168623,113 @@ var motion = /* @__PURE__ */ createMotionProxy({
168623
168623
  ...layout
168624
168624
  }, createDomVisualElement);
168625
168625
  //#endregion
168626
+ //#region src/components/progressive-blur.tsx
168627
+ /**
168628
+ * Orthogonal intents (created 2026-08-04 Asia/Shanghai):
168629
+ * 1. Render a direction-aware progressive backdrop blur from a bounded level tuple.
168630
+ * 2. Scale overlapping mask bands from the actual level count instead of assuming eight levels.
168631
+ * 3. Preserve positioning-free Grid composition and expose one theme-owned surface layer.
168632
+ *
168633
+ * Original request (2026-08-04): refine Kanban edge fusion from Magic UI Progressive Blur while reducing blurLevels because eight instances render together.
168634
+ */
168635
+ var DEFAULT_BLUR_LEVELS = [
168636
+ .5,
168637
+ 2,
168638
+ 6
168639
+ ];
168640
+ function formatPercent(value) {
168641
+ return Number(value.toFixed(4)).toString();
168642
+ }
168643
+ function createLayerMask(index, layerCount, position) {
168644
+ const direction = position === "bottom" ? "to bottom" : "to top";
168645
+ const step = 100 / layerCount;
168646
+ if (index === layerCount - 1) return `linear-gradient(${direction}, transparent ${formatPercent(100 - step)}%, black 100%)`;
168647
+ const transparentStart = index * step;
168648
+ const opaqueStart = (index + 1) * step;
168649
+ const opaqueEnd = (index + 2) * step;
168650
+ const transparentEnd = (index + 3) * step;
168651
+ return `linear-gradient(${direction}, transparent ${formatPercent(transparentStart)}%, black ${formatPercent(opaqueStart)}%, black ${formatPercent(opaqueEnd)}%, transparent ${formatPercent(transparentEnd)}%)`;
168652
+ }
168653
+ /** Progressive backdrop blur whose overlapping bands scale with its blur-level count. */
168654
+ function ProgressiveBlur({ position, blurLevels = DEFAULT_BLUR_LEVELS, surfaceClassName, className, ...divProps }) {
168655
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
168656
+ ...divProps,
168657
+ "aria-hidden": "true",
168658
+ "data-progressive-blur": position,
168659
+ "data-progressive-blur-levels": blurLevels.length,
168660
+ className: cn$1("progressive-blur grid", className),
168661
+ children: [blurLevels.map((blur, index) => {
168662
+ const maskImage = createLayerMask(index, blurLevels.length, position);
168663
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168664
+ "data-progressive-blur-layer": index,
168665
+ className: "progressive-blur__layer",
168666
+ style: {
168667
+ zIndex: index + 1,
168668
+ backdropFilter: `blur(${blur}px)`,
168669
+ WebkitBackdropFilter: `blur(${blur}px)`,
168670
+ maskImage,
168671
+ WebkitMaskImage: maskImage
168672
+ }
168673
+ }, `${blur}:${index}`);
168674
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168675
+ "data-progressive-blur-surface": "",
168676
+ className: cn$1("progressive-blur__surface", surfaceClassName),
168677
+ style: { zIndex: blurLevels.length + 1 }
168678
+ })]
168679
+ });
168680
+ }
168681
+ //#endregion
168682
+ //#region src/components/kanban/kanban-lane-viewport.tsx
168683
+ /**
168684
+ * Orthogonal intents (updated 2026-08-04 Asia/Shanghai):
168685
+ * 1. Layer one semantic lane header and two visual edge veils over a full-height row scroller.
168686
+ * 2. Reserve readable header/footer landing space through density-owned scroll padding.
168687
+ * 3. Forward native section interactions without owning Kanban data or operations.
168688
+ *
168689
+ * Original request (2026-08-03): layer title and bottom space over a padded list with Grid, gradients, and progressive backdrop blur.
168690
+ * Owner refinement (2026-08-04): follow Magic UI Progressive Blur with fewer blur levels because eight lane-edge instances render together.
168691
+ */
168692
+ var KANBAN_BLUR_LEVELS = [
168693
+ .5,
168694
+ 2,
168695
+ 6
168696
+ ];
168697
+ /** Grid-layered lane viewport with one independent block-axis scroll owner. */
168698
+ function KanbanLaneViewport({ laneId, density, header, children, className, ...sectionProps }) {
168699
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
168700
+ ...sectionProps,
168701
+ "data-kanban-lane": laneId,
168702
+ "data-kanban-lane-density": density,
168703
+ className: cn$1("kanban-lane-viewport border-border/70 grid min-h-0 min-w-0 overflow-hidden border-t", className),
168704
+ children: [
168705
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168706
+ "data-kanban-lane-scroll": laneId,
168707
+ 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",
168708
+ children
168709
+ }),
168710
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProgressiveBlur, {
168711
+ position: "top",
168712
+ blurLevels: KANBAN_BLUR_LEVELS,
168713
+ "data-kanban-lane-veil": "top",
168714
+ className: "kanban-lane-viewport__veil kanban-lane-viewport__veil--top",
168715
+ surfaceClassName: "kanban-lane-viewport__veil-surface kanban-lane-viewport__veil-surface--top"
168716
+ }),
168717
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", {
168718
+ "data-kanban-lane-header": laneId,
168719
+ className: "kanban-lane-viewport__header",
168720
+ children: header
168721
+ }),
168722
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProgressiveBlur, {
168723
+ position: "bottom",
168724
+ blurLevels: KANBAN_BLUR_LEVELS,
168725
+ "data-kanban-lane-veil": "bottom",
168726
+ className: "kanban-lane-viewport__veil kanban-lane-viewport__veil--bottom",
168727
+ surfaceClassName: "kanban-lane-viewport__veil-surface kanban-lane-viewport__veil-surface--bottom"
168728
+ })
168729
+ ]
168730
+ });
168731
+ }
168732
+ //#endregion
168626
168733
  //#region src/components/kanban/kanban-model.ts
168627
168734
  /**
168628
168735
  * Orthogonal intents (created 2026-07-28 Asia/Shanghai):
@@ -168687,14 +168794,15 @@ function getKanbanArchiveTimestamp(item) {
168687
168794
  //#endregion
168688
168795
  //#region src/components/kanban/interactive-kanban.tsx
168689
168796
  /**
168690
- * Orthogonal intents (created 2026-07-28 Asia/Shanghai):
168797
+ * Orthogonal intents (updated 2026-08-03 Asia/Shanghai):
168691
168798
  * 1. Render live objective lanes with independent active/archive lifecycle evidence.
168692
168799
  * 2. Expose accessible Apply/Archive launchers without mutating projected state.
168693
168800
  * 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.
168801
+ * 4. Preserve progressive evidence while assigning one inline scroller and layered lane block scrollers.
168695
168802
  *
168696
168803
  * Original request (2026-07-28): implement the reviewed interactive Kanban rewrite.
168697
168804
  * Owner correction (2026-07-28): remove double horizontal scrolling and let each lane scroll vertically.
168805
+ * Original request (2026-08-03): layer title and bottom space over a padded list with Grid, gradients, and progressive backdrop blur.
168698
168806
  */
168699
168807
  var CHANGE_DRAG_MIME = "application/x-openspecui-change-id";
168700
168808
  var RANGE_OPTIONS$1 = [
@@ -168753,7 +168861,9 @@ function InteractiveKanban({ activeItems, archivedItems, statuses, range, onRang
168753
168861
  const rowCount = archived ? archiveRows.length : activeRows.length;
168754
168862
  const initialLoading = archived ? archiveState.initialLoading : activeState.initialLoading;
168755
168863
  const updating = archived ? archiveState.updating : activeState.updating;
168756
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
168864
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KanbanLaneViewport, {
168865
+ laneId: lane.id,
168866
+ density: "full",
168757
168867
  "data-lane": lane.id,
168758
168868
  onDragOver: archived ? (event) => {
168759
168869
  if (!archiveDropCurrent || !event.dataTransfer.types.includes(CHANGE_DRAG_MIME)) return;
@@ -168765,9 +168875,9 @@ function InteractiveKanban({ activeItems, archivedItems, statuses, range, onRang
168765
168875
  if (!event.currentTarget.contains(event.relatedTarget)) setDropActive(false);
168766
168876
  } : void 0,
168767
168877
  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",
168878
+ className: cn$1("transition-colors", archived && dropActive && "border-primary bg-primary/5"),
168879
+ header: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
168880
+ className: "flex h-full min-w-0 items-center justify-between gap-2 px-1",
168771
168881
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
168772
168882
  className: "flex min-w-0 items-center gap-2",
168773
168883
  children: [
@@ -168788,79 +168898,76 @@ function InteractiveKanban({ activeItems, archivedItems, statuses, range, onRang
168788
168898
  options: RANGE_OPTIONS$1,
168789
168899
  onValueChange: onRangeChange,
168790
168900
  ariaLabel: "Archived time range",
168791
- className: "h-7 min-w-0 gap-1 px-2 text-xs"
168901
+ className: "pointer-events-auto h-7 min-w-0 gap-1 px-2 text-xs"
168792
168902
  }) : 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"
168903
+ }),
168904
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RealtimeRevalidateCue, {
168905
+ active: updating && rowCount > 0,
168906
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(motion.div, {
168907
+ layout: true,
168908
+ className: "min-h-24 space-y-2",
168909
+ children: [
168910
+ initialLoading && rowCount === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChangeListSkeleton, { count: 2 }) : null,
168911
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AnimatePresence, {
168912
+ initial: false,
168913
+ mode: "popLayout",
168914
+ children: [archiveRows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
168915
+ layout: true,
168916
+ layoutId: `live-kanban:${item.id}`,
168917
+ initial: {
168918
+ opacity: 0,
168919
+ y: 4
168920
+ },
168921
+ animate: {
168922
+ opacity: 1,
168923
+ y: 0
168924
+ },
168925
+ exit: {
168926
+ opacity: 0,
168927
+ scale: .98
168928
+ },
168929
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArchivedRow, { item })
168930
+ }, `archived:${item.id}`)), activeRows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
168931
+ layout: true,
168932
+ layoutId: `live-kanban:${item.id}`,
168933
+ initial: {
168934
+ opacity: 0,
168935
+ y: 4
168936
+ },
168937
+ animate: {
168938
+ opacity: 1,
168939
+ y: 0
168940
+ },
168941
+ exit: {
168942
+ opacity: 0,
168943
+ scale: .98
168944
+ },
168945
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ActiveRow, {
168946
+ item,
168947
+ status: statusById.get(item.id),
168948
+ canApply: activeOperationsCurrent && applyStatusCurrent,
168949
+ canArchive: activeOperationsCurrent,
168950
+ canDragArchive: archiveDropCurrent,
168951
+ applyBlockedReason: rootBlockedReason ?? (applyStatusCurrent ? null : "Apply availability is not current."),
168952
+ archiveBlockedReason: rootBlockedReason,
168953
+ onApply,
168954
+ onArchive
168858
168955
  })
168859
- }) : null
168860
- ]
168861
- })
168956
+ }, `active:${item.id}`))]
168957
+ }),
168958
+ !initialLoading && rowCount === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
168959
+ className: "border-border/60 text-muted-foreground flex h-20 items-center justify-center rounded-md border border-dashed",
168960
+ children: lane.id === "no-tasks" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileQuestion, {
168961
+ className: "h-4 w-4",
168962
+ "aria-label": "No entries"
168963
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListChecks, {
168964
+ className: "h-4 w-4",
168965
+ "aria-label": "No entries"
168966
+ })
168967
+ }) : null
168968
+ ]
168862
168969
  })
168863
- })]
168970
+ })
168864
168971
  }, lane.id);
168865
168972
  })
168866
168973
  })]
@@ -169013,15 +169120,16 @@ function ProjectionEvidence({ activeError, archiveError, applyStatusError, rowEr
169013
169120
  //#endregion
169014
169121
  //#region src/components/kanban/readonly-kanban.tsx
169015
169122
  /**
169016
- * Orthogonal intents (updated 2026-07-31 Asia/Shanghai):
169123
+ * Orthogonal intents (updated 2026-08-03 Asia/Shanghai):
169017
169124
  * 1. Render objective Change lanes with navigation and no operation callbacks.
169018
169125
  * 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.
169126
+ * 3. Own a 1/2/4-column container-responsive topology composed from layered lane viewports.
169020
169127
  * 4. Preserve list continuity through motion layout transitions and stable identities.
169021
169128
  *
169022
169129
  * Original request (2026-07-28): add ReadonlyKanban to Dashboard and keep static mode objective.
169023
169130
  * Owner correction (2026-07-28): use container queries for 4x1, 2x2, and 1x4 without horizontal scrolling.
169024
169131
  * Original request (2026-07-31): "Kanban 的高度可以固定下来,并且要让每个group都可以独立滚动"
169132
+ * Original request (2026-08-03): layer title and bottom space over a padded list with Grid, gradients, and progressive backdrop blur.
169025
169133
  */
169026
169134
  /** Readonly objective Kanban with navigation but no mutation capability. */
169027
169135
  function ReadonlyKanban({ activeItems, archivedItems, activeCounts, archivedCount, variant = "full", pending = false, className }) {
@@ -169033,14 +169141,15 @@ function ReadonlyKanban({ activeItems, archivedItems, activeCounts, archivedCoun
169033
169141
  className: cn$1("@container min-w-0 max-w-full overflow-x-clip", compact && "@[32rem]:h-[32rem] @[64rem]:h-72 h-[46rem]", className),
169034
169142
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169035
169143
  "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"),
169144
+ 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
169145
  children: KANBAN_LANES.map((lane) => {
169038
169146
  const rows = lane.id === "archived" ? archivedItems : grouped[lane.id];
169039
169147
  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",
169148
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KanbanLaneViewport, {
169149
+ laneId: lane.id,
169150
+ density: compact ? "compact" : "full",
169151
+ header: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
169152
+ className: "flex h-full min-w-0 items-center justify-between gap-2 px-1",
169044
169153
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
169045
169154
  className: "flex min-w-0 items-center gap-2",
169046
169155
  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 +169162,54 @@ function ReadonlyKanban({ activeItems, archivedItems, activeCounts, archivedCoun
169053
169162
  size: "xs",
169054
169163
  shape: "pill"
169055
169164
  })]
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"
169165
+ }),
169166
+ children: pending ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169167
+ className: "space-y-2",
169168
+ "aria-hidden": "true",
169169
+ children: Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
169170
+ className: "border-border/70 bg-card space-y-2 rounded-md border px-2.5 py-2",
169171
+ 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" })]
169172
+ }, index))
169173
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(motion.div, {
169174
+ layout: true,
169175
+ className: "space-y-2",
169176
+ "data-lane": lane.id,
169177
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(AnimatePresence, {
169178
+ initial: false,
169179
+ mode: "popLayout",
169180
+ children: rows.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(motion.div, {
169181
+ layout: true,
169182
+ layoutId: `readonly-kanban:${item.id}`,
169183
+ initial: {
169184
+ opacity: 0,
169185
+ y: 4
169186
+ },
169187
+ animate: {
169188
+ opacity: 1,
169189
+ y: 0
169190
+ },
169191
+ exit: {
169192
+ opacity: 0,
169193
+ scale: .98
169194
+ },
169195
+ transition: { duration: .16 },
169196
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReadonlyKanbanRow, {
169197
+ item,
169198
+ laneId: lane.id,
169199
+ compact
169103
169200
  })
169104
- }) : null]
169105
- })
169106
- })]
169201
+ }, `${lane.id}:${item.id}`))
169202
+ }), rows.length === 0 && count === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
169203
+ className: "border-border/60 text-muted-foreground flex h-16 items-center justify-center rounded-md border border-dashed",
169204
+ children: lane.id === "no-tasks" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileQuestion, {
169205
+ className: "h-4 w-4",
169206
+ "aria-label": "No entries"
169207
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListChecks, {
169208
+ className: "h-4 w-4",
169209
+ "aria-label": "No entries"
169210
+ })
169211
+ }) : null]
169212
+ })
169107
169213
  }, lane.id);
169108
169214
  })
169109
169215
  })
@@ -171752,7 +171858,7 @@ var CONFIG_GUIDE_STAGE_META = {
171752
171858
  //#region src/components/config/config-guide.tsx
171753
171859
  var ConfigGuideContext = (0, import_react.createContext)(null);
171754
171860
  (0, import_react.lazy)(async () => {
171755
- return { default: (await import("./config-guide-presentation-BNsPtfSX.js")).ConfigGuidePresentationLayer };
171861
+ return { default: (await import("./config-guide-presentation-BysIO8oY.js")).ConfigGuidePresentationLayer };
171756
171862
  });
171757
171863
  /** Access the root-owned adaptive Guide runtime. */
171758
171864
  function useConfigGuide() {
@@ -1,5 +1,5 @@
1
1
  import { it as extensions } from "./Geometry-jQ4l8GtP.js";
2
- import { M as FilterPipe, j as FilterSystem } from "./entry-server-BrAwgnce.js";
2
+ import { M as FilterPipe, j as FilterSystem } from "./entry-server-C1flMDyD.js";
3
3
  //#region ../../node_modules/.pnpm/pixi.js@8.16.0/node_modules/pixi.js/lib/filters/init.mjs
4
4
  extensions.add(FilterSystem);
5
5
  extensions.add(FilterPipe);
@@ -0,0 +1,3 @@
1
+ import "./jsx-runtime-CQL-l9BP.js";
2
+ import { Nt as trpcClient } from "./entry-server-C1flMDyD.js";
3
+ export { trpcClient };