@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.
Files changed (73) hide show
  1. package/README.md +27 -0
  2. package/out/analysis/fuzzy-search-analyser.d.ts +17 -0
  3. package/out/analysis/fuzzy-search-analyser.js +25 -0
  4. package/out/analysis/fuzzy-search-analyser.js.map +1 -0
  5. package/out/analysis/fuzzy-search-worker-client.d.ts +39 -0
  6. package/out/analysis/fuzzy-search-worker-client.js +178 -0
  7. package/out/analysis/fuzzy-search-worker-client.js.map +1 -0
  8. package/out/analysis/fuzzy-search-worker.d.ts +32 -0
  9. package/out/analysis/fuzzy-search-worker.js +81 -0
  10. package/out/analysis/fuzzy-search-worker.js.map +1 -0
  11. package/out/analysis/fuzzy-search.d.ts +38 -0
  12. package/out/analysis/fuzzy-search.js +217 -0
  13. package/out/analysis/fuzzy-search.js.map +1 -0
  14. package/out/analysis/git-dates-analyser.js +12 -3
  15. package/out/analysis/git-dates-analyser.js.map +1 -1
  16. package/out/analysis-api.d.ts +14 -0
  17. package/out/analysis-api.js +32 -0
  18. package/out/analysis-api.js.map +1 -1
  19. package/out/core/barrel-page.d.ts +46 -0
  20. package/out/core/barrel-page.js +162 -0
  21. package/out/core/barrel-page.js.map +1 -0
  22. package/out/core/filter-specials.d.ts +2 -0
  23. package/out/core/filter-specials.js +15 -0
  24. package/out/core/filter-specials.js.map +1 -1
  25. package/out/core/types.d.ts +17 -1
  26. package/out/core/types.js +1 -0
  27. package/out/core/types.js.map +1 -1
  28. package/out/create-runtime.js +2 -0
  29. package/out/create-runtime.js.map +1 -1
  30. package/out/export/export-csv.d.ts +4 -0
  31. package/out/export/export-csv.js +13 -0
  32. package/out/export/export-csv.js.map +1 -0
  33. package/out/export/export-json.d.ts +6 -0
  34. package/out/export/export-json.js +28 -0
  35. package/out/export/export-json.js.map +1 -0
  36. package/out/export/export-markdown.d.ts +4 -0
  37. package/out/export/export-markdown.js +23 -0
  38. package/out/export/export-markdown.js.map +1 -0
  39. package/out/export/html-export-assets.d.ts +1 -1
  40. package/out/export/html-export-assets.js +126 -5
  41. package/out/export/html-export-assets.js.map +1 -1
  42. package/out/export/html-export-template.js +89 -47
  43. package/out/export/html-export-template.js.map +1 -1
  44. package/out/export/html-export-utils.d.ts +33 -3
  45. package/out/export/html-export-utils.js +108 -10
  46. package/out/export/html-export-utils.js.map +1 -1
  47. package/out/export/types.d.ts +1 -1
  48. package/out/export/write-csv-export.d.ts +5 -0
  49. package/out/export/write-csv-export.js +132 -0
  50. package/out/export/write-csv-export.js.map +1 -0
  51. package/out/export/write-json-export.d.ts +3 -0
  52. package/out/export/write-json-export.js +92 -0
  53. package/out/export/write-json-export.js.map +1 -0
  54. package/out/export/write-markdown-export.d.ts +5 -0
  55. package/out/export/write-markdown-export.js +177 -0
  56. package/out/export/write-markdown-export.js.map +1 -0
  57. package/out/index-store/idea-extractor.d.ts +6 -1
  58. package/out/index-store/idea-extractor.js +56 -11
  59. package/out/index-store/idea-extractor.js.map +1 -1
  60. package/out/index-store/sqlite-store.d.ts +16 -3
  61. package/out/index-store/sqlite-store.js +104 -8
  62. package/out/index-store/sqlite-store.js.map +1 -1
  63. package/out/index-store/webview-graph-queries.d.ts +5 -0
  64. package/out/index-store/webview-graph-queries.js +21 -4
  65. package/out/index-store/webview-graph-queries.js.map +1 -1
  66. package/out/index-store/webview-table-queries.js +1 -0
  67. package/out/index-store/webview-table-queries.js.map +1 -1
  68. package/out/index-store/workspace-index-file.js +22 -1
  69. package/out/index-store/workspace-index-file.js.map +1 -1
  70. package/out/index.d.ts +14 -1
  71. package/out/index.js +9 -1
  72. package/out/index.js.map +1 -1
  73. package/package.json +2 -2
@@ -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',
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0GH,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC7B,MAAM,oBAAoB,CAAC;AAqB5B,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACrC,SAAS;IACT,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,aAAa;CAChB,CAAC,CAAC;AAmGH,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"}
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"}
@@ -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":"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"}
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 { display: grid; gap: 1.5rem; }
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: nowrap;
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) && visibleIds.has(edge.targetId)
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":"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"}
1
+ {"version":3,"file":"html-export-assets.js","sourceRoot":"","sources":["../../src/export/html-export-assets.ts"],"names":[],"mappings":"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"}