eidotter 0.6.0 → 0.10.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.md +0 -0
- package/README.md +0 -0
- package/dist/components/Accordion/components/AccordionFill.d.ts +0 -0
- package/dist/components/Accordion/components/Section.d.ts +0 -0
- package/dist/components/Accordion/components/index.d.ts +0 -0
- package/dist/components/Accordion/index.d.ts +0 -0
- package/dist/components/Alert/components/Alert.d.ts +0 -0
- package/dist/components/Alert/components/index.d.ts +0 -0
- package/dist/components/Alert/index.d.ts +0 -0
- package/dist/components/Badge/components/Badge.d.ts +0 -0
- package/dist/components/Badge/components/index.d.ts +0 -0
- package/dist/components/Badge/index.d.ts +0 -0
- package/dist/components/Breadcrumb/components/Breadcrumb.d.ts +0 -0
- package/dist/components/Breadcrumb/components/index.d.ts +0 -0
- package/dist/components/Breadcrumb/index.d.ts +0 -0
- package/dist/components/Button/components/Button.d.ts +1 -0
- package/dist/components/Button/components/index.d.ts +0 -0
- package/dist/components/Button/index.d.ts +0 -0
- package/dist/components/Card/components/Card.d.ts +0 -0
- package/dist/components/Card/components/index.d.ts +0 -0
- package/dist/components/Card/index.d.ts +0 -0
- package/dist/components/Checkbox/components/Checkbox.d.ts +1 -0
- package/dist/components/Checkbox/components/index.d.ts +0 -0
- package/dist/components/Checkbox/index.d.ts +0 -0
- package/dist/components/CommandPrompt/components/CommandPrompt.d.ts +0 -0
- package/dist/components/CommandPrompt/components/index.d.ts +0 -0
- package/dist/components/CommandPrompt/index.d.ts +0 -0
- package/dist/components/FilterBar/components/FilterBar.d.ts +0 -0
- package/dist/components/FilterBar/components/index.d.ts +0 -0
- package/dist/components/FilterBar/index.d.ts +0 -0
- package/dist/components/Icon/components/Icon.d.ts +0 -0
- package/dist/components/Icon/components/index.d.ts +0 -0
- package/dist/components/Icon/index.d.ts +0 -0
- package/dist/components/InlineExpand/components/InlineExpand.d.ts +58 -0
- package/dist/components/InlineExpand/components/index.d.ts +2 -0
- package/dist/components/InlineExpand/index.d.ts +2 -0
- package/dist/components/Input/components/Input.d.ts +0 -0
- package/dist/components/Input/components/index.d.ts +0 -0
- package/dist/components/Input/index.d.ts +0 -0
- package/dist/components/Modal/components/Modal.d.ts +0 -0
- package/dist/components/Modal/components/index.d.ts +0 -0
- package/dist/components/Modal/index.d.ts +0 -0
- package/dist/components/Progress/components/Progress.d.ts +0 -0
- package/dist/components/Progress/components/index.d.ts +0 -0
- package/dist/components/Progress/index.d.ts +0 -0
- package/dist/components/RetroEffects/components/RetroEffects.d.ts +0 -0
- package/dist/components/RetroEffects/components/index.d.ts +0 -0
- package/dist/components/RetroEffects/index.d.ts +0 -0
- package/dist/components/Stat/components/Stat.d.ts +4 -0
- package/dist/components/Stat/components/index.d.ts +0 -0
- package/dist/components/Stat/index.d.ts +0 -0
- package/dist/components/Switch/components/Switch.d.ts +0 -0
- package/dist/components/Switch/components/index.d.ts +0 -0
- package/dist/components/Switch/index.d.ts +0 -0
- package/dist/components/Tabs/components/Tabs.d.ts +0 -0
- package/dist/components/Tabs/components/index.d.ts +0 -0
- package/dist/components/Tabs/index.d.ts +0 -0
- package/dist/components/Tag/components/Tag.d.ts +41 -0
- package/dist/components/Tag/components/TagGroup.d.ts +19 -0
- package/dist/components/Tag/components/index.d.ts +4 -0
- package/dist/components/Tag/index.d.ts +2 -0
- package/dist/components/Terminal/components/Terminal.d.ts +0 -0
- package/dist/components/Terminal/components/index.d.ts +0 -0
- package/dist/components/Terminal/index.d.ts +0 -0
- package/dist/components/TextScramble/components/TextScramble.d.ts +13 -0
- package/dist/components/TextScramble/components/index.d.ts +2 -0
- package/dist/components/TextScramble/index.d.ts +1 -0
- package/dist/components/TimelineContainer/components/TimelineAxis.d.ts +10 -0
- package/dist/components/TimelineContainer/components/TimelineContainer.d.ts +57 -0
- package/dist/components/TimelineContainer/components/TimelineContent.d.ts +13 -0
- package/dist/components/TimelineContainer/components/TimelineEntryCard.d.ts +14 -0
- package/dist/components/TimelineContainer/components/ZoomControls.d.ts +12 -0
- package/dist/components/TimelineContainer/components/index.d.ts +4 -0
- package/dist/components/TimelineContainer/components/timelineUtils.d.ts +11 -0
- package/dist/components/TimelineContainer/components/timelineUtils.test.d.ts +1 -0
- package/dist/components/TimelineContainer/components/types.d.ts +42 -0
- package/dist/components/TimelineContainer/components/useSelection.d.ts +15 -0
- package/dist/components/TimelineContainer/components/useSelection.test.d.ts +1 -0
- package/dist/components/TimelineContainer/components/useZoom.d.ts +19 -0
- package/dist/components/TimelineContainer/components/useZoom.test.d.ts +1 -0
- package/dist/components/TimelineContainer/components/views/DayView.d.ts +6 -0
- package/dist/components/TimelineContainer/components/views/HourView.d.ts +6 -0
- package/dist/components/TimelineContainer/components/views/MonthView.d.ts +6 -0
- package/dist/components/TimelineContainer/components/views/YearView.d.ts +6 -0
- package/dist/components/TimelineContainer/components/views/index.d.ts +4 -0
- package/dist/components/TimelineContainer/index.d.ts +3 -0
- package/dist/components/TimelineNode/components/TimelineNode.d.ts +0 -0
- package/dist/components/TimelineNode/components/index.d.ts +0 -0
- package/dist/components/TimelineNode/index.d.ts +0 -0
- package/dist/components/registry.d.ts +0 -0
- package/dist/eidotter.css +1 -1
- package/dist/index.d.ts +13 -1
- package/dist/index.es.js +1543 -602
- package/dist/index.umd.js +5 -5
- package/guidelines/README.md +0 -0
- package/guidelines/components.md +0 -0
- package/guidelines/patterns.md +0 -0
- package/guidelines/tokens.md +0 -0
- package/package.json +2 -2
- package/src/styles/theme.amber-mono.css +30 -0
- package/src/styles/theme.cga-amber.css +30 -0
- package/src/styles/theme.cga-mode4-p0.css +0 -0
- package/src/styles/theme.cga-mode4-p1.css +0 -0
- package/src/styles/theme.cga-mode5.css +0 -0
- package/src/styles/tokens.css +30 -0
- package/tailwind.preset.cjs +0 -0
package/LICENSE.md
CHANGED
|
File without changes
|
package/README.md
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './InlineExpand.css';
|
|
3
|
+
export interface InlineExpandSource {
|
|
4
|
+
/** Link text displayed as accessible label */
|
|
5
|
+
title: string;
|
|
6
|
+
/** URL — must be a valid absolute URL (http, https, or mailto) */
|
|
7
|
+
url: string;
|
|
8
|
+
/** Optional favicon URL; falls back to generic link icon */
|
|
9
|
+
favicon?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface InlineExpandProps {
|
|
12
|
+
/**
|
|
13
|
+
* Trigger text or element displayed inline — the clickable toggle
|
|
14
|
+
*/
|
|
15
|
+
children: React.ReactNode;
|
|
16
|
+
/**
|
|
17
|
+
* Content revealed when expanded — accepts ReactNode for composability
|
|
18
|
+
*/
|
|
19
|
+
content: React.ReactNode;
|
|
20
|
+
/**
|
|
21
|
+
* Whether the content is expanded on first render (uncontrolled mode)
|
|
22
|
+
*/
|
|
23
|
+
defaultExpanded?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Controlled expanded state — overrides internal state when provided
|
|
26
|
+
*/
|
|
27
|
+
expanded?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Called when the expand/collapse state changes
|
|
30
|
+
*/
|
|
31
|
+
onToggle?: (isExpanded: boolean) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Optional citation sources rendered after expanded content
|
|
34
|
+
*/
|
|
35
|
+
sources?: InlineExpandSource[];
|
|
36
|
+
/**
|
|
37
|
+
* Additional CSS class names
|
|
38
|
+
*/
|
|
39
|
+
className?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Inline disclosure widget that reveals content when trigger text is clicked.
|
|
43
|
+
*
|
|
44
|
+
* Unlike Section/Accordion (block-level, bordered sections), InlineExpand is
|
|
45
|
+
* designed for inline use within paragraphs and prose content.
|
|
46
|
+
*
|
|
47
|
+
* Features:
|
|
48
|
+
* - Controlled and uncontrolled modes
|
|
49
|
+
* - Native <button> trigger for full keyboard/screen reader support
|
|
50
|
+
* - Optional citation sources with favicons
|
|
51
|
+
* - DOS-authentic styling with phosphor glow and CGA tokens
|
|
52
|
+
* - WCAG 2.1 AA compliant
|
|
53
|
+
*
|
|
54
|
+
* Content stays in the DOM when collapsed (with visibility: hidden) to enable
|
|
55
|
+
* smooth CSS transition exit animations. This differs from Section which
|
|
56
|
+
* unmounts content on collapse via conditional rendering.
|
|
57
|
+
*/
|
|
58
|
+
export declare const InlineExpand: React.FC<InlineExpandProps>;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './Tag.css';
|
|
3
|
+
export interface TagProps {
|
|
4
|
+
/** Tag display text */
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
/** Visual variant */
|
|
7
|
+
variant?: 'default' | 'outlined' | 'filled';
|
|
8
|
+
/** The size of the tag */
|
|
9
|
+
size?: 'small' | 'medium';
|
|
10
|
+
/** CGA color token for border and text (e.g. '--color-cga-bright-cyan') */
|
|
11
|
+
color?: string;
|
|
12
|
+
/** Whether the tag appears in selected/active state */
|
|
13
|
+
selected?: boolean;
|
|
14
|
+
/** Whether to show a close button */
|
|
15
|
+
closeable?: boolean;
|
|
16
|
+
/** Whether the tag is disabled */
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/** Click handler for the tag body */
|
|
19
|
+
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
|
20
|
+
/** Close handler, called after dismiss animation completes */
|
|
21
|
+
onClose?: () => void;
|
|
22
|
+
/** Additional CSS class name */
|
|
23
|
+
className?: string;
|
|
24
|
+
/** Accessible label for the tag */
|
|
25
|
+
'aria-label'?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* DOS-styled Tag component for interactive labels
|
|
29
|
+
*
|
|
30
|
+
* Extends Badge's display-only approach with click, close, and selection
|
|
31
|
+
* behaviors. Use for content labels, category indicators, and filter chips.
|
|
32
|
+
*
|
|
33
|
+
* Features:
|
|
34
|
+
* - Three visual variants (default, outlined, filled)
|
|
35
|
+
* - Optional close button with DOS-authentic [x]
|
|
36
|
+
* - Toggle-able selected state
|
|
37
|
+
* - Custom CGA color support via CSS custom property
|
|
38
|
+
* - Keyboard accessible (Enter/Space to click, Delete/Backspace to close)
|
|
39
|
+
* - WCAG 2.1 AA compliant
|
|
40
|
+
*/
|
|
41
|
+
export declare const Tag: React.FC<TagProps>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface TagGroupProps {
|
|
3
|
+
/** Tag elements to render */
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
/** Spacing between tags */
|
|
6
|
+
gap?: 'tight' | 'normal' | 'loose';
|
|
7
|
+
/** Wrap tags to multiple lines (default true) */
|
|
8
|
+
wrap?: boolean;
|
|
9
|
+
/** Additional CSS class name */
|
|
10
|
+
className?: string;
|
|
11
|
+
/** Accessible label for the tag group */
|
|
12
|
+
'aria-label'?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Wrapper for rendering multiple Tag components with consistent spacing
|
|
16
|
+
*
|
|
17
|
+
* Provides flex layout with configurable gap and optional wrapping.
|
|
18
|
+
*/
|
|
19
|
+
export declare const TagGroup: React.FC<TagGroupProps>;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './TextScramble.css';
|
|
3
|
+
export interface TextScrambleProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
|
|
4
|
+
/** The text to display with scramble effect */
|
|
5
|
+
children: string;
|
|
6
|
+
/** Milliseconds per character position (default: 40) */
|
|
7
|
+
speed?: number;
|
|
8
|
+
/** Character set to use for scramble effect */
|
|
9
|
+
characters?: string;
|
|
10
|
+
/** Milliseconds before scramble starts (default: 0) */
|
|
11
|
+
delay?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const TextScramble: React.FC<TextScrambleProps>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './TimelineAxis.css';
|
|
3
|
+
export interface TimelineAxisProps {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Vertical spine connecting timeline nodes.
|
|
8
|
+
* Wraps content with a continuous vertical line on the left side.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TimelineAxis: React.FC<TimelineAxisProps>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { TimelineEntry, ZoomLevel } from './types';
|
|
3
|
+
import './TimelineContainer.css';
|
|
4
|
+
import './views/views.css';
|
|
5
|
+
export interface TimelineContainerProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
6
|
+
/** Timeline entries to display */
|
|
7
|
+
entries: TimelineEntry[];
|
|
8
|
+
/**
|
|
9
|
+
* Controlled zoom level — overrides internal state when provided.
|
|
10
|
+
* Use with `onZoomChange` for full control.
|
|
11
|
+
*/
|
|
12
|
+
zoomLevel?: ZoomLevel;
|
|
13
|
+
/**
|
|
14
|
+
* Initial zoom level for uncontrolled mode
|
|
15
|
+
* @default 'month'
|
|
16
|
+
*/
|
|
17
|
+
defaultZoomLevel?: ZoomLevel;
|
|
18
|
+
/** Callback fired when the zoom level changes */
|
|
19
|
+
onZoomChange?: (level: ZoomLevel) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Controlled selection — overrides internal state when provided.
|
|
22
|
+
* `null` means nothing selected, `undefined` means uncontrolled.
|
|
23
|
+
*/
|
|
24
|
+
selectedEntryId?: string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Initial selected entry for uncontrolled mode
|
|
27
|
+
* @default null
|
|
28
|
+
*/
|
|
29
|
+
defaultSelectedEntryId?: string | null;
|
|
30
|
+
/** Callback fired when entry selection changes */
|
|
31
|
+
onSelectEntry?: (entryId: string | null) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Sort order for entries within buckets
|
|
34
|
+
* @default 'desc'
|
|
35
|
+
*/
|
|
36
|
+
sortOrder?: 'asc' | 'desc';
|
|
37
|
+
/**
|
|
38
|
+
* Enable Ctrl/Cmd + scroll wheel to zoom
|
|
39
|
+
* @default true
|
|
40
|
+
*/
|
|
41
|
+
scrollToZoom?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Enable keyboard shortcuts (Ctrl+=/-/0, Escape)
|
|
44
|
+
* @default true
|
|
45
|
+
*/
|
|
46
|
+
keyboardShortcuts?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* TimelineContainer - Interactive multi-level zoom timeline
|
|
50
|
+
*
|
|
51
|
+
* A composite timeline component with 4 zoom levels (year, month, day, hour),
|
|
52
|
+
* entry selection, keyboard shortcuts, and scroll-to-zoom. Uses DOS/CGA
|
|
53
|
+
* aesthetic with eidotter primitives (TimelineNode, Card, Badge, Tag).
|
|
54
|
+
*
|
|
55
|
+
* Supports both controlled and uncontrolled patterns for zoom and selection.
|
|
56
|
+
*/
|
|
57
|
+
export declare const TimelineContainer: React.FC<TimelineContainerProps>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ZoomLevel, DateBucket } from './types';
|
|
3
|
+
export interface TimelineContentProps {
|
|
4
|
+
zoomLevel: ZoomLevel;
|
|
5
|
+
buckets: readonly DateBucket[];
|
|
6
|
+
selectedEntryId: string | null;
|
|
7
|
+
onEntrySelect?: (entryId: string) => void;
|
|
8
|
+
onBucketClick?: (bucket: DateBucket) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* View switcher that renders the appropriate zoom level view.
|
|
12
|
+
*/
|
|
13
|
+
export declare const TimelineContent: React.FC<TimelineContentProps>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { TimelineEntry } from './types';
|
|
3
|
+
export interface TimelineEntryCardProps {
|
|
4
|
+
entry: TimelineEntry;
|
|
5
|
+
isSelected: boolean;
|
|
6
|
+
onSelect?: (id: string) => void;
|
|
7
|
+
footer?: React.ReactNode;
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Memoized entry card wrapper. On selection change, only 2 cards re-render
|
|
12
|
+
* (previously selected + newly selected) instead of all N.
|
|
13
|
+
*/
|
|
14
|
+
export declare const TimelineEntryCard: React.NamedExoticComponent<TimelineEntryCardProps>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ZoomLevel } from './types';
|
|
3
|
+
import './ZoomControls.css';
|
|
4
|
+
export interface ZoomControlsProps {
|
|
5
|
+
zoomLevel: ZoomLevel;
|
|
6
|
+
canZoomIn: boolean;
|
|
7
|
+
canZoomOut: boolean;
|
|
8
|
+
onZoomIn: () => void;
|
|
9
|
+
onZoomOut: () => void;
|
|
10
|
+
onReset: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare const ZoomControls: React.FC<ZoomControlsProps>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeline utility functions for grouping entries and formatting dates.
|
|
3
|
+
* Pure functions with zero external dependencies — uses only native Date/Intl.
|
|
4
|
+
*/
|
|
5
|
+
import type { TimelineEntry, DateBucket, ZoomLevel } from './types';
|
|
6
|
+
/** Format a full timestamp: "Mar 15, 2024 at 2:30pm" */
|
|
7
|
+
export declare function formatTimestamp(iso: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Group timeline entries into DateBuckets based on the current zoom level.
|
|
10
|
+
*/
|
|
11
|
+
export declare function groupEntriesByZoom(entries: TimelineEntry[], zoomLevel: ZoomLevel, sortOrder?: 'asc' | 'desc'): DateBucket[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for TimelineContainer.
|
|
3
|
+
* Extracted to a separate file to avoid circular imports between
|
|
4
|
+
* the component, hooks, and view sub-components.
|
|
5
|
+
*/
|
|
6
|
+
/** Ordered zoom levels from least to most detail */
|
|
7
|
+
export declare const ZOOM_LEVELS: readonly ["year", "month", "day", "hour"];
|
|
8
|
+
/** Timeline zoom level */
|
|
9
|
+
export type ZoomLevel = (typeof ZOOM_LEVELS)[number];
|
|
10
|
+
export interface TimelineEntry {
|
|
11
|
+
/** Unique identifier for this entry */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Entry category — not rendered by default; available for consumer-side filtering/styling. Consider discriminated union if type-specific fields are added. */
|
|
14
|
+
type: 'event' | 'project' | 'milestone';
|
|
15
|
+
/** ISO 8601 date string */
|
|
16
|
+
date: string;
|
|
17
|
+
/** Display title */
|
|
18
|
+
title: string;
|
|
19
|
+
/** Entry body content */
|
|
20
|
+
content: string;
|
|
21
|
+
/** Categorization tags */
|
|
22
|
+
tags: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface DateBucket {
|
|
25
|
+
/** Human-readable label, e.g. "2024", "March 2024", "Mar 15" */
|
|
26
|
+
label: string;
|
|
27
|
+
/** ISO 8601 period start for sorting */
|
|
28
|
+
periodStart: string;
|
|
29
|
+
/** Entries grouped into this time bucket */
|
|
30
|
+
entries: readonly TimelineEntry[];
|
|
31
|
+
}
|
|
32
|
+
/** Shared props interface for zoom-level view components */
|
|
33
|
+
export interface TimelineViewProps {
|
|
34
|
+
/** Grouped entry buckets to display */
|
|
35
|
+
buckets: readonly DateBucket[];
|
|
36
|
+
/** Callback when an entry is selected */
|
|
37
|
+
onEntrySelect?: (id: string) => void;
|
|
38
|
+
/** Currently selected entry ID */
|
|
39
|
+
selectedEntryId?: string | null;
|
|
40
|
+
/** Callback when a bucket header is clicked (for drill-down) */
|
|
41
|
+
onBucketClick?: (bucket: DateBucket) => void;
|
|
42
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface UseSelectionOptions {
|
|
2
|
+
selectedEntryId?: string | null;
|
|
3
|
+
defaultSelectedEntryId?: string | null;
|
|
4
|
+
onSelectEntry?: (entryId: string | null) => void;
|
|
5
|
+
}
|
|
6
|
+
export interface UseSelectionReturn {
|
|
7
|
+
selectedEntryId: string | null;
|
|
8
|
+
select: (entryId: string) => void;
|
|
9
|
+
deselect: () => void;
|
|
10
|
+
toggle: (entryId: string) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Manages entry selection with controlled/uncontrolled pattern.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useSelection({ selectedEntryId: controlledId, defaultSelectedEntryId, onSelectEntry, }?: UseSelectionOptions): UseSelectionReturn;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ZoomLevel } from './types';
|
|
2
|
+
export interface UseZoomOptions {
|
|
3
|
+
zoomLevel?: ZoomLevel;
|
|
4
|
+
defaultZoomLevel?: ZoomLevel;
|
|
5
|
+
onZoomChange?: (level: ZoomLevel) => void;
|
|
6
|
+
}
|
|
7
|
+
export interface UseZoomReturn {
|
|
8
|
+
zoomLevel: ZoomLevel;
|
|
9
|
+
zoomIn: () => void;
|
|
10
|
+
zoomOut: () => void;
|
|
11
|
+
reset: () => void;
|
|
12
|
+
canZoomIn: boolean;
|
|
13
|
+
canZoomOut: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Manages zoom level with controlled/uncontrolled pattern.
|
|
17
|
+
* Zoom "in" means more detail (year -> month -> day -> hour).
|
|
18
|
+
*/
|
|
19
|
+
export declare function useZoom({ zoomLevel: controlledLevel, defaultZoomLevel, onZoomChange, }?: UseZoomOptions): UseZoomReturn;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|