eidotter 0.36.1 → 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/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,91 @@
|
|
|
1
|
+
import { useState, useEffect, useRef } from 'react';
|
|
2
|
+
import { prefersReducedMotion } from '../utils/prefersReducedMotion.js';
|
|
3
|
+
const DEFAULT_CHARACTERS = '░▒▓█│┤┐└┴┬├─┼';
|
|
4
|
+
const CYCLES_PER_CHAR = 4;
|
|
5
|
+
/**
|
|
6
|
+
* Hook that animates text with a DOS-style character scramble effect.
|
|
7
|
+
* Characters resolve left-to-right (CRT beam metaphor).
|
|
8
|
+
*
|
|
9
|
+
* Note: Changing `speed`, `characters`, or `delay` mid-animation
|
|
10
|
+
* will restart the scramble from position 0.
|
|
11
|
+
*/
|
|
12
|
+
export function useTextScramble(targetText, options) {
|
|
13
|
+
const { speed = 40, characters = DEFAULT_CHARACTERS, enabled = true, delay = 0, } = options ?? {};
|
|
14
|
+
// Initialize with scrambled chars (not empty) to avoid a blank frame
|
|
15
|
+
const [display, setDisplay] = useState(() => {
|
|
16
|
+
if (!enabled || prefersReducedMotion())
|
|
17
|
+
return targetText;
|
|
18
|
+
let result = '';
|
|
19
|
+
for (let i = 0; i < targetText.length; i++) {
|
|
20
|
+
if (targetText[i] === ' ') {
|
|
21
|
+
result += ' ';
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
result += characters[Math.floor(Math.random() * characters.length)];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
});
|
|
29
|
+
const [isScrambling, setIsScrambling] = useState(false);
|
|
30
|
+
const rafRef = useRef(0);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
// Skip animation if disabled or reduced motion
|
|
33
|
+
if (!enabled || prefersReducedMotion()) {
|
|
34
|
+
setDisplay(targetText);
|
|
35
|
+
setIsScrambling(false);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Track position (which char index we've resolved up to)
|
|
39
|
+
let resolvedCount = 0;
|
|
40
|
+
let cycleCount = 0;
|
|
41
|
+
let lastTime = 0;
|
|
42
|
+
let delayRemaining = delay;
|
|
43
|
+
setIsScrambling(true);
|
|
44
|
+
const animate = (time) => {
|
|
45
|
+
if (!lastTime)
|
|
46
|
+
lastTime = time;
|
|
47
|
+
const delta = time - lastTime;
|
|
48
|
+
if (delayRemaining > 0) {
|
|
49
|
+
delayRemaining -= delta;
|
|
50
|
+
lastTime = time;
|
|
51
|
+
rafRef.current = requestAnimationFrame(animate);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (delta >= speed) {
|
|
55
|
+
lastTime = time;
|
|
56
|
+
cycleCount++;
|
|
57
|
+
if (cycleCount >= CYCLES_PER_CHAR) {
|
|
58
|
+
resolvedCount++;
|
|
59
|
+
cycleCount = 0;
|
|
60
|
+
}
|
|
61
|
+
if (resolvedCount >= targetText.length) {
|
|
62
|
+
setDisplay(targetText);
|
|
63
|
+
setIsScrambling(false);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Build display string: resolved chars + scrambled chars
|
|
67
|
+
let result = '';
|
|
68
|
+
for (let i = 0; i < targetText.length; i++) {
|
|
69
|
+
if (i < resolvedCount) {
|
|
70
|
+
result += targetText[i];
|
|
71
|
+
}
|
|
72
|
+
else if (targetText[i] === ' ') {
|
|
73
|
+
result += ' ';
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
result += characters[Math.floor(Math.random() * characters.length)];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
setDisplay(result);
|
|
80
|
+
}
|
|
81
|
+
rafRef.current = requestAnimationFrame(animate);
|
|
82
|
+
};
|
|
83
|
+
rafRef.current = requestAnimationFrame(animate);
|
|
84
|
+
return () => {
|
|
85
|
+
if (rafRef.current) {
|
|
86
|
+
cancelAnimationFrame(rafRef.current);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}, [targetText, speed, characters, enabled, delay]);
|
|
90
|
+
return { text: display, isScrambling };
|
|
91
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a portal container on document.body that inherits the nearest
|
|
3
|
+
* ancestor's `data-theme` attribute. A MutationObserver keeps it in sync
|
|
4
|
+
* for dynamic theme changes.
|
|
5
|
+
*
|
|
6
|
+
* @param sourceRef - Ref to an element rendered in the normal React tree.
|
|
7
|
+
* Its nearest `[data-theme]` ancestor determines the portal's theme.
|
|
8
|
+
* @returns The portal container element, or `null` during SSR.
|
|
9
|
+
*
|
|
10
|
+
* @internal Not exported from the public API.
|
|
11
|
+
*/
|
|
12
|
+
export declare function useThemePortal(sourceRef: React.RefObject<HTMLElement | null>): HTMLDivElement | null;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useRef, useEffect } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a portal container on document.body that inherits the nearest
|
|
4
|
+
* ancestor's `data-theme` attribute. A MutationObserver keeps it in sync
|
|
5
|
+
* for dynamic theme changes.
|
|
6
|
+
*
|
|
7
|
+
* @param sourceRef - Ref to an element rendered in the normal React tree.
|
|
8
|
+
* Its nearest `[data-theme]` ancestor determines the portal's theme.
|
|
9
|
+
* @returns The portal container element, or `null` during SSR.
|
|
10
|
+
*
|
|
11
|
+
* @internal Not exported from the public API.
|
|
12
|
+
*/
|
|
13
|
+
export function useThemePortal(sourceRef) {
|
|
14
|
+
// SSR guard
|
|
15
|
+
if (typeof document === 'undefined')
|
|
16
|
+
return null;
|
|
17
|
+
// Lazy-init so createPortal has a target during the first render.
|
|
18
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
19
|
+
const containerRef = useRef(null);
|
|
20
|
+
if (!containerRef.current) {
|
|
21
|
+
const el = document.createElement('div');
|
|
22
|
+
el.setAttribute('data-eidotter-portal', '');
|
|
23
|
+
containerRef.current = el;
|
|
24
|
+
}
|
|
25
|
+
// Mount / unmount the container on document.body.
|
|
26
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
const container = containerRef.current;
|
|
29
|
+
document.body.appendChild(container);
|
|
30
|
+
return () => {
|
|
31
|
+
container.remove();
|
|
32
|
+
};
|
|
33
|
+
}, []);
|
|
34
|
+
// Sync data-theme from the nearest themed ancestor.
|
|
35
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
const source = sourceRef.current;
|
|
38
|
+
const container = containerRef.current;
|
|
39
|
+
if (!source)
|
|
40
|
+
return;
|
|
41
|
+
const themedAncestor = source.closest('[data-theme]');
|
|
42
|
+
function syncTheme() {
|
|
43
|
+
const value = themedAncestor?.getAttribute('data-theme');
|
|
44
|
+
if (value) {
|
|
45
|
+
container.setAttribute('data-theme', value);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
container.removeAttribute('data-theme');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
syncTheme();
|
|
52
|
+
if (!themedAncestor)
|
|
53
|
+
return;
|
|
54
|
+
const observer = new MutationObserver(syncTheme);
|
|
55
|
+
observer.observe(themedAncestor, {
|
|
56
|
+
attributes: true,
|
|
57
|
+
attributeFilter: ['data-theme'],
|
|
58
|
+
});
|
|
59
|
+
return () => observer.disconnect();
|
|
60
|
+
}, [sourceRef]);
|
|
61
|
+
return containerRef.current;
|
|
62
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge Tailwind CSS classes with conflict resolution.
|
|
3
|
+
* Wraps tailwind-merge for consistent class merging across eidotter components.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* cn('bg-dos-bg-primary text-dos-text-primary', 'bg-dos-bg-secondary')
|
|
7
|
+
* // → 'text-dos-text-primary bg-dos-bg-secondary'
|
|
8
|
+
*/
|
|
9
|
+
export declare function cn(...inputs: (string | undefined | null | false)[]): string;
|
package/dist/utils/cn.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { twMerge } from 'tailwind-merge';
|
|
2
|
+
/**
|
|
3
|
+
* Merge Tailwind CSS classes with conflict resolution.
|
|
4
|
+
* Wraps tailwind-merge for consistent class merging across eidotter components.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* cn('bg-dos-bg-primary text-dos-text-primary', 'bg-dos-bg-secondary')
|
|
8
|
+
* // → 'text-dos-text-primary bg-dos-bg-secondary'
|
|
9
|
+
*/
|
|
10
|
+
export function cn(...inputs) {
|
|
11
|
+
return twMerge(inputs.filter(Boolean));
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isSafeHref(href: string): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate that a URL string is safe to use as an anchor href.
|
|
3
|
+
*
|
|
4
|
+
* Allows: http://, https://, mailto:, and relative URLs (no scheme).
|
|
5
|
+
* Blocks: javascript:, data:, vbscript:, file:, and other unsafe schemes.
|
|
6
|
+
*
|
|
7
|
+
* Used to guard `<a href={...}>` against author-supplied URLs (e.g. MDX or
|
|
8
|
+
* JSON content). Returns the input unchanged when safe so callers can pass
|
|
9
|
+
* it directly into href; returns false to signal the link should be dropped.
|
|
10
|
+
*/
|
|
11
|
+
const SAFE_SCHEME_PATTERN = /^(?:https?:|mailto:)/i;
|
|
12
|
+
export function isSafeHref(href) {
|
|
13
|
+
if (typeof href !== 'string')
|
|
14
|
+
return false;
|
|
15
|
+
const trimmed = href.trim();
|
|
16
|
+
if (trimmed.length === 0)
|
|
17
|
+
return false;
|
|
18
|
+
// Relative URLs (no scheme) are safe.
|
|
19
|
+
if (!/^[a-z][a-z0-9+\-.]*:/i.test(trimmed))
|
|
20
|
+
return true;
|
|
21
|
+
return SAFE_SCHEME_PATTERN.test(trimmed);
|
|
22
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates that a URL uses a safe protocol (http, https, or mailto).
|
|
3
|
+
* Blocks javascript:, data:, vbscript:, blob:, and other dangerous protocols.
|
|
4
|
+
*
|
|
5
|
+
* @param url - URL string to validate
|
|
6
|
+
* @returns true if the URL uses an allowed protocol
|
|
7
|
+
*/
|
|
8
|
+
export declare const isSafeUrl: (url: string | undefined) => boolean;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates that a URL uses a safe protocol (http, https, or mailto).
|
|
3
|
+
* Blocks javascript:, data:, vbscript:, blob:, and other dangerous protocols.
|
|
4
|
+
*
|
|
5
|
+
* @param url - URL string to validate
|
|
6
|
+
* @returns true if the URL uses an allowed protocol
|
|
7
|
+
*/
|
|
8
|
+
export const isSafeUrl = (url) => {
|
|
9
|
+
if (!url)
|
|
10
|
+
return false;
|
|
11
|
+
try {
|
|
12
|
+
const parsed = new URL(url);
|
|
13
|
+
return ['http:', 'https:', 'mailto:'].includes(parsed.protocol);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eidotter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A DOS Themed Design System",
|
|
6
6
|
"main": "./dist/index.umd.js",
|
|
@@ -21,6 +21,10 @@
|
|
|
21
21
|
"import": "./dist/index.es.js",
|
|
22
22
|
"require": "./dist/index.umd.js"
|
|
23
23
|
},
|
|
24
|
+
"./components/*": {
|
|
25
|
+
"types": "./dist/components/*/index.d.ts",
|
|
26
|
+
"import": "./dist/components/*/index.js"
|
|
27
|
+
},
|
|
24
28
|
"./styles": "./dist/eidotter.css",
|
|
25
29
|
"./utilities": "./src/styles/dos-utilities.css",
|
|
26
30
|
"./tailwind.preset": "./tailwind.preset.cjs",
|
|
@@ -52,6 +56,8 @@
|
|
|
52
56
|
"dist/index.umd.js",
|
|
53
57
|
"dist/eidotter.css",
|
|
54
58
|
"dist/components",
|
|
59
|
+
"dist/utils",
|
|
60
|
+
"dist/hooks",
|
|
55
61
|
"dist/icons",
|
|
56
62
|
"tailwind.preset.cjs",
|
|
57
63
|
"src/styles/fonts.css",
|
|
@@ -68,7 +74,8 @@
|
|
|
68
74
|
],
|
|
69
75
|
"scripts": {
|
|
70
76
|
"dev": "vite",
|
|
71
|
-
"build": "vite build && node scripts/flatten-css-layers.mjs && tsc -p tsconfig.build.json && npm run build-icons",
|
|
77
|
+
"build": "vite build && node scripts/flatten-css-layers.mjs && tsc -p tsconfig.build.json && npm run build-components && npm run build-icons",
|
|
78
|
+
"build-components": "tsc -p tsconfig.components.json && node scripts/finalize-component-emit.mjs",
|
|
72
79
|
"build-icons": "node scripts/icons/build-barrels.mjs && tsc -p tsconfig.icons.json",
|
|
73
80
|
"fetch-icons": "node scripts/icons/fetch-svgs.mjs",
|
|
74
81
|
"generate-icons": "node scripts/icons/build-tsx.mjs && node scripts/icons/build-barrels.mjs",
|