eidotter 0.36.0 → 0.37.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/README.md +19 -0
- package/dist/components/AIText/components/AIText.d.ts +0 -1
- package/dist/components/AIText/components/AIText.js +23 -0
- package/dist/components/AIText/components/index.d.ts +2 -2
- package/dist/components/AIText/components/index.js +1 -0
- package/dist/components/AIText/index.d.ts +2 -2
- package/dist/components/AIText/index.js +1 -0
- package/dist/components/Accordion/components/AccordionFill.d.ts +0 -1
- package/dist/components/Accordion/components/AccordionFill.js +12 -0
- package/dist/components/Accordion/components/Section.d.ts +0 -1
- package/dist/components/Accordion/components/Section.js +22 -0
- package/dist/components/Accordion/components/index.d.ts +4 -4
- package/dist/components/Accordion/components/index.js +2 -0
- package/dist/components/Accordion/index.d.ts +1 -1
- package/dist/components/Accordion/index.js +1 -0
- package/dist/components/Alert/components/Alert.d.ts +0 -1
- package/dist/components/Alert/components/Alert.js +51 -0
- package/dist/components/Alert/components/index.d.ts +2 -2
- package/dist/components/Alert/components/index.js +1 -0
- package/dist/components/Alert/index.d.ts +1 -1
- package/dist/components/Alert/index.js +1 -0
- package/dist/components/Badge/components/Badge.d.ts +0 -1
- package/dist/components/Badge/components/Badge.js +31 -0
- package/dist/components/Badge/components/index.d.ts +2 -2
- package/dist/components/Badge/components/index.js +1 -0
- package/dist/components/Badge/index.d.ts +2 -2
- package/dist/components/Badge/index.js +1 -0
- package/dist/components/Brand/components/BrandLockup.js +14 -0
- package/dist/components/Brand/components/Logo.d.ts +0 -1
- package/dist/components/Brand/components/Logo.js +22 -0
- package/dist/components/Brand/components/Wordmark.d.ts +0 -1
- package/dist/components/Brand/components/Wordmark.js +13 -0
- package/dist/components/Brand/components/index.d.ts +6 -6
- package/dist/components/Brand/components/index.js +3 -0
- package/dist/components/Brand/index.d.ts +1 -1
- package/dist/components/Brand/index.js +1 -0
- package/dist/components/Breadcrumb/components/Breadcrumb.d.ts +0 -1
- package/dist/components/Breadcrumb/components/Breadcrumb.js +29 -0
- package/dist/components/Breadcrumb/components/index.d.ts +2 -2
- package/dist/components/Breadcrumb/components/index.js +1 -0
- package/dist/components/Breadcrumb/index.d.ts +2 -2
- package/dist/components/Breadcrumb/index.js +1 -0
- package/dist/components/Button/components/Button.d.ts +0 -2
- package/dist/components/Button/components/Button.js +49 -0
- package/dist/components/Button/components/index.d.ts +2 -2
- package/dist/components/Button/components/index.js +1 -0
- package/dist/components/Button/index.d.ts +2 -2
- package/dist/components/Button/index.js +1 -0
- package/dist/components/Card/components/Card.d.ts +0 -1
- package/dist/components/Card/components/Card.js +16 -0
- package/dist/components/Card/components/index.d.ts +2 -2
- package/dist/components/Card/components/index.js +1 -0
- package/dist/components/Card/index.d.ts +2 -2
- package/dist/components/Card/index.js +1 -0
- package/dist/components/Chat/components/ChatContainer.d.ts +1 -1
- package/dist/components/Chat/components/ChatContainer.js +20 -0
- package/dist/components/Chat/components/ChatHistory.d.ts +0 -1
- package/dist/components/Chat/components/ChatHistory.js +27 -0
- package/dist/components/Chat/components/ChatInput.d.ts +0 -2
- package/dist/components/Chat/components/ChatInput.js +37 -0
- package/dist/components/Chat/components/ChatMessage.d.ts +0 -2
- package/dist/components/Chat/components/ChatMessage.js +18 -0
- package/dist/components/Chat/components/index.d.ts +8 -8
- package/dist/components/Chat/components/index.js +4 -0
- package/dist/components/Chat/index.d.ts +2 -2
- package/dist/components/Chat/index.js +1 -0
- package/dist/components/Checkbox/components/Checkbox.d.ts +0 -2
- package/dist/components/Checkbox/components/Checkbox.js +11 -0
- package/dist/components/Checkbox/components/index.d.ts +2 -2
- package/dist/components/Checkbox/components/index.js +1 -0
- package/dist/components/Checkbox/index.d.ts +2 -2
- package/dist/components/Checkbox/index.js +1 -0
- package/dist/components/ChecklistRow/components/ChecklistRow.js +18 -0
- package/dist/components/ChecklistRow/components/index.d.ts +2 -2
- package/dist/components/ChecklistRow/components/index.js +1 -0
- package/dist/components/ChecklistRow/index.d.ts +2 -2
- package/dist/components/ChecklistRow/index.js +1 -0
- package/dist/components/CmdPalette/components/CmdPalette.d.ts +0 -2
- package/dist/components/CmdPalette/components/CmdPalette.js +169 -0
- package/dist/components/CmdPalette/components/index.d.ts +2 -2
- package/dist/components/CmdPalette/components/index.js +1 -0
- package/dist/components/CmdPalette/index.d.ts +2 -2
- package/dist/components/CmdPalette/index.js +1 -0
- package/dist/components/CommandPrompt/components/CommandPrompt.d.ts +0 -2
- package/dist/components/CommandPrompt/components/CommandPrompt.js +34 -0
- package/dist/components/CommandPrompt/components/index.d.ts +2 -2
- package/dist/components/CommandPrompt/components/index.js +1 -0
- package/dist/components/CommandPrompt/index.d.ts +1 -1
- package/dist/components/CommandPrompt/index.js +1 -0
- package/dist/components/CopyButton/components/CopyButton.js +50 -0
- package/dist/components/CopyButton/components/index.d.ts +2 -2
- package/dist/components/CopyButton/components/index.js +1 -0
- package/dist/components/CopyButton/index.d.ts +2 -2
- package/dist/components/CopyButton/index.js +1 -0
- package/dist/components/DosFigure/components/DosFigure.d.ts +0 -1
- package/dist/components/DosFigure/components/DosFigure.js +26 -0
- package/dist/components/DosFigure/components/index.d.ts +2 -2
- package/dist/components/DosFigure/components/index.js +1 -0
- package/dist/components/DosFigure/index.d.ts +2 -2
- package/dist/components/DosFigure/index.js +1 -0
- package/dist/components/EmptyState/components/EmptyState.js +18 -0
- package/dist/components/EmptyState/components/index.d.ts +2 -2
- package/dist/components/EmptyState/components/index.js +1 -0
- package/dist/components/EmptyState/index.d.ts +2 -2
- package/dist/components/EmptyState/index.js +1 -0
- package/dist/components/FilterBar/components/FilterBar.d.ts +0 -1
- package/dist/components/FilterBar/components/FilterBar.js +120 -0
- package/dist/components/FilterBar/components/index.d.ts +2 -2
- package/dist/components/FilterBar/components/index.js +1 -0
- package/dist/components/FilterBar/index.d.ts +2 -2
- package/dist/components/FilterBar/index.js +1 -0
- package/dist/components/Footer/components/Footer.d.ts +0 -1
- package/dist/components/Footer/components/Footer.js +18 -0
- package/dist/components/Footer/components/index.d.ts +2 -2
- package/dist/components/Footer/components/index.js +1 -0
- package/dist/components/Footer/index.d.ts +2 -2
- package/dist/components/Footer/index.js +1 -0
- package/dist/components/Header/components/Header.d.ts +1 -2
- package/dist/components/Header/components/Header.js +13 -0
- package/dist/components/Header/components/index.d.ts +2 -2
- package/dist/components/Header/components/index.js +1 -0
- package/dist/components/Header/index.d.ts +2 -2
- package/dist/components/Header/index.js +1 -0
- package/dist/components/Icon/components/Icon.d.ts +0 -1
- package/dist/components/Icon/components/Icon.js +78 -0
- package/dist/components/Icon/components/index.d.ts +2 -2
- package/dist/components/Icon/components/index.js +1 -0
- package/dist/components/Icon/index.d.ts +1 -1
- package/dist/components/Icon/index.js +1 -0
- package/dist/components/InlineExpand/components/InlineExpand.d.ts +0 -1
- package/dist/components/InlineExpand/components/InlineExpand.js +50 -0
- package/dist/components/InlineExpand/components/index.d.ts +2 -2
- package/dist/components/InlineExpand/components/index.js +1 -0
- package/dist/components/InlineExpand/index.d.ts +2 -2
- package/dist/components/InlineExpand/index.js +1 -0
- package/dist/components/InlineLink/components/InlineLink.d.ts +0 -1
- package/dist/components/InlineLink/components/InlineLink.js +61 -0
- package/dist/components/InlineLink/components/index.d.ts +2 -2
- package/dist/components/InlineLink/components/index.js +1 -0
- package/dist/components/InlineLink/index.d.ts +2 -2
- package/dist/components/InlineLink/index.js +1 -0
- package/dist/components/Input/components/Input.d.ts +0 -1
- package/dist/components/Input/components/Input.js +18 -0
- package/dist/components/Input/components/index.d.ts +2 -2
- package/dist/components/Input/components/index.js +1 -0
- package/dist/components/Input/index.d.ts +1 -1
- package/dist/components/Input/index.js +1 -0
- package/dist/components/LabeledProgress/components/LabeledProgress.d.ts +0 -1
- package/dist/components/LabeledProgress/components/LabeledProgress.js +16 -0
- package/dist/components/LabeledProgress/components/index.d.ts +2 -2
- package/dist/components/LabeledProgress/components/index.js +1 -0
- package/dist/components/LabeledProgress/index.d.ts +2 -2
- package/dist/components/LabeledProgress/index.js +1 -0
- package/dist/components/LedgerRow/components/LedgerRow.js +15 -0
- package/dist/components/LedgerRow/components/index.d.ts +2 -2
- package/dist/components/LedgerRow/components/index.js +1 -0
- package/dist/components/LedgerRow/index.d.ts +2 -2
- package/dist/components/LedgerRow/index.js +1 -0
- package/dist/components/LegalPage/components/LegalPage.d.ts +0 -1
- package/dist/components/LegalPage/components/LegalPage.js +11 -0
- package/dist/components/LegalPage/components/clauses.js +28 -0
- package/dist/components/LegalPage/components/index.d.ts +4 -4
- package/dist/components/LegalPage/components/index.js +2 -0
- package/dist/components/LegalPage/index.d.ts +2 -2
- package/dist/components/LegalPage/index.js +1 -0
- package/dist/components/Lightbox/components/Lightbox.d.ts +1 -3
- package/dist/components/Lightbox/components/Lightbox.js +97 -0
- package/dist/components/Lightbox/components/index.d.ts +2 -2
- package/dist/components/Lightbox/components/index.js +1 -0
- package/dist/components/Lightbox/index.d.ts +2 -2
- package/dist/components/Lightbox/index.js +1 -0
- package/dist/components/Modal/components/Modal.d.ts +0 -2
- package/dist/components/Modal/components/Modal.js +37 -0
- package/dist/components/Modal/components/index.d.ts +2 -2
- package/dist/components/Modal/components/index.js +1 -0
- package/dist/components/Modal/index.d.ts +2 -2
- package/dist/components/Modal/index.js +1 -0
- package/dist/components/Nav/components/Nav.d.ts +0 -1
- package/dist/components/Nav/components/Nav.js +69 -0
- package/dist/components/Nav/components/index.d.ts +2 -2
- package/dist/components/Nav/components/index.js +1 -0
- package/dist/components/Nav/index.d.ts +2 -2
- package/dist/components/Nav/index.js +1 -0
- package/dist/components/Notification/components/Notification.d.ts +1 -2
- package/dist/components/Notification/components/Notification.js +34 -0
- package/dist/components/Notification/components/index.d.ts +2 -2
- package/dist/components/Notification/components/index.js +1 -0
- package/dist/components/Notification/index.d.ts +1 -1
- package/dist/components/Notification/index.js +1 -0
- package/dist/components/Progress/components/Progress.d.ts +0 -1
- package/dist/components/Progress/components/Progress.js +72 -0
- package/dist/components/Progress/components/index.d.ts +2 -2
- package/dist/components/Progress/components/index.js +1 -0
- package/dist/components/Progress/index.d.ts +2 -2
- package/dist/components/Progress/index.js +1 -0
- package/dist/components/RetroEffects/components/RetroEffects.d.ts +0 -1
- package/dist/components/RetroEffects/components/RetroEffects.js +163 -0
- package/dist/components/RetroEffects/components/index.d.ts +2 -2
- package/dist/components/RetroEffects/components/index.js +1 -0
- package/dist/components/RetroEffects/index.d.ts +2 -2
- package/dist/components/RetroEffects/index.js +1 -0
- package/dist/components/SectionHeading/components/SectionHeading.js +18 -0
- package/dist/components/SectionHeading/components/index.d.ts +2 -2
- package/dist/components/SectionHeading/components/index.js +1 -0
- package/dist/components/SectionHeading/index.d.ts +2 -2
- package/dist/components/SectionHeading/index.js +1 -0
- package/dist/components/Select/components/Select.js +14 -0
- package/dist/components/Select/components/index.d.ts +2 -2
- package/dist/components/Select/components/index.js +1 -0
- package/dist/components/Select/index.d.ts +2 -2
- package/dist/components/Select/index.js +1 -0
- package/dist/components/Separator/components/Separator.d.ts +0 -1
- package/dist/components/Separator/components/Separator.js +11 -0
- package/dist/components/Separator/components/index.d.ts +2 -2
- package/dist/components/Separator/components/index.js +1 -0
- package/dist/components/Separator/index.d.ts +2 -2
- package/dist/components/Separator/index.js +1 -0
- package/dist/components/Skeleton/components/Skeleton.d.ts +0 -1
- package/dist/components/Skeleton/components/Skeleton.js +52 -0
- package/dist/components/Skeleton/components/index.d.ts +2 -2
- package/dist/components/Skeleton/components/index.js +1 -0
- package/dist/components/Skeleton/index.d.ts +2 -2
- package/dist/components/Skeleton/index.js +1 -0
- package/dist/components/Stat/components/Stat.d.ts +0 -1
- package/dist/components/Stat/components/Stat.js +42 -0
- package/dist/components/Stat/components/index.d.ts +2 -2
- package/dist/components/Stat/components/index.js +1 -0
- package/dist/components/Stat/index.d.ts +2 -2
- package/dist/components/Stat/index.js +1 -0
- package/dist/components/Switch/components/Switch.d.ts +0 -1
- package/dist/components/Switch/components/Switch.js +11 -0
- package/dist/components/Switch/components/index.d.ts +2 -2
- package/dist/components/Switch/components/index.js +1 -0
- package/dist/components/Switch/index.d.ts +2 -2
- package/dist/components/Switch/index.js +1 -0
- package/dist/components/Tabs/components/Tabs.d.ts +0 -1
- package/dist/components/Tabs/components/Tabs.js +54 -0
- package/dist/components/Tabs/components/index.d.ts +2 -2
- package/dist/components/Tabs/components/index.js +1 -0
- package/dist/components/Tabs/index.d.ts +2 -2
- package/dist/components/Tabs/index.js +1 -0
- package/dist/components/Tag/components/Tag.d.ts +0 -1
- package/dist/components/Tag/components/Tag.js +46 -0
- package/dist/components/Tag/components/TagGroup.js +15 -0
- package/dist/components/Tag/components/index.d.ts +4 -4
- package/dist/components/Tag/components/index.js +2 -0
- package/dist/components/Tag/index.d.ts +2 -2
- package/dist/components/Tag/index.js +1 -0
- package/dist/components/Terminal/components/Terminal.d.ts +0 -2
- package/dist/components/Terminal/components/Terminal.js +43 -0
- package/dist/components/Terminal/components/index.d.ts +2 -2
- package/dist/components/Terminal/components/index.js +1 -0
- package/dist/components/Terminal/index.d.ts +1 -1
- package/dist/components/Terminal/index.js +1 -0
- package/dist/components/TextScramble/components/TextScramble.d.ts +0 -1
- package/dist/components/TextScramble/components/TextScramble.js +14 -0
- package/dist/components/TextScramble/components/index.d.ts +2 -2
- package/dist/components/TextScramble/components/index.js +1 -0
- package/dist/components/TextScramble/index.d.ts +1 -1
- package/dist/components/TextScramble/index.js +1 -0
- package/dist/components/TimelineContainer/components/MasterDetailLayout.d.ts +1 -3
- package/dist/components/TimelineContainer/components/MasterDetailLayout.js +77 -0
- package/dist/components/TimelineContainer/components/TimelineAxis.d.ts +0 -1
- package/dist/components/TimelineContainer/components/TimelineAxis.js +8 -0
- package/dist/components/TimelineContainer/components/TimelineContainer.d.ts +1 -3
- package/dist/components/TimelineContainer/components/TimelineContainer.js +218 -0
- package/dist/components/TimelineContainer/components/TimelineContent.d.ts +1 -1
- package/dist/components/TimelineContainer/components/TimelineContent.js +23 -0
- package/dist/components/TimelineContainer/components/TimelineEntryCard.d.ts +1 -2
- package/dist/components/TimelineContainer/components/TimelineEntryCard.js +50 -0
- package/dist/components/TimelineContainer/components/ZoomControls.d.ts +2 -3
- package/dist/components/TimelineContainer/components/ZoomControls.js +16 -0
- package/dist/components/TimelineContainer/components/index.d.ts +5 -5
- package/dist/components/TimelineContainer/components/index.js +2 -0
- package/dist/components/TimelineContainer/components/timelineUtils.d.ts +1 -1
- package/dist/components/TimelineContainer/components/timelineUtils.js +185 -0
- package/dist/components/TimelineContainer/components/types.js +7 -0
- package/dist/components/TimelineContainer/components/useDrillDown.d.ts +1 -1
- package/dist/components/TimelineContainer/components/useDrillDown.js +83 -0
- package/dist/components/TimelineContainer/components/useSelection.js +51 -0
- package/dist/components/TimelineContainer/components/useZoom.d.ts +1 -1
- package/dist/components/TimelineContainer/components/useZoom.js +54 -0
- package/dist/components/TimelineContainer/components/variants/TimelineEntryCardGallery.d.ts +1 -2
- package/dist/components/TimelineContainer/components/variants/TimelineEntryCardGallery.js +67 -0
- package/dist/components/TimelineContainer/components/variants/TimelineEntryCardImage.d.ts +1 -2
- package/dist/components/TimelineContainer/components/variants/TimelineEntryCardImage.js +31 -0
- package/dist/components/TimelineContainer/components/views/DayView.d.ts +1 -1
- package/dist/components/TimelineContainer/components/views/DayView.js +20 -0
- package/dist/components/TimelineContainer/components/views/HourView.d.ts +1 -1
- package/dist/components/TimelineContainer/components/views/HourView.js +22 -0
- package/dist/components/TimelineContainer/components/views/MonthView.d.ts +1 -1
- package/dist/components/TimelineContainer/components/views/MonthView.js +18 -0
- package/dist/components/TimelineContainer/components/views/YearView.d.ts +1 -1
- package/dist/components/TimelineContainer/components/views/YearView.js +13 -0
- package/dist/components/TimelineContainer/components/views/index.d.ts +4 -4
- package/dist/components/TimelineContainer/components/views/index.js +4 -0
- package/dist/components/TimelineContainer/index.d.ts +3 -3
- package/dist/components/TimelineContainer/index.js +2 -0
- package/dist/components/TimelineNode/components/TimelineNode.d.ts +0 -1
- package/dist/components/TimelineNode/components/TimelineNode.js +49 -0
- package/dist/components/TimelineNode/components/index.d.ts +2 -2
- package/dist/components/TimelineNode/components/index.js +1 -0
- package/dist/components/TimelineNode/index.d.ts +2 -2
- package/dist/components/TimelineNode/index.js +1 -0
- package/dist/components/registry.js +247 -0
- package/dist/eidotter.css +1 -1
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/useAnimatedDismiss.d.ts +15 -0
- package/dist/hooks/useAnimatedDismiss.js +29 -0
- package/dist/hooks/useTextScramble.d.ts +21 -0
- package/dist/hooks/useTextScramble.js +91 -0
- package/dist/hooks/useTextScramble.test.d.ts +1 -0
- package/dist/hooks/useThemePortal.d.ts +12 -0
- package/dist/hooks/useThemePortal.js +62 -0
- package/dist/hooks/useThemePortal.test.d.ts +1 -0
- package/dist/utils/cn.d.ts +9 -0
- package/dist/utils/cn.js +12 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/isSafeHref.d.ts +1 -0
- package/dist/utils/isSafeHref.js +22 -0
- package/dist/utils/isSafeUrl.d.ts +8 -0
- package/dist/utils/isSafeUrl.js +18 -0
- package/dist/utils/isSafeUrl.test.d.ts +1 -0
- package/dist/utils/prefersReducedMotion.d.ts +5 -0
- package/dist/utils/prefersReducedMotion.js +8 -0
- package/package.json +9 -2
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../../../utils/cn.js';
|
|
3
|
+
/**
|
|
4
|
+
* DOS-styled labelled progress bar — optional leading label, a width-accurate
|
|
5
|
+
* amber fill, and a trailing value with a custom suffix (DMNC-861).
|
|
6
|
+
*
|
|
7
|
+
* A standalone div-bar (not the block-fill `<Progress>`): `<Progress>`'s
|
|
8
|
+
* monospace `█`/`░` fill renders wider than the track in some fonts, so a
|
|
9
|
+
* solid-fill bar is width-accurate. The fill animates via `transform: scaleX`
|
|
10
|
+
* (compositor-only; reduced-motion disables it).
|
|
11
|
+
*/
|
|
12
|
+
export const LabeledProgress = ({ label, value, max = 100, valueSuffix = '%', showValue = true, className, 'aria-label': ariaLabel, }) => {
|
|
13
|
+
const pct = max === 0 ? 0 : Math.min(100, Math.max(0, Math.round((value / max) * 100)));
|
|
14
|
+
return (_jsxs("div", { className: cn('eidotter-labeled-progress', 'flex items-center gap-3', className), children: [label && (_jsx("span", { className: "eidotter-labeled-progress__label font-dos text-dos-text-sm text-dos-text-muted shrink-0", children: label })), _jsx("div", { role: "progressbar", "aria-valuenow": pct, "aria-valuemin": 0, "aria-valuemax": 100, "aria-label": ariaLabel ?? (typeof label === 'string' ? label : `${pct}${valueSuffix}`), className: "eidotter-labeled-progress__track relative h-3 flex-1 overflow-hidden bg-dos-bg-primary border border-dos-border-disabled", children: _jsx("div", { className: "eidotter-labeled-progress__fill absolute inset-y-0 left-0 w-full bg-dos-bg-accent", style: { transform: `scaleX(${pct / 100})` } }) }), showValue && (_jsxs("span", { className: "eidotter-labeled-progress__value font-dos text-dos-text-sm text-dos-text-accent tabular-nums shrink-0", children: [pct, valueSuffix] }))] }));
|
|
15
|
+
};
|
|
16
|
+
LabeledProgress.displayName = 'LabeledProgress';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { LabeledProgress } from './LabeledProgress';
|
|
2
|
-
export type { LabeledProgressProps } from './LabeledProgress';
|
|
1
|
+
export { LabeledProgress } from './LabeledProgress.js';
|
|
2
|
+
export type { LabeledProgressProps } from './LabeledProgress.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LabeledProgress } from './LabeledProgress.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { LabeledProgress } from './components';
|
|
2
|
-
export type { LabeledProgressProps } from './components';
|
|
1
|
+
export { LabeledProgress } from './components/index.js';
|
|
2
|
+
export type { LabeledProgressProps } from './components/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LabeledProgress } from './components/index.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../../../utils/cn.js';
|
|
3
|
+
import { CopyButton } from '../../CopyButton/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* DOS-styled ledger row — a label/note on the left and a right-aligned value
|
|
6
|
+
* with optional copy + trailing slot. A generic value-row primitive.
|
|
7
|
+
*
|
|
8
|
+
* Generalised from Steuerdash's money-specific LedgerRow (DMNC-857): currency
|
|
9
|
+
* formatting, Paperless links, and verify/shared badges are intentionally NOT
|
|
10
|
+
* built in — pass a pre-formatted `value`, a raw `copyValue` for the copy
|
|
11
|
+
* affordance, and compose domain chrome via `trailing`. Routes through
|
|
12
|
+
* `text-dos-*` semantic roles so it re-themes.
|
|
13
|
+
*/
|
|
14
|
+
export const LedgerRow = ({ label, note, value, copyValue, trailing, pending, className, }) => (_jsxs("div", { className: cn('eidotter-ledger-row', 'flex items-center gap-3 py-2 border-b border-dos-border-disabled', pending && 'opacity-50', className), children: [_jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "font-dos text-dos-text-sm text-dos-text-primary", children: label }), note && _jsx("p", { className: "font-dos text-dos-text-xs text-dos-text-muted mt-0.5", children: note })] }), _jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [_jsx("span", { className: "font-dos text-dos-text-sm text-dos-text-accent tabular-nums", children: value }), copyValue !== undefined && _jsx(CopyButton, { value: copyValue }), trailing] })] }));
|
|
15
|
+
LedgerRow.displayName = 'LedgerRow';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { LedgerRow } from './LedgerRow';
|
|
2
|
-
export type { LedgerRowProps } from './LedgerRow';
|
|
1
|
+
export { LedgerRow } from './LedgerRow.js';
|
|
2
|
+
export type { LedgerRowProps } from './LedgerRow.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LedgerRow } from './LedgerRow.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { LedgerRow } from './components';
|
|
2
|
-
export type { LedgerRowProps } from './components';
|
|
1
|
+
export { LedgerRow } from './components/index.js';
|
|
2
|
+
export type { LedgerRowProps } from './components/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LedgerRow } from './components/index.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../../../utils/cn.js';
|
|
3
|
+
/**
|
|
4
|
+
* Layout primitive for Impressum / Datenschutz / other compact legal pages.
|
|
5
|
+
*
|
|
6
|
+
* Wraps the `.legal-hero` + `.legal-body` chrome that previously lived
|
|
7
|
+
* duplicated across portfolio surfaces. Consumers compose freeform
|
|
8
|
+
* `<h2>`/`<p>`/`<ul>` body content (or pre-built clauses from this module)
|
|
9
|
+
* and the wrapper handles spacing, type scale, and the `>` list bullet.
|
|
10
|
+
*/
|
|
11
|
+
export const LegalPage = ({ title, date, intro, home, children, className, ...props }) => (_jsxs("div", { className: cn('eidotter-legal-page', className), ...props, children: [home && _jsx("div", { className: "eidotter-legal-page__home", children: home }), _jsxs("article", { children: [_jsxs("header", { className: "eidotter-legal-page__hero", children: [_jsx("p", { className: "eidotter-legal-page__date", children: date }), _jsx("h1", { children: title }), intro && _jsx("div", { className: "eidotter-legal-page__intro", children: intro })] }), _jsx("div", { className: "eidotter-legal-page__body", children: children })] })] }));
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
const DEFAULT_ADDRESS = (_jsxs(_Fragment, { children: ["Haus-Endt-Str. 149A", _jsx("br", {}), "40593 D\u00FCsseldorf", _jsx("br", {}), "Deutschland"] }));
|
|
3
|
+
const DEFAULT_NAME = 'Dominic Kennedy';
|
|
4
|
+
/** Standalone postal address block — wrapped in `<address>`. */
|
|
5
|
+
export const AddressBlock = ({ email, address = DEFAULT_ADDRESS, name = DEFAULT_NAME, }) => (_jsxs("address", { children: [name, _jsx("br", {}), address, email && (_jsxs(_Fragment, { children: [_jsx("br", {}), "E-Mail: ", _jsx("a", { href: `mailto:${email}`, children: email })] }))] }));
|
|
6
|
+
// ---------- Impressum clauses ----------
|
|
7
|
+
/** § 5 DDG header + address. */
|
|
8
|
+
export const ImpressumAddress = (props) => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Angaben gem\u00E4\u00DF \u00A7 5 DDG" }), _jsx(AddressBlock, { ...props })] }));
|
|
9
|
+
/** "Kontakt" header + mailto link. */
|
|
10
|
+
export const ImpressumContact = ({ email }) => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Kontakt" }), _jsxs("p", { children: ["E-Mail: ", _jsx("a", { href: `mailto:${email}`, children: email })] })] }));
|
|
11
|
+
/** § 18 Abs. 2 MStV responsibility block — short address (no country line). */
|
|
12
|
+
export const ImpressumResponsible = ({ name = DEFAULT_NAME }) => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Inhaltlich verantwortlich (\u00A7 18 Abs. 2 MStV)" }), _jsxs("address", { children: [name, _jsx("br", {}), "Haus-Endt-Str. 149A", _jsx("br", {}), "40593 D\u00FCsseldorf"] })] }));
|
|
13
|
+
/** §§ 7-10 DDG content liability disclaimer. */
|
|
14
|
+
export const ImpressumLiabilityContent = () => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Haftung f\u00FCr Inhalte" }), _jsx("p", { children: "Ich erstelle die Inhalte dieser Seiten mit gr\u00F6\u00DFter Sorgfalt, \u00FCbernehme jedoch keine Gew\u00E4hr f\u00FCr Richtigkeit, Vollst\u00E4ndigkeit oder Aktualit\u00E4t. Als Diensteanbieter bin ich gem\u00E4\u00DF \u00A7 7 Abs. 1 DDG f\u00FCr eigene Inhalte verantwortlich. Eine Pflicht zur \u00DCberwachung fremder Informationen besteht gem\u00E4\u00DF \u00A7\u00A7 8\u201310 DDG nicht." })] }));
|
|
15
|
+
/** External-link liability disclaimer. */
|
|
16
|
+
export const ImpressumLiabilityLinks = () => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Haftung f\u00FCr Links" }), _jsx("p", { children: "Diese Website verlinkt auf externe Seiten Dritter, auf deren Inhalte ich keinen Einfluss habe. F\u00FCr verlinkte Inhalte haftet der jeweilige Anbieter. Eine dauerhafte Kontrolle ist ohne Anhaltspunkte f\u00FCr Rechtsverletzungen nicht zumutbar. Bei Bekanntwerden von Verst\u00F6\u00DFen entferne ich solche Links umgehend." })] }));
|
|
17
|
+
/** "Verantwortlicher" header + address with email. */
|
|
18
|
+
export const DatenschutzController = ({ email, name = DEFAULT_NAME }) => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Verantwortlicher" }), _jsxs("address", { children: [name, _jsx("br", {}), "Haus-Endt-Str. 149A", _jsx("br", {}), "40593 D\u00FCsseldorf, Deutschland", _jsx("br", {}), "E-Mail: ", _jsx("a", { href: `mailto:${email}`, children: email })] })] }));
|
|
19
|
+
/** Cloudflare hosting clause + Art. 6 Abs. 1 lit. f legal basis. */
|
|
20
|
+
export const DatenschutzHosting = () => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Hosting" }), _jsx("p", { children: "Cloudflare Pages stellt diese Website bereit. Beim Seitenaufruf erhebt Cloudflare automatisch technische Zugriffsdaten (darunter Ihre IP-Adresse), um die Seite auszuliefern." }), _jsx("p", { className: "eidotter-legal-page__basis", children: "Anbieter: Cloudflare, Inc., 101 Townsend St, San Francisco, CA 94107, USA. Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse)." })] }));
|
|
21
|
+
/** PostHog webanalytics clause — EU servers, reverse-proxied, no cookies. */
|
|
22
|
+
export const DatenschutzPostHog = ({ proxyHost = 'e.dmnc.tech' }) => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Webanalyse \u2014 PostHog" }), _jsxs("p", { children: ["Diese Website nutzt PostHog zur Analyse des Nutzungsverhaltens. PostHog l\u00E4uft auf EU-Servern (eu.posthog.com). Die Daten\u00FCbertragung erfolgt \u00FCber einen Reverse-Proxy auf der Domain ", proxyHost, " \u2014 es besteht keine direkte Verbindung zu PostHog-Servern."] }), _jsxs("p", { children: ["Es werden ", _jsx("strong", { children: "keine Cookies" }), " gesetzt. PostHog speichert Daten ausschlie\u00DFlich im Arbeitsspeicher des Browsers (Session Memory). Personenbezogene Profile entstehen nicht, solange Sie sich nicht aktiv identifizieren."] }), _jsxs("p", { children: [_jsx("strong", { children: "Session Recording:" }), " PostHog zeichnet anonymisierte Sitzungswiederholungen auf. Alle Eingabefelder werden automatisch maskiert."] }), _jsx("p", { className: "eidotter-legal-page__basis", children: "Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse)." })] }));
|
|
23
|
+
/** Local Perfect DOS VGA 437 font clause. */
|
|
24
|
+
export const DatenschutzFonts = () => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Schriftarten" }), _jsx("p", { children: "Die Schriftart \u201EPerfect DOS VGA 437\u201C wird lokal von diesem Server ausgeliefert. Es findet keine Verbindung zu externen Schriftarten-Diensten statt." })] }));
|
|
25
|
+
/** SSL/TLS encryption clause. */
|
|
26
|
+
export const DatenschutzEncryption = () => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Verschl\u00FCsselung" }), _jsx("p", { children: "Diese Website nutzt SSL-/TLS-Verschl\u00FCsselung. Eine verschl\u00FCsselte Verbindung erkennen Sie am \u201Ehttps://\u201C in der Adresszeile Ihres Browsers." })] }));
|
|
27
|
+
/** DSGVO Art. 15-21 rights list + Art. 77 supervisory-authority complaint clause. */
|
|
28
|
+
export const DatenschutzRights = ({ email, supervisoryAuthority = 'die Landesbeauftragte für Datenschutz und Informationsfreiheit Nordrhein-Westfalen', }) => (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Ihre Rechte" }), _jsx("p", { children: "Die DSGVO gew\u00E4hrt Ihnen folgende Rechte:" }), _jsxs("ul", { children: [_jsx("li", { children: "Auskunft (Art. 15)" }), _jsx("li", { children: "Berichtigung (Art. 16)" }), _jsx("li", { children: "L\u00F6schung (Art. 17)" }), _jsx("li", { children: "Einschr\u00E4nkung der Verarbeitung (Art. 18)" }), _jsx("li", { children: "Daten\u00FCbertragbarkeit (Art. 20)" }), _jsx("li", { children: "Widerspruch (Art. 21)" })] }), email && (_jsxs("p", { children: ["Zur Aus\u00FCbung Ihrer Rechte gen\u00FCgt eine formlose E-Mail an", ' ', _jsx("a", { href: `mailto:${email}`, children: email }), "."] })), _jsxs("p", { children: ["Sie k\u00F6nnen sich bei einer Aufsichtsbeh\u00F6rde beschweren (Art. 77 DSGVO). Zust\u00E4ndig ist ", supervisoryAuthority, "."] })] }));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { LegalPage } from './LegalPage';
|
|
2
|
-
export type { LegalPageProps } from './LegalPage';
|
|
3
|
-
export { AddressBlock, ImpressumAddress, ImpressumContact, ImpressumResponsible, ImpressumLiabilityContent, ImpressumLiabilityLinks, DatenschutzController, DatenschutzHosting, DatenschutzPostHog, DatenschutzFonts, DatenschutzEncryption, DatenschutzRights, } from './clauses';
|
|
4
|
-
export type { AddressBlockProps, DatenschutzControllerProps, DatenschutzPostHogProps, DatenschutzRightsProps, } from './clauses';
|
|
1
|
+
export { LegalPage } from './LegalPage.js';
|
|
2
|
+
export type { LegalPageProps } from './LegalPage.js';
|
|
3
|
+
export { AddressBlock, ImpressumAddress, ImpressumContact, ImpressumResponsible, ImpressumLiabilityContent, ImpressumLiabilityLinks, DatenschutzController, DatenschutzHosting, DatenschutzPostHog, DatenschutzFonts, DatenschutzEncryption, DatenschutzRights, } from './clauses.js';
|
|
4
|
+
export type { AddressBlockProps, DatenschutzControllerProps, DatenschutzPostHogProps, DatenschutzRightsProps, } from './clauses.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { LegalPage } from './LegalPage.js';
|
|
2
|
+
export { AddressBlock, ImpressumAddress, ImpressumContact, ImpressumResponsible, ImpressumLiabilityContent, ImpressumLiabilityLinks, DatenschutzController, DatenschutzHosting, DatenschutzPostHog, DatenschutzFonts, DatenschutzEncryption, DatenschutzRights, } from './clauses.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { LegalPage, AddressBlock, ImpressumAddress, ImpressumContact, ImpressumResponsible, ImpressumLiabilityContent, ImpressumLiabilityLinks, DatenschutzController, DatenschutzHosting, DatenschutzPostHog, DatenschutzFonts, DatenschutzEncryption, DatenschutzRights, } from './components';
|
|
2
|
-
export type { LegalPageProps, AddressBlockProps, DatenschutzControllerProps, DatenschutzPostHogProps, DatenschutzRightsProps, } from './components';
|
|
1
|
+
export { LegalPage, AddressBlock, ImpressumAddress, ImpressumContact, ImpressumResponsible, ImpressumLiabilityContent, ImpressumLiabilityLinks, DatenschutzController, DatenschutzHosting, DatenschutzPostHog, DatenschutzFonts, DatenschutzEncryption, DatenschutzRights, } from './components/index.js';
|
|
2
|
+
export type { LegalPageProps, AddressBlockProps, DatenschutzControllerProps, DatenschutzPostHogProps, DatenschutzRightsProps, } from './components/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LegalPage, AddressBlock, ImpressumAddress, ImpressumContact, ImpressumResponsible, ImpressumLiabilityContent, ImpressumLiabilityLinks, DatenschutzController, DatenschutzHosting, DatenschutzPostHog, DatenschutzFonts, DatenschutzEncryption, DatenschutzRights, } from './components/index.js';
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { TimelineImage } from '../../TimelineContainer/components/types';
|
|
3
|
-
import '../../../styles/keyframes.css';
|
|
4
|
-
import './Lightbox.css';
|
|
2
|
+
import type { TimelineImage } from '../../TimelineContainer/components/types.js';
|
|
5
3
|
export interface LightboxProps {
|
|
6
4
|
/** Images to navigate between. */
|
|
7
5
|
images: TimelineImage[];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
4
|
+
import { Button as AriaButton, ModalOverlay as AriaModalOverlay, Modal as AriaModal, Dialog as AriaDialog, } from 'react-aria-components';
|
|
5
|
+
import { Icon } from '../../Icon/components/Icon.js';
|
|
6
|
+
import { cn } from '../../../utils/cn.js';
|
|
7
|
+
/**
|
|
8
|
+
* Fullscreen image viewer built on the same React Aria primitives as Modal.
|
|
9
|
+
*
|
|
10
|
+
* Reuses Modal's CRT phosphor enter/exit animations, overlay tokens, and close
|
|
11
|
+
* button styling. Adds prev/next, counter, caption, keyboard nav, and touch
|
|
12
|
+
* swipe — see Tasks 4 and 5.
|
|
13
|
+
*/
|
|
14
|
+
export const Lightbox = ({ images, initialIndex = 0, isOpen, onClose, onIndexChange, }) => {
|
|
15
|
+
// Clamp the requested initial index so callers passing stale indices
|
|
16
|
+
// (e.g. Gallery.state.index after entry.images shrinks) don't crash.
|
|
17
|
+
const safeInitial = images.length === 0
|
|
18
|
+
? 0
|
|
19
|
+
: Math.max(0, Math.min(initialIndex, images.length - 1));
|
|
20
|
+
const [index, setIndex] = useState(safeInitial);
|
|
21
|
+
// Reset to the requested initial index whenever the lightbox is reopened.
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (isOpen)
|
|
24
|
+
setIndex(safeInitial);
|
|
25
|
+
}, [isOpen, safeInitial]);
|
|
26
|
+
// If `images` shrinks while the lightbox is open and the current index
|
|
27
|
+
// would be out of bounds, snap back to the last valid image instead of
|
|
28
|
+
// dereferencing undefined.
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (images.length > 0 && index >= images.length) {
|
|
31
|
+
setIndex(images.length - 1);
|
|
32
|
+
}
|
|
33
|
+
}, [images.length, index]);
|
|
34
|
+
const goTo = useCallback((next) => {
|
|
35
|
+
if (next < 0 || next >= images.length || next === index)
|
|
36
|
+
return;
|
|
37
|
+
setIndex(next);
|
|
38
|
+
onIndexChange?.(next);
|
|
39
|
+
}, [images.length, index, onIndexChange]);
|
|
40
|
+
const goPrev = useCallback(() => goTo(index - 1), [goTo, index]);
|
|
41
|
+
const goNext = useCallback(() => goTo(index + 1), [goTo, index]);
|
|
42
|
+
// Touch swipe — minimal hand-rolled gesture, no library.
|
|
43
|
+
const SWIPE_THRESHOLD = 30; // px
|
|
44
|
+
const touchStartXRef = React.useRef(null);
|
|
45
|
+
const onTouchStart = useCallback((e) => {
|
|
46
|
+
touchStartXRef.current = e.touches[0]?.clientX ?? null;
|
|
47
|
+
}, []);
|
|
48
|
+
const onTouchEnd = useCallback((e) => {
|
|
49
|
+
const startX = touchStartXRef.current;
|
|
50
|
+
touchStartXRef.current = null;
|
|
51
|
+
if (startX == null)
|
|
52
|
+
return;
|
|
53
|
+
const endX = e.changedTouches[0]?.clientX ?? startX;
|
|
54
|
+
const dx = endX - startX;
|
|
55
|
+
if (Math.abs(dx) < SWIPE_THRESHOLD)
|
|
56
|
+
return;
|
|
57
|
+
if (dx < 0)
|
|
58
|
+
goNext();
|
|
59
|
+
else
|
|
60
|
+
goPrev();
|
|
61
|
+
}, [goNext, goPrev]);
|
|
62
|
+
// Keyboard navigation. React Aria handles Esc dismissal via `isDismissable`,
|
|
63
|
+
// but does not own the arrow keys, so we listen at the window level while open.
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (!isOpen)
|
|
66
|
+
return;
|
|
67
|
+
const onKeyDown = (e) => {
|
|
68
|
+
if (e.key === 'ArrowLeft') {
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
goPrev();
|
|
71
|
+
}
|
|
72
|
+
else if (e.key === 'ArrowRight') {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
goNext();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
window.addEventListener('keydown', onKeyDown);
|
|
78
|
+
return () => window.removeEventListener('keydown', onKeyDown);
|
|
79
|
+
}, [isOpen, goPrev, goNext]);
|
|
80
|
+
// Empty array: nothing to show. (Note: do NOT early-return on !isOpen here —
|
|
81
|
+
// React Aria's AriaModalOverlay needs to stay mounted across isOpen
|
|
82
|
+
// transitions so it can play modal-crt-exit. The overlay handles its own
|
|
83
|
+
// visibility based on the `isOpen` prop.)
|
|
84
|
+
if (images.length === 0) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
// Defensive: if a render slips through with an out-of-range index before
|
|
88
|
+
// the clamp effect has run, fall back to the last valid image rather than
|
|
89
|
+
// crashing on undefined dereference.
|
|
90
|
+
const safeIndex = Math.max(0, Math.min(index, images.length - 1));
|
|
91
|
+
const current = images[safeIndex];
|
|
92
|
+
const hasPrev = safeIndex > 0;
|
|
93
|
+
const hasNext = safeIndex < images.length - 1;
|
|
94
|
+
return (_jsx(AriaModalOverlay, { isOpen: isOpen, onOpenChange: (open) => { if (!open)
|
|
95
|
+
onClose(); }, isDismissable: true, className: ({ isEntering, isExiting }) => cn('eidotter-lightbox-overlay', isEntering && 'eidotter-lightbox-overlay--entering', isExiting && 'eidotter-lightbox-overlay--exiting'), children: _jsx(AriaModal, { className: ({ isEntering, isExiting }) => cn('eidotter-lightbox', isEntering && 'eidotter-lightbox--entering', isExiting && 'eidotter-lightbox--exiting'), children: _jsxs(AriaDialog, { "aria-label": current.alt || 'Image viewer', className: "eidotter-lightbox__container outline-none", children: [_jsx(AriaButton, { className: "eidotter-lightbox__close", onPress: onClose, "aria-label": "Close lightbox", children: _jsx(Icon, { name: "Close", size: "S" }) }), _jsx(AriaButton, { className: "eidotter-lightbox__nav eidotter-lightbox__nav--prev", onPress: goPrev, isDisabled: !hasPrev, "aria-label": "Previous image", children: "\u25C0" }), _jsx(AriaButton, { className: "eidotter-lightbox__nav eidotter-lightbox__nav--next", onPress: goNext, isDisabled: !hasNext, "aria-label": "Next image", children: "\u25B6" }), _jsxs("figure", { className: "eidotter-lightbox__figure", children: [_jsx("img", { className: "eidotter-lightbox__image", src: current.src, alt: current.alt, width: current.width, height: current.height, onTouchStart: onTouchStart, onTouchEnd: onTouchEnd }), current.caption && (_jsx("figcaption", { className: "eidotter-lightbox__caption", children: current.caption }))] }), _jsxs("span", { className: "eidotter-lightbox__counter", "aria-live": "polite", children: ["[ ", safeIndex + 1, " / ", images.length, " ]"] })] }) }) }));
|
|
96
|
+
};
|
|
97
|
+
Lightbox.displayName = 'Lightbox';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Lightbox } from './Lightbox';
|
|
2
|
-
export type { LightboxProps } from './Lightbox';
|
|
1
|
+
export { Lightbox } from './Lightbox.js';
|
|
2
|
+
export type { LightboxProps } from './Lightbox.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Lightbox } from './Lightbox.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Lightbox } from './components';
|
|
2
|
-
export type { LightboxProps } from './components';
|
|
1
|
+
export { Lightbox } from './components/index.js';
|
|
2
|
+
export type { LightboxProps } from './components/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Lightbox } from './components/index.js';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef, forwardRef } from 'react';
|
|
4
|
+
import { Button as AriaButton, ModalOverlay as AriaModalOverlay, Modal as AriaModal, Dialog as AriaDialog, } from 'react-aria-components';
|
|
5
|
+
import { Icon } from '../../Icon/components/Icon.js';
|
|
6
|
+
import { cn } from '../../../utils/cn.js';
|
|
7
|
+
/**
|
|
8
|
+
* DOS-styled Modal with React Aria Dialog.
|
|
9
|
+
* React Aria provides focus trapping, scroll lock, backdrop dismiss, and escape handling.
|
|
10
|
+
* CRT phosphor enter/exit animations via isEntering/isExiting render props.
|
|
11
|
+
* Ref forwards to the inner AriaDialog element (not the overlay).
|
|
12
|
+
*/
|
|
13
|
+
export const Modal = forwardRef(({ isOpen, onOpenChange, onClose, title, children, footer, className, }, ref) => {
|
|
14
|
+
const prevOpenRef = useRef(isOpen);
|
|
15
|
+
const interactionRef = useRef(false);
|
|
16
|
+
// Notify onOpenChange on prop-driven state changes only (observer pattern for agents).
|
|
17
|
+
// User-initiated changes are handled in handleOpenChange to avoid double-firing.
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (isOpen !== prevOpenRef.current) {
|
|
20
|
+
prevOpenRef.current = isOpen;
|
|
21
|
+
if (!interactionRef.current) {
|
|
22
|
+
onOpenChange?.(isOpen);
|
|
23
|
+
if (!isOpen)
|
|
24
|
+
onClose?.();
|
|
25
|
+
}
|
|
26
|
+
interactionRef.current = false;
|
|
27
|
+
}
|
|
28
|
+
}, [isOpen, onOpenChange, onClose]);
|
|
29
|
+
const handleOpenChange = (open) => {
|
|
30
|
+
interactionRef.current = true;
|
|
31
|
+
onOpenChange?.(open);
|
|
32
|
+
if (!open)
|
|
33
|
+
onClose?.();
|
|
34
|
+
};
|
|
35
|
+
return (_jsx(AriaModalOverlay, { isOpen: isOpen, onOpenChange: handleOpenChange, isDismissable: true, className: ({ isEntering, isExiting }) => cn('eidotter-modal-overlay', isEntering && 'eidotter-modal-overlay--entering', isExiting && 'eidotter-modal-overlay--exiting'), children: _jsx(AriaModal, { className: ({ isEntering, isExiting }) => cn('eidotter-modal', isEntering && 'eidotter-modal--entering', isExiting && 'eidotter-modal--exiting'), children: _jsxs(AriaDialog, { ref: ref, "aria-label": title, className: cn('eidotter-modal__container outline-none', className), children: [_jsxs("header", { className: "eidotter-modal__header", children: [_jsx("h2", { className: "eidotter-modal__title", children: title }), _jsx(AriaButton, { className: "eidotter-modal__close", onPress: () => handleOpenChange(false), "aria-label": "Close modal", children: _jsx(Icon, { name: "Close", size: "S" }) })] }), _jsx("div", { className: "eidotter-modal__body", children: children }), footer && (_jsx("footer", { className: "eidotter-modal__footer", children: footer }))] }) }) }));
|
|
36
|
+
});
|
|
37
|
+
Modal.displayName = 'Modal';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Modal } from './Modal';
|
|
2
|
-
export type { ModalProps } from './Modal';
|
|
1
|
+
export { Modal } from './Modal.js';
|
|
2
|
+
export type { ModalProps } from './Modal.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Modal } from './Modal.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Modal } from './components';
|
|
2
|
-
export type { ModalProps } from './components';
|
|
1
|
+
export { Modal } from './components/index.js';
|
|
2
|
+
export type { ModalProps } from './components/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Modal } from './components/index.js';
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
|
+
import { Icon } from '../../Icon/index.js';
|
|
6
|
+
const variantClasses = {
|
|
7
|
+
retro: 'eidotter-nav--retro',
|
|
8
|
+
modern: 'eidotter-nav--modern',
|
|
9
|
+
};
|
|
10
|
+
export const DesktopNav = ({ items, activeHref, variant = 'retro', linkComponent, className, }) => {
|
|
11
|
+
const LinkTag = linkComponent || 'a';
|
|
12
|
+
return (_jsx("nav", { className: cn('eidotter-nav eidotter-nav--desktop', variantClasses[variant], className), "aria-label": "Main navigation", children: _jsx("ul", { className: "eidotter-nav__desktop-list", children: items.map((item) => (_jsx("li", { className: "eidotter-nav__desktop-item", children: _jsx(LinkTag, { href: item.href, className: cn('eidotter-nav__link', activeHref === item.href && 'eidotter-nav__link--active'), "aria-current": activeHref === item.href ? 'page' : undefined, children: item.label }) }, item.href))) }) }));
|
|
13
|
+
};
|
|
14
|
+
export const MobileNav = ({ items, activeHref, variant = 'retro', linkComponent, className, }) => {
|
|
15
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
16
|
+
const LinkTag = linkComponent || 'a';
|
|
17
|
+
const triggerRef = useRef(null);
|
|
18
|
+
const closeButtonRef = useRef(null);
|
|
19
|
+
const panelRef = useRef(null);
|
|
20
|
+
// Only restore focus to the trigger on an open→close transition, never on the
|
|
21
|
+
// initial closed mount.
|
|
22
|
+
const wasOpenRef = useRef(false);
|
|
23
|
+
const toggle = useCallback(() => setIsOpen(prev => !prev), []);
|
|
24
|
+
const close = useCallback(() => setIsOpen(false), []);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (!isOpen)
|
|
27
|
+
return;
|
|
28
|
+
const handleKeyDown = (e) => {
|
|
29
|
+
if (e.key === 'Escape')
|
|
30
|
+
close();
|
|
31
|
+
};
|
|
32
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
33
|
+
return () => document.removeEventListener('keydown', handleKeyDown);
|
|
34
|
+
}, [isOpen, close]);
|
|
35
|
+
// Focus management: move focus into the panel on open, restore it to the
|
|
36
|
+
// MENU trigger on close. The panel is always in the DOM (slide transition),
|
|
37
|
+
// so `inert` (below) keeps it out of the tab order / a11y tree while closed.
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (isOpen) {
|
|
40
|
+
closeButtonRef.current?.focus();
|
|
41
|
+
}
|
|
42
|
+
else if (wasOpenRef.current) {
|
|
43
|
+
triggerRef.current?.focus();
|
|
44
|
+
}
|
|
45
|
+
wasOpenRef.current = isOpen;
|
|
46
|
+
}, [isOpen]);
|
|
47
|
+
// Focus trap — cycle Tab/Shift+Tab within the open panel.
|
|
48
|
+
const handlePanelKeyDown = (e) => {
|
|
49
|
+
if (e.key !== 'Tab' || !isOpen)
|
|
50
|
+
return;
|
|
51
|
+
const focusables = panelRef.current?.querySelectorAll('a[href], button:not([disabled])');
|
|
52
|
+
if (!focusables || focusables.length === 0)
|
|
53
|
+
return;
|
|
54
|
+
const first = focusables[0];
|
|
55
|
+
const last = focusables[focusables.length - 1];
|
|
56
|
+
if (e.shiftKey && document.activeElement === first) {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
last.focus();
|
|
59
|
+
}
|
|
60
|
+
else if (!e.shiftKey && document.activeElement === last) {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
first.focus();
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
return (_jsxs("div", { className: cn('eidotter-nav eidotter-nav--mobile', variantClasses[variant], className), children: [_jsx("button", { ref: triggerRef, onClick: toggle, className: "eidotter-nav__menu-trigger", "aria-label": isOpen ? 'Close menu' : 'Open menu', "aria-expanded": isOpen, "aria-controls": "eidotter-mobile-nav-panel", children: "MENU" }), isOpen && (_jsx("div", { className: "eidotter-nav__overlay", onClick: close, "aria-hidden": "true" })), _jsxs("nav", { ref: panelRef, id: "eidotter-mobile-nav-panel", className: cn('eidotter-nav__panel', isOpen && 'eidotter-nav__panel--open'), "aria-label": "Mobile navigation", inert: !isOpen, onKeyDown: handlePanelKeyDown, children: [_jsx("div", { className: "eidotter-nav__panel-header", children: _jsx("button", { ref: closeButtonRef, onClick: close, className: "eidotter-nav__close", "aria-label": "Close menu", children: _jsx(Icon, { name: "Close", size: "S" }) }) }), _jsx("ul", { className: "eidotter-nav__list", children: items.map((item) => (_jsx("li", { className: "eidotter-nav__item", children: _jsx(LinkTag, { href: item.href, className: cn('eidotter-nav__link', activeHref === item.href && 'eidotter-nav__link--active'), "aria-current": activeHref === item.href ? 'page' : undefined, onClick: close, children: item.label }) }, item.href))) })] })] }));
|
|
66
|
+
};
|
|
67
|
+
export const Nav = (props) => {
|
|
68
|
+
return (_jsxs(_Fragment, { children: [_jsx(MobileNav, { ...props }), _jsx(DesktopNav, { ...props })] }));
|
|
69
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Nav, DesktopNav, MobileNav } from './Nav';
|
|
2
|
-
export type { NavProps, NavItem } from './Nav';
|
|
1
|
+
export { Nav, DesktopNav, MobileNav } from './Nav.js';
|
|
2
|
+
export type { NavProps, NavItem } from './Nav.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Nav, DesktopNav, MobileNav } from './Nav.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Nav, DesktopNav, MobileNav } from './components';
|
|
2
|
-
export type { NavProps, NavItem } from './components';
|
|
1
|
+
export { Nav, DesktopNav, MobileNav } from './components/index.js';
|
|
2
|
+
export type { NavProps, NavItem } from './components/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Nav, DesktopNav, MobileNav } from './components/index.js';
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { AlertAction } from '../../Alert/components/Alert';
|
|
3
|
-
import './Notification.css';
|
|
2
|
+
import type { AlertAction } from '../../Alert/components/Alert.js';
|
|
4
3
|
export type NotificationType = 'primary' | 'gray' | 'success' | 'warning' | 'error';
|
|
5
4
|
export interface NotificationProps {
|
|
6
5
|
/** Color/icon variant */
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect } from 'react';
|
|
4
|
+
import { Button as AriaButton } from 'react-aria-components';
|
|
5
|
+
import { cn } from '../../../utils/cn.js';
|
|
6
|
+
import { Icon } from '../../Icon/components/Icon.js';
|
|
7
|
+
import { Progress } from '../../Progress/components/Progress.js';
|
|
8
|
+
import { useAnimatedDismiss } from '../../../hooks/useAnimatedDismiss.js';
|
|
9
|
+
const TYPE_ICONS = {
|
|
10
|
+
primary: 'Info',
|
|
11
|
+
gray: 'Info',
|
|
12
|
+
success: 'Done',
|
|
13
|
+
warning: 'Warning',
|
|
14
|
+
error: 'Error',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* DOS-styled Notification (toast) with V.37 design: layered amber glow,
|
|
18
|
+
* featured icon with outline rings, optional progress bar and auto-dismiss.
|
|
19
|
+
*
|
|
20
|
+
* Purely presentational — consumers handle positioning.
|
|
21
|
+
*/
|
|
22
|
+
export const Notification = ({ type = 'primary', title, children, actions, onClose, avatar, image, progress, progressLabel, duration, showIcon = true, className, }) => {
|
|
23
|
+
const { isClosing, triggerClose, handleAnimationEnd } = useAnimatedDismiss('notification-exit', onClose);
|
|
24
|
+
// Auto-dismiss timer
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (duration == null || !onClose)
|
|
27
|
+
return;
|
|
28
|
+
const timer = setTimeout(() => triggerClose(), duration);
|
|
29
|
+
return () => clearTimeout(timer);
|
|
30
|
+
}, [duration, onClose, triggerClose]);
|
|
31
|
+
const hasIcon = showIcon && !avatar;
|
|
32
|
+
const hasProgress = progress != null;
|
|
33
|
+
return (_jsxs("div", { className: cn('w-full max-w-[400px]', 'font-dos text-dos-text-sm', 'border border-dos-border-default rounded-dos-base', 'eidotter-notification', `eidotter-notification--${type}`, isClosing && 'eidotter-notification--closing', className), onAnimationEnd: handleAnimationEnd, role: type === 'error' ? 'alert' : 'status', "data-type": type, children: [image && (_jsx("div", { className: "eidotter-notification__image", children: image })), _jsxs("div", { className: "flex flex-row gap-4 p-4", children: [avatar && (_jsx("div", { className: "eidotter-notification__avatar flex-shrink-0", children: avatar })), hasIcon && (_jsx("div", { className: "eidotter-notification__icon", children: _jsx(Icon, { name: TYPE_ICONS[type] || 'Info', size: "S", "aria-label": `${type} notification` }) })), _jsxs("div", { className: cn('flex-1 flex flex-col gap-3 min-w-0', onClose && !hasIcon && !avatar && 'pr-8'), children: [(title || children) && (_jsxs("div", { className: "flex flex-col gap-1", children: [title && (_jsx("div", { className: "eidotter-notification__title font-dos leading-[140%]", children: title })), children && (_jsx("div", { className: "eidotter-notification__text font-dos leading-[140%]", children: children }))] })), hasProgress && (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Progress, { value: progress, max: 100, size: "sm", fullWidth: true, showLabel: false }), progressLabel && (_jsx("div", { className: "eidotter-notification__text font-dos text-dos-text-xs", children: progressLabel }))] })), actions && actions.length > 0 && (_jsx("div", { className: "flex flex-row gap-3", children: actions.map((action, i) => (_jsxs(AriaButton, { className: "eidotter-notification__action", onPress: action.onClick, children: [action.label, action.icon] }, i))) }))] }), onClose && (_jsx(AriaButton, { className: "eidotter-notification__close", onPress: triggerClose, "aria-label": "Close notification", children: _jsx(Icon, { name: "Close", size: "S" }) }))] })] }));
|
|
34
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Notification } from './Notification';
|
|
2
|
-
export type { NotificationProps, NotificationType } from './Notification';
|
|
1
|
+
export { Notification } from './Notification.js';
|
|
2
|
+
export type { NotificationProps, NotificationType } from './Notification.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Notification } from './Notification.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './components';
|
|
1
|
+
export * from './components/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components/index.js';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { cn } from '../../../utils/cn.js';
|
|
4
|
+
const FILLED = '\u2588'; // █
|
|
5
|
+
const EMPTY = '\u2591'; // ░
|
|
6
|
+
const DARK_SHADE = '\u2593'; // ▓
|
|
7
|
+
const MED_SHADE = '\u2592'; // ▒
|
|
8
|
+
const sizeClasses = {
|
|
9
|
+
sm: 'text-xs',
|
|
10
|
+
md: 'text-base',
|
|
11
|
+
lg: 'text-lg',
|
|
12
|
+
small: 'text-xs',
|
|
13
|
+
medium: 'text-base',
|
|
14
|
+
large: 'text-lg',
|
|
15
|
+
};
|
|
16
|
+
const variantClasses = {
|
|
17
|
+
default: 'eidotter-progress--default',
|
|
18
|
+
success: 'eidotter-progress--success',
|
|
19
|
+
warning: 'eidotter-progress--warning',
|
|
20
|
+
error: 'eidotter-progress--error',
|
|
21
|
+
};
|
|
22
|
+
function buildBarContent(filledCount, totalBlocks, trackStyle) {
|
|
23
|
+
const emptyCount = totalBlocks - filledCount;
|
|
24
|
+
if (trackStyle === 'gradient' && filledCount > 0 && filledCount < totalBlocks) {
|
|
25
|
+
const transChars = Math.min(2, emptyCount);
|
|
26
|
+
const actualEmpty = emptyCount - transChars;
|
|
27
|
+
const transition = (transChars >= 1 ? DARK_SHADE : '') +
|
|
28
|
+
(transChars >= 2 ? MED_SHADE : '');
|
|
29
|
+
return {
|
|
30
|
+
filled: FILLED.repeat(filledCount),
|
|
31
|
+
transition,
|
|
32
|
+
empty: EMPTY.repeat(actualEmpty),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
filled: FILLED.repeat(filledCount),
|
|
37
|
+
transition: '',
|
|
38
|
+
empty: EMPTY.repeat(emptyCount),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* DOS-styled Progress bar with block characters, phosphor glow, and track styles.
|
|
43
|
+
* Pure presentational — no React Aria needed.
|
|
44
|
+
*/
|
|
45
|
+
export const Progress = forwardRef(({ value = 0, max = 100, indeterminate = false, variant = 'default', size = 'md', trackStyle = 'block', blocks = 20, showLabel = false, fullWidth = false, glow = false, valueText, className, 'aria-label': ariaLabel, ...props }, ref) => {
|
|
46
|
+
const totalBlocks = Math.min(80, Math.max(3, Math.floor(blocks)));
|
|
47
|
+
const percentage = Math.min(100, Math.max(0, (value / max) * 100));
|
|
48
|
+
const filledBlocks = Math.round((percentage / 100) * totalBlocks);
|
|
49
|
+
const rootClasses = cn('inline-flex items-center gap-2 font-dos', 'eidotter-progress', sizeClasses[size] || sizeClasses.md, variantClasses[variant] || variantClasses.default, glow && 'eidotter-progress--glow', fullWidth && 'eidotter-progress--full-width', indeterminate && 'eidotter-progress--indeterminate', trackStyle === 'bordered' && 'eidotter-progress--bordered', className);
|
|
50
|
+
const ariaAttrs = {
|
|
51
|
+
'aria-label': ariaLabel || `Progress: ${indeterminate ? 'loading' : `${Math.round(percentage)}%`}`,
|
|
52
|
+
};
|
|
53
|
+
if (!indeterminate) {
|
|
54
|
+
ariaAttrs['aria-valuenow'] = value;
|
|
55
|
+
ariaAttrs['aria-valuemin'] = 0;
|
|
56
|
+
ariaAttrs['aria-valuemax'] = max;
|
|
57
|
+
}
|
|
58
|
+
if (valueText) {
|
|
59
|
+
ariaAttrs['aria-valuetext'] = valueText;
|
|
60
|
+
}
|
|
61
|
+
const isBordered = trackStyle === 'bordered';
|
|
62
|
+
const trackClasses = cn('eidotter-progress__track', isBordered && 'eidotter-progress__track--borderless');
|
|
63
|
+
if (indeterminate) {
|
|
64
|
+
const emptyContent = EMPTY.repeat(totalBlocks);
|
|
65
|
+
return (_jsxs("div", { ref: ref, className: rootClasses, role: "progressbar", ...ariaAttrs, ...props, children: [_jsxs("span", { className: trackClasses, children: [isBordered && _jsx("span", { className: "eidotter-progress__bracket", children: "[" }), _jsxs("span", { className: "eidotter-progress__bar", children: [_jsx("span", { className: "eidotter-progress__empty", children: emptyContent }), _jsxs("span", { className: "eidotter-progress__scanner", children: [DARK_SHADE, FILLED, DARK_SHADE] })] }), isBordered && _jsx("span", { className: "eidotter-progress__bracket", children: "]" })] }), showLabel && (_jsx("span", { className: "eidotter-progress__label", children: "..." }))] }));
|
|
66
|
+
}
|
|
67
|
+
const allFilled = FILLED.repeat(totalBlocks);
|
|
68
|
+
const allEmpty = EMPTY.repeat(totalBlocks);
|
|
69
|
+
const { transition: gradientChars } = buildBarContent(filledBlocks, totalBlocks, trackStyle);
|
|
70
|
+
return (_jsxs("div", { ref: ref, className: rootClasses, role: "progressbar", ...ariaAttrs, ...props, children: [_jsxs("span", { className: trackClasses, children: [isBordered && _jsx("span", { className: "eidotter-progress__bracket", children: "[" }), _jsxs("span", { className: "eidotter-progress__bar", children: [_jsx("span", { className: "eidotter-progress__empty", children: allEmpty }), _jsx("span", { className: "eidotter-progress__fill", style: { '--fill-pct': String(percentage) }, children: allFilled }), gradientChars && (_jsx("span", { className: "eidotter-progress__transition", style: { '--fill-pct': String(percentage) }, children: gradientChars }))] }), isBordered && _jsx("span", { className: "eidotter-progress__bracket", children: "]" })] }), showLabel && (_jsxs("span", { className: "eidotter-progress__label", children: [Math.round(percentage), "%"] }))] }));
|
|
71
|
+
});
|
|
72
|
+
Progress.displayName = 'Progress';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Progress } from './Progress';
|
|
2
|
-
export type { ProgressProps } from './Progress';
|
|
1
|
+
export { Progress } from './Progress.js';
|
|
2
|
+
export type { ProgressProps } from './Progress.js';
|