Code reference detail
app.js
crates/reqlan-export/assets/app.js
| Idea | Status | Tags | Summary | Katz |
|---|---|---|---|---|
| html_export | done | `@reqlan/analytical` builds documentation as HTML from the requirement graph ( ["./export.rq".export_pipeline], [analysis_scope] ). Html export should render ideas, attributes, references, and navigable structure suitable for sharing. Pipeline: `NativeAnalysisApi.exportHtml` / `AnalysisRuntime.export` → `reqlan-export` snapshot ( `build_export_snapshot` ) → multi-file static site ( `write_html_export` ). Single-file mode remains optional via [html_export_runtime_modes]. Interactive graph / search JS stays bundled static assets ( [html_export_graph_layout] ), not a second writer ( ["./rust_port.rq".export_rust] ). Thin hosts: extension UI ( ["../extension/export/export.rq".export_webview], ["../extension/export/html-export.rq".html_export_form], ["../extension/export/export.rq".export_html] ) and CLI ( `reqlan export` / ["../cli/cli_package.rq".commands] ). Export is scoped to a selected ["../bases/base.rq".base] ( not a merged multi-base workspace graph ). [html_export_multi_file] [html_export_internal_links] [html_export_idea_tooltips] [html_export_layout_cards] [html_export_heading_tooltips] [html_export_table_columns] [html_export_search] [html_export_list_views] [html_export_overview_links] [html_export_idea_pages] [html_export_file_pages] [html_export_code_reference_pages] [html_export_cluster_pages] [html_export_graph_page] [html_export_attributes_index] [html_export_attribute_pages] [html_export_printable_pages] [html_export_print_idea_cards] [html_export_print_body_whitespace] [html_export_print_in_page_anchors] [html_export_print_all_attributes] [html_export_print_button] [html_export_print_order_by] [html_export_runtime_modes] [html_export_scrollable_lists] [html_export_header_link] [html_export_url_base] [html_export_katz_column] | 0.201 | |
| html_export_graph_animation | Live physics in the HTML export should match Ideas Summary animatePhysics: continuous damped semi-implicit Euler using the defaults from ["../../packages/extension/webviews/shared/graph/physics-core.js"] ( same module as ["../../packages/extension/webviews/shared/graph/graph-physics.ts"] ), inlined in ["../../crates/reqlan-export/assets/app.js"]. A Live physics toggle pauses and resumes the same simulation state ( default off ); when off, the graph batch-settles then sleeps. Batch settle must remain responsive per [html_export_graph_background_load] — yield between chunks rather than freezing the page for large graphs. Simulation should converge and sleep when calm, waking on filter changes or when Live physics is turned back on, aligned with [layout_physics]. Large graphs use a spatial grid + repulsion cutoff in the shared core; all nodes and full labels remain visible. | 0.093 | ||
| html_export_graph_background_load | done | Interactive HTML export graph boot and layout settle must not monopolise the main thread on large graphs. Page chrome ( nav, filters, search, other controls ) should stay responsive while the graph initialises. Graph wiring should start after the first paint / idle opportunity rather than synchronously blocking `DOMContentLoaded`. When Live physics is off, the initial batch settle should run in yielded chunks ( animation frames or idle callbacks ) so the browser can paint and handle input between steps; keep the boot spinner until the first usable canvas frame, then show progressive settle status. A new filter / refresh or remount must cancel any in-flight background settle before starting another. Cross-refs [html_export_graph_page], [html_export_graph_animation], [html_export_graph_interaction]. | 0.093 | |
| html_export_graph_interaction | The interactive export graph should support dragging nodes and panning or zooming the viewport, aligned with [view_controls] and [manual_reframe]. Click-through to idea pages must remain available after drag via click-versus-drag discrimination. A Fit control should reframe the viewport to the current node set without restarting layout or clearing live physics state. Zoom and Fit must continuously drive [graph_label_auto] / [html_export_graph_label_auto] opacity when Labels is in auto mode. When ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".file_treatment_toggle] is compound: file bounding boxes are hittable — drag moves member nodes together; clicking the underlined title navigates to the hosting file page ( when `hostFilePageUrl` / `pageUrl` is present ). When linked: synthetic file ideaset nodes are dragged and clicked like other leaves. Related: ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".file_treatment_toggle], ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".webview_export_graph_parity]. | 0.085 | ||
| html_export_graph_label_auto | done | Export-surface wiring for [graph_label_auto]: canvas paint applies continuous zoom opacity ( GRAPH_LABEL_FADE_START → GRAPH_LABEL_FADE_END ); hover / drag stays fully opaque. Labels stay fully invisible while the graph is initialising or batch-settling so text paint does not lag those phases; zoom fade applies only after settle completes. Zoom and Fit from [html_export_graph_interaction] / [manual_reframe] update opacity each paint. | 0.081 | |
| html_export_graph_label_modes | done | Export-surface wiring for [graph_label_modes]: Labels control on every interactive export graph cycles auto / on / off; Reset restores auto. | 0.070 | |
| html_export_graph_labels | HTML export canvas graphs implement shared [graph_labels] ( full names, no ellipsis truncation ). [html_export_graph_label_modes] [html_export_graph_label_auto] | 0.062 | ||
| html_export_graph_layout | The interactive export graph should lay out nodes so labels and circles do not heavily overlap. Initial placement should settle with the same Obsidian-style force model as [layout_physics] ( central gravity, edge springs, inverse-square repulsion ). Rendering uses canvas 2 d ( not SVG DOM ) with shared physics from ["../../packages/extension/webviews/shared/graph/physics-core.js"], inlined into the export asset ["../../crates/reqlan-export/assets/app.js"]. | 0.121 | ||
| html_export_graph_links | Graph node hrefs must resolve to idea pages from every export page depth, including nested idea, file, and cluster pages. Node urls should be export-root-relative so path segments such as ideas / are not dropped when resolving from nested pages. When [html_export_url_base] is set, runtime resolution of those urls must honour the mount prefix ( same contract as page and asset hrefs ). External file nodes should resolve to [html_export_file_pages] or [html_export_code_reference_pages] when those page families are enabled. Hosting-file linked nodes ( ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".file_treatment_toggle] linked mode ) prefer `hostFilePageUrl` stamped during graph URL enrichment ( file / code-file page for the idea's `fileUri` ), falling back to a member idea `pageUrl` when file pages are disabled. | 0.117 | ||
| html_export_graph_metadata | Graph nodes in the HTML export should surface tags, status, and attribute keys on or beside the node, not only as filter inputs. Attribute values declared on the idea should be reachable from the graph via the idea page and on-node attribute key summary. | 0.062 | ||
| html_export_graph_page | Html export should provide an interactive graph page with search, filters, and links back into idea and cluster pages. The graph should support scoped views for workspace, file, cluster, and idea contexts. The workspace graph page must include every idea in the export scope — blocks, oneliners, and ideasets — and must not apply the interactive Ideas Summary GRAPH_MAX_NODES budget. Ideasets are visible by default with a Hide ideasets / Show ideasets toggle, matching the external-file visibility control ( explicit AST ideasets only — distinct from hosting-file treatment ). Hosting `.rq` files ( implicit ideasets ) use a Files `<select>` — hidden / compound / linked — with option tooltips, per ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".file_treatment_toggle] ( parity with Ideas Summary ). Compound mode draws hittable / draggable bounding boxes with clickable titles; linked mode adds synthetic ideaset nodes that navigate via `hostFilePageUrl` / `pageUrl`. Wildcard fan-out edges ( `wildcard_reference` ) are visible by default with a " Wildcard refs " chip ( same label / default as Ideas Summary ); turning it off client-filters those edges and draws them dotted when on — see ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".wildcard_refs_toggle] and ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".webview_export_graph_parity]. Status and tag filters are multi-select and distinguish [graph_status_tag_filters]. Per-idea, per-file, and per-cluster neighbourhood graphs may still use a capped budget for focused pages. [html_export_graph_links] [html_export_graph_layout] [html_export_graph_animation] [html_export_graph_background_load] [html_export_graph_subject] [html_export_graph_labels] [html_export_graph_label_modes] [html_export_graph_label_auto] [html_export_graph_interaction] [html_export_graph_metadata] | 0.165 | ||
| html_export_graph_subject | When a graph view has a subject or center idea, that node should be visually distinct from peers and externals. Subject styling should use the brand rust accent against cyan peer nodes. | 0.062 | ||
| html_export_heading_tooltips | done | Section headings on layout panels show a short descriptive tip via the styled tooltip panel when pointer or keyboard focus rests on the heading. Entity-card title headings tip with that card's short summary text. Idea title headings tip with the idea summary when present. Heading tips must not use the browser title text. Reuses the tooltip surface from [html_export_idea_tooltips]. Cross-refs [html_export_layout_cards]. | 0.092 | |
| html_export_idea_tooltips | done | A link to an idea must show a tooltip when the pointer or keyboard focus rests on the link. The tooltip must show the idea name, the source file, and the idea body text. The tooltip must show the status when the idea has a status. The tooltip must be a styled panel. The tooltip must not use the browser title text. The tooltip must stay inside the viewport. An unresolved reference must not show an idea tooltip. Section and card heading tips follow [html_export_heading_tooltips]. | 0.099 | |
| html_export_layout_cards | done | In interactive runtime mode, detail-page panels ( panel, table-shell, graph-shell ) and entity-card tiles are drag-reorderable within their layout group and collapsible. In interactive mode, cards that are direct children of a page layout group and use panel, table-shell, or graph-shell chrome are width-resizable by column span. Entity-card tiles inside an entity-list layout group are drag-reorderable and collapsible, but they are not width-resizable. Column hide and column width on tables stay separate from card width. Width-resizable cards sit in a responsive multi-column grid and snap to column spans so a card can take one column, several columns, or the full row. Double-click on the card width handle fills the row. A second double-click restores the last non-full span. Collapsed cards ignore fill. Narrow viewports collapse spans so cards stack without horizontal overflow. The full card header is the drag handle. Links, buttons, and inputs in the header still activate on click. The collapse caret stays hidden until the card is hovered or has focus within. Collapse hides the card body and shrinks the card chrome so the layout does not keep empty body space. Card-width and header drag must not lose control to text selection: pointer capture, select lock, and preventDefault on resize pointerdown. Order, collapse, column-span, and fill-restore state persist in localStorage for that page path. Document and print runtime modes keep a static layout with no rearrange, resize, or collapse behaviour. Printable-report idea cards stay outside this idea ( [html_export_print_idea_cards], [html_export_print_order_by] ). Table column chrome follows [html_export_table_columns]. Cross-refs [html_export_runtime_modes], [html_export_heading_tooltips]. | 0.092 | |
| html_export_list_views | Html export should provide searchable list views for ideas, files, code files, references, clusters, and attributes. List views should preserve the usability of the current ideas summary tables with counts, sorting, filters, and quick navigation. Every interactive table column should be sortable by header click and filterable with a per-column filter, in addition to any page-level search bar. Navigable facet cells in those tables ( status, tags, paths, attribute values, cluster labels / kinds ) should be links to the matching detail page or to a list page with the matching column filter applied via [html_export_overview_links]. Long lists that sit above other page content follow [html_export_scrollable_lists]. The ideas index count columns follow [html_export_ideas_ref_columns]. Column hide, resize, and selector chrome follow [html_export_table_columns]. [html_export_ideas_ref_columns] [html_export_table_columns] [html_export_attributes_index] [html_export_file_pages] [html_export_code_reference_pages] [html_export_scrollable_lists] [html_export_overview_links] | 0.121 | ||
| html_export_overview_links | done | The interactive overview page status rollup, tags rollup, and highlighted clusters must be interactive navigation, not plain labels. Status and tag rollup entries should open the matching status / tag cluster page when [html_export_cluster_pages] is enabled; otherwise they should open the ideas list with the Status or Tags column filter seeded from the rollup key. Highlighted clusters should open the matching cluster page ( or the clusters index when cluster pages are disabled ). List pages must honour URL query parameters that seed per-column filters ( for example `ideas.html?status=todo` or `ideas.html?tags=export` ) so overview and in-table facet links land with the filter already applied. Query keys match stable `data-filter-key` values on table headers; filter values use the same display labels as the rollup ( including Not present / Empty ). Cross-refs [html_export_list_views], [html_export_cluster_pages], [html_export_internal_links]. | 0.103 | |
| html_export_table_columns | done | In interactive runtime mode, tables inside layout cards let the user hide and resize columns. An eye control on each column header toggles that column. The eye shows when the header cell is hovered or focused. A column-selector control in the table card header opens a multiselect panel with search, select all, clear, and shift-click range selection. Column resize must not lose control to text selection: pointer capture, select lock, and a resize handle above selectable header text. Hidden columns and column widths persist in localStorage for that page path and table. Document and print runtime modes keep all columns visible at default widths with no column chrome. Cross-refs [html_export_layout_cards], [html_export_list_views]. | 0.095 | |
| extension_startup_reliability | done | Reqlan startup must make the activity-bar shell and contributed commands available before optional indexing, parser construction, database initialization, or language-client startup can monopolize the extension host. The implementation contract is [first_paint_contract], [webview_claim_race], [deferred_startup_sequence], [lazy_runtime_dependencies], and [development_bundle_freshness]. Operational diagnosis follows [startup_diagnostics]. [activation.activation_sequence] [activitybar.loading_state] [indexer.nonblocking_index] [build.extension_bundle] | 0.046 | |
| invalid_url_activation_failure | done | The concrete incident failed while requiring `out/extension/main.cjs`, before `activate()` ran: `TypeError: Invalid URL` in `embedPhysicsCoreSource`. Runtime `readFileSync(new URL(..., import.meta.url))` is unsafe when esbuild emits CommonJS for an ES2017 target: `import.meta.url` is unavailable / empty and source-relative assets do not exist beside the bundled entry. The HTML export used to embed physics via `html-export-assets.ts` `embedPhysicsCoreSource`. That writer is gone; export now inlines assets from ["../../../crates/reqlan-export/assets/app.js"]. Code that still needs a module directory or `createRequire` ( core engine loader and parse worker ) must not mention `import.meta` statically in a way that esbuild CJS empties: prefer CJS `__dirname` / `__filename` when those exist ( extension host bundle ), and `import.meta.url` on the Node ESM path ( CLI / MCP ). The host esbuild step defines `import.meta.url` as `import_meta_url` from this file's `__filename` so the CJS bundle stays valid and does not warn `empty-import-meta`. CLI / MCP keep the TypeScript `import.meta.url` emit. Do not eval `import.meta.url` — Node 24 treats that as a script eval and throws `Cannot use 'import.meta' outside a module`. ["../../../packages/analytical/src/native/load-native.ts"] ["../../../packages/language/src/reqlan-async-parser.ts"] ["../../../packages/extension/esbuild.mjs"] | 0.040 | |
| graph_design | The graph should show nodes for ideas and files and edges for references. Used by Ideas Summary, activity-bar minigraph, and export previews. | 0.040 | ||
| graph_label_auto | done | In Labels auto mode, visibility follows viewport zoom continuously rather than a hard cut. ( fade ) Below a low zoom threshold labels are fully hidden; above a slightly higher threshold they are fully opaque; between those thresholds opacity ramps briefly through a muted / semi-transparent phase ( GRAPH_LABEL_FADE_START → GRAPH_LABEL_FADE_END ). Labels start fully invisible during graph initialisation and layout settling so text paint does not lag those phases; zoom fade only applies once settle / reframe has finished. Hovered or dragged nodes remain fully opaque even when ambient auto opacity is low or zero. Zoom and Fit from [view_controls] / [reframe_view] must update this opacity on each paint or zoom event. Applies to Ideas Summary GraphCyController and HTML export canvas graph alike. | 0.184 | |
| graph_label_modes | done | Every interactive graph should provide a Labels control that cycles auto ( default ), on, and off without changing graph membership. On forces full opacity; off hides all labels; auto follows [graph_label_auto]. Reset / default restore auto. Ideas Summary: control in ["../../../packages/extension/webviews/ideas-summary/components/GraphControls.svelte"], mode persisted via ["../workspace-summary/ideas_summary/graphical_graph.rq".graph_ui_persistence]. HTML export: control in ["../../../crates/reqlan-export/src/html_template/mod.rs"] / ["../../../crates/reqlan-export/assets/app.js"]. Driven by the same viewport zoom as [view_controls]. | 0.148 | |
| graph_status_tag_filters | done | Status and tag graph filters are searchable checkbox dropdowns ( still a dropdown trigger; multi-select via checkboxes; OR within each field ). They must distinguish attribute absence from an empty declaration and from a literal unspecified value: - Not present — attribute key absent ( no `@status` / no `@tags` ) - Empty — attribute declared with no value ( `@status`, `@tags`, `@status ""`, bare flag ) - unspecified — literal authored value " unspecified " Do not invent unspecified for missing attributes in rollups, clusters, or filter options. Special options render differently from concrete values ( italic muted Not present; info-tint Empty; warning-tint unspecified ). Shared helpers live in ["../../../packages/analytical/src/core/filter-specials.ts"]. Surfaces: Ideas Summary SearchableCheckboxDropdown; HTML export SCD in ["../../../crates/reqlan-export/assets/app.js"]. | 0.134 | |
| file_treatment_toggle | done | Toolbar dropdown selects how hosting `.rq` files ( implicit ideasets ) appear in the graph — distinct from explicit AST `ideaset` declarations and from external `file:` reference nodes. Options ( with info tooltips / help text ): - invisible / Hidden — no file containers or file leaf nodes; ideas float free - compound — one compound parent per hosting file ( basename label ); nests under folder / tag compounds when Controls → Compound is also on. Containers are draggable ( members move with the box; live physics pins descendants while dragging ). Clicking the title opens the file; double-click also opens. - linked / Linked nodes ( default ) — synthetic ideaset-styled leaf per hosting file ( `rq-file:…` ) with `ideaset_member` edges to ideas in that file; click / dbl-click opens the hosting file like other nodes. Client reshape via `applyFileTreatment` in ["../../../../packages/extension/webviews/shared/graph/file-treatment.ts"]; no re-query on mode flip. Ideas Summary: `FileTreatmentSelect` on GraphControls; persisted as `fileTreatment` in [graph_ui_persistence]. HTML export: same three options via a select; compound boxes are hittable / draggable with clickable titles; linked nodes carry `pageUrl` / `hostFilePageUrl` for navigation. Related: [graphical_graph], [ui_controls], [webview_export_graph_parity], ["../../../ontology.rq".file], ["../../../ontology.rq".ideaset], [html_export_graph_page]. | 0.170 | |
| graphical_graph | There should be a tab that renders requirement ideas and references as a force-directed web. The graph tab lives in the Ideas Summary webview per [ideas_summary]. UI is implemented in ["../../../../packages/extension/webviews/ideas-summary/components/GraphView.svelte"]. Graph slices are built in ["../../../../packages/analytical/src/index-store/webview-graph-queries.ts"] and served by ["../../../../packages/extension/src/ideas_summary_module/ideas-summary-panel.ts"]. By default the view focuses on the active editor file's first idea; without a focus it shows a capped slice of matching ideas rather than dumping the full graph. Users can filter by search text, path, multi-select @ status, and multi-select tags per [graph_status_tag_filters]. An " Indirect references " toggle expands neighbourhood depth from 1 to 2 hops. A " Wildcard refs " toggle includes or hides edges expanded from path + idea wildcards per [wildcard_refs_toggle] ["@/reqlan rq/language/imports.rq".wildcard_references] A " Files " dropdown selects hosting- `.rq` treatment per [file_treatment_toggle] ( hidden / compound containers / linked ideaset nodes ), with per-option info tooltips. Interactive graph controls that also exist on HTML export must stay aligned per [webview_export_graph_parity]. Clicking a node opens its source; double-click or " Focus graph " recenters the slice on that idea. Linked file ideaset nodes and file-compound titles open the hosting `.rq` file per [file_treatment_toggle]. External file references render as dashed edges to file nodes; wildcard-fan-out edges render dotted. A toggleable key explains node colours and edge styles and toggles node-type visibility per [key_panel_toggle]; a toggleable [control_panel] exposes layout, physics, and node-budget settings. Key and Controls state persist per workspace via [graph_ui_persistence]. Pan, zoom, and drag repositioning per [view_controls]. [manual_reframe] via " Fit to view " in [ui_controls]; [auto_reframe] when the loaded node set changes; [reframe_animation] for smooth transitions after the first paint. Node text labels per [graph_labels], [graph_label_modes], and [graph_label_auto]. Layout, compound grouping, and live physics behaviour per [layout_physics], [layout_options], [physics_options], and [compound_graph]. Cytoscape lifecycle and threading constraints per [graph_cy_controller] and [webview_threading]. | 0.207 | ||
| webview_export_graph_parity | done | Interactive graph behaviour that authors rely on in Ideas Summary must have a matching affordance on the HTML export workspace graph ( [html_export_graph_page] ) unless a requirement explicitly scopes it to one host. Shared today: Labels auto / on / off, live physics, Fit, status / tag filters, path / search filters, hide external files, hide ideasets ( explicit AST ), [file_treatment_toggle] ( dropdown with the same three modes, compound drag / title-open, linked-node open ), and [wildcard_refs_toggle] ( default on; dotted wildcard edges ). Ideas Summary may still differ where the host model differs: Indirect refs rebuilds hop depth via `buildGraphViewSlice` ( export freezes neighbourhood at snapshot time — no Indirect chip ); Key / Controls panels and node-budget controls are webview-only; export uses client-side filters on the embedded graph JSON rather than re-querying the index; Ideas Summary uses cytoscape compound parents while export draws AABB compound boxes on canvas. When adding a new Ideas Summary graph chip or edge style, update [html_export_graph_page] ( or document an intentional exception here ) and keep labels / defaults aligned across surfaces. Related: [graphical_graph], [wildcard_refs_toggle], [file_treatment_toggle], [ui_controls], [graph_labels], [graph_label_modes], [graph_status_tag_filters]. | 0.165 | |
| wildcard_refs_toggle | done | Toolbar chip " Wildcard refs " ( next to Indirect refs ) on GraphControls toggles `GraphViewQuery.includeWildcardRefs`. Default true — edges of kind `wildcard_reference` from the indexer fan-out stay visible ( ["../../../indexer/indexer.rq".wildcard_reference_edges] ). When false, `buildGraphViewSlice` omits those edges and does not expand neighbourhood through them ( `includeWildcardRefs!== false` normalisation in Ideas Summary host + analytical query ). Distinct from plain `references` and from the Indirect refs depth toggle; Key legend shows a dotted " Wildcard reference " row; cytoscape marks `edge[?isWildcard]` with `line-style: dotted`. Query field flows Ideas Summary loadGraph → `buildGraphViewSlice` in ["../../../../packages/analytical/src/index-store/webview-graph-queries.ts"]. HTML export workspace graph has the same chip ( client filter on embedded edges; dotted stroke ) per [webview_export_graph_parity] and [html_export_graph_page]. Related: ["../../../language/imports.rq".wildcard_references], ["../../../indexer/indexer.rq".wildcard_reference_edges], ["../../../indexer/indexer.rq".index], [graphical_graph], [ui_controls], [webview_export_graph_parity]. | 0.308 |
Reference labels
"../../../../crates/reqlan-export/assets/app.js", "../../../crates/reqlan-export/assets/app.js", "../../crates/reqlan-export/assets/app.js", ../../../../crates/reqlan-export/assets/app.js, ../../../crates/reqlan-export/assets/app.js, ../../crates/reqlan-export/assets/app.js