@n-dx/web 0.1.0
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/LICENSE +96 -0
- package/README.md +5 -0
- package/build.js +243 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/landing/index.html +325 -0
- package/dist/landing/landing.d.ts +38 -0
- package/dist/landing/landing.js +299 -0
- package/dist/landing/landing.js.map +1 -0
- package/dist/public.d.ts +55 -0
- package/dist/public.js +51 -0
- package/dist/public.js.map +1 -0
- package/dist/schema/features.d.ts +28 -0
- package/dist/schema/features.js +9 -0
- package/dist/schema/features.js.map +1 -0
- package/dist/schema/v1.d.ts +317 -0
- package/dist/schema/v1.js +3 -0
- package/dist/schema/v1.js.map +1 -0
- package/dist/server/aggregation-cache.d.ts +105 -0
- package/dist/server/aggregation-cache.js +163 -0
- package/dist/server/aggregation-cache.js.map +1 -0
- package/dist/server/concurrent-execution-metrics.d.ts +103 -0
- package/dist/server/concurrent-execution-metrics.js +253 -0
- package/dist/server/concurrent-execution-metrics.js.map +1 -0
- package/dist/server/domain-gateway.d.ts +18 -0
- package/dist/server/domain-gateway.js +19 -0
- package/dist/server/domain-gateway.js.map +1 -0
- package/dist/server/incremental-task-usage.d.ts +92 -0
- package/dist/server/incremental-task-usage.js +251 -0
- package/dist/server/incremental-task-usage.js.map +1 -0
- package/dist/server/index.d.ts +39 -0
- package/dist/server/index.js +36 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/port.d.ts +96 -0
- package/dist/server/port.js +134 -0
- package/dist/server/port.js.map +1 -0
- package/dist/server/pr-markdown-refresh-diagnostics.d.ts +59 -0
- package/dist/server/pr-markdown-refresh-diagnostics.js +429 -0
- package/dist/server/pr-markdown-refresh-diagnostics.js.map +1 -0
- package/dist/server/prd-io.d.ts +40 -0
- package/dist/server/prd-io.js +66 -0
- package/dist/server/prd-io.js.map +1 -0
- package/dist/server/process-memory-tracker.d.ts +79 -0
- package/dist/server/process-memory-tracker.js +194 -0
- package/dist/server/process-memory-tracker.js.map +1 -0
- package/dist/server/register-scheduler.d.ts +53 -0
- package/dist/server/register-scheduler.js +36 -0
- package/dist/server/register-scheduler.js.map +1 -0
- package/dist/server/rex-gateway.d.ts +39 -0
- package/dist/server/rex-gateway.js +47 -0
- package/dist/server/rex-gateway.js.map +1 -0
- package/dist/server/routes-adaptive.d.ts +21 -0
- package/dist/server/routes-adaptive.js +659 -0
- package/dist/server/routes-adaptive.js.map +1 -0
- package/dist/server/routes-config.d.ts +47 -0
- package/dist/server/routes-config.js +222 -0
- package/dist/server/routes-config.js.map +1 -0
- package/dist/server/routes-data.d.ts +14 -0
- package/dist/server/routes-data.js +129 -0
- package/dist/server/routes-data.js.map +1 -0
- package/dist/server/routes-features.d.ts +14 -0
- package/dist/server/routes-features.js +245 -0
- package/dist/server/routes-features.js.map +1 -0
- package/dist/server/routes-hench.d.ts +116 -0
- package/dist/server/routes-hench.js +2016 -0
- package/dist/server/routes-hench.js.map +1 -0
- package/dist/server/routes-integrations.d.ts +23 -0
- package/dist/server/routes-integrations.js +277 -0
- package/dist/server/routes-integrations.js.map +1 -0
- package/dist/server/routes-mcp.d.ts +31 -0
- package/dist/server/routes-mcp.js +175 -0
- package/dist/server/routes-mcp.js.map +1 -0
- package/dist/server/routes-notion.d.ts +23 -0
- package/dist/server/routes-notion.js +723 -0
- package/dist/server/routes-notion.js.map +1 -0
- package/dist/server/routes-project.d.ts +47 -0
- package/dist/server/routes-project.js +128 -0
- package/dist/server/routes-project.js.map +1 -0
- package/dist/server/routes-rex/analysis.d.ts +11 -0
- package/dist/server/routes-rex/analysis.js +583 -0
- package/dist/server/routes-rex/analysis.js.map +1 -0
- package/dist/server/routes-rex/execution.d.ts +37 -0
- package/dist/server/routes-rex/execution.js +355 -0
- package/dist/server/routes-rex/execution.js.map +1 -0
- package/dist/server/routes-rex/health.d.ts +8 -0
- package/dist/server/routes-rex/health.js +136 -0
- package/dist/server/routes-rex/health.js.map +1 -0
- package/dist/server/routes-rex/index.d.ts +35 -0
- package/dist/server/routes-rex/index.js +72 -0
- package/dist/server/routes-rex/index.js.map +1 -0
- package/dist/server/routes-rex/items.d.ts +8 -0
- package/dist/server/routes-rex/items.js +359 -0
- package/dist/server/routes-rex/items.js.map +1 -0
- package/dist/server/routes-rex/prune.d.ts +11 -0
- package/dist/server/routes-rex/prune.js +379 -0
- package/dist/server/routes-rex/prune.js.map +1 -0
- package/dist/server/routes-rex/reads.d.ts +9 -0
- package/dist/server/routes-rex/reads.js +119 -0
- package/dist/server/routes-rex/reads.js.map +1 -0
- package/dist/server/routes-rex/requirements.d.ts +10 -0
- package/dist/server/routes-rex/requirements.js +408 -0
- package/dist/server/routes-rex/requirements.js.map +1 -0
- package/dist/server/routes-rex/shared.d.ts +37 -0
- package/dist/server/routes-rex/shared.js +73 -0
- package/dist/server/routes-rex/shared.js.map +1 -0
- package/dist/server/routes-search.d.ts +26 -0
- package/dist/server/routes-search.js +82 -0
- package/dist/server/routes-search.js.map +1 -0
- package/dist/server/routes-sourcevision.d.ts +18 -0
- package/dist/server/routes-sourcevision.js +444 -0
- package/dist/server/routes-sourcevision.js.map +1 -0
- package/dist/server/routes-static.d.ts +20 -0
- package/dist/server/routes-static.js +168 -0
- package/dist/server/routes-static.js.map +1 -0
- package/dist/server/routes-status.d.ts +58 -0
- package/dist/server/routes-status.js +191 -0
- package/dist/server/routes-status.js.map +1 -0
- package/dist/server/routes-token-usage.d.ts +63 -0
- package/dist/server/routes-token-usage.js +720 -0
- package/dist/server/routes-token-usage.js.map +1 -0
- package/dist/server/routes-validation.d.ts +10 -0
- package/dist/server/routes-validation.js +365 -0
- package/dist/server/routes-validation.js.map +1 -0
- package/dist/server/routes-workflow.d.ts +15 -0
- package/dist/server/routes-workflow.js +498 -0
- package/dist/server/routes-workflow.js.map +1 -0
- package/dist/server/search-index.d.ts +111 -0
- package/dist/server/search-index.js +348 -0
- package/dist/server/search-index.js.map +1 -0
- package/dist/server/shared-types.d.ts +65 -0
- package/dist/server/shared-types.js +31 -0
- package/dist/server/shared-types.js.map +1 -0
- package/dist/server/start.d.ts +68 -0
- package/dist/server/start.js +568 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/task-usage.d.ts +17 -0
- package/dist/server/task-usage.js +20 -0
- package/dist/server/task-usage.js.map +1 -0
- package/dist/server/types.d.ts +27 -0
- package/dist/server/types.js +26 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/usage-cleanup-scheduler.d.ts +107 -0
- package/dist/server/usage-cleanup-scheduler.js +232 -0
- package/dist/server/usage-cleanup-scheduler.js.map +1 -0
- package/dist/server/websocket.d.ts +131 -0
- package/dist/server/websocket.js +512 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/shared/data-files.d.ts +17 -0
- package/dist/shared/data-files.js +18 -0
- package/dist/shared/data-files.js.map +1 -0
- package/dist/shared/index.d.ts +9 -0
- package/dist/shared/index.js +9 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/view-id.d.ts +8 -0
- package/dist/shared/view-id.js +9 -0
- package/dist/shared/view-id.js.map +1 -0
- package/dist/viewer/Hench-F.png +0 -0
- package/dist/viewer/Rex-F.png +0 -0
- package/dist/viewer/SourceVision-F.png +0 -0
- package/dist/viewer/SourceVision.png +0 -0
- package/dist/viewer/api.d.ts +19 -0
- package/dist/viewer/api.js +17 -0
- package/dist/viewer/api.js.map +1 -0
- package/dist/viewer/bootstrap.d.ts +13 -0
- package/dist/viewer/bootstrap.js +40 -0
- package/dist/viewer/bootstrap.js.map +1 -0
- package/dist/viewer/components/active-tasks-panel.d.ts +36 -0
- package/dist/viewer/components/active-tasks-panel.js +183 -0
- package/dist/viewer/components/active-tasks-panel.js.map +1 -0
- package/dist/viewer/components/breadcrumb.d.ts +21 -0
- package/dist/viewer/components/breadcrumb.js +117 -0
- package/dist/viewer/components/breadcrumb.js.map +1 -0
- package/dist/viewer/components/concurrency-panel.d.ts +18 -0
- package/dist/viewer/components/concurrency-panel.js +175 -0
- package/dist/viewer/components/concurrency-panel.js.map +1 -0
- package/dist/viewer/components/config-footer.d.ts +11 -0
- package/dist/viewer/components/config-footer.js +132 -0
- package/dist/viewer/components/config-footer.js.map +1 -0
- package/dist/viewer/components/constants.d.ts +10 -0
- package/dist/viewer/components/constants.js +11 -0
- package/dist/viewer/components/constants.js.map +1 -0
- package/dist/viewer/components/copy-link-button.d.ts +30 -0
- package/dist/viewer/components/copy-link-button.js +74 -0
- package/dist/viewer/components/copy-link-button.js.map +1 -0
- package/dist/viewer/components/crash-recovery-banner.d.ts +28 -0
- package/dist/viewer/components/crash-recovery-banner.js +47 -0
- package/dist/viewer/components/crash-recovery-banner.js.map +1 -0
- package/dist/viewer/components/data-display/collapsible-section.d.ts +14 -0
- package/dist/viewer/components/data-display/collapsible-section.js +66 -0
- package/dist/viewer/components/data-display/collapsible-section.js.map +1 -0
- package/dist/viewer/components/data-display/findings-list.d.ts +13 -0
- package/dist/viewer/components/data-display/findings-list.js +136 -0
- package/dist/viewer/components/data-display/findings-list.js.map +1 -0
- package/dist/viewer/components/data-display/health-gauge.d.ts +37 -0
- package/dist/viewer/components/data-display/health-gauge.js +62 -0
- package/dist/viewer/components/data-display/health-gauge.js.map +1 -0
- package/dist/viewer/components/data-display/mini-charts.d.ts +36 -0
- package/dist/viewer/components/data-display/mini-charts.js +124 -0
- package/dist/viewer/components/data-display/mini-charts.js.map +1 -0
- package/dist/viewer/components/data-display/tree-view.d.ts +18 -0
- package/dist/viewer/components/data-display/tree-view.js +107 -0
- package/dist/viewer/components/data-display/tree-view.js.map +1 -0
- package/dist/viewer/components/data-display/zone-map.d.ts +28 -0
- package/dist/viewer/components/data-display/zone-map.js +197 -0
- package/dist/viewer/components/data-display/zone-map.js.map +1 -0
- package/dist/viewer/components/degradation-banner.d.ts +28 -0
- package/dist/viewer/components/degradation-banner.js +47 -0
- package/dist/viewer/components/degradation-banner.js.map +1 -0
- package/dist/viewer/components/detail-panel.d.ts +12 -0
- package/dist/viewer/components/detail-panel.js +166 -0
- package/dist/viewer/components/detail-panel.js.map +1 -0
- package/dist/viewer/components/elapsed-time.d.ts +38 -0
- package/dist/viewer/components/elapsed-time.js +35 -0
- package/dist/viewer/components/elapsed-time.js.map +1 -0
- package/dist/viewer/components/faq.d.ts +12 -0
- package/dist/viewer/components/faq.js +237 -0
- package/dist/viewer/components/faq.js.map +1 -0
- package/dist/viewer/components/favicon.d.ts +30 -0
- package/dist/viewer/components/favicon.js +90 -0
- package/dist/viewer/components/favicon.js.map +1 -0
- package/dist/viewer/components/guide.d.ts +5 -0
- package/dist/viewer/components/guide.js +116 -0
- package/dist/viewer/components/guide.js.map +1 -0
- package/dist/viewer/components/index.d.ts +37 -0
- package/dist/viewer/components/index.js +46 -0
- package/dist/viewer/components/index.js.map +1 -0
- package/dist/viewer/components/logos.d.ts +42 -0
- package/dist/viewer/components/logos.js +46 -0
- package/dist/viewer/components/logos.js.map +1 -0
- package/dist/viewer/components/memory-panel.d.ts +19 -0
- package/dist/viewer/components/memory-panel.js +181 -0
- package/dist/viewer/components/memory-panel.js.map +1 -0
- package/dist/viewer/components/memory-warning.d.ts +23 -0
- package/dist/viewer/components/memory-warning.js +42 -0
- package/dist/viewer/components/memory-warning.js.map +1 -0
- package/dist/viewer/components/notion-schema-wizard.d.ts +16 -0
- package/dist/viewer/components/notion-schema-wizard.js +263 -0
- package/dist/viewer/components/notion-schema-wizard.js.map +1 -0
- package/dist/viewer/components/polling-suspension-indicator.d.ts +24 -0
- package/dist/viewer/components/polling-suspension-indicator.js +31 -0
- package/dist/viewer/components/polling-suspension-indicator.js.map +1 -0
- package/dist/viewer/components/prd-tree/add-item-form.d.ts +31 -0
- package/dist/viewer/components/prd-tree/add-item-form.js +231 -0
- package/dist/viewer/components/prd-tree/add-item-form.js.map +1 -0
- package/dist/viewer/components/prd-tree/analyze-panel.d.ts +13 -0
- package/dist/viewer/components/prd-tree/analyze-panel.js +245 -0
- package/dist/viewer/components/prd-tree/analyze-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.d.ts +34 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.js +415 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/bulk-actions.d.ts +19 -0
- package/dist/viewer/components/prd-tree/bulk-actions.js +90 -0
- package/dist/viewer/components/prd-tree/bulk-actions.js.map +1 -0
- package/dist/viewer/components/prd-tree/compute.d.ts +32 -0
- package/dist/viewer/components/prd-tree/compute.js +129 -0
- package/dist/viewer/components/prd-tree/compute.js.map +1 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.d.ts +23 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.js +83 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.js.map +1 -0
- package/dist/viewer/components/prd-tree/execution-panel.d.ts +14 -0
- package/dist/viewer/components/prd-tree/execution-panel.js +291 -0
- package/dist/viewer/components/prd-tree/execution-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/facet-filter.d.ts +40 -0
- package/dist/viewer/components/prd-tree/facet-filter.js +188 -0
- package/dist/viewer/components/prd-tree/facet-filter.js.map +1 -0
- package/dist/viewer/components/prd-tree/index.d.ts +24 -0
- package/dist/viewer/components/prd-tree/index.js +16 -0
- package/dist/viewer/components/prd-tree/index.js.map +1 -0
- package/dist/viewer/components/prd-tree/inline-add-form.d.ts +32 -0
- package/dist/viewer/components/prd-tree/inline-add-form.js +175 -0
- package/dist/viewer/components/prd-tree/inline-add-form.js.map +1 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.d.ts +31 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.js +110 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.js.map +1 -0
- package/dist/viewer/components/prd-tree/lazy-children.d.ts +40 -0
- package/dist/viewer/components/prd-tree/lazy-children.js +73 -0
- package/dist/viewer/components/prd-tree/lazy-children.js.map +1 -0
- package/dist/viewer/components/prd-tree/levels.d.ts +31 -0
- package/dist/viewer/components/prd-tree/levels.js +72 -0
- package/dist/viewer/components/prd-tree/levels.js.map +1 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.d.ts +105 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.js +173 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.js.map +1 -0
- package/dist/viewer/components/prd-tree/merge-preview.d.ts +25 -0
- package/dist/viewer/components/prd-tree/merge-preview.js +181 -0
- package/dist/viewer/components/prd-tree/merge-preview.js.map +1 -0
- package/dist/viewer/components/prd-tree/prd-tree.d.ts +91 -0
- package/dist/viewer/components/prd-tree/prd-tree.js +565 -0
- package/dist/viewer/components/prd-tree/prd-tree.js.map +1 -0
- package/dist/viewer/components/prd-tree/proposal-editor.d.ts +44 -0
- package/dist/viewer/components/prd-tree/proposal-editor.js +438 -0
- package/dist/viewer/components/prd-tree/proposal-editor.js.map +1 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.d.ts +25 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.js +336 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.js.map +1 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.d.ts +39 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.js +319 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.js.map +1 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.d.ts +16 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.js +213 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/smart-add-input.d.ts +19 -0
- package/dist/viewer/components/prd-tree/smart-add-input.js +383 -0
- package/dist/viewer/components/prd-tree/smart-add-input.js.map +1 -0
- package/dist/viewer/components/prd-tree/status-filter.d.ts +40 -0
- package/dist/viewer/components/prd-tree/status-filter.js +131 -0
- package/dist/viewer/components/prd-tree/status-filter.js.map +1 -0
- package/dist/viewer/components/prd-tree/task-detail.d.ts +41 -0
- package/dist/viewer/components/prd-tree/task-detail.js +1205 -0
- package/dist/viewer/components/prd-tree/task-detail.js.map +1 -0
- package/dist/viewer/components/prd-tree/task-utilization.d.ts +7 -0
- package/dist/viewer/components/prd-tree/task-utilization.js +25 -0
- package/dist/viewer/components/prd-tree/task-utilization.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-differ.d.ts +59 -0
- package/dist/viewer/components/prd-tree/tree-differ.js +200 -0
- package/dist/viewer/components/prd-tree/tree-differ.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.d.ts +70 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.js +176 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-search.d.ts +65 -0
- package/dist/viewer/components/prd-tree/tree-search.js +178 -0
- package/dist/viewer/components/prd-tree/tree-search.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-utils.d.ts +38 -0
- package/dist/viewer/components/prd-tree/tree-utils.js +107 -0
- package/dist/viewer/components/prd-tree/tree-utils.js.map +1 -0
- package/dist/viewer/components/prd-tree/types.d.ts +93 -0
- package/dist/viewer/components/prd-tree/types.js +16 -0
- package/dist/viewer/components/prd-tree/types.js.map +1 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.d.ts +119 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.js +169 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.js.map +1 -0
- package/dist/viewer/components/progressive-loader.d.ts +114 -0
- package/dist/viewer/components/progressive-loader.js +225 -0
- package/dist/viewer/components/progressive-loader.js.map +1 -0
- package/dist/viewer/components/refresh-queue-status.d.ts +20 -0
- package/dist/viewer/components/refresh-queue-status.js +65 -0
- package/dist/viewer/components/refresh-queue-status.js.map +1 -0
- package/dist/viewer/components/rex-task-link.d.ts +50 -0
- package/dist/viewer/components/rex-task-link.js +218 -0
- package/dist/viewer/components/rex-task-link.js.map +1 -0
- package/dist/viewer/components/search-filter.d.ts +20 -0
- package/dist/viewer/components/search-filter.js +28 -0
- package/dist/viewer/components/search-filter.js.map +1 -0
- package/dist/viewer/components/search-overlay.d.ts +31 -0
- package/dist/viewer/components/search-overlay.js +472 -0
- package/dist/viewer/components/search-overlay.js.map +1 -0
- package/dist/viewer/components/sidebar.d.ts +18 -0
- package/dist/viewer/components/sidebar.js +357 -0
- package/dist/viewer/components/sidebar.js.map +1 -0
- package/dist/viewer/components/status-indicators.d.ts +63 -0
- package/dist/viewer/components/status-indicators.js +136 -0
- package/dist/viewer/components/status-indicators.js.map +1 -0
- package/dist/viewer/components/theme-toggle.d.ts +8 -0
- package/dist/viewer/components/theme-toggle.js +28 -0
- package/dist/viewer/components/theme-toggle.js.map +1 -0
- package/dist/viewer/components/throttle-controls.d.ts +18 -0
- package/dist/viewer/components/throttle-controls.js +304 -0
- package/dist/viewer/components/throttle-controls.js.map +1 -0
- package/dist/viewer/components/ws-health-panel.d.ts +18 -0
- package/dist/viewer/components/ws-health-panel.js +250 -0
- package/dist/viewer/components/ws-health-panel.js.map +1 -0
- package/dist/viewer/components/zone-slideout.d.ts +17 -0
- package/dist/viewer/components/zone-slideout.js +162 -0
- package/dist/viewer/components/zone-slideout.js.map +1 -0
- package/dist/viewer/crash/crash-detector.d.ts +69 -0
- package/dist/viewer/crash/crash-detector.js +239 -0
- package/dist/viewer/crash/crash-detector.js.map +1 -0
- package/dist/viewer/crash/index.d.ts +7 -0
- package/dist/viewer/crash/index.js +8 -0
- package/dist/viewer/crash/index.js.map +1 -0
- package/dist/viewer/deployed-mode.d.ts +37 -0
- package/dist/viewer/deployed-mode.js +94 -0
- package/dist/viewer/deployed-mode.js.map +1 -0
- package/dist/viewer/external.d.ts +17 -0
- package/dist/viewer/external.js +17 -0
- package/dist/viewer/external.js.map +1 -0
- package/dist/viewer/graph/index.d.ts +9 -0
- package/dist/viewer/graph/index.js +12 -0
- package/dist/viewer/graph/index.js.map +1 -0
- package/dist/viewer/graph/physics.d.ts +96 -0
- package/dist/viewer/graph/physics.js +366 -0
- package/dist/viewer/graph/physics.js.map +1 -0
- package/dist/viewer/graph/renderer.d.ts +184 -0
- package/dist/viewer/graph/renderer.js +1438 -0
- package/dist/viewer/graph/renderer.js.map +1 -0
- package/dist/viewer/hooks/index.d.ts +27 -0
- package/dist/viewer/hooks/index.js +28 -0
- package/dist/viewer/hooks/index.js.map +1 -0
- package/dist/viewer/hooks/use-app-data.d.ts +31 -0
- package/dist/viewer/hooks/use-app-data.js +152 -0
- package/dist/viewer/hooks/use-app-data.js.map +1 -0
- package/dist/viewer/hooks/use-crash-recovery.d.ts +50 -0
- package/dist/viewer/hooks/use-crash-recovery.js +76 -0
- package/dist/viewer/hooks/use-crash-recovery.js.map +1 -0
- package/dist/viewer/hooks/use-delete-actions.d.ts +48 -0
- package/dist/viewer/hooks/use-delete-actions.js +103 -0
- package/dist/viewer/hooks/use-delete-actions.js.map +1 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.d.ts +68 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.js +71 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.js.map +1 -0
- package/dist/viewer/hooks/use-facet-state.d.ts +32 -0
- package/dist/viewer/hooks/use-facet-state.js +119 -0
- package/dist/viewer/hooks/use-facet-state.js.map +1 -0
- package/dist/viewer/hooks/use-feature-toggle.d.ts +18 -0
- package/dist/viewer/hooks/use-feature-toggle.js +57 -0
- package/dist/viewer/hooks/use-feature-toggle.js.map +1 -0
- package/dist/viewer/hooks/use-file-edges.d.ts +23 -0
- package/dist/viewer/hooks/use-file-edges.js +221 -0
- package/dist/viewer/hooks/use-file-edges.js.map +1 -0
- package/dist/viewer/hooks/use-graceful-degradation.d.ts +30 -0
- package/dist/viewer/hooks/use-graceful-degradation.js +45 -0
- package/dist/viewer/hooks/use-graceful-degradation.js.map +1 -0
- package/dist/viewer/hooks/use-item-selection.d.ts +49 -0
- package/dist/viewer/hooks/use-item-selection.js +117 -0
- package/dist/viewer/hooks/use-item-selection.js.map +1 -0
- package/dist/viewer/hooks/use-memory-monitor.d.ts +39 -0
- package/dist/viewer/hooks/use-memory-monitor.js +73 -0
- package/dist/viewer/hooks/use-memory-monitor.js.map +1 -0
- package/dist/viewer/hooks/use-pan-zoom.d.ts +33 -0
- package/dist/viewer/hooks/use-pan-zoom.js +110 -0
- package/dist/viewer/hooks/use-pan-zoom.js.map +1 -0
- package/dist/viewer/hooks/use-persistent-filter.d.ts +24 -0
- package/dist/viewer/hooks/use-persistent-filter.js +37 -0
- package/dist/viewer/hooks/use-persistent-filter.js.map +1 -0
- package/dist/viewer/hooks/use-polling-suspension.d.ts +32 -0
- package/dist/viewer/hooks/use-polling-suspension.js +41 -0
- package/dist/viewer/hooks/use-polling-suspension.js.map +1 -0
- package/dist/viewer/hooks/use-polling.d.ts +39 -0
- package/dist/viewer/hooks/use-polling.js +55 -0
- package/dist/viewer/hooks/use-polling.js.map +1 -0
- package/dist/viewer/hooks/use-prd-actions.d.ts +126 -0
- package/dist/viewer/hooks/use-prd-actions.js +250 -0
- package/dist/viewer/hooks/use-prd-actions.js.map +1 -0
- package/dist/viewer/hooks/use-prd-data.d.ts +45 -0
- package/dist/viewer/hooks/use-prd-data.js +159 -0
- package/dist/viewer/hooks/use-prd-data.js.map +1 -0
- package/dist/viewer/hooks/use-prd-deep-link.d.ts +45 -0
- package/dist/viewer/hooks/use-prd-deep-link.js +60 -0
- package/dist/viewer/hooks/use-prd-deep-link.js.map +1 -0
- package/dist/viewer/hooks/use-prd-websocket.d.ts +47 -0
- package/dist/viewer/hooks/use-prd-websocket.js +139 -0
- package/dist/viewer/hooks/use-prd-websocket.js.map +1 -0
- package/dist/viewer/hooks/use-project-metadata.d.ts +25 -0
- package/dist/viewer/hooks/use-project-metadata.js +55 -0
- package/dist/viewer/hooks/use-project-metadata.js.map +1 -0
- package/dist/viewer/hooks/use-project-status.d.ts +60 -0
- package/dist/viewer/hooks/use-project-status.js +133 -0
- package/dist/viewer/hooks/use-project-status.js.map +1 -0
- package/dist/viewer/hooks/use-refresh-throttle.d.ts +45 -0
- package/dist/viewer/hooks/use-refresh-throttle.js +52 -0
- package/dist/viewer/hooks/use-refresh-throttle.js.map +1 -0
- package/dist/viewer/hooks/use-route-state.d.ts +18 -0
- package/dist/viewer/hooks/use-route-state.js +115 -0
- package/dist/viewer/hooks/use-route-state.js.map +1 -0
- package/dist/viewer/hooks/use-subzone-edges.d.ts +21 -0
- package/dist/viewer/hooks/use-subzone-edges.js +147 -0
- package/dist/viewer/hooks/use-subzone-edges.js.map +1 -0
- package/dist/viewer/hooks/use-tab-visibility.d.ts +31 -0
- package/dist/viewer/hooks/use-tab-visibility.js +43 -0
- package/dist/viewer/hooks/use-tab-visibility.js.map +1 -0
- package/dist/viewer/hooks/use-tick.d.ts +43 -0
- package/dist/viewer/hooks/use-tick.js +76 -0
- package/dist/viewer/hooks/use-tick.js.map +1 -0
- package/dist/viewer/hooks/use-toast.d.ts +24 -0
- package/dist/viewer/hooks/use-toast.js +26 -0
- package/dist/viewer/hooks/use-toast.js.map +1 -0
- package/dist/viewer/hooks/use-zone-drag.d.ts +30 -0
- package/dist/viewer/hooks/use-zone-drag.js +60 -0
- package/dist/viewer/hooks/use-zone-drag.js.map +1 -0
- package/dist/viewer/index.html +36 -0
- package/dist/viewer/loader.d.ts +33 -0
- package/dist/viewer/loader.js +195 -0
- package/dist/viewer/loader.js.map +1 -0
- package/dist/viewer/main.d.ts +1 -0
- package/dist/viewer/main.js +121 -0
- package/dist/viewer/main.js.map +1 -0
- package/dist/viewer/messaging/call-rate-limiter.d.ts +50 -0
- package/dist/viewer/messaging/call-rate-limiter.js +103 -0
- package/dist/viewer/messaging/call-rate-limiter.js.map +1 -0
- package/dist/viewer/messaging/fetch-pipeline.d.ts +58 -0
- package/dist/viewer/messaging/fetch-pipeline.js +58 -0
- package/dist/viewer/messaging/fetch-pipeline.js.map +1 -0
- package/dist/viewer/messaging/index.d.ts +43 -0
- package/dist/viewer/messaging/index.js +46 -0
- package/dist/viewer/messaging/index.js.map +1 -0
- package/dist/viewer/messaging/message-coalescer.d.ts +96 -0
- package/dist/viewer/messaging/message-coalescer.js +121 -0
- package/dist/viewer/messaging/message-coalescer.js.map +1 -0
- package/dist/viewer/messaging/message-throttle.d.ts +95 -0
- package/dist/viewer/messaging/message-throttle.js +147 -0
- package/dist/viewer/messaging/message-throttle.js.map +1 -0
- package/dist/viewer/messaging/request-dedup.d.ts +43 -0
- package/dist/viewer/messaging/request-dedup.js +55 -0
- package/dist/viewer/messaging/request-dedup.js.map +1 -0
- package/dist/viewer/messaging/ws-pipeline.d.ts +85 -0
- package/dist/viewer/messaging/ws-pipeline.js +68 -0
- package/dist/viewer/messaging/ws-pipeline.js.map +1 -0
- package/dist/viewer/n-dx.png +0 -0
- package/dist/viewer/performance/dom-performance-monitor.d.ts +157 -0
- package/dist/viewer/performance/dom-performance-monitor.js +341 -0
- package/dist/viewer/performance/dom-performance-monitor.js.map +1 -0
- package/dist/viewer/performance/dom-update-gate.d.ts +122 -0
- package/dist/viewer/performance/dom-update-gate.js +229 -0
- package/dist/viewer/performance/dom-update-gate.js.map +1 -0
- package/dist/viewer/performance/graceful-degradation.d.ts +73 -0
- package/dist/viewer/performance/graceful-degradation.js +152 -0
- package/dist/viewer/performance/graceful-degradation.js.map +1 -0
- package/dist/viewer/performance/index.d.ts +14 -0
- package/dist/viewer/performance/index.js +20 -0
- package/dist/viewer/performance/index.js.map +1 -0
- package/dist/viewer/performance/memory-monitor.d.ts +78 -0
- package/dist/viewer/performance/memory-monitor.js +218 -0
- package/dist/viewer/performance/memory-monitor.js.map +1 -0
- package/dist/viewer/performance/refresh-throttle.d.ts +90 -0
- package/dist/viewer/performance/refresh-throttle.js +266 -0
- package/dist/viewer/performance/refresh-throttle.js.map +1 -0
- package/dist/viewer/performance/response-buffer-gate.d.ts +108 -0
- package/dist/viewer/performance/response-buffer-gate.js +170 -0
- package/dist/viewer/performance/response-buffer-gate.js.map +1 -0
- package/dist/viewer/performance/update-batcher.d.ts +79 -0
- package/dist/viewer/performance/update-batcher.js +119 -0
- package/dist/viewer/performance/update-batcher.js.map +1 -0
- package/dist/viewer/polling/batched-tick-dispatcher.d.ts +83 -0
- package/dist/viewer/polling/batched-tick-dispatcher.js +183 -0
- package/dist/viewer/polling/batched-tick-dispatcher.js.map +1 -0
- package/dist/viewer/polling/index.d.ts +13 -0
- package/dist/viewer/polling/index.js +16 -0
- package/dist/viewer/polling/index.js.map +1 -0
- package/dist/viewer/polling/polling-manager.d.ts +82 -0
- package/dist/viewer/polling/polling-manager.js +254 -0
- package/dist/viewer/polling/polling-manager.js.map +1 -0
- package/dist/viewer/polling/polling-restart.d.ts +45 -0
- package/dist/viewer/polling/polling-restart.js +98 -0
- package/dist/viewer/polling/polling-restart.js.map +1 -0
- package/dist/viewer/polling/polling-state.d.ts +182 -0
- package/dist/viewer/polling/polling-state.js +306 -0
- package/dist/viewer/polling/polling-state.js.map +1 -0
- package/dist/viewer/polling/tab-visibility.d.ts +112 -0
- package/dist/viewer/polling/tab-visibility.js +276 -0
- package/dist/viewer/polling/tab-visibility.js.map +1 -0
- package/dist/viewer/polling/tick-timer.d.ts +70 -0
- package/dist/viewer/polling/tick-timer.js +168 -0
- package/dist/viewer/polling/tick-timer.js.map +1 -0
- package/dist/viewer/polling/tick-visibility-gate.d.ts +92 -0
- package/dist/viewer/polling/tick-visibility-gate.js +146 -0
- package/dist/viewer/polling/tick-visibility-gate.js.map +1 -0
- package/dist/viewer/route-state.d.ts +8 -0
- package/dist/viewer/route-state.js +77 -0
- package/dist/viewer/route-state.js.map +1 -0
- package/dist/viewer/schema-compat.d.ts +17 -0
- package/dist/viewer/schema-compat.js +49 -0
- package/dist/viewer/schema-compat.js.map +1 -0
- package/dist/viewer/types.d.ts +66 -0
- package/dist/viewer/types.js +2 -0
- package/dist/viewer/types.js.map +1 -0
- package/dist/viewer/usage/constants.d.ts +14 -0
- package/dist/viewer/usage/constants.js +14 -0
- package/dist/viewer/usage/constants.js.map +1 -0
- package/dist/viewer/usage/index.d.ts +7 -0
- package/dist/viewer/usage/index.js +8 -0
- package/dist/viewer/usage/index.js.map +1 -0
- package/dist/viewer/utils.d.ts +25 -0
- package/dist/viewer/utils.js +48 -0
- package/dist/viewer/utils.js.map +1 -0
- package/dist/viewer/validate.d.ts +23 -0
- package/dist/viewer/validate.js +275 -0
- package/dist/viewer/validate.js.map +1 -0
- package/dist/viewer/views/analysis.d.ts +10 -0
- package/dist/viewer/views/analysis.js +109 -0
- package/dist/viewer/views/analysis.js.map +1 -0
- package/dist/viewer/views/architecture.d.ts +10 -0
- package/dist/viewer/views/architecture.js +44 -0
- package/dist/viewer/views/architecture.js.map +1 -0
- package/dist/viewer/views/domain-hench.d.ts +13 -0
- package/dist/viewer/views/domain-hench.js +14 -0
- package/dist/viewer/views/domain-hench.js.map +1 -0
- package/dist/viewer/views/domain-rex.d.ts +17 -0
- package/dist/viewer/views/domain-rex.js +18 -0
- package/dist/viewer/views/domain-rex.js.map +1 -0
- package/dist/viewer/views/domain-settings.d.ts +12 -0
- package/dist/viewer/views/domain-settings.js +13 -0
- package/dist/viewer/views/domain-settings.js.map +1 -0
- package/dist/viewer/views/domain-sourcevision.d.ts +20 -0
- package/dist/viewer/views/domain-sourcevision.js +21 -0
- package/dist/viewer/views/domain-sourcevision.js.map +1 -0
- package/dist/viewer/views/enrichment-thresholds.d.ts +11 -0
- package/dist/viewer/views/enrichment-thresholds.js +12 -0
- package/dist/viewer/views/enrichment-thresholds.js.map +1 -0
- package/dist/viewer/views/feature-toggles.d.ts +13 -0
- package/dist/viewer/views/feature-toggles.js +185 -0
- package/dist/viewer/views/feature-toggles.js.map +1 -0
- package/dist/viewer/views/files.d.ts +13 -0
- package/dist/viewer/views/files.js +174 -0
- package/dist/viewer/views/files.js.map +1 -0
- package/dist/viewer/views/graph.d.ts +12 -0
- package/dist/viewer/views/graph.js +316 -0
- package/dist/viewer/views/graph.js.map +1 -0
- package/dist/viewer/views/hench-config.d.ts +39 -0
- package/dist/viewer/views/hench-config.js +473 -0
- package/dist/viewer/views/hench-config.js.map +1 -0
- package/dist/viewer/views/hench-runs.d.ts +19 -0
- package/dist/viewer/views/hench-runs.js +460 -0
- package/dist/viewer/views/hench-runs.js.map +1 -0
- package/dist/viewer/views/hench-templates.d.ts +17 -0
- package/dist/viewer/views/hench-templates.js +262 -0
- package/dist/viewer/views/hench-templates.js.map +1 -0
- package/dist/viewer/views/integration-config.d.ts +73 -0
- package/dist/viewer/views/integration-config.js +524 -0
- package/dist/viewer/views/integration-config.js.map +1 -0
- package/dist/viewer/views/notion-config.d.ts +16 -0
- package/dist/viewer/views/notion-config.js +357 -0
- package/dist/viewer/views/notion-config.js.map +1 -0
- package/dist/viewer/views/overview.d.ts +10 -0
- package/dist/viewer/views/overview.js +187 -0
- package/dist/viewer/views/overview.js.map +1 -0
- package/dist/viewer/views/pr-markdown.d.ts +3 -0
- package/dist/viewer/views/pr-markdown.js +350 -0
- package/dist/viewer/views/pr-markdown.js.map +1 -0
- package/dist/viewer/views/prd.d.ts +34 -0
- package/dist/viewer/views/prd.js +257 -0
- package/dist/viewer/views/prd.js.map +1 -0
- package/dist/viewer/views/problems.d.ts +8 -0
- package/dist/viewer/views/problems.js +50 -0
- package/dist/viewer/views/problems.js.map +1 -0
- package/dist/viewer/views/rex-dashboard.d.ts +14 -0
- package/dist/viewer/views/rex-dashboard.js +334 -0
- package/dist/viewer/views/rex-dashboard.js.map +1 -0
- package/dist/viewer/views/routes.d.ts +8 -0
- package/dist/viewer/views/routes.js +216 -0
- package/dist/viewer/views/routes.js.map +1 -0
- package/dist/viewer/views/sourcevision-tabs.d.ts +18 -0
- package/dist/viewer/views/sourcevision-tabs.js +14 -0
- package/dist/viewer/views/sourcevision-tabs.js.map +1 -0
- package/dist/viewer/views/suggestions.d.ts +8 -0
- package/dist/viewer/views/suggestions.js +36 -0
- package/dist/viewer/views/suggestions.js.map +1 -0
- package/dist/viewer/views/task-audit.d.ts +18 -0
- package/dist/viewer/views/task-audit.js +413 -0
- package/dist/viewer/views/task-audit.js.map +1 -0
- package/dist/viewer/views/token-usage.d.ts +10 -0
- package/dist/viewer/views/token-usage.js +410 -0
- package/dist/viewer/views/token-usage.js.map +1 -0
- package/dist/viewer/views/validation.d.ts +11 -0
- package/dist/viewer/views/validation.js +475 -0
- package/dist/viewer/views/validation.js.map +1 -0
- package/dist/viewer/views/view-registry.d.ts +27 -0
- package/dist/viewer/views/view-registry.js +70 -0
- package/dist/viewer/views/view-registry.js.map +1 -0
- package/dist/viewer/views/workflow-optimization.d.ts +12 -0
- package/dist/viewer/views/workflow-optimization.js +311 -0
- package/dist/viewer/views/workflow-optimization.js.map +1 -0
- package/dist/viewer/views/zone-types.d.ts +69 -0
- package/dist/viewer/views/zone-types.js +5 -0
- package/dist/viewer/views/zone-types.js.map +1 -0
- package/dist/viewer/views/zones.d.ts +50 -0
- package/dist/viewer/views/zones.js +1438 -0
- package/dist/viewer/views/zones.js.map +1 -0
- package/dist/viewer/visualization/colors.d.ts +16 -0
- package/dist/viewer/visualization/colors.js +31 -0
- package/dist/viewer/visualization/colors.js.map +1 -0
- package/dist/viewer/visualization/flow.d.ts +54 -0
- package/dist/viewer/visualization/flow.js +123 -0
- package/dist/viewer/visualization/flow.js.map +1 -0
- package/dist/viewer/visualization/index.d.ts +34 -0
- package/dist/viewer/visualization/index.js +40 -0
- package/dist/viewer/visualization/index.js.map +1 -0
- package/dist/viewer/visualization/metrics.d.ts +8 -0
- package/dist/viewer/visualization/metrics.js +16 -0
- package/dist/viewer/visualization/metrics.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for PRD hierarchy visualization.
|
|
3
|
+
*
|
|
4
|
+
* These mirror the canonical types in packages/rex/src/schema/v1.ts.
|
|
5
|
+
* Duplication is intentional: the viewer is bundled as standalone browser
|
|
6
|
+
* code via esbuild and cannot import from the Rex Node.js package at
|
|
7
|
+
* runtime. If the canonical Rex types change, update these to match.
|
|
8
|
+
*
|
|
9
|
+
* Drift between these types and the canonical source is caught by
|
|
10
|
+
* compile-time consistency tests in tests/unit/server/type-consistency.test.ts.
|
|
11
|
+
*
|
|
12
|
+
* @see packages/rex/src/schema/v1.ts — canonical source: ItemLevel, ItemStatus, Priority, PRDItem, PRDDocument
|
|
13
|
+
* @see packages/web/src/server/rex-gateway.ts — server-side gateway (re-exports from rex)
|
|
14
|
+
*/
|
|
15
|
+
export type ItemLevel = "epic" | "feature" | "task" | "subtask";
|
|
16
|
+
export type ItemStatus = "pending" | "in_progress" | "completed" | "failing" | "deferred" | "blocked" | "deleted";
|
|
17
|
+
export type Priority = "critical" | "high" | "medium" | "low";
|
|
18
|
+
/**
|
|
19
|
+
* @see packages/rex/src/schema/v1.ts — RequirementCategory
|
|
20
|
+
*/
|
|
21
|
+
export type RequirementCategory = "technical" | "performance" | "security" | "accessibility" | "compatibility" | "quality";
|
|
22
|
+
/**
|
|
23
|
+
* @see packages/rex/src/schema/v1.ts — RequirementValidationType
|
|
24
|
+
*/
|
|
25
|
+
export type RequirementValidationType = "automated" | "manual" | "metric";
|
|
26
|
+
/**
|
|
27
|
+
* @see packages/rex/src/schema/v1.ts — Requirement
|
|
28
|
+
*/
|
|
29
|
+
export interface RequirementData {
|
|
30
|
+
id: string;
|
|
31
|
+
title: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
category: RequirementCategory;
|
|
34
|
+
validationType: RequirementValidationType;
|
|
35
|
+
acceptanceCriteria: string[];
|
|
36
|
+
validationCommand?: string;
|
|
37
|
+
threshold?: number;
|
|
38
|
+
priority?: Priority;
|
|
39
|
+
}
|
|
40
|
+
export interface PRDItemData {
|
|
41
|
+
id: string;
|
|
42
|
+
title: string;
|
|
43
|
+
status: ItemStatus;
|
|
44
|
+
level: ItemLevel;
|
|
45
|
+
description?: string;
|
|
46
|
+
acceptanceCriteria?: string[];
|
|
47
|
+
priority?: Priority;
|
|
48
|
+
tags?: string[];
|
|
49
|
+
blockedBy?: string[];
|
|
50
|
+
/** @see packages/rex/src/schema/v1.ts — PRDItem.requirements */
|
|
51
|
+
requirements?: RequirementData[];
|
|
52
|
+
startedAt?: string;
|
|
53
|
+
completedAt?: string;
|
|
54
|
+
failureReason?: string;
|
|
55
|
+
children?: PRDItemData[];
|
|
56
|
+
}
|
|
57
|
+
export interface PRDDocumentData {
|
|
58
|
+
schema: string;
|
|
59
|
+
title: string;
|
|
60
|
+
items: PRDItemData[];
|
|
61
|
+
}
|
|
62
|
+
export type WeeklyBudgetSource = "vendor_model" | "vendor_default" | "global_default" | "missing_budget";
|
|
63
|
+
export interface WeeklyBudgetResolution {
|
|
64
|
+
/** Resolved weekly token budget; null means no configured budget applies. */
|
|
65
|
+
budget: number | null;
|
|
66
|
+
/** Which lookup tier produced the result. */
|
|
67
|
+
source: WeeklyBudgetSource;
|
|
68
|
+
}
|
|
69
|
+
export interface TaskUtilizationSummary {
|
|
70
|
+
/** Rounded weekly utilization percentage, if budget is available. */
|
|
71
|
+
percent: number | null;
|
|
72
|
+
/** Shared display label used in chips and detail panel. */
|
|
73
|
+
label: string;
|
|
74
|
+
/** Resolver source reason used for fallback diagnostics. */
|
|
75
|
+
reason: WeeklyBudgetSource;
|
|
76
|
+
}
|
|
77
|
+
/** Aggregated token usage for a single task across associated runs. */
|
|
78
|
+
export interface TaskUsageSummary {
|
|
79
|
+
totalTokens: number;
|
|
80
|
+
runCount: number;
|
|
81
|
+
utilization?: TaskUtilizationSummary;
|
|
82
|
+
}
|
|
83
|
+
/** Computed stats for a branch of the tree. */
|
|
84
|
+
export interface BranchStats {
|
|
85
|
+
total: number;
|
|
86
|
+
completed: number;
|
|
87
|
+
inProgress: number;
|
|
88
|
+
pending: number;
|
|
89
|
+
failing: number;
|
|
90
|
+
deferred: number;
|
|
91
|
+
blocked: number;
|
|
92
|
+
deleted: number;
|
|
93
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for PRD hierarchy visualization.
|
|
3
|
+
*
|
|
4
|
+
* These mirror the canonical types in packages/rex/src/schema/v1.ts.
|
|
5
|
+
* Duplication is intentional: the viewer is bundled as standalone browser
|
|
6
|
+
* code via esbuild and cannot import from the Rex Node.js package at
|
|
7
|
+
* runtime. If the canonical Rex types change, update these to match.
|
|
8
|
+
*
|
|
9
|
+
* Drift between these types and the canonical source is caught by
|
|
10
|
+
* compile-time consistency tests in tests/unit/server/type-consistency.test.ts.
|
|
11
|
+
*
|
|
12
|
+
* @see packages/rex/src/schema/v1.ts — canonical source: ItemLevel, ItemStatus, Priority, PRDItem, PRDDocument
|
|
13
|
+
* @see packages/web/src/server/rex-gateway.ts — server-side gateway (re-exports from rex)
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/viewer/components/prd-tree/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual scrolling engine for the PRD tree.
|
|
3
|
+
*
|
|
4
|
+
* Flattens the hierarchical tree into a linear array respecting expansion
|
|
5
|
+
* state and status filters, then computes which items fall within the
|
|
6
|
+
* current scroll viewport plus a configurable buffer zone. Only those
|
|
7
|
+
* items are rendered, dramatically reducing DOM node count for large trees.
|
|
8
|
+
*
|
|
9
|
+
* The module exposes:
|
|
10
|
+
* - Pure functions for flattening and range computation (easily testable)
|
|
11
|
+
* - A Preact hook (`useVirtualScroll`) for scroll state management
|
|
12
|
+
*
|
|
13
|
+
* @see ./prd-tree.ts — integrating component
|
|
14
|
+
* @see ./compute.ts — itemMatchesFilter used for visibility checks
|
|
15
|
+
*/
|
|
16
|
+
import type { PRDItemData, ItemStatus } from "./types.js";
|
|
17
|
+
/** A flattened tree node with depth and structural metadata for rendering. */
|
|
18
|
+
export interface FlatNode {
|
|
19
|
+
/** The original PRD item data. */
|
|
20
|
+
item: PRDItemData;
|
|
21
|
+
/** Depth level in the tree (0 = root). */
|
|
22
|
+
depth: number;
|
|
23
|
+
/** Whether this node is currently expanded (children visible). */
|
|
24
|
+
isExpanded: boolean;
|
|
25
|
+
/** Whether this node has children (regardless of expansion state). */
|
|
26
|
+
hasChildren: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** Configuration for the virtual scroll engine. */
|
|
29
|
+
export interface VirtualScrollConfig {
|
|
30
|
+
/** Estimated height per row in pixels. Default: DEFAULT_ITEM_HEIGHT. */
|
|
31
|
+
itemHeight?: number;
|
|
32
|
+
/** Extra items to render above and below viewport. Default: DEFAULT_BUFFER_COUNT. */
|
|
33
|
+
bufferCount?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Range of indices to render. */
|
|
36
|
+
export interface VisibleRange {
|
|
37
|
+
/** First index to render (inclusive). */
|
|
38
|
+
start: number;
|
|
39
|
+
/** Last index to render (exclusive). */
|
|
40
|
+
end: number;
|
|
41
|
+
/** Pixel offset for the spacer before visible items. */
|
|
42
|
+
offsetY: number;
|
|
43
|
+
}
|
|
44
|
+
/** Default estimated row height in pixels. */
|
|
45
|
+
export declare const DEFAULT_ITEM_HEIGHT = 40;
|
|
46
|
+
/** Default number of buffer items above and below viewport. */
|
|
47
|
+
export declare const DEFAULT_BUFFER_COUNT = 10;
|
|
48
|
+
/**
|
|
49
|
+
* Flatten a hierarchical tree into a linear array of FlatNodes.
|
|
50
|
+
*
|
|
51
|
+
* Only includes nodes that:
|
|
52
|
+
* 1. Match the status filter (or have descendants that match)
|
|
53
|
+
* 2. Are within expanded parent branches
|
|
54
|
+
*
|
|
55
|
+
* The result preserves render order (depth-first, pre-order traversal).
|
|
56
|
+
* This is the same ordering that the recursive TreeNodes renderer produced,
|
|
57
|
+
* but in a flat array suitable for virtual scrolling.
|
|
58
|
+
*
|
|
59
|
+
* Complexity: O(V) where V = visible nodes in the expanded tree.
|
|
60
|
+
*/
|
|
61
|
+
export declare function flattenVisibleTree(items: PRDItemData[], expanded: Set<string>, activeStatuses: Set<ItemStatus>, depth?: number, searchVisibleIds?: Set<string>): FlatNode[];
|
|
62
|
+
/**
|
|
63
|
+
* Compute the visible range of indices for the current scroll position.
|
|
64
|
+
*
|
|
65
|
+
* Returns start/end indices and the pixel offset for positioning.
|
|
66
|
+
* Buffer items are included above and below the viewport to prevent
|
|
67
|
+
* flashing during rapid scrolling.
|
|
68
|
+
*
|
|
69
|
+
* When containerHeight is 0 (unmeasured or jsdom), returns the full
|
|
70
|
+
* range so all items render — virtual scrolling activates once the
|
|
71
|
+
* container has a measured height.
|
|
72
|
+
*/
|
|
73
|
+
export declare function computeVisibleRange(scrollTop: number, containerHeight: number, totalCount: number, itemHeight?: number, bufferCount?: number): VisibleRange;
|
|
74
|
+
/**
|
|
75
|
+
* Find the index of an item in the flat node list by ID.
|
|
76
|
+
* Returns -1 if not found.
|
|
77
|
+
*/
|
|
78
|
+
export declare function findFlatNodeIndex(flatNodes: FlatNode[], itemId: string): number;
|
|
79
|
+
export interface UseVirtualScrollOptions {
|
|
80
|
+
/** Flattened visible tree nodes. */
|
|
81
|
+
flatNodes: FlatNode[];
|
|
82
|
+
/** Ref to the scroll container element. */
|
|
83
|
+
containerRef: {
|
|
84
|
+
current: HTMLDivElement | null;
|
|
85
|
+
};
|
|
86
|
+
/** Virtual scroll configuration. */
|
|
87
|
+
config?: VirtualScrollConfig;
|
|
88
|
+
}
|
|
89
|
+
export interface UseVirtualScrollResult {
|
|
90
|
+
/** Subset of flatNodes currently visible in the viewport + buffer. */
|
|
91
|
+
visibleNodes: FlatNode[];
|
|
92
|
+
/** Total virtual height of the full tree in pixels. */
|
|
93
|
+
totalHeight: number;
|
|
94
|
+
/** Pixel offset for the spacer before visible items. */
|
|
95
|
+
offsetY: number;
|
|
96
|
+
/** Height in pixels for the spacer after visible items. */
|
|
97
|
+
afterSpaceHeight: number;
|
|
98
|
+
/** Scroll event handler to attach to the container. */
|
|
99
|
+
onScroll: (e: Event) => void;
|
|
100
|
+
/** Scroll the container to center a specific item index. */
|
|
101
|
+
scrollToIndex: (index: number) => void;
|
|
102
|
+
/** Number of items currently rendered. */
|
|
103
|
+
renderedCount: number;
|
|
104
|
+
/** Total number of items in the flattened tree. */
|
|
105
|
+
totalCount: number;
|
|
106
|
+
/** Whether virtual scrolling is active (container has measured height). */
|
|
107
|
+
isActive: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Preact hook that manages virtual scroll state.
|
|
111
|
+
*
|
|
112
|
+
* Observes the container element's height via ResizeObserver and
|
|
113
|
+
* computes which items to render based on the current scroll position.
|
|
114
|
+
*
|
|
115
|
+
* When the container height is unmeasured (0), all items are returned
|
|
116
|
+
* as visible — virtual scrolling activates once the browser reports
|
|
117
|
+
* a real height. This handles initial render, jsdom tests, and SSR.
|
|
118
|
+
*/
|
|
119
|
+
export declare function useVirtualScroll({ flatNodes, containerRef, config, }: UseVirtualScrollOptions): UseVirtualScrollResult;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual scrolling engine for the PRD tree.
|
|
3
|
+
*
|
|
4
|
+
* Flattens the hierarchical tree into a linear array respecting expansion
|
|
5
|
+
* state and status filters, then computes which items fall within the
|
|
6
|
+
* current scroll viewport plus a configurable buffer zone. Only those
|
|
7
|
+
* items are rendered, dramatically reducing DOM node count for large trees.
|
|
8
|
+
*
|
|
9
|
+
* The module exposes:
|
|
10
|
+
* - Pure functions for flattening and range computation (easily testable)
|
|
11
|
+
* - A Preact hook (`useVirtualScroll`) for scroll state management
|
|
12
|
+
*
|
|
13
|
+
* @see ./prd-tree.ts — integrating component
|
|
14
|
+
* @see ./compute.ts — itemMatchesFilter used for visibility checks
|
|
15
|
+
*/
|
|
16
|
+
import { useState, useEffect, useRef, useMemo, useCallback } from "preact/hooks";
|
|
17
|
+
import { itemMatchesFilter } from "./compute.js";
|
|
18
|
+
import { itemMatchesSearch } from "./tree-search.js";
|
|
19
|
+
// ── Constants ─────────────────────────────────────────────────────────────────
|
|
20
|
+
/** Default estimated row height in pixels. */
|
|
21
|
+
export const DEFAULT_ITEM_HEIGHT = 40;
|
|
22
|
+
/** Default number of buffer items above and below viewport. */
|
|
23
|
+
export const DEFAULT_BUFFER_COUNT = 10;
|
|
24
|
+
// ── Pure functions ────────────────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Flatten a hierarchical tree into a linear array of FlatNodes.
|
|
27
|
+
*
|
|
28
|
+
* Only includes nodes that:
|
|
29
|
+
* 1. Match the status filter (or have descendants that match)
|
|
30
|
+
* 2. Are within expanded parent branches
|
|
31
|
+
*
|
|
32
|
+
* The result preserves render order (depth-first, pre-order traversal).
|
|
33
|
+
* This is the same ordering that the recursive TreeNodes renderer produced,
|
|
34
|
+
* but in a flat array suitable for virtual scrolling.
|
|
35
|
+
*
|
|
36
|
+
* Complexity: O(V) where V = visible nodes in the expanded tree.
|
|
37
|
+
*/
|
|
38
|
+
export function flattenVisibleTree(items, expanded, activeStatuses, depth = 0, searchVisibleIds) {
|
|
39
|
+
const result = [];
|
|
40
|
+
for (const item of items) {
|
|
41
|
+
if (!itemMatchesFilter(item, activeStatuses))
|
|
42
|
+
continue;
|
|
43
|
+
// When a search is active, skip items not in the visible set.
|
|
44
|
+
if (searchVisibleIds && searchVisibleIds.size > 0) {
|
|
45
|
+
if (!itemMatchesSearch(item, searchVisibleIds))
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const children = item.children ?? [];
|
|
49
|
+
const hasChildren = children.length > 0;
|
|
50
|
+
const isExpanded = expanded.has(item.id);
|
|
51
|
+
result.push({ item, depth, isExpanded, hasChildren });
|
|
52
|
+
if (hasChildren && isExpanded) {
|
|
53
|
+
const childNodes = flattenVisibleTree(children, expanded, activeStatuses, depth + 1, searchVisibleIds);
|
|
54
|
+
for (const cn of childNodes)
|
|
55
|
+
result.push(cn);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Compute the visible range of indices for the current scroll position.
|
|
62
|
+
*
|
|
63
|
+
* Returns start/end indices and the pixel offset for positioning.
|
|
64
|
+
* Buffer items are included above and below the viewport to prevent
|
|
65
|
+
* flashing during rapid scrolling.
|
|
66
|
+
*
|
|
67
|
+
* When containerHeight is 0 (unmeasured or jsdom), returns the full
|
|
68
|
+
* range so all items render — virtual scrolling activates once the
|
|
69
|
+
* container has a measured height.
|
|
70
|
+
*/
|
|
71
|
+
export function computeVisibleRange(scrollTop, containerHeight, totalCount, itemHeight = DEFAULT_ITEM_HEIGHT, bufferCount = DEFAULT_BUFFER_COUNT) {
|
|
72
|
+
if (totalCount === 0) {
|
|
73
|
+
return { start: 0, end: 0, offsetY: 0 };
|
|
74
|
+
}
|
|
75
|
+
// Fallback: container not yet measured — render everything.
|
|
76
|
+
if (containerHeight <= 0) {
|
|
77
|
+
return { start: 0, end: totalCount, offsetY: 0 };
|
|
78
|
+
}
|
|
79
|
+
const startIdx = Math.floor(scrollTop / itemHeight);
|
|
80
|
+
const visibleCount = Math.ceil(containerHeight / itemHeight);
|
|
81
|
+
const start = Math.max(0, startIdx - bufferCount);
|
|
82
|
+
const end = Math.min(totalCount, startIdx + visibleCount + bufferCount);
|
|
83
|
+
const offsetY = start * itemHeight;
|
|
84
|
+
return { start, end, offsetY };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Find the index of an item in the flat node list by ID.
|
|
88
|
+
* Returns -1 if not found.
|
|
89
|
+
*/
|
|
90
|
+
export function findFlatNodeIndex(flatNodes, itemId) {
|
|
91
|
+
for (let i = 0; i < flatNodes.length; i++) {
|
|
92
|
+
if (flatNodes[i].item.id === itemId)
|
|
93
|
+
return i;
|
|
94
|
+
}
|
|
95
|
+
return -1;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Preact hook that manages virtual scroll state.
|
|
99
|
+
*
|
|
100
|
+
* Observes the container element's height via ResizeObserver and
|
|
101
|
+
* computes which items to render based on the current scroll position.
|
|
102
|
+
*
|
|
103
|
+
* When the container height is unmeasured (0), all items are returned
|
|
104
|
+
* as visible — virtual scrolling activates once the browser reports
|
|
105
|
+
* a real height. This handles initial render, jsdom tests, and SSR.
|
|
106
|
+
*/
|
|
107
|
+
export function useVirtualScroll({ flatNodes, containerRef, config = {}, }) {
|
|
108
|
+
const itemHeight = config.itemHeight ?? DEFAULT_ITEM_HEIGHT;
|
|
109
|
+
const bufferCount = config.bufferCount ?? DEFAULT_BUFFER_COUNT;
|
|
110
|
+
const [scrollTop, setScrollTop] = useState(0);
|
|
111
|
+
const [containerHeight, setContainerHeight] = useState(0);
|
|
112
|
+
// Measure container height on mount and resize.
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
const el = containerRef.current;
|
|
115
|
+
if (!el)
|
|
116
|
+
return;
|
|
117
|
+
setContainerHeight(el.clientHeight);
|
|
118
|
+
if (typeof ResizeObserver === "undefined")
|
|
119
|
+
return;
|
|
120
|
+
const ro = new ResizeObserver((entries) => {
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
setContainerHeight(entry.contentRect.height);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
ro.observe(el);
|
|
126
|
+
return () => ro.disconnect();
|
|
127
|
+
}, [containerRef]);
|
|
128
|
+
// Reset scrollTop when flatNodes changes significantly (e.g. filter change).
|
|
129
|
+
const prevLengthRef = useRef(flatNodes.length);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
if (prevLengthRef.current !== flatNodes.length) {
|
|
132
|
+
prevLengthRef.current = flatNodes.length;
|
|
133
|
+
// Don't reset scroll on small changes (expand/collapse).
|
|
134
|
+
// Only reset when the change is dramatic (e.g. filter switch).
|
|
135
|
+
if (Math.abs(prevLengthRef.current - flatNodes.length) > flatNodes.length * 0.5) {
|
|
136
|
+
setScrollTop(0);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}, [flatNodes.length]);
|
|
140
|
+
const totalHeight = flatNodes.length * itemHeight;
|
|
141
|
+
const isActive = containerHeight > 0;
|
|
142
|
+
const range = useMemo(() => computeVisibleRange(scrollTop, containerHeight, flatNodes.length, itemHeight, bufferCount), [scrollTop, containerHeight, flatNodes.length, itemHeight, bufferCount]);
|
|
143
|
+
const visibleNodes = useMemo(() => flatNodes.slice(range.start, range.end), [flatNodes, range.start, range.end]);
|
|
144
|
+
const afterSpaceHeight = Math.max(0, totalHeight - range.offsetY - visibleNodes.length * itemHeight);
|
|
145
|
+
const onScroll = useCallback((e) => {
|
|
146
|
+
const target = e.target;
|
|
147
|
+
setScrollTop(target.scrollTop);
|
|
148
|
+
}, []);
|
|
149
|
+
const scrollToIndex = useCallback((index) => {
|
|
150
|
+
const el = containerRef.current;
|
|
151
|
+
if (!el)
|
|
152
|
+
return;
|
|
153
|
+
// Center the item in the viewport.
|
|
154
|
+
const targetScroll = Math.max(0, index * itemHeight - containerHeight / 2 + itemHeight / 2);
|
|
155
|
+
el.scrollTop = targetScroll;
|
|
156
|
+
}, [containerRef, itemHeight, containerHeight]);
|
|
157
|
+
return {
|
|
158
|
+
visibleNodes,
|
|
159
|
+
totalHeight,
|
|
160
|
+
offsetY: range.offsetY,
|
|
161
|
+
afterSpaceHeight,
|
|
162
|
+
onScroll,
|
|
163
|
+
scrollToIndex,
|
|
164
|
+
renderedCount: visibleNodes.length,
|
|
165
|
+
totalCount: flatNodes.length,
|
|
166
|
+
isActive,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=virtual-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-scroll.js","sourceRoot":"","sources":["../../../../src/viewer/components/prd-tree/virtual-scroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progressive tree loading for large PRD datasets.
|
|
3
|
+
*
|
|
4
|
+
* Renders tree nodes in configurable chunks rather than all at once. A flat
|
|
5
|
+
* "node budget" controls how many visible nodes are rendered: the tree is
|
|
6
|
+
* walked in render order and items beyond the budget are excluded. Parents
|
|
7
|
+
* whose children are partially truncated keep their structural position so
|
|
8
|
+
* scroll position is stable.
|
|
9
|
+
*
|
|
10
|
+
* The module exposes:
|
|
11
|
+
* - Pure functions for counting and slicing visible nodes (easily testable)
|
|
12
|
+
* - A Preact hook (`useProgressiveLoader`) for chunk state management
|
|
13
|
+
* - A `LoadMoreIndicator` component for the "load more" UI
|
|
14
|
+
*
|
|
15
|
+
* Search and filter operations always work on the **full** item tree —
|
|
16
|
+
* progressive loading only limits the **rendering** pass, not the data.
|
|
17
|
+
*
|
|
18
|
+
* @see ./prd-tree/prd-tree.ts — integrating component
|
|
19
|
+
* @see ./prd-tree/compute.ts — itemMatchesFilter used for visibility checks
|
|
20
|
+
*/
|
|
21
|
+
import type { VNode } from "preact";
|
|
22
|
+
import type { PRDItemData, ItemStatus } from "./prd-tree/types.js";
|
|
23
|
+
/** Default number of nodes to render per chunk. */
|
|
24
|
+
export declare const DEFAULT_CHUNK_SIZE = 50;
|
|
25
|
+
/**
|
|
26
|
+
* Minimum item count before progressive loading activates.
|
|
27
|
+
* Trees smaller than this render in full without any chunking UI.
|
|
28
|
+
*/
|
|
29
|
+
export declare const PROGRESSIVE_THRESHOLD = 50;
|
|
30
|
+
/**
|
|
31
|
+
* Count visible nodes in a tree, respecting the status filter.
|
|
32
|
+
*
|
|
33
|
+
* A node is "visible" when it (or any descendant) matches the active status
|
|
34
|
+
* filter — the same logic `itemMatchesFilter` uses. Each visible node
|
|
35
|
+
* contributes 1 to the count, and visible children are counted recursively.
|
|
36
|
+
*
|
|
37
|
+
* Complexity: O(N) where N = total nodes in tree.
|
|
38
|
+
*/
|
|
39
|
+
export declare function countVisibleNodes(items: PRDItemData[], activeStatuses: Set<ItemStatus>): number;
|
|
40
|
+
/**
|
|
41
|
+
* Result of a progressive tree slice operation.
|
|
42
|
+
*/
|
|
43
|
+
export interface ProgressiveSlice {
|
|
44
|
+
/** Items to render (may be a subset of the original tree). */
|
|
45
|
+
items: PRDItemData[];
|
|
46
|
+
/** Number of visible nodes in this slice. */
|
|
47
|
+
renderedCount: number;
|
|
48
|
+
/** Total visible nodes in the unsliced tree. */
|
|
49
|
+
totalCount: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Slice a tree to fit within a node budget.
|
|
53
|
+
*
|
|
54
|
+
* Returns the original `items` array unchanged when the total visible count
|
|
55
|
+
* fits within the limit (common case for small trees).
|
|
56
|
+
*
|
|
57
|
+
* @param items Full PRD item tree
|
|
58
|
+
* @param activeStatuses Status filter (from StatusFilter component)
|
|
59
|
+
* @param limit Maximum number of visible nodes to include
|
|
60
|
+
* @returns Progressive slice with rendered/total counts
|
|
61
|
+
*/
|
|
62
|
+
export declare function sliceVisibleTree(items: PRDItemData[], activeStatuses: Set<ItemStatus>, limit: number): ProgressiveSlice;
|
|
63
|
+
export interface ProgressiveLoaderState {
|
|
64
|
+
/** Current node rendering limit. */
|
|
65
|
+
limit: number;
|
|
66
|
+
/** Whether there are more nodes beyond the current limit. */
|
|
67
|
+
hasMore: boolean;
|
|
68
|
+
/** Load the next chunk of nodes. */
|
|
69
|
+
loadMore: () => void;
|
|
70
|
+
/** Load all remaining nodes at once. */
|
|
71
|
+
loadAll: () => void;
|
|
72
|
+
/** Whether a chunk load is in progress (brief transition state). */
|
|
73
|
+
isLoading: boolean;
|
|
74
|
+
/** Number of visible nodes that will be rendered. */
|
|
75
|
+
renderedCount: number;
|
|
76
|
+
/** Total visible nodes in the full tree. */
|
|
77
|
+
totalCount: number;
|
|
78
|
+
/** Whether progressive loading is active (tree exceeds threshold). */
|
|
79
|
+
isActive: boolean;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Manages progressive loading state for a tree of the given size.
|
|
83
|
+
*
|
|
84
|
+
* The hook auto-resets the limit when `totalCount` changes (e.g. after a
|
|
85
|
+
* filter change or data refresh), ensuring the user always starts from a
|
|
86
|
+
* reasonable chunk size.
|
|
87
|
+
*
|
|
88
|
+
* A brief `isLoading` transition (one frame) is triggered on `loadMore` /
|
|
89
|
+
* `loadAll` to give the browser a paint opportunity before the potentially
|
|
90
|
+
* heavy render of additional nodes.
|
|
91
|
+
*
|
|
92
|
+
* @param totalCount Total visible nodes (from countVisibleNodes)
|
|
93
|
+
* @param chunkSize Number of nodes per chunk (DEFAULT_CHUNK_SIZE)
|
|
94
|
+
*/
|
|
95
|
+
export declare function useProgressiveLoader(totalCount: number, chunkSize?: number): ProgressiveLoaderState;
|
|
96
|
+
export interface LoadMoreIndicatorProps {
|
|
97
|
+
/** Number of nodes currently rendered. */
|
|
98
|
+
renderedCount: number;
|
|
99
|
+
/** Total visible nodes in the tree. */
|
|
100
|
+
totalCount: number;
|
|
101
|
+
/** Number of nodes to add per chunk. */
|
|
102
|
+
chunkSize: number;
|
|
103
|
+
/** Whether a load operation is in progress. */
|
|
104
|
+
isLoading: boolean;
|
|
105
|
+
/** Load the next chunk. */
|
|
106
|
+
onLoadMore: () => void;
|
|
107
|
+
/** Load all remaining nodes. */
|
|
108
|
+
onLoadAll: () => void;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* "Load More" indicator shown below the tree when progressive loading is
|
|
112
|
+
* active and there are more nodes to reveal.
|
|
113
|
+
*/
|
|
114
|
+
export declare function LoadMoreIndicator({ renderedCount, totalCount, chunkSize, isLoading, onLoadMore, onLoadAll, }: LoadMoreIndicatorProps): VNode;
|