@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.
- package/dist/assets/{App-D04w0rKO.js → App-DZbK_VKF.js} +96 -96
- package/dist/assets/App-Ddx3wr17.css +1 -0
- package/dist/assets/{main-Bh5BqDEB.js → main-DvWl4ArY.js} +2 -2
- package/dist/assets/{trpc-vqcD0NTx.js → trpc-CUrXyPaH.js} +1 -1
- package/dist/index.html +1 -1
- package/dist-ssg/client/.vite/ssr-manifest.json +89 -29
- package/dist-ssg/client/assets/CanvasRenderer-DbReVIDE.js +1 -0
- package/dist-ssg/client/assets/WebGLRenderer-DYji4Hjk.js +1 -0
- package/dist-ssg/client/assets/WebGPURenderer-DCzgl3HP.js +1 -0
- package/dist-ssg/client/assets/browserAll-DyJwsAsx.js +1 -0
- package/dist-ssg/client/assets/{config-guide-presentation-BEF34WAK.js → config-guide-presentation-PYNWYVfd.js} +1 -1
- package/dist-ssg/client/assets/{dist-DU7FOddi.js → dist-B6_zeP9X.js} +1 -1
- package/dist-ssg/client/assets/{dist-CBT1FQBi.js → dist-BXD-ZTAM.js} +1 -1
- package/dist-ssg/client/assets/{dist-BRX0vHHj.js → dist-BxLfQE_c.js} +1 -1
- package/dist-ssg/client/assets/{dist-XQwsfb9S.js → dist-C8koIGSO.js} +1 -1
- package/dist-ssg/client/assets/{dist-BzOaRFB5.js → dist-CD337m0H.js} +1 -1
- package/dist-ssg/client/assets/{dist-CQfLbMfn.js → dist-Cb1nIvKO.js} +1 -1
- package/dist-ssg/client/assets/dist-DOqQmBHc.js +1 -0
- package/dist-ssg/client/assets/dist-DUhJ59_2.js +1 -0
- package/dist-ssg/client/assets/{dist-DwdkRYfv.js → dist-DZMoaNp9.js} +1 -1
- package/dist-ssg/client/assets/{dist-gcj7KpQ7.js → dist-f2vnkzi9.js} +1 -1
- package/dist-ssg/client/assets/{dist-C7ncT3z3.js → dist-n_0I1u31.js} +1 -1
- package/dist-ssg/client/assets/dist-osbHiFDv.js +1 -0
- package/dist-ssg/client/assets/{ghostty-web-BuKlD9v-.js → ghostty-web-DEm8ZrOM.js} +1 -1
- package/dist-ssg/client/assets/index-Dcu2Vogo.css +1 -0
- package/dist-ssg/client/assets/{index.ssg-DRSFMaRS.js → index.ssg-5ak0Ru-F.js} +153 -153
- package/dist-ssg/client/assets/{init-Cna88xtL.js → init-mhU1_WMm.js} +1 -1
- package/dist-ssg/client/assets/{trpc-5KfqD8Sg.js → trpc-DcBLtyHb.js} +1 -1
- package/dist-ssg/client/assets/webworkerAll-BZhOzVEX.js +1 -0
- package/dist-ssg/client/index.ssg.html +2 -2
- package/dist-ssg/server/assets/CanvasRenderer-2gUSLPR3.js +3 -0
- package/dist-ssg/server/assets/WebGLRenderer-VYeMuiRZ.js +3 -0
- package/dist-ssg/server/assets/WebGPURenderer-CzqH7K0F.js +3 -0
- package/dist-ssg/server/assets/{browserAll-Br-Ym0s3.js → browserAll-C3TgySxy.js} +2 -2
- package/dist-ssg/server/assets/{config-guide-presentation-BNsPtfSX.js → config-guide-presentation-DluN0NgQ.js} +1 -1
- package/dist-ssg/server/assets/{dist-DLLg4uMo.js → dist-BQhB00FX.js} +1 -1
- package/dist-ssg/server/assets/{dist-tmI1Vtui.js → dist-BQopLPgi.js} +1 -1
- package/dist-ssg/server/assets/{dist-C-ifGdHx.js → dist-BSYA61e0.js} +1 -1
- package/dist-ssg/server/assets/{dist-BKolbUhu.js → dist-C0UE33e7.js} +1 -1
- package/dist-ssg/server/assets/{dist-D4wdS9IG.js → dist-CcweeoW2.js} +1 -1
- package/dist-ssg/server/assets/{dist-2q5MBzNz.js → dist-CqznyH3C.js} +1 -1
- package/dist-ssg/server/assets/dist-Cr2VaH_X.js +3 -0
- package/dist-ssg/server/assets/dist-CuufxmlH.js +3 -0
- package/dist-ssg/server/assets/dist-D-tZhX9W.js +3 -0
- package/dist-ssg/server/assets/{dist-BXMtMtrz.js → dist-DHRASvmg.js} +1 -1
- package/dist-ssg/server/assets/{dist-jJ40WsNS.js → dist-DukPjaq8.js} +1 -1
- package/dist-ssg/server/assets/{dist-DkcAEJix.js → dist-DxUyXTq1.js} +1 -1
- package/dist-ssg/server/assets/{entry-server-BrAwgnce.js → entry-server-CByGxb_0.js} +323 -163
- package/dist-ssg/server/assets/{init-d-mn_N98.js → init-C33dwfW5.js} +1 -1
- package/dist-ssg/server/assets/trpc-BZ-LKmoQ.js +3 -0
- package/dist-ssg/server/assets/webworkerAll-jouzdRxg.js +4 -0
- package/dist-ssg/server/ssr-entry-manifest.json +25 -25
- package/package.json +5 -5
- package/dist/assets/App-J7QMKvLP.css +0 -1
- package/dist-ssg/client/assets/CanvasRenderer-Dgiuwgmn.js +0 -1
- package/dist-ssg/client/assets/WebGLRenderer-BlOEHuOZ.js +0 -1
- package/dist-ssg/client/assets/WebGPURenderer-P8I2K_Xf.js +0 -1
- package/dist-ssg/client/assets/browserAll-D8-fUgsu.js +0 -1
- package/dist-ssg/client/assets/dist-BOrzLvBw.js +0 -1
- package/dist-ssg/client/assets/dist-D-Qw6bA0.js +0 -1
- package/dist-ssg/client/assets/dist-kaLCvHyA.js +0 -1
- package/dist-ssg/client/assets/index-BvRDTcR7.css +0 -1
- package/dist-ssg/client/assets/webworkerAll-CortW4j-.js +0 -1
- package/dist-ssg/server/assets/CanvasRenderer-BddS1srD.js +0 -3
- package/dist-ssg/server/assets/WebGLRenderer-CI_abbD1.js +0 -3
- package/dist-ssg/server/assets/WebGPURenderer-CGD9VYdm.js +0 -3
- package/dist-ssg/server/assets/dist-BuMA6YKx.js +0 -3
- package/dist-ssg/server/assets/dist-DHm81glc.js +0 -3
- package/dist-ssg/server/assets/dist-DweGKZ3K.js +0 -3
- package/dist-ssg/server/assets/trpc-DUmUqj4-.js +0 -3
- 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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 (
|
|
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
|
|
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.
|
|
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("
|
|
168769
|
-
|
|
168770
|
-
className: "flex h-
|
|
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
|
-
}),
|
|
168794
|
-
|
|
168795
|
-
|
|
168796
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.
|
|
168797
|
-
|
|
168798
|
-
|
|
168799
|
-
|
|
168800
|
-
|
|
168801
|
-
|
|
168802
|
-
|
|
168803
|
-
|
|
168804
|
-
|
|
168805
|
-
|
|
168806
|
-
|
|
168807
|
-
|
|
168808
|
-
|
|
168809
|
-
|
|
168810
|
-
|
|
168811
|
-
|
|
168812
|
-
|
|
168813
|
-
|
|
168814
|
-
|
|
168815
|
-
|
|
168816
|
-
|
|
168817
|
-
|
|
168818
|
-
|
|
168819
|
-
|
|
168820
|
-
|
|
168821
|
-
|
|
168822
|
-
|
|
168823
|
-
|
|
168824
|
-
|
|
168825
|
-
|
|
168826
|
-
|
|
168827
|
-
|
|
168828
|
-
|
|
168829
|
-
|
|
168830
|
-
|
|
168831
|
-
|
|
168832
|
-
|
|
168833
|
-
|
|
168834
|
-
|
|
168835
|
-
|
|
168836
|
-
|
|
168837
|
-
|
|
168838
|
-
|
|
168839
|
-
|
|
168840
|
-
|
|
168841
|
-
|
|
168842
|
-
|
|
168843
|
-
|
|
168844
|
-
|
|
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
|
-
})
|
|
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-
|
|
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
|
|
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
|
|
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.
|
|
169041
|
-
|
|
169042
|
-
|
|
169043
|
-
|
|
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
|
-
}),
|
|
169057
|
-
|
|
169058
|
-
className: "
|
|
169059
|
-
|
|
169060
|
-
|
|
169061
|
-
"
|
|
169062
|
-
children:
|
|
169063
|
-
|
|
169064
|
-
|
|
169065
|
-
|
|
169066
|
-
|
|
169067
|
-
|
|
169068
|
-
|
|
169069
|
-
|
|
169070
|
-
|
|
169071
|
-
|
|
169072
|
-
|
|
169073
|
-
|
|
169074
|
-
|
|
169075
|
-
|
|
169076
|
-
|
|
169077
|
-
|
|
169078
|
-
|
|
169079
|
-
|
|
169080
|
-
|
|
169081
|
-
|
|
169082
|
-
|
|
169083
|
-
|
|
169084
|
-
|
|
169085
|
-
|
|
169086
|
-
|
|
169087
|
-
|
|
169088
|
-
|
|
169089
|
-
|
|
169090
|
-
|
|
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
|
-
})
|
|
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-
|
|
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() {
|