@devcabs/folio-engine 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts +7 -0
- package/dist/components/canvas/CanvasAddBar.d.ts +28 -0
- package/dist/components/canvas/CanvasAddModal.d.ts +38 -0
- package/dist/components/canvas/CanvasChart.d.ts +23 -0
- package/dist/components/canvas/CanvasDeleteConfirmModal.d.ts +21 -0
- package/dist/components/canvas/CanvasGallery.d.ts +20 -0
- package/dist/components/canvas/CanvasItemControls.d.ts +33 -0
- package/dist/components/canvas/CanvasPhoto.d.ts +28 -0
- package/dist/components/canvas/CanvasSection.d.ts +27 -0
- package/dist/components/canvas/CanvasSubsection.d.ts +23 -0
- package/dist/components/canvas/CanvasText.d.ts +23 -0
- package/dist/components/canvas/DocumentCanvas.d.ts +20 -0
- package/dist/components/canvas/HeroPhoto.d.ts +17 -0
- package/dist/components/canvas/NodeCanvas.d.ts +2 -0
- package/dist/components/canvas/index.d.ts +17 -0
- package/dist/components/chart/BarChart.d.ts +23 -0
- package/dist/components/chart/ChartCard.d.ts +33 -0
- package/dist/components/chart/ChartConfigDrawer.d.ts +16 -0
- package/dist/components/chart/ChartGhostWireframe.d.ts +16 -0
- package/dist/components/chart/ChartLegend.d.ts +14 -0
- package/dist/components/chart/ChartRouter.d.ts +8 -0
- package/dist/components/chart/ChartSortingControls.d.ts +15 -0
- package/dist/components/chart/ChartTableModal.d.ts +26 -0
- package/dist/components/chart/ChartTooltip.d.ts +12 -0
- package/dist/components/chart/DataPendingCard.d.ts +28 -0
- package/dist/components/chart/DonutChart.d.ts +16 -0
- package/dist/components/chart/HistogramChart.d.ts +23 -0
- package/dist/components/chart/LineChart.d.ts +22 -0
- package/dist/components/chart/RangePreviewMatrix.d.ts +19 -0
- package/dist/components/chart/ScatterPlot.d.ts +21 -0
- package/dist/components/chart/drawer/controls/BarVisualControls.d.ts +9 -0
- package/dist/components/chart/drawer/controls/ChartTitlesSection.d.ts +15 -0
- package/dist/components/chart/drawer/controls/DonutVisualControls.d.ts +7 -0
- package/dist/components/chart/drawer/controls/HistogramVisualControls.d.ts +13 -0
- package/dist/components/chart/drawer/controls/LineVisualControls.d.ts +14 -0
- package/dist/components/chart/drawer/controls/ScatterDataControls.d.ts +17 -0
- package/dist/components/chart/drawer/controls/ScatterVisualControls.d.ts +23 -0
- package/dist/components/chart/drawer/controls/SortingAndOrderControls.d.ts +18 -0
- package/dist/components/chart/drawer/controls/StandardDataControls.d.ts +31 -0
- package/dist/components/chart/drawer/hooks/useChartConfigForm.d.ts +156 -0
- package/dist/components/chart/drawer/hooks/useLiveMatrixSync.d.ts +21 -0
- package/dist/components/chart/drawer/hooks/useSheetVerification.d.ts +26 -0
- package/dist/components/chart/drawer/index.d.ts +17 -0
- package/dist/components/chart/drawer/panels/Step1Source.d.ts +18 -0
- package/dist/components/chart/drawer/panels/Step1SourceRange.d.ts +32 -0
- package/dist/components/chart/drawer/panels/Step2DataRange.d.ts +15 -0
- package/dist/components/chart/drawer/panels/Step3ChartSetup.d.ts +17 -0
- package/dist/components/chart/drawer/panels/Step4Review.d.ts +11 -0
- package/dist/components/chart/index.d.ts +22 -0
- package/dist/components/dev/DevActionAffordance.d.ts +4 -0
- package/dist/components/dev/DevExitConfirmModal.d.ts +14 -0
- package/dist/components/dev/DevLockBlockedModal.d.ts +3 -0
- package/dist/components/dev/DevModeBadge.d.ts +3 -0
- package/dist/components/dev/DevPinModal.d.ts +3 -0
- package/dist/components/dev/DevPublishModal.d.ts +9 -0
- package/dist/components/dev/UniversalEditModal.d.ts +40 -0
- package/dist/components/dev/index.d.ts +8 -0
- package/dist/components/feedback/EmptyState.d.ts +13 -0
- package/dist/components/feedback/PageNotFound.d.ts +15 -0
- package/dist/components/feedback/Toast.d.ts +25 -0
- package/dist/components/feedback/index.d.ts +2 -0
- package/dist/components/history/HistoryHubModal.d.ts +44 -0
- package/dist/components/history/index.d.ts +1 -0
- package/dist/components/layout/AppFooter.d.ts +10 -0
- package/dist/components/layout/AppHeader.d.ts +22 -0
- package/dist/components/layout/EditorialSection.d.ts +27 -0
- package/dist/components/layout/EditorialSidebar.d.ts +34 -0
- package/dist/components/layout/HeroSection.d.ts +2 -0
- package/dist/components/layout/HeroWelcome.d.ts +11 -0
- package/dist/components/layout/SearchField.d.ts +9 -0
- package/dist/components/layout/StatusPill.d.ts +2 -0
- package/dist/components/layout/index.d.ts +8 -0
- package/dist/components/roadmap/RoadmapNode.d.ts +30 -0
- package/dist/components/roadmap/RoadmapSection.d.ts +27 -0
- package/dist/components/roadmap/RoadmapTrack.d.ts +25 -0
- package/dist/components/roadmap/serpentine-generator.d.ts +60 -0
- package/dist/components/roadmap/use-roadmap-scroll.d.ts +19 -0
- package/dist/components/source/EditPhotoModal.d.ts +22 -0
- package/dist/components/source/LightboxPhotoStrip.d.ts +23 -0
- package/dist/components/source/LinkFolderModal.d.ts +24 -0
- package/dist/components/source/SourceCard.d.ts +31 -0
- package/dist/components/source/SourceFolderAttachment.d.ts +25 -0
- package/dist/components/source/SourceGallery.d.ts +26 -0
- package/dist/components/source/SourceImage.d.ts +26 -0
- package/dist/components/source/SourceLightbox.d.ts +28 -0
- package/dist/components/source/index.d.ts +9 -0
- package/dist/components/ui/AccordionSection.d.ts +21 -0
- package/dist/components/ui/Breadcrumb.d.ts +29 -0
- package/dist/components/ui/Button.d.ts +31 -0
- package/dist/components/ui/ColumnSelect.d.ts +17 -0
- package/dist/components/ui/ColumnTypeBadge.d.ts +6 -0
- package/dist/components/ui/DevHelpTooltip.d.ts +11 -0
- package/dist/components/ui/DraggableRows.d.ts +21 -0
- package/dist/components/ui/Drawer.d.ts +50 -0
- package/dist/components/ui/DrawerTier.d.ts +8 -0
- package/dist/components/ui/EditableText.d.ts +48 -0
- package/dist/components/ui/FAB.d.ts +24 -0
- package/dist/components/ui/Modal.d.ts +24 -0
- package/dist/components/ui/PageTitle.d.ts +33 -0
- package/dist/components/ui/ParametricShape.d.ts +57 -0
- package/dist/components/ui/RevolvingButton.d.ts +5 -0
- package/dist/components/ui/SectionTitle.d.ts +42 -0
- package/dist/components/ui/SeriesSelectToolbar.d.ts +10 -0
- package/dist/components/ui/StatusPill.d.ts +21 -0
- package/dist/components/ui/TieredSlider.d.ts +19 -0
- package/dist/components/ui/Toast.d.ts +1 -0
- package/dist/components/ui/ValueLabelToggle.d.ts +10 -0
- package/dist/components/ui/index.d.ts +21 -0
- package/dist/config/engine.config.d.ts +162 -0
- package/dist/context/DeveloperModeContext.d.ts +11 -0
- package/dist/context/UndoRedoContext.d.ts +20 -0
- package/dist/diagnostics/verifyEngineSetup.d.ts +30 -0
- package/dist/diagnostics-CpGr1hhi.js +126 -0
- package/dist/diagnostics-Dw5PzR78.cjs +5 -0
- package/dist/diagnostics.cjs +1 -0
- package/dist/diagnostics.d.ts +10 -0
- package/dist/diagnostics.js +14 -0
- package/dist/edge-1WCVZ0J7.cjs +1 -0
- package/dist/edge-CSjifIhA.js +2709 -0
- package/dist/edge-Dr41JdrQ.cjs +34 -0
- package/dist/edge-h_ge9f1E.js +512 -0
- package/dist/edge.cjs +1 -0
- package/dist/edge.d.ts +10 -0
- package/dist/edge.js +26 -0
- package/dist/folio.cjs +9 -0
- package/dist/folio.js +21895 -0
- package/dist/hooks/use-auto-toc.d.ts +31 -0
- package/dist/hooks/use-discrete-step-navigation.d.ts +26 -0
- package/dist/hooks/use-dynamic-section-numbers.d.ts +30 -0
- package/dist/hooks/use-hash-route.d.ts +36 -0
- package/dist/hooks/use-scroll.d.ts +22 -0
- package/dist/hooks/use-scrollspy.d.ts +19 -0
- package/dist/hooks/useChartTooltip.d.ts +25 -0
- package/dist/hooks/useContent.d.ts +36 -0
- package/dist/hooks/useDeveloperMode.d.ts +1 -0
- package/dist/hooks/useDocumentCanvas.d.ts +53 -0
- package/dist/hooks/useDrivePhotoSync.d.ts +15 -0
- package/dist/hooks/useImageLoader.d.ts +12 -0
- package/dist/hooks/useLightboxHistory.d.ts +14 -0
- package/dist/hooks/useNodeCanvas.d.ts +2 -0
- package/dist/hooks/useSheetChartData.d.ts +31 -0
- package/dist/hooks/useSourcePoint.d.ts +35 -0
- package/dist/hooks/useSwipeGesture.d.ts +30 -0
- package/dist/hooks/useUndoRedo.d.ts +9 -0
- package/dist/hooks/useUnsavedChangesPrompt.d.ts +18 -0
- package/dist/index.d.ts +53 -0
- package/dist/main.d.ts +1 -0
- package/dist/services/canvasLayoutService.d.ts +158 -0
- package/dist/services/chartSourceService.d.ts +128 -0
- package/dist/services/devLockService.d.ts +76 -0
- package/dist/services/draftService.d.ts +129 -0
- package/dist/services/drivePhotoSyncService.d.ts +60 -0
- package/dist/services/driveVerificationService.d.ts +41 -0
- package/dist/services/edgePreBakeService.d.ts +81 -0
- package/dist/services/historyService.d.ts +215 -0
- package/dist/services/historyStorage.d.ts +17 -0
- package/dist/services/mediaService.d.ts +25 -0
- package/dist/services/sheetsDataService.d.ts +59 -0
- package/dist/services/sheetsVerificationService.d.ts +87 -0
- package/dist/services/sourceService.d.ts +43 -0
- package/dist/services/undoRedoService.d.ts +63 -0
- package/dist/services/unsavedChangesService.d.ts +32 -0
- package/dist/style.css +1 -0
- package/dist/types/canvas.d.ts +115 -0
- package/dist/types/chart.d.ts +117 -0
- package/dist/types/developer.d.ts +144 -0
- package/dist/types/draft.d.ts +21 -0
- package/dist/types/edge.d.ts +232 -0
- package/dist/types/history.d.ts +81 -0
- package/dist/types/media.d.ts +16 -0
- package/dist/types/navigation.d.ts +19 -0
- package/dist/types/node.d.ts +51 -0
- package/dist/types/source.d.ts +88 -0
- package/dist/utils/canvasDefaults.d.ts +43 -0
- package/dist/utils/chartColors.d.ts +48 -0
- package/dist/utils/chartDimensions.d.ts +50 -0
- package/dist/utils/chartMath.d.ts +142 -0
- package/dist/utils/chartSanitizer.d.ts +84 -0
- package/dist/utils/contentDb.d.ts +86 -0
- package/dist/utils/devSecurity.d.ts +84 -0
- package/dist/utils/mediaUrl.d.ts +32 -0
- package/dist/utils/modalActions.d.ts +32 -0
- package/dist/utils/node-sections.d.ts +15 -0
- package/dist/utils/page-sections.d.ts +1 -0
- package/dist/utils/runtime-env.d.ts +21 -0
- package/dist/utils/scrollLock.d.ts +10 -0
- package/dist/utils/smooth-scroll.d.ts +24 -0
- package/dist/utils/source.d.ts +25 -0
- package/dist/utils/storage.d.ts +13 -0
- package/dist/utils/supabase-config.d.ts +29 -0
- package/dist/utils/supabase-write-guard.d.ts +15 -0
- package/package.json +68 -4
- package/README.md +0 -3
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folio Engine - Active Session Undo / Redo Contracts
|
|
3
|
+
* Location: src/types/history.ts
|
|
4
|
+
* Specification: docs/tasks/task9_2_active_session_undo_redo_engine.md
|
|
5
|
+
* Aligned with: docs/00_WORKFLOW.md, docs/03_ARCHITECTURE.md, docs/07_CODING_STANDARDS.md
|
|
6
|
+
*/
|
|
7
|
+
export type UndoActionType = 'canvas_insert_section' | 'canvas_remove_section' | 'canvas_insert_subsection' | 'canvas_remove_subsection' | 'canvas_insert_leaf' | 'canvas_remove_leaf' | 'canvas_move_item' | 'canvas_relocate_item' | 'canvas_update_item' | 'content_text_override';
|
|
8
|
+
export interface UndoAction {
|
|
9
|
+
id: string;
|
|
10
|
+
type: UndoActionType;
|
|
11
|
+
timestamp: number;
|
|
12
|
+
description: string;
|
|
13
|
+
/** Function that reverses the action */
|
|
14
|
+
undo: () => void;
|
|
15
|
+
/** Function that re-applies the action */
|
|
16
|
+
redo: () => void;
|
|
17
|
+
}
|
|
18
|
+
export interface UndoRedoState {
|
|
19
|
+
canUndo: boolean;
|
|
20
|
+
canRedo: boolean;
|
|
21
|
+
undoCount: number;
|
|
22
|
+
redoCount: number;
|
|
23
|
+
lastActionDescription?: string;
|
|
24
|
+
nextRedoDescription?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface UndoRedoContextType extends UndoRedoState {
|
|
27
|
+
/** Push a reversible action pair onto the active stack */
|
|
28
|
+
pushAction: (action: Omit<UndoAction, 'id' | 'timestamp'>) => void;
|
|
29
|
+
/** Execute the most recent undo action */
|
|
30
|
+
undo: () => void;
|
|
31
|
+
/** Execute the most recent redo action */
|
|
32
|
+
redo: () => void;
|
|
33
|
+
/** Clear both stacks (e.g. on dev mode exit or full restore) */
|
|
34
|
+
clearHistory: () => void;
|
|
35
|
+
}
|
|
36
|
+
import type { NodeCanvasDocument } from './canvas';
|
|
37
|
+
export type SnapshotType = 'milestone' | 'autosave' | 'safety_backup';
|
|
38
|
+
export interface UnifiedPortalSnapshot {
|
|
39
|
+
id: string;
|
|
40
|
+
schemaVersion: number;
|
|
41
|
+
type: SnapshotType;
|
|
42
|
+
title: string;
|
|
43
|
+
notes?: string;
|
|
44
|
+
createdAt: string;
|
|
45
|
+
authorSessionId: string;
|
|
46
|
+
/** Canvas layout documents for all 5 nodes keyed by node ID */
|
|
47
|
+
canvases: Record<string, NodeCanvasDocument>;
|
|
48
|
+
/** Complete key-value registry of all Content DB text overrides */
|
|
49
|
+
contentOverrides: Record<string, string>;
|
|
50
|
+
/** Metrics summary for quick scannability in UI */
|
|
51
|
+
summary: {
|
|
52
|
+
totalSections: number;
|
|
53
|
+
totalSubsections: number;
|
|
54
|
+
totalLeafElements: number;
|
|
55
|
+
totalTextOverrides: number;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export interface HistoryManifest {
|
|
59
|
+
lastRestoredId?: string;
|
|
60
|
+
activePublishedId?: string;
|
|
61
|
+
activeMilestoneId?: string;
|
|
62
|
+
snapshots: UnifiedPortalSnapshot[];
|
|
63
|
+
updatedAt: string;
|
|
64
|
+
}
|
|
65
|
+
export interface PublishedSnapshot {
|
|
66
|
+
id: string;
|
|
67
|
+
schemaVersion: number;
|
|
68
|
+
title: string;
|
|
69
|
+
description: string;
|
|
70
|
+
createdAt: string;
|
|
71
|
+
authorSessionId: string;
|
|
72
|
+
isActive: boolean;
|
|
73
|
+
canvases: Record<string, NodeCanvasDocument>;
|
|
74
|
+
contentOverrides: Record<string, string>;
|
|
75
|
+
summary: {
|
|
76
|
+
totalSections: number;
|
|
77
|
+
totalSubsections: number;
|
|
78
|
+
totalLeafElements: number;
|
|
79
|
+
totalTextOverrides: number;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folio Engine - Media & Asset Pipeline Contracts
|
|
3
|
+
* Location: src/types/media.ts
|
|
4
|
+
* Specification: docs/tasks/task11_2g_db_draft_and_blob_storage_pipeline.md
|
|
5
|
+
*/
|
|
6
|
+
export interface UploadMediaResult {
|
|
7
|
+
url: string;
|
|
8
|
+
sizeBytes: number;
|
|
9
|
+
format: string;
|
|
10
|
+
}
|
|
11
|
+
export type MediaFolder = 'photos' | 'documents' | 'source';
|
|
12
|
+
export interface ImageDownscaleOptions {
|
|
13
|
+
maxDimension?: number;
|
|
14
|
+
quality?: number;
|
|
15
|
+
mimeType?: 'image/webp' | 'image/jpeg' | 'image/png';
|
|
16
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Navigation Type Contracts
|
|
3
|
+
* Document Reference: docs/07_CODING_STANDARDS.md
|
|
4
|
+
*
|
|
5
|
+
* Reusable navigation contracts across AppHeader, EditorialSidebar,
|
|
6
|
+
* Table of Contents, and Mobile Navigation Menus.
|
|
7
|
+
*/
|
|
8
|
+
export interface NavItem {
|
|
9
|
+
/** Display label for the navigation item */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Navigation destination (URL, route hash e.g. '#stage-1', or path) */
|
|
12
|
+
href: string;
|
|
13
|
+
/** Unique element ID targeted by in-page anchors without the '#' prefix */
|
|
14
|
+
id?: string;
|
|
15
|
+
/** Optional sequence or stage number prefix (e.g. '01', '02') rendered in JetBrains Mono */
|
|
16
|
+
number?: string;
|
|
17
|
+
/** Explicit active state flag when controlled externally */
|
|
18
|
+
isActive?: boolean;
|
|
19
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic Sequence Node Model
|
|
3
|
+
* Document Reference: docs/tasks/task18_2_data_contracts_and_single_source_of_truth.md
|
|
4
|
+
*
|
|
5
|
+
* Parameterized milestone node model supporting dynamic sequence length (N >= 1).
|
|
6
|
+
* Completely decoupled from institutional union constraints.
|
|
7
|
+
*/
|
|
8
|
+
export type NodeCode = string;
|
|
9
|
+
export interface NodeHeroImage {
|
|
10
|
+
src: string;
|
|
11
|
+
alt: string;
|
|
12
|
+
caption?: string;
|
|
13
|
+
showCaption?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Canonical alias for hero image contract */
|
|
16
|
+
export type CanonicalPhoto = NodeHeroImage;
|
|
17
|
+
export interface SourceItem {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
dateStamp?: string;
|
|
21
|
+
photo?: CanonicalPhoto;
|
|
22
|
+
imageSrc?: string;
|
|
23
|
+
reference?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface StageStory {
|
|
26
|
+
step: number;
|
|
27
|
+
stageName: string;
|
|
28
|
+
narrative: string;
|
|
29
|
+
}
|
|
30
|
+
export interface NodeItem {
|
|
31
|
+
id: string;
|
|
32
|
+
index: number;
|
|
33
|
+
title: string;
|
|
34
|
+
subtitle?: string;
|
|
35
|
+
summary?: string;
|
|
36
|
+
tagline?: string;
|
|
37
|
+
accentColor: string;
|
|
38
|
+
accentTint?: string;
|
|
39
|
+
heroImage?: NodeHeroImage;
|
|
40
|
+
annotation?: string;
|
|
41
|
+
nodeNumber?: number;
|
|
42
|
+
stages?: StageStory[];
|
|
43
|
+
sourceItems?: SourceItem[];
|
|
44
|
+
metadata?: Record<string, unknown>;
|
|
45
|
+
}
|
|
46
|
+
export interface NodeNavigationLink {
|
|
47
|
+
id: string;
|
|
48
|
+
index: number;
|
|
49
|
+
title: string;
|
|
50
|
+
path: string;
|
|
51
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { NodeCode, SourceItem } from './node';
|
|
2
|
+
export interface SourceSource {
|
|
3
|
+
pointId: NodeCode | string;
|
|
4
|
+
folderUrl: string;
|
|
5
|
+
folderTitle: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
lastVerified?: string;
|
|
8
|
+
}
|
|
9
|
+
export type SourceSourceRegistry = Record<string, SourceSource>;
|
|
10
|
+
export interface DrivePhotoFile {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
mimeType: string;
|
|
14
|
+
thumbnailLink?: string;
|
|
15
|
+
webContentLink?: string;
|
|
16
|
+
createdTime?: string;
|
|
17
|
+
modifiedTime?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* SyncedSourceItem
|
|
21
|
+
* Contract Unification: Directly extends Canonical SourceItem so all existing
|
|
22
|
+
* gallery, card, and lightbox components accept it without mapping overhead.
|
|
23
|
+
*/
|
|
24
|
+
export interface SyncedSourceItem extends SourceItem {
|
|
25
|
+
pointId?: string;
|
|
26
|
+
driveFileId: string;
|
|
27
|
+
originalFileName: string;
|
|
28
|
+
thumbnailUrl: string;
|
|
29
|
+
fullImageUrl: string;
|
|
30
|
+
isCustomTitle?: boolean;
|
|
31
|
+
orderIndex: number;
|
|
32
|
+
category?: string;
|
|
33
|
+
date?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface DriveReconciliationStats {
|
|
36
|
+
added: number;
|
|
37
|
+
removed: number;
|
|
38
|
+
retained: number;
|
|
39
|
+
total: number;
|
|
40
|
+
hasChanged: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface DriveReconciliationResult {
|
|
43
|
+
items: SyncedSourceItem[];
|
|
44
|
+
stats: DriveReconciliationStats;
|
|
45
|
+
}
|
|
46
|
+
export type SyncState = 'never_synced' | 'syncing' | 'synced_success' | 'synced_empty' | 'sync_error';
|
|
47
|
+
export interface SyncFolderPhotosResult {
|
|
48
|
+
items: SyncedSourceItem[];
|
|
49
|
+
stats: DriveReconciliationStats;
|
|
50
|
+
source: LiveSourceSource;
|
|
51
|
+
}
|
|
52
|
+
export interface UseDrivePhotoSyncResult {
|
|
53
|
+
syncedPhotos: SyncedSourceItem[];
|
|
54
|
+
syncState: SyncState;
|
|
55
|
+
hasSynced: boolean;
|
|
56
|
+
isSyncing: boolean;
|
|
57
|
+
error: string | null;
|
|
58
|
+
lastStats: DriveReconciliationStats | null;
|
|
59
|
+
syncPhotos: () => Promise<DriveReconciliationStats | null>;
|
|
60
|
+
}
|
|
61
|
+
export interface LiveSourceSource {
|
|
62
|
+
pointId: NodeCode | string;
|
|
63
|
+
folderUrl: string;
|
|
64
|
+
folderTitle: string;
|
|
65
|
+
description?: string;
|
|
66
|
+
updatedBy: string;
|
|
67
|
+
lastVerified: string;
|
|
68
|
+
createdAt: string;
|
|
69
|
+
syncedPhotos?: SyncedSourceItem[];
|
|
70
|
+
}
|
|
71
|
+
export type LiveSourceRegistry = Record<string, LiveSourceSource>;
|
|
72
|
+
export interface UpsertSourcePayload {
|
|
73
|
+
pointId: string;
|
|
74
|
+
folderUrl: string;
|
|
75
|
+
folderTitle: string;
|
|
76
|
+
description?: string;
|
|
77
|
+
updatedBy?: string;
|
|
78
|
+
syncedPhotos?: SyncedSourceItem[];
|
|
79
|
+
}
|
|
80
|
+
export type ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error';
|
|
81
|
+
export interface UseImageLoaderResult {
|
|
82
|
+
status: ImageLoadingStatus;
|
|
83
|
+
isLoading: boolean;
|
|
84
|
+
isLoaded: boolean;
|
|
85
|
+
isError: boolean;
|
|
86
|
+
resolvedSrc?: string;
|
|
87
|
+
retry: () => void;
|
|
88
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folio Engine - Default Element Generation Factory
|
|
3
|
+
* Location: src/utils/canvasDefaults.ts
|
|
4
|
+
* Specification: docs/tasks/task8_1_data_models_and_default_factory.md
|
|
5
|
+
*
|
|
6
|
+
* Rules:
|
|
7
|
+
* 1. Zero parentheses in all default copy, titles, and placeholders.
|
|
8
|
+
* 2. Pure, deterministic factory functions without DOM dependencies.
|
|
9
|
+
* 3. Canonical naming hierarchy for pointIds.
|
|
10
|
+
*/
|
|
11
|
+
import type { CanvasElementType, TextElement, PhotoElement, GalleryElement, ChartElement, SubsectionElement, SectionElement, NodeCanvasDocument } from '../types/canvas';
|
|
12
|
+
/**
|
|
13
|
+
* Generate a unique element ID with type prefix and collision-resistant entropy.
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateCanvasId(prefix: CanvasElementType): string;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a default narrative Text block.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createDefaultText(nodeId: string): TextElement;
|
|
20
|
+
/**
|
|
21
|
+
* Generate a default photographic source block.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createDefaultPhoto(nodeId: string): PhotoElement;
|
|
24
|
+
/**
|
|
25
|
+
* Generate a default photographic Evidence Gallery block.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createDefaultGallery(nodeId: string): GalleryElement;
|
|
28
|
+
/**
|
|
29
|
+
* Generate a default Indicator Chart block with pending state.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createDefaultChart(nodeId: string): ChartElement;
|
|
32
|
+
/**
|
|
33
|
+
* Generate a default mid-level Subsection container.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createDefaultSubsection(nodeId?: string): SubsectionElement;
|
|
36
|
+
/**
|
|
37
|
+
* Generate a default top-level Section container with auto-assigned numbering.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createDefaultSection(index: number, nodeId?: string): SectionElement;
|
|
40
|
+
/**
|
|
41
|
+
* Generate a default top-level versioned document for a Node canvas.
|
|
42
|
+
*/
|
|
43
|
+
export declare function createDefaultCanvasDocument(nodeId: string): NodeCanvasDocument;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Chart Color Engine & Palette System
|
|
3
|
+
* Document Reference: docs/tasks/task7_6_common_chart_engine_drawer_components.md
|
|
4
|
+
*
|
|
5
|
+
* Enforces:
|
|
6
|
+
* 1. Deduplicated base palette (replacing duplicate indices 6 & 7 with Academic Indigo and Rich Academic Teal).
|
|
7
|
+
* 2. Guaranteed intra-chart uniqueness: No chart element ever shares the same color twice.
|
|
8
|
+
* 3. Automatic Tiered Variants: When chart elements exceed 5, the engine switches to high-contrast
|
|
9
|
+
* Super-Dark jewel shades (or Super-Light tints) to prevent collisions.
|
|
10
|
+
* 4. Token Purity: Strictly consumes CSS custom properties from tokens.css.
|
|
11
|
+
*/
|
|
12
|
+
import type { NodeCode } from '../types/node';
|
|
13
|
+
export declare const NODE_ACCENT_TOKENS: Record<NodeCode, string>;
|
|
14
|
+
/**
|
|
15
|
+
* 7 Distinct Base Palette Colors (Preserved for backward-compatibility)
|
|
16
|
+
*/
|
|
17
|
+
export declare const CHART_BASE_PALETTE: readonly string[];
|
|
18
|
+
/**
|
|
19
|
+
* 14 Distinct Bright Palette Colors (Prioritizing vibrant, high-contrast academic hues over dull darks)
|
|
20
|
+
*/
|
|
21
|
+
export declare const CHART_BRIGHT_PALETTE: readonly string[];
|
|
22
|
+
/**
|
|
23
|
+
* Super-Dark Jewel Tone Palette (>7:1 contrast on light canvas)
|
|
24
|
+
*/
|
|
25
|
+
export declare const CHART_DARK_PALETTE: readonly string[];
|
|
26
|
+
/**
|
|
27
|
+
* Super-Light Pastel Tint Palette (for soft fills and secondary tiers)
|
|
28
|
+
*/
|
|
29
|
+
export declare const CHART_LIGHT_PALETTE: readonly string[];
|
|
30
|
+
/**
|
|
31
|
+
* Normalizes synonymous institutional tokens to detect conceptual duplicates.
|
|
32
|
+
* (e.g. Node 2 #881337 is synonymous with Brand Maroon #881337)
|
|
33
|
+
*/
|
|
34
|
+
export declare function normalizeColorToken(token?: string): string;
|
|
35
|
+
export type ChartTierMode = 'bright' | 'dark' | 'light';
|
|
36
|
+
export interface ResolveColorsOptions {
|
|
37
|
+
count: number;
|
|
38
|
+
accentColor?: string;
|
|
39
|
+
tierMode?: ChartTierMode;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolves a guaranteed unique sequence of chart colors.
|
|
43
|
+
* - If accentColor is supplied, it is anchored at index 0 and removed from candidate pools.
|
|
44
|
+
* - By default (tierMode: 'bright'), all 14 vibrant bright base colors are prioritized.
|
|
45
|
+
* - If tierMode: 'dark' is requested, legacy behavior (5 base, then super-dark) is honored.
|
|
46
|
+
* - No color is ever repeated within the resolved sequence.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveUniqueChartColors(options: ResolveColorsOptions): string[];
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Viewport, Canvas & Margin Constants
|
|
3
|
+
* Document Reference: docs/tasks/task7_6_common_chart_engine_drawer_components.md
|
|
4
|
+
*/
|
|
5
|
+
export declare const CHART_CANVAS_DIMENSIONS: {
|
|
6
|
+
readonly viewBoxWidth: 800;
|
|
7
|
+
readonly viewBoxHeight: 360;
|
|
8
|
+
readonly margins: {
|
|
9
|
+
readonly top: 28;
|
|
10
|
+
readonly right: 32;
|
|
11
|
+
readonly bottom: 48;
|
|
12
|
+
readonly left: 56;
|
|
13
|
+
};
|
|
14
|
+
readonly compactMargins: {
|
|
15
|
+
readonly top: 16;
|
|
16
|
+
readonly right: 16;
|
|
17
|
+
readonly bottom: 36;
|
|
18
|
+
readonly left: 44;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export interface ChartPlotMargins {
|
|
22
|
+
top: number;
|
|
23
|
+
right: number;
|
|
24
|
+
bottom: number;
|
|
25
|
+
left: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ChartPlotAreaOptions {
|
|
28
|
+
width?: number;
|
|
29
|
+
height?: number;
|
|
30
|
+
margins?: Partial<ChartPlotMargins>;
|
|
31
|
+
dynamicLeftMargin?: number;
|
|
32
|
+
isCompact?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ChartPlotAreaResult {
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
margin: ChartPlotMargins;
|
|
38
|
+
innerWidth: number;
|
|
39
|
+
innerHeight: number;
|
|
40
|
+
baselineY: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Pure calculation function for chart plot area bounds, baseline, and dynamic category margins.
|
|
44
|
+
*/
|
|
45
|
+
export declare function calculateChartPlotArea(options?: ChartPlotAreaOptions): ChartPlotAreaResult;
|
|
46
|
+
/**
|
|
47
|
+
* Unified Plot Area Calculation Hook.
|
|
48
|
+
* Calculates inner dimensions and baseline across all Folio Engine chart engines.
|
|
49
|
+
*/
|
|
50
|
+
export declare function useChartPlotArea(options?: ChartPlotAreaOptions): ChartPlotAreaResult;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D3 Math Primitives & Geometric Scaling Utilities
|
|
3
|
+
* Document Reference: docs/tasks/task7_1_contracts_d3_math_sanitizer.md
|
|
4
|
+
*
|
|
5
|
+
* Lightweight mathematical wrappers around tree-shakable d3-scale and d3-array modules.
|
|
6
|
+
* Strictly adheres to bundle-barrel-imports (direct subpackage imports) and js-early-exit.
|
|
7
|
+
*/
|
|
8
|
+
import { type ScaleLinear, type ScaleBand } from 'd3-scale';
|
|
9
|
+
import type { ChartSeries, ScatterPoint } from '../types/chart';
|
|
10
|
+
export interface Point2D {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ComputedBin {
|
|
15
|
+
x0: number;
|
|
16
|
+
x1: number;
|
|
17
|
+
count: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates a continuous linear scale with optional domain rounding (.nice())
|
|
21
|
+
*/
|
|
22
|
+
export declare function createLinearScale(domain: [number, number], range: [number, number], nice?: boolean): ScaleLinear<number, number>;
|
|
23
|
+
/**
|
|
24
|
+
* Creates a discrete band scale for categorical bar positioning
|
|
25
|
+
*/
|
|
26
|
+
export declare function createBandScale(domain: string[], range: [number, number], padding?: number): ScaleBand<string>;
|
|
27
|
+
export declare const HUMAN_FRIENDLY_STEPS: number[];
|
|
28
|
+
export declare function roundToHumanFriendlyStep(raw: number): number;
|
|
29
|
+
/**
|
|
30
|
+
* Calculates optimal bin width using the Freedman-Diaconis Rule:
|
|
31
|
+
* h = 2 * IQR(x) / cbrt(N)
|
|
32
|
+
* Rounded to the nearest human-friendly interval step (1, 2, 5, 10, 20, 25, 50, 100).
|
|
33
|
+
*/
|
|
34
|
+
export declare function calculateFreedmanDiaconisBinWidth(data: number[]): number;
|
|
35
|
+
export interface SummaryStats {
|
|
36
|
+
n: number;
|
|
37
|
+
mean: number;
|
|
38
|
+
median: number;
|
|
39
|
+
mode?: number | string;
|
|
40
|
+
stdDev: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Calculates sample size, mean, median, mode, and sample standard deviation
|
|
44
|
+
*/
|
|
45
|
+
export declare function computeSummaryStats(data: number[]): SummaryStats;
|
|
46
|
+
export interface HistogramBinOptions {
|
|
47
|
+
strategy?: 'auto' | 'custom';
|
|
48
|
+
binCount?: number;
|
|
49
|
+
bucketSize?: number;
|
|
50
|
+
min?: number;
|
|
51
|
+
max?: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Computes frequency distribution bins with standard half-open intervals [x0, x1),
|
|
55
|
+
* with the maximum value included in the final bin [xk-1, xk].
|
|
56
|
+
*/
|
|
57
|
+
export declare function computeHistogramBins(data: number[], options?: number | HistogramBinOptions): ComputedBin[];
|
|
58
|
+
/**
|
|
59
|
+
* Calculates extent [min, max] safely ignoring nulls, NaNs, and infinite values
|
|
60
|
+
*/
|
|
61
|
+
export declare function computeDataExtent(values: (number | null)[]): [number, number];
|
|
62
|
+
/**
|
|
63
|
+
* Generates a smooth cubic Bézier SVG path string ("M... C...") for line charts
|
|
64
|
+
*/
|
|
65
|
+
export declare function generateCubicBezierPath(points: Point2D[]): string;
|
|
66
|
+
/**
|
|
67
|
+
* Generates a straight linear SVG path string ("M... L...") for line charts
|
|
68
|
+
*/
|
|
69
|
+
export declare function generateStraightLinePath(points: Point2D[]): string;
|
|
70
|
+
export interface CornerRadii {
|
|
71
|
+
tl?: number;
|
|
72
|
+
tr?: number;
|
|
73
|
+
br?: number;
|
|
74
|
+
bl?: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Generates an SVG path string for a rectangle with individual corner radii.
|
|
78
|
+
* Essential for stacked bar charts where interior/middle boundaries must have 0 radius.
|
|
79
|
+
*/
|
|
80
|
+
export declare function createRoundedRectPath(x: number, y: number, w: number, h: number, radii?: CornerRadii): string;
|
|
81
|
+
/**
|
|
82
|
+
* Universal Two-Dropdown Sorting Engine
|
|
83
|
+
* Sorts tabular categories and series data consistently by category name, series values, or original order.
|
|
84
|
+
*/
|
|
85
|
+
export declare function applyChartSorting(categories: string[], series: ChartSeries[], sortField?: string, sortDirection?: 'asc' | 'desc'): {
|
|
86
|
+
categories: string[];
|
|
87
|
+
series: ChartSeries[];
|
|
88
|
+
};
|
|
89
|
+
export interface LinearRegressionResult {
|
|
90
|
+
slope: number;
|
|
91
|
+
intercept: number;
|
|
92
|
+
r: number;
|
|
93
|
+
rSquared: number;
|
|
94
|
+
n: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Computes standard least-squares linear regression (y = mx + b),
|
|
98
|
+
* Pearson correlation coefficient (r), and coefficient of determination (R²).
|
|
99
|
+
*/
|
|
100
|
+
export declare function computeLinearRegression(points: ScatterPoint[]): LinearRegressionResult;
|
|
101
|
+
export interface ConfidenceBandPoint {
|
|
102
|
+
x: number;
|
|
103
|
+
y0: number;
|
|
104
|
+
y1: number;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Computes 95% confidence interval ribbon bounds around the linear regression line.
|
|
108
|
+
*/
|
|
109
|
+
export declare function computeConfidenceBand(points: ScatterPoint[], m: number, b: number): ConfidenceBandPoint[];
|
|
110
|
+
/**
|
|
111
|
+
* Computes 95% confidence interval ribbon bounds along a non-linear curve (Polynomial or LOESS).
|
|
112
|
+
*/
|
|
113
|
+
export declare function computeCurveConfidenceBand(points: ScatterPoint[], curvePoints: Point2D[], degreesOfFreedom?: number): ConfidenceBandPoint[];
|
|
114
|
+
/**
|
|
115
|
+
* Computes locally estimated scatterplot smoothing (LOESS) curve coordinates
|
|
116
|
+
* using a tricube kernel weight.
|
|
117
|
+
*/
|
|
118
|
+
export declare function computeLoessCurve(points: ScatterPoint[], bandwidth?: number): Point2D[];
|
|
119
|
+
export interface CohortMeans {
|
|
120
|
+
meanX: number;
|
|
121
|
+
meanY: number;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Computes cohort averages (meanX, meanY) for mean quadrant crosshair guides.
|
|
125
|
+
*/
|
|
126
|
+
export declare function computeCohortMeans(points: ScatterPoint[]): CohortMeans;
|
|
127
|
+
/**
|
|
128
|
+
* Sorts scatter plot points by sheet order, x, y, point label, or group name.
|
|
129
|
+
*/
|
|
130
|
+
export declare function sortScatterPoints(points: ScatterPoint[], sortField?: string, sortDirection?: 'asc' | 'desc'): ScatterPoint[];
|
|
131
|
+
export interface PolynomialRegressionResult {
|
|
132
|
+
a: number;
|
|
133
|
+
b: number;
|
|
134
|
+
c: number;
|
|
135
|
+
rSquared: number;
|
|
136
|
+
points: Point2D[];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Computes quadratic polynomial regression (y = a*x^2 + b*x + c)
|
|
140
|
+
* Solves the normal equations using Cramer's rule and samples smooth curve coordinates.
|
|
141
|
+
*/
|
|
142
|
+
export declare function computePolynomialRegression(points: ScatterPoint[], sampleCount?: number): PolynomialRegressionResult;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tabular Data Sanitizer & Range Parser
|
|
3
|
+
* Document Reference: docs/tasks/task7_1_contracts_d3_math_sanitizer.md
|
|
4
|
+
*
|
|
5
|
+
* Enforces pure numbers (never coerces missing values/errors into 0),
|
|
6
|
+
* canonical string sanitization, automatic summary row detection,
|
|
7
|
+
* bounding box cell range parsing, and public CSV receipt generation.
|
|
8
|
+
*/
|
|
9
|
+
import type { ChartSeries } from '../types/chart';
|
|
10
|
+
export interface CellCoordinate {
|
|
11
|
+
col: number;
|
|
12
|
+
row: number;
|
|
13
|
+
}
|
|
14
|
+
export interface BoundingBoxRange {
|
|
15
|
+
sheetName?: string;
|
|
16
|
+
startCol: number;
|
|
17
|
+
startRow: number;
|
|
18
|
+
endCol: number;
|
|
19
|
+
endRow?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Trims whitespace and collapses consecutive spaces into single spaces.
|
|
23
|
+
*/
|
|
24
|
+
export declare function sanitizeString(val: unknown): string;
|
|
25
|
+
/**
|
|
26
|
+
* Parses numeric cell values strictly preserving null for blanks or formula errors.
|
|
27
|
+
* Never coerces empty cells, hyphens, or errors into 0.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parsePureNumber(val: unknown): number | null;
|
|
30
|
+
/**
|
|
31
|
+
* Extracts semantic units enclosed in parentheses or brackets from column headers.
|
|
32
|
+
* e.g., "Enrolment (learners)" -> "learners", "Budget [₱]" -> "₱", "Passing Rate (%)" -> "%"
|
|
33
|
+
*/
|
|
34
|
+
export declare function extractHeaderUnit(header: string): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Checks if a row label represents an aggregate summary row (Total, Grand Total, Average, Mean)
|
|
37
|
+
*/
|
|
38
|
+
export declare function isSummaryRow(rowLabel: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Converts spreadsheet column letters to 0-indexed column number (e.g., A -> 0, Z -> 25, AA -> 26).
|
|
41
|
+
*/
|
|
42
|
+
export declare function colLetterToIndex(letters: string): number;
|
|
43
|
+
/**
|
|
44
|
+
* Converts 0-indexed column number to spreadsheet column letters (e.g., 0 -> A, 25 -> Z, 26 -> AA).
|
|
45
|
+
*/
|
|
46
|
+
export declare function indexToColLetter(index: number): string;
|
|
47
|
+
/**
|
|
48
|
+
* Parses ranges such as "A5:D12", "A1:D", "A:D", "Sheet1!B2:F20", or "'Enrolment Summary'!A1:C15"
|
|
49
|
+
* into bounding 0-indexed grid coordinates. Supports open-ended column ranges.
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseRangeNotation(rangeStr: string): BoundingBoxRange | null;
|
|
52
|
+
/**
|
|
53
|
+
* Detects the bounding cell range of filled content within a 2D sheet matrix.
|
|
54
|
+
* Determines the minimum and maximum row and column indices containing non-empty cells,
|
|
55
|
+
* and returns the bounding A1-notation range (e.g. "A1:D14"), or null if matrix is empty.
|
|
56
|
+
*/
|
|
57
|
+
export declare function detectFilledRange(matrix: (string | number | null)[][]): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Generates an RFC 4180-compliant public CSV blob with all internal URLs and sensitive metadata stripped.
|
|
60
|
+
*/
|
|
61
|
+
export declare function generatePublicCsv(categories: string[], series: ChartSeries[], title?: string, unit?: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Formats a timestamp string safe for filesystem usage (e.g. "2026-10-24_032503").
|
|
64
|
+
*/
|
|
65
|
+
export declare function formatFilenameTimestamp(date?: Date): string;
|
|
66
|
+
/**
|
|
67
|
+
* Strips or replaces filesystem-reserved and control characters.
|
|
68
|
+
*/
|
|
69
|
+
export declare function sanitizeFilename(name: string): string;
|
|
70
|
+
export interface CsvFilenameOptions {
|
|
71
|
+
title?: string | null;
|
|
72
|
+
sheetName?: string | null;
|
|
73
|
+
chartId?: string | null;
|
|
74
|
+
date?: Date;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Generates the CSV export filename.
|
|
78
|
+
* Rules:
|
|
79
|
+
* - Uses the Chart Title if present.
|
|
80
|
+
* - If absent, falls back to the Sheet Name (tab name).
|
|
81
|
+
* - If both are absent, falls back to chartId or 'chart-data'.
|
|
82
|
+
* - Appends a timestamp: `${cleanBase}_${timestamp}.csv`
|
|
83
|
+
*/
|
|
84
|
+
export declare function generateCsvDownloadFilename(options: CsvFilenameOptions): string;
|