@reqlan/analytical 0.7.0 → 0.8.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/README.md +27 -0
- package/out/analysis/fuzzy-search-analyser.d.ts +17 -0
- package/out/analysis/fuzzy-search-analyser.js +25 -0
- package/out/analysis/fuzzy-search-analyser.js.map +1 -0
- package/out/analysis/fuzzy-search-worker-client.d.ts +39 -0
- package/out/analysis/fuzzy-search-worker-client.js +178 -0
- package/out/analysis/fuzzy-search-worker-client.js.map +1 -0
- package/out/analysis/fuzzy-search-worker.d.ts +32 -0
- package/out/analysis/fuzzy-search-worker.js +81 -0
- package/out/analysis/fuzzy-search-worker.js.map +1 -0
- package/out/analysis/fuzzy-search.d.ts +38 -0
- package/out/analysis/fuzzy-search.js +217 -0
- package/out/analysis/fuzzy-search.js.map +1 -0
- package/out/analysis/git-dates-analyser.js +12 -3
- package/out/analysis/git-dates-analyser.js.map +1 -1
- package/out/analysis-api.d.ts +14 -0
- package/out/analysis-api.js +32 -0
- package/out/analysis-api.js.map +1 -1
- package/out/core/barrel-page.d.ts +46 -0
- package/out/core/barrel-page.js +162 -0
- package/out/core/barrel-page.js.map +1 -0
- package/out/core/filter-specials.d.ts +2 -0
- package/out/core/filter-specials.js +15 -0
- package/out/core/filter-specials.js.map +1 -1
- package/out/core/types.d.ts +17 -1
- package/out/core/types.js +1 -0
- package/out/core/types.js.map +1 -1
- package/out/create-runtime.js +2 -0
- package/out/create-runtime.js.map +1 -1
- package/out/export/export-csv.d.ts +4 -0
- package/out/export/export-csv.js +13 -0
- package/out/export/export-csv.js.map +1 -0
- package/out/export/export-json.d.ts +6 -0
- package/out/export/export-json.js +28 -0
- package/out/export/export-json.js.map +1 -0
- package/out/export/export-markdown.d.ts +4 -0
- package/out/export/export-markdown.js +23 -0
- package/out/export/export-markdown.js.map +1 -0
- package/out/export/html-export-assets.d.ts +1 -1
- package/out/export/html-export-assets.js +126 -5
- package/out/export/html-export-assets.js.map +1 -1
- package/out/export/html-export-template.js +89 -47
- package/out/export/html-export-template.js.map +1 -1
- package/out/export/html-export-utils.d.ts +33 -3
- package/out/export/html-export-utils.js +108 -10
- package/out/export/html-export-utils.js.map +1 -1
- package/out/export/types.d.ts +1 -1
- package/out/export/write-csv-export.d.ts +5 -0
- package/out/export/write-csv-export.js +132 -0
- package/out/export/write-csv-export.js.map +1 -0
- package/out/export/write-json-export.d.ts +3 -0
- package/out/export/write-json-export.js +92 -0
- package/out/export/write-json-export.js.map +1 -0
- package/out/export/write-markdown-export.d.ts +5 -0
- package/out/export/write-markdown-export.js +177 -0
- package/out/export/write-markdown-export.js.map +1 -0
- package/out/index-store/idea-extractor.d.ts +6 -1
- package/out/index-store/idea-extractor.js +56 -11
- package/out/index-store/idea-extractor.js.map +1 -1
- package/out/index-store/sqlite-store.d.ts +16 -3
- package/out/index-store/sqlite-store.js +104 -8
- package/out/index-store/sqlite-store.js.map +1 -1
- package/out/index-store/webview-graph-queries.d.ts +5 -0
- package/out/index-store/webview-graph-queries.js +21 -4
- package/out/index-store/webview-graph-queries.js.map +1 -1
- package/out/index-store/webview-table-queries.js +1 -0
- package/out/index-store/webview-table-queries.js.map +1 -1
- package/out/index-store/workspace-index-file.js +22 -1
- package/out/index-store/workspace-index-file.js.map +1 -1
- package/out/index.d.ts +14 -1
- package/out/index.js +9 -1
- package/out/index.js.map +1 -1
- package/package.json +2 -2
package/out/core/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shared domain types for the idea graph index and analysers.
|
|
3
3
|
*/
|
|
4
4
|
export type IdeaKind = 'block' | 'oneliner' | 'ideaset';
|
|
5
|
-
export type EdgeKind = 'references' | 'file_reference' | 'ideaset_member' | 'import' | 'comment_link';
|
|
5
|
+
export type EdgeKind = 'references' | 'wildcard_reference' | 'file_reference' | 'ideaset_member' | 'import' | 'comment_link';
|
|
6
6
|
export interface IdeaRecord {
|
|
7
7
|
id: string;
|
|
8
8
|
name: string;
|
|
@@ -92,7 +92,23 @@ export type { ActivityBarScope, CurrentFileSlice, ReqlanContextModel } from './c
|
|
|
92
92
|
export { CONTEXT_DIMENSION_LABELS, CONTEXT_DIMENSION_WEIGHTS, DEFAULT_ENABLED_DIMENSIONS } from './context-model.js';
|
|
93
93
|
export type { ContextAnomaly, ContextDimensionContribution, ContextDimensionId, ContextFileEntry, ContextFocus, ContextFocusKind, ContextFootprint, ContextIdeaEntry, ContextProvenance, ContextReferencesSlice, GitAuthorRollup, GitContextSlice, GitFocusCommit, GitFocusStats, GitPeerChangeRate, WorkspaceBaseGlance, WorkspaceContextSlice } from './context-model.js';
|
|
94
94
|
export declare const ACTIVITY_BAR_MAX_NODES = 40;
|
|
95
|
+
export declare const ACTIVITY_BAR_TODO_LIMIT = 40;
|
|
95
96
|
export declare const BLOCKING_STATUSES: Set<string>;
|
|
97
|
+
/** Idea carrying a `@todo` attribute for the activity-bar todo pane. */
|
|
98
|
+
export interface TodoIdeaRow {
|
|
99
|
+
id: string;
|
|
100
|
+
name: string;
|
|
101
|
+
kind: IdeaKind;
|
|
102
|
+
fileUri: string;
|
|
103
|
+
lineStart: number;
|
|
104
|
+
summary: string;
|
|
105
|
+
/** Note text when `@todo` has a value; omitted for bare `@todo`. */
|
|
106
|
+
todoNote?: string;
|
|
107
|
+
}
|
|
108
|
+
export interface TodoIdeaListResult {
|
|
109
|
+
total: number;
|
|
110
|
+
ideas: TodoIdeaRow[];
|
|
111
|
+
}
|
|
96
112
|
export interface GraphSlice {
|
|
97
113
|
centerId: string;
|
|
98
114
|
depth: number;
|
package/out/core/types.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { CONTEXT_DIMENSION_LABELS, CONTEXT_DIMENSION_WEIGHTS, DEFAULT_ENABLED_DIMENSIONS } from './context-model.js';
|
|
5
5
|
export const ACTIVITY_BAR_MAX_NODES = 40;
|
|
6
|
+
export const ACTIVITY_BAR_TODO_LIMIT = 40;
|
|
6
7
|
export const BLOCKING_STATUSES = new Set([
|
|
7
8
|
'pending',
|
|
8
9
|
'todo',
|
package/out/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2GH,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC7B,MAAM,oBAAoB,CAAC;AAqB5B,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACrC,SAAS;IACT,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,aAAa;CAChB,CAAC,CAAC;AAoHH,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,IAAY;IAChD,OAAO,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,QAAgB,EAAE,IAAc,EAAE,MAAc;IACnE,OAAO,GAAG,QAAQ,KAAK,IAAI,IAAI,MAAM,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,UAA4B;IACjD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAA4B;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACjC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAA4B;IACrD,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,CAAC;AAChF,CAAC"}
|
package/out/create-runtime.js
CHANGED
|
@@ -9,6 +9,7 @@ import { gitDatesAnalyser } from './analysis/git-dates-analyser.js';
|
|
|
9
9
|
import { completionTrackingAnalyser } from './analysis/completion-tracking-analyser.js';
|
|
10
10
|
import { localGraphAnalyser } from './analysis/local-graph-analyser.js';
|
|
11
11
|
import { semanticSearchAnalyser } from './analysis/semantic-search-analyser.js';
|
|
12
|
+
import { fuzzySearchAnalyser } from './analysis/fuzzy-search-analyser.js';
|
|
12
13
|
import { WorkspaceIndex } from './index-store/workspace-index.js';
|
|
13
14
|
function registerDefaultAnalysers(analysers) {
|
|
14
15
|
analysers.register(listAllIdeasAnalyser);
|
|
@@ -18,6 +19,7 @@ function registerDefaultAnalysers(analysers) {
|
|
|
18
19
|
analysers.register(completionTrackingAnalyser);
|
|
19
20
|
analysers.register(localGraphAnalyser);
|
|
20
21
|
analysers.register(semanticSearchAnalyser);
|
|
22
|
+
analysers.register(fuzzySearchAnalyser);
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Create a headless analysis runtime bound to one base.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-runtime.js","sourceRoot":"","sources":["../src/create-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAwB,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EACH,aAAa,EACb,iBAAiB,EAEpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAuClE,SAAS,wBAAwB,CAAC,SAA2B;IACzD,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACzC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACvC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"create-runtime.js","sourceRoot":"","sources":["../src/create-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SqliteIndexStore } from '../index-store/sqlite-store.js';
|
|
2
|
+
import type { ExportProgressCallback, ExportRequest, ExportResult } from './types.js';
|
|
3
|
+
/** Build a snapshot and write CSV files (ideas + references). */
|
|
4
|
+
export declare function exportCsv(store: SqliteIndexStore, request: ExportRequest, onProgress?: ExportProgressCallback): Promise<ExportResult>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { buildExportSnapshot } from './build-export-snapshot.js';
|
|
2
|
+
import { dataExportSnapshotRequest } from './export-json.js';
|
|
3
|
+
import { writeCsvExport } from './write-csv-export.js';
|
|
4
|
+
/** Build a snapshot and write CSV files (ideas + references). */
|
|
5
|
+
export async function exportCsv(store, request, onProgress) {
|
|
6
|
+
onProgress?.({
|
|
7
|
+
phase: 'snapshot',
|
|
8
|
+
message: 'Building export snapshot…',
|
|
9
|
+
});
|
|
10
|
+
const snapshot = await buildExportSnapshot(store, dataExportSnapshotRequest(request, 'csv'), onProgress);
|
|
11
|
+
return writeCsvExport(snapshot, request, onProgress);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=export-csv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-csv.js","sourceRoot":"","sources":["../../src/export/export-csv.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,KAAuB,EACvB,OAAsB,EACtB,UAAmC;IAEnC,UAAU,EAAE,CAAC;QACT,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,2BAA2B;KACvC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;IACzG,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SqliteIndexStore } from '../index-store/sqlite-store.js';
|
|
2
|
+
import type { ExportProgressCallback, ExportRequest, ExportResult } from './types.js';
|
|
3
|
+
/** Lean request overrides shared by JSON/CSV (and similar data) exports. */
|
|
4
|
+
export declare function dataExportSnapshotRequest(request: ExportRequest, format: 'json' | 'csv'): ExportRequest;
|
|
5
|
+
/** Build a snapshot and write structured JSON. */
|
|
6
|
+
export declare function exportJson(store: SqliteIndexStore, request: ExportRequest, onProgress?: ExportProgressCallback): Promise<ExportResult>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { buildExportSnapshot } from './build-export-snapshot.js';
|
|
2
|
+
import { writeJsonExport } from './write-json-export.js';
|
|
3
|
+
/** Lean request overrides shared by JSON/CSV (and similar data) exports. */
|
|
4
|
+
export function dataExportSnapshotRequest(request, format) {
|
|
5
|
+
return {
|
|
6
|
+
...request,
|
|
7
|
+
format,
|
|
8
|
+
includeGraphPage: false,
|
|
9
|
+
includeRequirementsPage: false,
|
|
10
|
+
includePrintPages: false,
|
|
11
|
+
includeIdeaPages: false,
|
|
12
|
+
includeFilePages: false,
|
|
13
|
+
includeCodeFilePages: false,
|
|
14
|
+
includeClusterPages: true,
|
|
15
|
+
includeAttributePages: true,
|
|
16
|
+
runtimeMode: request.runtimeMode ?? 'document',
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Build a snapshot and write structured JSON. */
|
|
20
|
+
export async function exportJson(store, request, onProgress) {
|
|
21
|
+
onProgress?.({
|
|
22
|
+
phase: 'snapshot',
|
|
23
|
+
message: 'Building export snapshot…',
|
|
24
|
+
});
|
|
25
|
+
const snapshot = await buildExportSnapshot(store, dataExportSnapshotRequest(request, 'json'), onProgress);
|
|
26
|
+
return writeJsonExport(snapshot, request, onProgress);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=export-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-json.js","sourceRoot":"","sources":["../../src/export/export-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,4EAA4E;AAC5E,MAAM,UAAU,yBAAyB,CAAC,OAAsB,EAAE,MAAsB;IACpF,OAAO;QACH,GAAG,OAAO;QACV,MAAM;QACN,gBAAgB,EAAE,KAAK;QACvB,uBAAuB,EAAE,KAAK;QAC9B,iBAAiB,EAAE,KAAK;QACxB,gBAAgB,EAAE,KAAK;QACvB,gBAAgB,EAAE,KAAK;QACvB,oBAAoB,EAAE,KAAK;QAC3B,mBAAmB,EAAE,IAAI;QACzB,qBAAqB,EAAE,IAAI;QAC3B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,UAAU;KACjD,CAAC;AACN,CAAC;AAED,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,KAAuB,EACvB,OAAsB,EACtB,UAAmC;IAEnC,UAAU,EAAE,CAAC;QACT,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,2BAA2B;KACvC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1G,OAAO,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SqliteIndexStore } from '../index-store/sqlite-store.js';
|
|
2
|
+
import type { ExportProgressCallback, ExportRequest, ExportResult } from './types.js';
|
|
3
|
+
/** Build a snapshot and write a multi-file markdown export. */
|
|
4
|
+
export declare function exportMarkdown(store: SqliteIndexStore, request: ExportRequest, onProgress?: ExportProgressCallback): Promise<ExportResult>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { buildExportSnapshot } from './build-export-snapshot.js';
|
|
2
|
+
import { writeMarkdownExport } from './write-markdown-export.js';
|
|
3
|
+
/** Build a snapshot and write a multi-file markdown export. */
|
|
4
|
+
export async function exportMarkdown(store, request, onProgress) {
|
|
5
|
+
onProgress?.({
|
|
6
|
+
phase: 'snapshot',
|
|
7
|
+
message: 'Building export snapshot…',
|
|
8
|
+
});
|
|
9
|
+
const snapshot = await buildExportSnapshot(store, {
|
|
10
|
+
...request,
|
|
11
|
+
format: 'markdown',
|
|
12
|
+
// Markdown is document-oriented; skip interactive HTML-only families by default.
|
|
13
|
+
includeGraphPage: false,
|
|
14
|
+
includeRequirementsPage: false,
|
|
15
|
+
includePrintPages: false,
|
|
16
|
+
includeCodeFilePages: false,
|
|
17
|
+
includeClusterPages: false,
|
|
18
|
+
includeAttributePages: false,
|
|
19
|
+
runtimeMode: request.runtimeMode ?? 'document',
|
|
20
|
+
}, onProgress);
|
|
21
|
+
return writeMarkdownExport(snapshot, request, onProgress);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=export-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-markdown.js","sourceRoot":"","sources":["../../src/export/export-markdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,KAAuB,EACvB,OAAsB,EACtB,UAAmC;IAEnC,UAAU,EAAE,CAAC;QACT,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,2BAA2B;KACvC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE;QAC9C,GAAG,OAAO;QACV,MAAM,EAAE,UAAU;QAClB,iFAAiF;QACjF,gBAAgB,EAAE,KAAK;QACvB,uBAAuB,EAAE,KAAK;QAC9B,iBAAiB,EAAE,KAAK;QACxB,oBAAoB,EAAE,KAAK;QAC3B,mBAAmB,EAAE,KAAK;QAC1B,qBAAqB,EAAE,KAAK;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,UAAU;KACjD,EAAE,UAAU,CAAC,CAAC;IACf,OAAO,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const SHARED_STYLES = "\n:root {\n color-scheme: dark;\n --bg: #14100e;\n --bg-elev: #1f1815;\n --bg-soft: #1f1815;\n --bg-raised: #2a211d;\n --fg: #ebe4de;\n --muted: #a89488;\n --faint: #6e5f56;\n --line: #3d2f28;\n --accent: #07a0e5;\n --accent-strong: #0bbefb;\n --accent-dim: #0371c1;\n --rust: #b85c38;\n --rust-muted: #8a4530;\n --good: #4ade80;\n --warn: #fbbf24;\n --bad: #fb7185;\n font-family: Inter, system-ui, sans-serif;\n}\n* { box-sizing: border-box; }\nbody {\n margin: 0;\n background: var(--bg);\n color: var(--fg);\n line-height: 1.55;\n}\na { color: var(--accent-strong); text-decoration: none; }\na:hover { color: var(--accent); }\nmain.layout {\n max-width: 1360px; margin: 0 auto; padding: 1.5rem;\n display: flex; flex-direction: column; gap: 1.5rem;\n}\n.topbar {\n position: sticky; top: 0; z-index: 10;\n background: var(--bg-elev); border-bottom: 1px solid var(--line); margin: 0 -1.5rem;\n padding: 0.9rem 1.5rem;\n}\n.topbar-inner, .hero, .split, .grid, .detail-grid { display: grid; gap: 1.5rem; }\n.topbar-inner { grid-template-columns: 1.3fr auto; align-items: center; }\n.nav { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; }\n.nav a {\n padding: 0.45rem 0.75rem; border-radius: 8px;\n background: var(--bg-raised); color: var(--muted); border: 1px solid var(--line);\n}\n.nav a:hover { color: var(--fg); border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); }\n.nav a.active {\n background: color-mix(in srgb, var(--rust) 28%, var(--bg-raised));\n color: var(--fg); border-color: var(--rust);\n}\n.nav a.brand-link {\n background: transparent;\n border-color: transparent;\n color: var(--fg);\n font-weight: 650;\n letter-spacing: 0.02em;\n padding-left: 0.15rem;\n padding-right: 0.9rem;\n}\n.nav a.brand-link:hover {\n color: var(--accent);\n border-color: transparent;\n background: transparent;\n}\n.hero { grid-template-columns: 2fr 1fr; }\n.grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 140px), 1fr));\n gap: 1.5rem;\n row-gap: 1.5rem;\n column-gap: 1.5rem;\n}\n.split, .detail-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));\n gap: 1.5rem;\n}\n.panel, .metric, .card, .table-shell, .graph-shell, .print-card, .search-result {\n background: var(--bg-raised);\n border: 1px solid var(--line);\n border-radius: 10px;\n}\n.panel, .card, .table-shell, .graph-shell, .print-card, .search-result { padding: 1rem 1.1rem; }\n.metric { padding: 0; overflow: hidden; }\n.metric-link, .metric > span, .metric > strong {\n display: flex; flex-direction: column; gap: 0.35rem; padding: 1rem; color: inherit;\n}\n.metric-link:hover { background: color-mix(in srgb, var(--accent) 10%, var(--bg-raised)); }\n.metric-label, .subtle, .eyebrow, .breadcrumbs { color: var(--muted); }\n.metric-value { font-size: 1.75rem; color: var(--accent-strong); }\n.eyebrow { text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.75rem; color: var(--rust); }\n.page-header { display: grid; gap: 0.55rem; }\n.page-header h1 { margin: 0; }\n.page-header .eyebrow { margin: 0; }\n.page-header .subtle { margin: 0; }\n.toolbar {\n display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; justify-content: space-between;\n margin-bottom: 0.9rem;\n}\n.toolbar .actions, .pill-row, .breadcrumbs { display: flex; gap: 0.75rem; row-gap: 0.85rem; flex-wrap: wrap; align-items: center; }\n.chip, .pill {\n display: inline-flex; align-items: center; gap: 0.35rem;\n padding: 0.28rem 0.6rem; border-radius: 8px;\n border: 1px solid var(--line); background: var(--bg); color: var(--muted);\n}\na.pill:hover { color: var(--accent-strong); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.graph-controls-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.65rem;\n align-items: center;\n margin-bottom: 0.9rem;\n padding: 0.8rem;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg);\n}\n.graph-shell > .pill-row { margin-bottom: 0.9rem; }\n.graph-filter {\n flex: 1 1 180px;\n min-width: 160px;\n}\n.scd {\n position: relative;\n flex: 1 1 180px;\n min-width: 160px;\n}\n.scd-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.55rem;\n width: 100%;\n min-height: 2.35rem;\n padding: 0.4rem 0.75rem;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: var(--bg-soft);\n color: var(--fg);\n font: inherit;\n cursor: pointer;\n text-align: left;\n}\n.scd.is-open .scd-trigger,\n.scd-trigger:hover {\n border-color: var(--accent-dim);\n}\n.scd.has-selection .scd-trigger {\n border-color: color-mix(in srgb, var(--accent) 45%, var(--line));\n}\n.scd.is-searching .scd-trigger {\n border-color: var(--line);\n}\n.scd.is-loading .scd-trigger {\n opacity: 0.72;\n}\n.scd-trigger-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.scd-chevron {\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 5px solid currentColor;\n opacity: 0.7;\n flex: 0 0 auto;\n}\n.scd.is-open .scd-chevron { transform: rotate(180deg); }\n.scd-panel {\n position: absolute;\n z-index: 50;\n top: calc(100% + 0.35rem);\n left: 0;\n right: auto;\n width: max(100%, 15rem);\n max-width: min(20rem, 80vw);\n max-height: 18rem;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg-elev);\n box-shadow: 0 16px 40px rgba(0, 0, 0, 0.35);\n overflow: hidden;\n}\n/* Author display:flex overrides the UA [hidden] rule; keep closed panels invisible. */\n.scd-panel[hidden] {\n display: none;\n}\n.scd-search-row {\n display: flex;\n gap: 0.45rem;\n padding: 0.65rem;\n border-bottom: 1px solid var(--line);\n opacity: 0.72;\n}\n.scd-search-row.is-active { opacity: 1; }\n.scd-search {\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.55rem;\n border: 1px solid transparent;\n border-radius: 6px;\n background: color-mix(in srgb, var(--bg) 88%, transparent);\n color: var(--muted);\n font: inherit;\n}\n.scd.is-searching .scd-search,\n.scd-search:focus {\n border-color: var(--accent-dim);\n background: var(--bg);\n color: var(--fg);\n outline: none;\n}\n.scd-clear {\n border: none;\n background: transparent;\n color: var(--accent-strong);\n font: inherit;\n cursor: pointer;\n}\n.scd-list {\n overflow: auto;\n padding: 0.25rem 0 0.55rem;\n}\n.scd-group-label {\n padding: 0.55rem 0.85rem 0.25rem;\n font-size: 0.72rem;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--muted);\n}\n.scd-option {\n display: flex;\n align-items: center;\n gap: 0.55rem;\n padding: 0.45rem 0.85rem;\n cursor: pointer;\n color: var(--fg);\n}\n.scd-option:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); }\n.scd-option input { margin: 0; }\n.scd-option-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.scd-option-count {\n flex: 0 0 auto;\n font-variant-numeric: tabular-nums;\n font-size: 0.85em;\n color: var(--muted);\n opacity: 0.65;\n}\n.scd-option.is-special .scd-option-label { font-style: italic; }\n.scd-option.is-not-present .scd-option-label { color: var(--faint); }\n.scd-option.is-empty .scd-option-label { color: var(--accent-strong); }\n.scd-option.is-unspecified .scd-option-label { color: var(--rust-muted); }\n.scd-empty {\n margin: 0;\n padding: 0.85rem;\n color: var(--muted);\n font-size: 0.9rem;\n}\n.rollup-list .rollup-special dt {\n font-style: italic;\n}\n.rollup-list .rollup-not-present dt {\n color: var(--faint);\n}\n.rollup-list .rollup-empty dt {\n color: var(--accent-strong);\n}\n.rollup-list .rollup-unspecified dt {\n color: var(--rust-muted);\n}\n.graph-action {\n border: 1px solid var(--line);\n background: var(--bg-soft);\n color: var(--fg);\n border-radius: 8px;\n padding: 0.7rem 0.9rem;\n cursor: pointer;\n}\n.graph-action:hover { border-color: var(--accent-dim); color: var(--accent-strong); }\n.graph-action.is-active {\n background: color-mix(in srgb, var(--rust) 28%, var(--bg-soft));\n border-color: var(--rust);\n color: var(--fg);\n}\n.graph-status {\n color: var(--muted);\n font-size: 0.92rem;\n margin-left: auto;\n}\n.searchbar, select, input[type=\"search\"] {\n width: min(100%, 440px); background: var(--bg); color: var(--fg);\n border: 1px solid var(--line); border-radius: 8px; padding: 0.75rem 0.9rem;\n}\n.searchbar:focus, select:focus, input[type=\"search\"]:focus {\n outline: none;\n border-color: var(--accent);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 25%, transparent);\n}\ntable { width: 100%; border-collapse: collapse; }\nth, td {\n padding: 0.75rem 0.65rem; text-align: left; border-bottom: 1px solid var(--line); vertical-align: top;\n}\nth { color: var(--muted); font-size: 0.94rem; }\ntbody tr:hover { background: var(--bg-raised); }\n.table-shell { overflow-x: auto; }\n.scroll-window {\n --scroll-window-max: min(28rem, 50vh);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window {\n max-height: var(--scroll-window-max);\n overflow: auto;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: var(--bg);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window > table {\n margin: 0;\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window .entity-list,\nbody[data-runtime-mode=\"interactive\"] .scroll-window .rollup-list {\n padding: 0.75rem;\n}\n.sortable-th { padding: 0.45rem 0.4rem; }\n.sort-button {\n display: inline-flex; align-items: center; gap: 0.35rem;\n width: 100%; margin: 0; padding: 0.3rem 0.25rem;\n border: 0; background: transparent; color: inherit;\n font: inherit; text-align: left; cursor: pointer;\n}\n.sort-button:hover { color: var(--fg); }\n.sort-button.sort-active { color: var(--accent-strong); }\n.sort-indicator { color: var(--faint); font-size: 0.8em; min-width: 1em; }\n.sort-button.sort-active .sort-indicator { color: var(--accent-strong); }\n.table-filter-toggle {\n display: inline-flex; align-items: center; justify-content: center;\n width: 2.25rem; height: 2.25rem; padding: 0;\n border: 1px solid var(--line); border-radius: 8px;\n background: var(--bg-raised); color: var(--muted); cursor: pointer;\n}\n.table-filter-toggle:hover { color: var(--fg); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.table-filter-toggle.is-active {\n color: var(--fg);\n border-color: var(--accent);\n background: color-mix(in srgb, var(--accent) 18%, var(--bg-raised));\n}\n.table-filter-toggle.has-filters:not(.is-active) {\n color: var(--accent-strong);\n border-color: color-mix(in srgb, var(--accent) 45%, var(--line));\n}\n.table-filter-toggle svg { width: 1rem; height: 1rem; display: block; }\n.table-filter-actions {\n display: flex; justify-content: flex-end; gap: 0.55rem;\n margin-bottom: 0.65rem;\n}\n.column-filter-row { display: none; }\n.column-filter-row.is-open { display: table-row; }\n.column-filter-row th {\n padding: 0.35rem 0.4rem 0.75rem; border-bottom: 1px solid var(--line); font-weight: 400;\n}\n.column-filter {\n width: 100%; min-width: 4.5rem; background: var(--bg); color: var(--fg);\n border: 1px solid var(--line); border-radius: 6px; padding: 0.4rem 0.55rem; font-size: 0.85rem;\n}\n.column-filter:focus {\n outline: none;\n border-color: var(--accent);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 25%, transparent);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window thead tr:first-child th {\n position: sticky;\n top: 0;\n z-index: 2;\n background: var(--bg-raised);\n box-shadow: 0 1px 0 var(--line);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window thead .column-filter-row.is-open th {\n position: sticky;\n top: 2.65rem;\n z-index: 1;\n background: var(--bg-raised);\n box-shadow: 0 1px 0 var(--line);\n}\n.entity-list { display: grid; gap: 1.5rem; }\n.entity-card {\n border: 1px solid var(--line); border-radius: 10px; padding: 0.9rem 1rem; background: var(--bg);\n color: inherit;\n}\n.entity-card:hover { border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.entity-card h3, .entity-card p { margin: 0; }\n.entity-card p + p, .entity-card strong + p, .entity-card h3 + p { margin-top: 0.35rem; }\n.panel > h2, .table-shell > h2, .graph-shell > h2, .print-card > h3 { margin-top: 0; margin-bottom: 0.75rem; }\n.toolbar h2 { margin: 0; }\n.rollup-list { display: grid; gap: 0.5rem; }\n.rollup-list div {\n display: flex; justify-content: space-between; gap: 1rem; border-bottom: 1px solid var(--line); padding-bottom: 0.4rem;\n}\n.rollup-list dd { margin: 0; }\n.distribution-track {\n height: 0.7rem;\n min-width: 6rem;\n border-radius: 999px;\n background: var(--bg);\n border: 1px solid var(--line);\n overflow: hidden;\n}\n.distribution-fill {\n display: block;\n height: 100%;\n border-radius: inherit;\n background: linear-gradient(90deg, var(--accent-dim), var(--accent-strong));\n min-width: 0;\n}\n.graph-root {\n position: relative;\n min-height: 620px;\n}\n.graph-root.is-booting {\n display: grid;\n place-items: center;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg);\n}\n.graph-boot {\n display: grid;\n justify-items: center;\n gap: 0.75rem;\n padding: 1.5rem;\n text-align: center;\n color: var(--muted);\n}\n.graph-boot p { margin: 0; }\n.graph-boot-spinner {\n width: 1.35rem;\n height: 1.35rem;\n border: 2px solid color-mix(in srgb, var(--muted) 35%, transparent);\n border-top-color: var(--accent-strong);\n border-radius: 50%;\n animation: graph-boot-spin 0.7s linear infinite;\n}\n@keyframes graph-boot-spin {\n to { transform: rotate(360deg); }\n}\n.graph-root canvas {\n display: block;\n width: 100%;\n min-height: 620px;\n background: var(--bg);\n border-radius: 10px;\n border: 1px solid var(--line);\n touch-action: none;\n cursor: grab;\n}\n.graph-root canvas.is-panning { cursor: grabbing; }\n.graph-root canvas.is-dragging-node { cursor: pointer; }\n.search-results { display: grid; gap: 0.7rem; margin-top: 1rem; }\n.search-result:hover { border-color: var(--accent-dim); }\n.hidden { display: none !important; }\n.breadcrumbs a { color: var(--muted); }\n.breadcrumbs a:hover { color: var(--accent-strong); }\n.section-link { font-size: 0.92rem; }\n.prose p { line-height: 1.55; }\n.idea-summary { white-space: normal; }\n.idea-ref {\n display: inline;\n padding: 0.05em 0.35em;\n margin: 0 0.05em;\n border-radius: 0.3em;\n border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--line));\n background: color-mix(in srgb, var(--accent) 14%, var(--bg-raised));\n color: var(--accent-strong);\n font-weight: 600;\n text-decoration: none;\n white-space: nowrap;\n}\na.idea-ref:hover {\n color: var(--fg);\n border-color: var(--accent);\n background: color-mix(in srgb, var(--accent) 22%, var(--bg-raised));\n}\n.idea-ref--file {\n border-color: color-mix(in srgb, var(--rust) 40%, var(--line));\n background: color-mix(in srgb, var(--rust) 16%, var(--bg-raised));\n color: #e8a07a;\n}\na.idea-ref--file:hover {\n color: var(--fg);\n border-color: var(--rust);\n}\n.idea-ref--unresolved {\n border-style: dashed;\n border-color: color-mix(in srgb, var(--warn) 45%, var(--line));\n background: color-mix(in srgb, var(--warn) 10%, var(--bg-raised));\n color: var(--warn);\n font-weight: 500;\n}\npre.code-like {\n white-space: pre-wrap; padding: 0.9rem; border-radius: 8px;\n background: var(--bg); border: 1px solid var(--line);\n}\n@media (max-width: 900px) {\n .hero, .topbar-inner { grid-template-columns: 1fr; }\n}\n@media print {\n :root { color-scheme: light; }\n body { background: white; color: black; }\n .topbar, .searchbar, .toolbar .actions, .graph-shell .toolbar, .column-filter-row, .table-filter-toggle, .table-filter-actions, .hide-on-print { display: none !important; }\n .sort-button { cursor: default; }\n .panel, .metric, .card, .table-shell, .graph-shell, .print-card, .search-result, .entity-card {\n background: white; color: black; border-color: #cbd5e1; box-shadow: none;\n }\n .scroll-window {\n max-height: none !important;\n overflow: visible !important;\n border: none !important;\n background: transparent !important;\n }\n .scroll-window thead th {\n position: static !important;\n box-shadow: none !important;\n }\n a { color: black; text-decoration: underline; }\n .print-break-avoid { break-inside: avoid; }\n}\n";
|
|
1
|
+
export declare const SHARED_STYLES = "\n:root {\n color-scheme: dark;\n --bg: #14100e;\n --bg-elev: #1f1815;\n --bg-soft: #1f1815;\n --bg-raised: #2a211d;\n --fg: #ebe4de;\n --muted: #a89488;\n --faint: #6e5f56;\n --line: #3d2f28;\n --accent: #07a0e5;\n --accent-strong: #0bbefb;\n --accent-dim: #0371c1;\n --rust: #b85c38;\n --rust-muted: #8a4530;\n --good: #4ade80;\n --warn: #fbbf24;\n --bad: #fb7185;\n font-family: Inter, system-ui, sans-serif;\n}\n* { box-sizing: border-box; }\nhtml {\n /* Keep fragment targets below the sticky .topbar (nav + padding \u2248 4.5\u20135rem). */\n scroll-padding-top: 5.5rem;\n}\nbody {\n margin: 0;\n background: var(--bg);\n color: var(--fg);\n line-height: 1.55;\n}\na { color: var(--accent-strong); text-decoration: none; }\na:hover { color: var(--accent); }\nmain.layout {\n max-width: 1360px; margin: 0 auto; padding: 1.5rem;\n display: flex; flex-direction: column; gap: 1.5rem;\n}\n.topbar {\n position: sticky; top: 0; z-index: 10;\n background: var(--bg-elev); border-bottom: 1px solid var(--line); margin: 0 -1.5rem;\n padding: 0.9rem 1.5rem;\n}\n.topbar-inner, .hero, .split, .grid, .detail-grid { display: grid; gap: 1.5rem; }\n.topbar-inner { grid-template-columns: 1.3fr auto; align-items: center; }\n.nav { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; }\n.nav a {\n padding: 0.45rem 0.75rem; border-radius: 8px;\n background: var(--bg-raised); color: var(--muted); border: 1px solid var(--line);\n}\n.nav a:hover { color: var(--fg); border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); }\n.nav a.active {\n background: color-mix(in srgb, var(--rust) 28%, var(--bg-raised));\n color: var(--fg); border-color: var(--rust);\n}\n.nav a.brand-link {\n background: transparent;\n border-color: transparent;\n color: var(--fg);\n font-weight: 650;\n letter-spacing: 0.02em;\n padding-left: 0.15rem;\n padding-right: 0.9rem;\n}\n.nav a.brand-link:hover {\n color: var(--accent);\n border-color: transparent;\n background: transparent;\n}\n.hero { grid-template-columns: 2fr 1fr; }\n.grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 140px), 1fr));\n gap: 1.5rem;\n row-gap: 1.5rem;\n column-gap: 1.5rem;\n}\n.split, .detail-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));\n gap: 1.5rem;\n}\n.panel, .metric, .card, .table-shell, .graph-shell, .print-card, .search-result {\n background: var(--bg-raised);\n border: 1px solid var(--line);\n border-radius: 10px;\n}\n.panel, .card, .table-shell, .graph-shell, .print-card, .search-result { padding: 1rem 1.1rem; }\n.metric { padding: 0; overflow: hidden; }\n.metric-link, .metric > span, .metric > strong {\n display: flex; flex-direction: column; gap: 0.35rem; padding: 1rem; color: inherit;\n}\n.metric-link:hover { background: color-mix(in srgb, var(--accent) 10%, var(--bg-raised)); }\n.metric-label, .subtle, .eyebrow, .breadcrumbs { color: var(--muted); }\n.metric-value { font-size: 1.75rem; color: var(--accent-strong); }\n.eyebrow { text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.75rem; color: var(--rust); }\n.page-header { display: grid; gap: 0.55rem; }\n.page-header h1 { margin: 0; }\n.page-header .eyebrow { margin: 0; }\n.page-header .subtle { margin: 0; }\n.toolbar {\n display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; justify-content: space-between;\n margin-bottom: 0.9rem;\n}\n.toolbar .actions, .pill-row, .breadcrumbs { display: flex; gap: 0.75rem; row-gap: 0.85rem; flex-wrap: wrap; align-items: center; }\n.chip, .pill {\n display: inline-flex; align-items: center; gap: 0.35rem;\n padding: 0.28rem 0.6rem; border-radius: 8px;\n border: 1px solid var(--line); background: var(--bg); color: var(--muted);\n}\na.pill:hover { color: var(--accent-strong); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.graph-controls-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.65rem;\n align-items: center;\n margin-bottom: 0.9rem;\n padding: 0.8rem;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg);\n}\n.graph-shell > .pill-row { margin-bottom: 0.9rem; }\n.graph-filter {\n flex: 1 1 180px;\n min-width: 160px;\n}\n.scd {\n position: relative;\n flex: 1 1 180px;\n min-width: 160px;\n}\n.scd-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.55rem;\n width: 100%;\n min-height: 2.35rem;\n padding: 0.4rem 0.75rem;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: var(--bg-soft);\n color: var(--fg);\n font: inherit;\n cursor: pointer;\n text-align: left;\n}\n.scd.is-open .scd-trigger,\n.scd-trigger:hover {\n border-color: var(--accent-dim);\n}\n.scd.has-selection .scd-trigger {\n border-color: color-mix(in srgb, var(--accent) 45%, var(--line));\n}\n.scd.is-searching .scd-trigger {\n border-color: var(--line);\n}\n.scd.is-loading .scd-trigger {\n opacity: 0.72;\n}\n.scd-trigger-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.scd-chevron {\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 5px solid currentColor;\n opacity: 0.7;\n flex: 0 0 auto;\n}\n.scd.is-open .scd-chevron { transform: rotate(180deg); }\n.scd-panel {\n position: absolute;\n z-index: 50;\n top: calc(100% + 0.35rem);\n left: 0;\n right: auto;\n width: max(100%, 15rem);\n max-width: min(20rem, 80vw);\n max-height: 18rem;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg-elev);\n box-shadow: 0 16px 40px rgba(0, 0, 0, 0.35);\n overflow: hidden;\n}\n/* Author display:flex overrides the UA [hidden] rule; keep closed panels invisible. */\n.scd-panel[hidden] {\n display: none;\n}\n.scd-search-row {\n display: flex;\n gap: 0.45rem;\n padding: 0.65rem;\n border-bottom: 1px solid var(--line);\n opacity: 0.72;\n}\n.scd-search-row.is-active { opacity: 1; }\n.scd-search {\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.55rem;\n border: 1px solid transparent;\n border-radius: 6px;\n background: color-mix(in srgb, var(--bg) 88%, transparent);\n color: var(--muted);\n font: inherit;\n}\n.scd.is-searching .scd-search,\n.scd-search:focus {\n border-color: var(--accent-dim);\n background: var(--bg);\n color: var(--fg);\n outline: none;\n}\n.scd-clear {\n border: none;\n background: transparent;\n color: var(--accent-strong);\n font: inherit;\n cursor: pointer;\n}\n.scd-list {\n overflow: auto;\n padding: 0.25rem 0 0.55rem;\n}\n.scd-group-label {\n padding: 0.55rem 0.85rem 0.25rem;\n font-size: 0.72rem;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--muted);\n}\n.scd-option {\n display: flex;\n align-items: center;\n gap: 0.55rem;\n padding: 0.45rem 0.85rem;\n cursor: pointer;\n color: var(--fg);\n}\n.scd-option:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); }\n.scd-option input { margin: 0; }\n.scd-option-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.scd-option-count {\n flex: 0 0 auto;\n font-variant-numeric: tabular-nums;\n font-size: 0.85em;\n color: var(--muted);\n opacity: 0.65;\n}\n.scd-option.is-special .scd-option-label { font-style: italic; }\n.scd-option.is-not-present .scd-option-label { color: var(--faint); }\n.scd-option.is-empty .scd-option-label { color: var(--accent-strong); }\n.scd-option.is-unspecified .scd-option-label { color: var(--rust-muted); }\n.scd-empty {\n margin: 0;\n padding: 0.85rem;\n color: var(--muted);\n font-size: 0.9rem;\n}\n.rollup-list .rollup-special dt {\n font-style: italic;\n}\n.rollup-list .rollup-not-present dt {\n color: var(--faint);\n}\n.rollup-list .rollup-empty dt {\n color: var(--accent-strong);\n}\n.rollup-list .rollup-unspecified dt {\n color: var(--rust-muted);\n}\n.graph-action {\n border: 1px solid var(--line);\n background: var(--bg-soft);\n color: var(--fg);\n border-radius: 8px;\n padding: 0.7rem 0.9rem;\n cursor: pointer;\n}\n.graph-action:hover { border-color: var(--accent-dim); color: var(--accent-strong); }\n.graph-action.is-active {\n background: color-mix(in srgb, var(--rust) 28%, var(--bg-soft));\n border-color: var(--rust);\n color: var(--fg);\n}\n.graph-status {\n color: var(--muted);\n font-size: 0.92rem;\n margin-left: auto;\n}\n.searchbar, select, input[type=\"search\"] {\n width: min(100%, 440px); background: var(--bg); color: var(--fg);\n border: 1px solid var(--line); border-radius: 8px; padding: 0.75rem 0.9rem;\n}\n.searchbar:focus, select:focus, input[type=\"search\"]:focus {\n outline: none;\n border-color: var(--accent);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 25%, transparent);\n}\ntable { width: 100%; border-collapse: collapse; }\nth, td {\n padding: 0.75rem 0.65rem; text-align: left; border-bottom: 1px solid var(--line); vertical-align: top;\n}\nth { color: var(--muted); font-size: 0.94rem; }\ntbody tr:hover { background: var(--bg-raised); }\n.table-shell { overflow-x: auto; }\n.scroll-window {\n --scroll-window-max: min(28rem, 50vh);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window {\n max-height: var(--scroll-window-max);\n overflow: auto;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: var(--bg);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window > table {\n margin: 0;\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window .entity-list,\nbody[data-runtime-mode=\"interactive\"] .scroll-window .rollup-list {\n padding: 0.75rem;\n}\n.sortable-th { padding: 0.45rem 0.4rem; }\n.sort-button {\n display: inline-flex; align-items: center; gap: 0.35rem;\n width: 100%; margin: 0; padding: 0.3rem 0.25rem;\n border: 0; background: transparent; color: inherit;\n font: inherit; text-align: left; cursor: pointer;\n}\n.sort-button:hover { color: var(--fg); }\n.sort-button.sort-active { color: var(--accent-strong); }\n.sort-indicator { color: var(--faint); font-size: 0.8em; min-width: 1em; }\n.sort-button.sort-active .sort-indicator { color: var(--accent-strong); }\n.table-filter-toggle {\n display: inline-flex; align-items: center; justify-content: center;\n width: 2.25rem; height: 2.25rem; padding: 0;\n border: 1px solid var(--line); border-radius: 8px;\n background: var(--bg-raised); color: var(--muted); cursor: pointer;\n}\n.table-filter-toggle:hover { color: var(--fg); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.table-filter-toggle.is-active {\n color: var(--fg);\n border-color: var(--accent);\n background: color-mix(in srgb, var(--accent) 18%, var(--bg-raised));\n}\n.table-filter-toggle.has-filters:not(.is-active) {\n color: var(--accent-strong);\n border-color: color-mix(in srgb, var(--accent) 45%, var(--line));\n}\n.table-filter-toggle svg { width: 1rem; height: 1rem; display: block; }\n.table-filter-actions {\n display: flex; justify-content: flex-end; gap: 0.55rem;\n margin-bottom: 0.65rem;\n}\n.column-filter-row { display: none; }\n.column-filter-row.is-open { display: table-row; }\n.column-filter-row th {\n padding: 0.35rem 0.4rem 0.75rem; border-bottom: 1px solid var(--line); font-weight: 400;\n}\n.column-filter {\n width: 100%; min-width: 4.5rem; background: var(--bg); color: var(--fg);\n border: 1px solid var(--line); border-radius: 6px; padding: 0.4rem 0.55rem; font-size: 0.85rem;\n}\n.column-filter:focus {\n outline: none;\n border-color: var(--accent);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 25%, transparent);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window thead tr:first-child th {\n position: sticky;\n top: 0;\n z-index: 2;\n background: var(--bg-raised);\n box-shadow: 0 1px 0 var(--line);\n}\nbody[data-runtime-mode=\"interactive\"] .scroll-window thead .column-filter-row.is-open th {\n position: sticky;\n top: 2.65rem;\n z-index: 1;\n background: var(--bg-raised);\n box-shadow: 0 1px 0 var(--line);\n}\n.entity-list {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 1.5rem;\n}\n.entity-card {\n border: 1px solid var(--line); border-radius: 10px; padding: 0.9rem 1rem; background: var(--bg);\n color: inherit;\n min-width: 0;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.entity-card:hover { border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }\n.entity-card h3, .entity-card p { margin: 0; }\n.entity-card p + p, .entity-card strong + p, .entity-card h3 + p { margin-top: 0.35rem; }\n.print-card {\n min-width: 0;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n scroll-margin-top: 5.5rem;\n}\n.print-card > h3 { overflow-wrap: anywhere; }\n.print-attrs {\n display: grid;\n gap: 0.45rem;\n margin: 0.75rem 0 0;\n}\n.print-attrs div {\n display: grid;\n grid-template-columns: minmax(0, 8rem) minmax(0, 1fr);\n gap: 0.65rem;\n border-bottom: 1px solid var(--line);\n padding-bottom: 0.35rem;\n}\n.print-attrs dt {\n margin: 0;\n color: var(--muted);\n font-weight: 600;\n overflow-wrap: anywhere;\n}\n.print-attrs dd {\n margin: 0;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.print-button {\n appearance: none;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: color-mix(in srgb, var(--accent) 18%, var(--bg-raised));\n color: var(--fg);\n font: inherit;\n font-weight: 600;\n padding: 0.45rem 0.9rem;\n cursor: pointer;\n}\n.print-button:hover {\n border-color: color-mix(in srgb, var(--accent) 45%, var(--line));\n background: color-mix(in srgb, var(--accent) 28%, var(--bg-raised));\n}\n.panel > h2, .table-shell > h2, .graph-shell > h2, .print-card > h3 { margin-top: 0; margin-bottom: 0.75rem; }\n.toolbar h2 { margin: 0; }\n.rollup-list { display: grid; gap: 0.5rem; }\n.rollup-list div {\n display: flex; justify-content: space-between; gap: 1rem; border-bottom: 1px solid var(--line); padding-bottom: 0.4rem;\n}\n.rollup-list dd { margin: 0; }\n.rollup-list a.rollup-link {\n color: inherit;\n text-decoration: none;\n}\n.rollup-list a.rollup-link:hover {\n color: var(--accent);\n text-decoration: underline;\n}\n.distribution-track {\n height: 0.7rem;\n min-width: 6rem;\n border-radius: 999px;\n background: var(--bg);\n border: 1px solid var(--line);\n overflow: hidden;\n}\n.distribution-fill {\n display: block;\n height: 100%;\n border-radius: inherit;\n background: linear-gradient(90deg, var(--accent-dim), var(--accent-strong));\n min-width: 0;\n}\n.graph-root {\n position: relative;\n min-height: 620px;\n}\n.graph-root.is-booting {\n display: grid;\n place-items: center;\n border: 1px solid var(--line);\n border-radius: 10px;\n background: var(--bg);\n}\n.graph-boot {\n display: grid;\n justify-items: center;\n gap: 0.75rem;\n padding: 1.5rem;\n text-align: center;\n color: var(--muted);\n}\n.graph-boot p { margin: 0; }\n.graph-boot-spinner {\n width: 1.35rem;\n height: 1.35rem;\n border: 2px solid color-mix(in srgb, var(--muted) 35%, transparent);\n border-top-color: var(--accent-strong);\n border-radius: 50%;\n animation: graph-boot-spin 0.7s linear infinite;\n}\n@keyframes graph-boot-spin {\n to { transform: rotate(360deg); }\n}\n.graph-root canvas {\n display: block;\n width: 100%;\n min-height: 620px;\n background: var(--bg);\n border-radius: 10px;\n border: 1px solid var(--line);\n touch-action: none;\n cursor: grab;\n}\n.graph-root canvas.is-panning { cursor: grabbing; }\n.graph-root canvas.is-dragging-node { cursor: pointer; }\n.search-results { display: grid; gap: 0.7rem; margin-top: 1rem; }\n.search-result:hover { border-color: var(--accent-dim); }\n.hidden { display: none !important; }\n.breadcrumbs a { color: var(--muted); }\n.breadcrumbs a:hover { color: var(--accent-strong); }\n.section-link { font-size: 0.92rem; }\n.prose p { line-height: 1.55; }\n.idea-summary { white-space: normal; }\n.idea-ref {\n display: inline;\n padding: 0.05em 0.35em;\n margin: 0 0.05em;\n border-radius: 0.3em;\n border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--line));\n background: color-mix(in srgb, var(--accent) 14%, var(--bg-raised));\n color: var(--accent-strong);\n font-weight: 600;\n text-decoration: none;\n white-space: normal;\n overflow-wrap: anywhere;\n}\na.idea-ref:hover {\n color: var(--fg);\n border-color: var(--accent);\n background: color-mix(in srgb, var(--accent) 22%, var(--bg-raised));\n}\n.idea-ref--file {\n border-color: color-mix(in srgb, var(--rust) 40%, var(--line));\n background: color-mix(in srgb, var(--rust) 16%, var(--bg-raised));\n color: #e8a07a;\n}\na.idea-ref--file:hover {\n color: var(--fg);\n border-color: var(--rust);\n}\n.idea-ref--unresolved {\n border-style: dashed;\n border-color: color-mix(in srgb, var(--warn) 45%, var(--line));\n background: color-mix(in srgb, var(--warn) 10%, var(--bg-raised));\n color: var(--warn);\n font-weight: 500;\n}\npre.code-like {\n white-space: pre-wrap; padding: 0.9rem; border-radius: 8px;\n background: var(--bg); border: 1px solid var(--line);\n}\n@media (max-width: 900px) {\n .hero, .topbar-inner { grid-template-columns: 1fr; }\n}\n@media (max-width: 520px) {\n .print-attrs div { grid-template-columns: 1fr; }\n}\n@media print {\n :root { color-scheme: light; }\n body { background: white; color: black; }\n .topbar, .searchbar, .toolbar .actions, .graph-shell .toolbar, .column-filter-row, .table-filter-toggle, .table-filter-actions, .hide-on-print { display: none !important; }\n .sort-button { cursor: default; }\n .panel, .metric, .card, .table-shell, .graph-shell, .print-card, .search-result, .entity-card {\n background: white; color: black; border-color: #cbd5e1; box-shadow: none;\n }\n .scroll-window {\n max-height: none !important;\n overflow: visible !important;\n border: none !important;\n background: transparent !important;\n }\n .scroll-window thead th {\n position: static !important;\n box-shadow: none !important;\n }\n a { color: black; text-decoration: underline; }\n .print-break-avoid { break-inside: avoid; }\n}\n";
|
|
2
2
|
export declare const APP_JS: string;
|
|
3
3
|
export declare function buildSearchIndexScript(documents: unknown): string;
|
|
@@ -31,6 +31,10 @@ export const SHARED_STYLES = `
|
|
|
31
31
|
font-family: Inter, system-ui, sans-serif;
|
|
32
32
|
}
|
|
33
33
|
* { box-sizing: border-box; }
|
|
34
|
+
html {
|
|
35
|
+
/* Keep fragment targets below the sticky .topbar (nav + padding ≈ 4.5–5rem). */
|
|
36
|
+
scroll-padding-top: 5.5rem;
|
|
37
|
+
}
|
|
34
38
|
body {
|
|
35
39
|
margin: 0;
|
|
36
40
|
background: var(--bg);
|
|
@@ -403,14 +407,68 @@ body[data-runtime-mode="interactive"] .scroll-window thead .column-filter-row.is
|
|
|
403
407
|
background: var(--bg-raised);
|
|
404
408
|
box-shadow: 0 1px 0 var(--line);
|
|
405
409
|
}
|
|
406
|
-
.entity-list {
|
|
410
|
+
.entity-list {
|
|
411
|
+
display: grid;
|
|
412
|
+
grid-template-columns: minmax(0, 1fr);
|
|
413
|
+
gap: 1.5rem;
|
|
414
|
+
}
|
|
407
415
|
.entity-card {
|
|
408
416
|
border: 1px solid var(--line); border-radius: 10px; padding: 0.9rem 1rem; background: var(--bg);
|
|
409
417
|
color: inherit;
|
|
418
|
+
min-width: 0;
|
|
419
|
+
max-width: 100%;
|
|
420
|
+
overflow-wrap: anywhere;
|
|
421
|
+
word-break: break-word;
|
|
410
422
|
}
|
|
411
423
|
.entity-card:hover { border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }
|
|
412
424
|
.entity-card h3, .entity-card p { margin: 0; }
|
|
413
425
|
.entity-card p + p, .entity-card strong + p, .entity-card h3 + p { margin-top: 0.35rem; }
|
|
426
|
+
.print-card {
|
|
427
|
+
min-width: 0;
|
|
428
|
+
max-width: 100%;
|
|
429
|
+
overflow-wrap: anywhere;
|
|
430
|
+
word-break: break-word;
|
|
431
|
+
scroll-margin-top: 5.5rem;
|
|
432
|
+
}
|
|
433
|
+
.print-card > h3 { overflow-wrap: anywhere; }
|
|
434
|
+
.print-attrs {
|
|
435
|
+
display: grid;
|
|
436
|
+
gap: 0.45rem;
|
|
437
|
+
margin: 0.75rem 0 0;
|
|
438
|
+
}
|
|
439
|
+
.print-attrs div {
|
|
440
|
+
display: grid;
|
|
441
|
+
grid-template-columns: minmax(0, 8rem) minmax(0, 1fr);
|
|
442
|
+
gap: 0.65rem;
|
|
443
|
+
border-bottom: 1px solid var(--line);
|
|
444
|
+
padding-bottom: 0.35rem;
|
|
445
|
+
}
|
|
446
|
+
.print-attrs dt {
|
|
447
|
+
margin: 0;
|
|
448
|
+
color: var(--muted);
|
|
449
|
+
font-weight: 600;
|
|
450
|
+
overflow-wrap: anywhere;
|
|
451
|
+
}
|
|
452
|
+
.print-attrs dd {
|
|
453
|
+
margin: 0;
|
|
454
|
+
overflow-wrap: anywhere;
|
|
455
|
+
word-break: break-word;
|
|
456
|
+
}
|
|
457
|
+
.print-button {
|
|
458
|
+
appearance: none;
|
|
459
|
+
border: 1px solid var(--line);
|
|
460
|
+
border-radius: 8px;
|
|
461
|
+
background: color-mix(in srgb, var(--accent) 18%, var(--bg-raised));
|
|
462
|
+
color: var(--fg);
|
|
463
|
+
font: inherit;
|
|
464
|
+
font-weight: 600;
|
|
465
|
+
padding: 0.45rem 0.9rem;
|
|
466
|
+
cursor: pointer;
|
|
467
|
+
}
|
|
468
|
+
.print-button:hover {
|
|
469
|
+
border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
|
|
470
|
+
background: color-mix(in srgb, var(--accent) 28%, var(--bg-raised));
|
|
471
|
+
}
|
|
414
472
|
.panel > h2, .table-shell > h2, .graph-shell > h2, .print-card > h3 { margin-top: 0; margin-bottom: 0.75rem; }
|
|
415
473
|
.toolbar h2 { margin: 0; }
|
|
416
474
|
.rollup-list { display: grid; gap: 0.5rem; }
|
|
@@ -418,6 +476,14 @@ body[data-runtime-mode="interactive"] .scroll-window thead .column-filter-row.is
|
|
|
418
476
|
display: flex; justify-content: space-between; gap: 1rem; border-bottom: 1px solid var(--line); padding-bottom: 0.4rem;
|
|
419
477
|
}
|
|
420
478
|
.rollup-list dd { margin: 0; }
|
|
479
|
+
.rollup-list a.rollup-link {
|
|
480
|
+
color: inherit;
|
|
481
|
+
text-decoration: none;
|
|
482
|
+
}
|
|
483
|
+
.rollup-list a.rollup-link:hover {
|
|
484
|
+
color: var(--accent);
|
|
485
|
+
text-decoration: underline;
|
|
486
|
+
}
|
|
421
487
|
.distribution-track {
|
|
422
488
|
height: 0.7rem;
|
|
423
489
|
min-width: 6rem;
|
|
@@ -494,7 +560,8 @@ body[data-runtime-mode="interactive"] .scroll-window thead .column-filter-row.is
|
|
|
494
560
|
color: var(--accent-strong);
|
|
495
561
|
font-weight: 600;
|
|
496
562
|
text-decoration: none;
|
|
497
|
-
white-space:
|
|
563
|
+
white-space: normal;
|
|
564
|
+
overflow-wrap: anywhere;
|
|
498
565
|
}
|
|
499
566
|
a.idea-ref:hover {
|
|
500
567
|
color: var(--fg);
|
|
@@ -524,6 +591,9 @@ pre.code-like {
|
|
|
524
591
|
@media (max-width: 900px) {
|
|
525
592
|
.hero, .topbar-inner { grid-template-columns: 1fr; }
|
|
526
593
|
}
|
|
594
|
+
@media (max-width: 520px) {
|
|
595
|
+
.print-attrs div { grid-template-columns: 1fr; }
|
|
596
|
+
}
|
|
527
597
|
@media print {
|
|
528
598
|
:root { color-scheme: light; }
|
|
529
599
|
body { background: white; color: black; }
|
|
@@ -957,6 +1027,7 @@ function ensureTableFilterToggle(table, filterRow, filterInputs, syncToggleState
|
|
|
957
1027
|
function wireTables(root) {
|
|
958
1028
|
const tables = root.querySelectorAll('table');
|
|
959
1029
|
const tableControllers = [];
|
|
1030
|
+
const params = new URLSearchParams(typeof location !== 'undefined' ? location.search : '');
|
|
960
1031
|
|
|
961
1032
|
for (const table of tables) {
|
|
962
1033
|
const thead = table.tHead;
|
|
@@ -1006,8 +1077,12 @@ function wireTables(root) {
|
|
|
1006
1077
|
|
|
1007
1078
|
headers.forEach((th, index) => {
|
|
1008
1079
|
const label = String(th.textContent || '').trim() || \`Column \${index + 1}\`;
|
|
1080
|
+
const filterKey = String(th.getAttribute('data-filter-key') || '').trim();
|
|
1009
1081
|
th.classList.add('sortable-th');
|
|
1010
1082
|
th.replaceChildren();
|
|
1083
|
+
if (filterKey) {
|
|
1084
|
+
th.setAttribute('data-filter-key', filterKey);
|
|
1085
|
+
}
|
|
1011
1086
|
const button = document.createElement('button');
|
|
1012
1087
|
button.type = 'button';
|
|
1013
1088
|
button.className = 'sort-button';
|
|
@@ -1053,12 +1128,16 @@ function wireTables(root) {
|
|
|
1053
1128
|
filterRow.className = 'column-filter-row';
|
|
1054
1129
|
headers.forEach((th, index) => {
|
|
1055
1130
|
const label = String(th.querySelector('.sort-button span')?.textContent || \`Column \${index + 1}\`);
|
|
1131
|
+
const filterKey = String(th.getAttribute('data-filter-key') || '').trim().toLowerCase();
|
|
1056
1132
|
const cell = document.createElement('th');
|
|
1057
1133
|
const input = document.createElement('input');
|
|
1058
1134
|
input.type = 'search';
|
|
1059
1135
|
input.className = 'column-filter';
|
|
1060
1136
|
input.placeholder = 'Filter…';
|
|
1061
1137
|
input.dataset.colFilter = String(index);
|
|
1138
|
+
if (filterKey) {
|
|
1139
|
+
input.dataset.filterKey = filterKey;
|
|
1140
|
+
}
|
|
1062
1141
|
input.setAttribute('aria-label', \`Filter \${label}\`);
|
|
1063
1142
|
input.addEventListener('input', () => controller.applyFilters());
|
|
1064
1143
|
filterInputs.push(input);
|
|
@@ -1068,6 +1147,32 @@ function wireTables(root) {
|
|
|
1068
1147
|
thead.appendChild(filterRow);
|
|
1069
1148
|
filterToggle = ensureTableFilterToggle(table, filterRow, filterInputs, syncToggleState);
|
|
1070
1149
|
tableControllers.push(controller);
|
|
1150
|
+
|
|
1151
|
+
let seeded = false;
|
|
1152
|
+
for (const input of filterInputs) {
|
|
1153
|
+
const key = String(input.dataset.filterKey || '').trim().toLowerCase();
|
|
1154
|
+
if (!key) continue;
|
|
1155
|
+
const aliases = [key];
|
|
1156
|
+
if (key === 'tags') aliases.push('tag');
|
|
1157
|
+
if (key === 'status') aliases.push('statuses');
|
|
1158
|
+
if (key === 'cluster') aliases.push('label');
|
|
1159
|
+
let value = '';
|
|
1160
|
+
for (const alias of aliases) {
|
|
1161
|
+
if (params.has(alias)) {
|
|
1162
|
+
value = params.get(alias) || '';
|
|
1163
|
+
break;
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
if (!value) continue;
|
|
1167
|
+
input.value = value;
|
|
1168
|
+
seeded = true;
|
|
1169
|
+
}
|
|
1170
|
+
if (seeded) {
|
|
1171
|
+
filterRow.classList.add('is-open');
|
|
1172
|
+
filterToggle.classList.add('is-active', 'has-filters');
|
|
1173
|
+
filterToggle.setAttribute('aria-expanded', 'true');
|
|
1174
|
+
controller.applyFilters();
|
|
1175
|
+
}
|
|
1071
1176
|
}
|
|
1072
1177
|
|
|
1073
1178
|
const inputs = root.querySelectorAll('[data-filter-input]');
|
|
@@ -1122,6 +1227,7 @@ function wireGraph(root) {
|
|
|
1122
1227
|
const tagHost = controls.querySelector('[data-graph-tag-scd]');
|
|
1123
1228
|
const toggleExternal = controls.querySelector('[data-graph-toggle-external]');
|
|
1124
1229
|
const toggleIdeasets = controls.querySelector('[data-graph-toggle-ideasets]');
|
|
1230
|
+
const toggleWildcard = controls.querySelector('[data-graph-toggle-wildcard]');
|
|
1125
1231
|
const toggleLabels = controls.querySelector('[data-graph-toggle-labels]');
|
|
1126
1232
|
const togglePhysics = controls.querySelector('[data-graph-toggle-physics]');
|
|
1127
1233
|
const fitButton = controls.querySelector('[data-graph-fit]');
|
|
@@ -1131,6 +1237,7 @@ function wireGraph(root) {
|
|
|
1131
1237
|
element.classList.add('is-booting');
|
|
1132
1238
|
let hideExternal = false;
|
|
1133
1239
|
let hideIdeasets = false;
|
|
1240
|
+
let includeWildcardRefs = true;
|
|
1134
1241
|
let labelMode = 'auto';
|
|
1135
1242
|
let statusSelected = [];
|
|
1136
1243
|
let tagSelected = [];
|
|
@@ -1399,11 +1506,14 @@ function wireGraph(root) {
|
|
|
1399
1506
|
const source = positions.get(edge.sourceId);
|
|
1400
1507
|
const target = positions.get(edge.targetId);
|
|
1401
1508
|
if (!source || !target) continue;
|
|
1509
|
+
const isWildcard = edge.kind === 'wildcard_reference';
|
|
1510
|
+
ctx.setLineDash(isWildcard ? [2 / scale, 3.5 / scale] : []);
|
|
1402
1511
|
ctx.beginPath();
|
|
1403
1512
|
ctx.moveTo(source.x, source.y);
|
|
1404
1513
|
ctx.lineTo(target.x, target.y);
|
|
1405
1514
|
ctx.stroke();
|
|
1406
1515
|
}
|
|
1516
|
+
ctx.setLineDash([]);
|
|
1407
1517
|
ctx.globalAlpha = 1;
|
|
1408
1518
|
|
|
1409
1519
|
pulsePhase = (pulsePhase + 0.035) % (Math.PI * 2);
|
|
@@ -1715,9 +1825,11 @@ function wireGraph(root) {
|
|
|
1715
1825
|
function refresh() {
|
|
1716
1826
|
const visibleNodes = (graph.nodes || []).filter(matches);
|
|
1717
1827
|
const visibleIds = new Set(visibleNodes.map(node => node.id));
|
|
1718
|
-
const visibleEdges = (graph.edges || []).filter(edge =>
|
|
1719
|
-
visibleIds.has(edge.sourceId)
|
|
1720
|
-
|
|
1828
|
+
const visibleEdges = (graph.edges || []).filter(edge => {
|
|
1829
|
+
if (!visibleIds.has(edge.sourceId) || !visibleIds.has(edge.targetId)) return false;
|
|
1830
|
+
if (!includeWildcardRefs && edge.kind === 'wildcard_reference') return false;
|
|
1831
|
+
return true;
|
|
1832
|
+
});
|
|
1721
1833
|
mountGraph(visibleNodes, visibleEdges);
|
|
1722
1834
|
}
|
|
1723
1835
|
|
|
@@ -1737,6 +1849,12 @@ function wireGraph(root) {
|
|
|
1737
1849
|
toggleIdeasets.textContent = hideIdeasets ? 'Show ideasets' : 'Hide ideasets';
|
|
1738
1850
|
refresh();
|
|
1739
1851
|
});
|
|
1852
|
+
toggleWildcard?.addEventListener('click', () => {
|
|
1853
|
+
includeWildcardRefs = !includeWildcardRefs;
|
|
1854
|
+
toggleWildcard.classList.toggle('is-active', includeWildcardRefs);
|
|
1855
|
+
toggleWildcard.setAttribute('aria-pressed', includeWildcardRefs ? 'true' : 'false');
|
|
1856
|
+
refresh();
|
|
1857
|
+
});
|
|
1740
1858
|
toggleLabels?.addEventListener('click', () => {
|
|
1741
1859
|
const index = GRAPH_LABEL_MODES.indexOf(labelMode);
|
|
1742
1860
|
labelMode = GRAPH_LABEL_MODES[(index + 1) % GRAPH_LABEL_MODES.length];
|
|
@@ -1767,9 +1885,12 @@ function wireGraph(root) {
|
|
|
1767
1885
|
tagFilter.clear();
|
|
1768
1886
|
hideExternal = false;
|
|
1769
1887
|
hideIdeasets = false;
|
|
1888
|
+
includeWildcardRefs = true;
|
|
1770
1889
|
labelMode = 'auto';
|
|
1771
1890
|
toggleExternal?.classList.remove('is-active');
|
|
1772
1891
|
toggleIdeasets?.classList.remove('is-active');
|
|
1892
|
+
toggleWildcard?.classList.add('is-active');
|
|
1893
|
+
toggleWildcard?.setAttribute('aria-pressed', 'true');
|
|
1773
1894
|
syncLabelsButton();
|
|
1774
1895
|
if (toggleExternal) toggleExternal.textContent = 'Hide external';
|
|
1775
1896
|
if (toggleIdeasets) toggleIdeasets.textContent = 'Hide ideasets';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-export-assets.js","sourceRoot":"","sources":["../../src/export/html-export-assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAE9E;;;;;;GAMG;AACH,SAAS,sBAAsB;IAC3B,OAAO,2BAA2B,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"html-export-assets.js","sourceRoot":"","sources":["../../src/export/html-export-assets.ts"],"names":[],"mappings":"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"}
|