react-marketing-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -0
- package/dist/accordion.d.cts +21 -0
- package/dist/accordion.d.ts +21 -0
- package/dist/accordion.d.ts.map +1 -0
- package/dist/accordion.js +230 -0
- package/dist/accordion.js.map +1 -0
- package/dist/accordion.mjs +4 -0
- package/dist/accordion.mjs.map +1 -0
- package/dist/action-swap.d.cts +23 -0
- package/dist/action-swap.d.ts +23 -0
- package/dist/action-swap.d.ts.map +1 -0
- package/dist/action-swap.js +81 -0
- package/dist/action-swap.js.map +1 -0
- package/dist/action-swap.mjs +5 -0
- package/dist/action-swap.mjs.map +1 -0
- package/dist/animated-beam.d.cts +24 -0
- package/dist/animated-beam.d.ts +24 -0
- package/dist/animated-beam.d.ts.map +1 -0
- package/dist/animated-beam.js +130 -0
- package/dist/animated-beam.js.map +1 -0
- package/dist/animated-beam.mjs +4 -0
- package/dist/animated-beam.mjs.map +1 -0
- package/dist/button.d.cts +55 -0
- package/dist/button.d.ts +55 -0
- package/dist/button.d.ts.map +1 -0
- package/dist/button.js +119 -0
- package/dist/button.js.map +1 -0
- package/dist/button.mjs +4 -0
- package/dist/button.mjs.map +1 -0
- package/dist/card.d.cts +20 -0
- package/dist/card.d.ts +20 -0
- package/dist/card.d.ts.map +1 -0
- package/dist/card.js +146 -0
- package/dist/card.js.map +1 -0
- package/dist/card.mjs +5 -0
- package/dist/card.mjs.map +1 -0
- package/dist/chunk-3SB6HUBA.mjs +31 -0
- package/dist/chunk-3SB6HUBA.mjs.map +1 -0
- package/dist/chunk-4PBVBXGY.mjs +84 -0
- package/dist/chunk-4PBVBXGY.mjs.map +1 -0
- package/dist/chunk-4VCFWVSJ.mjs +42 -0
- package/dist/chunk-4VCFWVSJ.mjs.map +1 -0
- package/dist/chunk-5QQAPGR2.mjs +109 -0
- package/dist/chunk-5QQAPGR2.mjs.map +1 -0
- package/dist/chunk-6MB4UKRX.mjs +19 -0
- package/dist/chunk-6MB4UKRX.mjs.map +1 -0
- package/dist/chunk-6T5LR34O.mjs +45 -0
- package/dist/chunk-6T5LR34O.mjs.map +1 -0
- package/dist/chunk-AYLCYDUM.mjs +275 -0
- package/dist/chunk-AYLCYDUM.mjs.map +1 -0
- package/dist/chunk-AYY7D2RJ.mjs +112 -0
- package/dist/chunk-AYY7D2RJ.mjs.map +1 -0
- package/dist/chunk-CTZEI2YS.mjs +324 -0
- package/dist/chunk-CTZEI2YS.mjs.map +1 -0
- package/dist/chunk-DA3I3Y5O.mjs +71 -0
- package/dist/chunk-DA3I3Y5O.mjs.map +1 -0
- package/dist/chunk-EYHT2EWJ.mjs +18 -0
- package/dist/chunk-EYHT2EWJ.mjs.map +1 -0
- package/dist/chunk-IHLGCS63.mjs +36 -0
- package/dist/chunk-IHLGCS63.mjs.map +1 -0
- package/dist/chunk-JVXJ6SFX.mjs +38 -0
- package/dist/chunk-JVXJ6SFX.mjs.map +1 -0
- package/dist/chunk-KBHYXLRG.mjs +13 -0
- package/dist/chunk-KBHYXLRG.mjs.map +1 -0
- package/dist/chunk-KMXUQYR3.mjs +74 -0
- package/dist/chunk-KMXUQYR3.mjs.map +1 -0
- package/dist/chunk-KNPOZ34H.mjs +88 -0
- package/dist/chunk-KNPOZ34H.mjs.map +1 -0
- package/dist/chunk-KRNWCJ4D.mjs +219 -0
- package/dist/chunk-KRNWCJ4D.mjs.map +1 -0
- package/dist/chunk-M5MESV26.mjs +124 -0
- package/dist/chunk-M5MESV26.mjs.map +1 -0
- package/dist/chunk-MJYBPJBA.mjs +115 -0
- package/dist/chunk-MJYBPJBA.mjs.map +1 -0
- package/dist/chunk-NNHPQ67J.mjs +10 -0
- package/dist/chunk-NNHPQ67J.mjs.map +1 -0
- package/dist/chunk-OCZFHVVD.mjs +71 -0
- package/dist/chunk-OCZFHVVD.mjs.map +1 -0
- package/dist/chunk-QAWSH567.mjs +19 -0
- package/dist/chunk-QAWSH567.mjs.map +1 -0
- package/dist/chunk-R2E2J42H.mjs +38 -0
- package/dist/chunk-R2E2J42H.mjs.map +1 -0
- package/dist/chunk-TPGLLSYV.mjs +65 -0
- package/dist/chunk-TPGLLSYV.mjs.map +1 -0
- package/dist/chunk-VJENJHXJ.mjs +72 -0
- package/dist/chunk-VJENJHXJ.mjs.map +1 -0
- package/dist/chunk-W22G7XHR.mjs +104 -0
- package/dist/chunk-W22G7XHR.mjs.map +1 -0
- package/dist/chunk-WDR5VPZJ.mjs +79 -0
- package/dist/chunk-WDR5VPZJ.mjs.map +1 -0
- package/dist/chunk-WLUGKBH7.mjs +37 -0
- package/dist/chunk-WLUGKBH7.mjs.map +1 -0
- package/dist/chunk-WYJYLDUA.mjs +84 -0
- package/dist/chunk-WYJYLDUA.mjs.map +1 -0
- package/dist/chunk-XZEDZVXT.mjs +38 -0
- package/dist/chunk-XZEDZVXT.mjs.map +1 -0
- package/dist/chunk-YKGP5JIL.mjs +328 -0
- package/dist/chunk-YKGP5JIL.mjs.map +1 -0
- package/dist/chunk-YM3U2OBE.mjs +99 -0
- package/dist/chunk-YM3U2OBE.mjs.map +1 -0
- package/dist/dia-text-reveal.css +18 -0
- package/dist/dia-text-reveal.css.map +1 -0
- package/dist/dia-text-reveal.d.cts +37 -0
- package/dist/dia-text-reveal.d.ts +37 -0
- package/dist/dia-text-reveal.d.ts.map +1 -0
- package/dist/dia-text-reveal.js +334 -0
- package/dist/dia-text-reveal.js.map +1 -0
- package/dist/dia-text-reveal.lines.d.cts +23 -0
- package/dist/dia-text-reveal.lines.d.ts +23 -0
- package/dist/dia-text-reveal.lines.d.ts.map +1 -0
- package/dist/dia-text-reveal.mjs +4 -0
- package/dist/dia-text-reveal.mjs.map +1 -0
- package/dist/dia-text-reveal.sweep.d.cts +49 -0
- package/dist/dia-text-reveal.sweep.d.ts +49 -0
- package/dist/dia-text-reveal.sweep.d.ts.map +1 -0
- package/dist/dia-text-reveal.utils.d.cts +3 -0
- package/dist/dia-text-reveal.utils.d.ts +3 -0
- package/dist/dia-text-reveal.utils.d.ts.map +1 -0
- package/dist/elevated-input.d.cts +11 -0
- package/dist/elevated-input.d.ts +11 -0
- package/dist/elevated-input.d.ts.map +1 -0
- package/dist/elevated-input.js +52 -0
- package/dist/elevated-input.js.map +1 -0
- package/dist/elevated-input.mjs +4 -0
- package/dist/elevated-input.mjs.map +1 -0
- package/dist/fade-in.d.cts +43 -0
- package/dist/fade-in.d.ts +43 -0
- package/dist/fade-in.d.ts.map +1 -0
- package/dist/fade-in.js +89 -0
- package/dist/fade-in.js.map +1 -0
- package/dist/fade-in.mjs +4 -0
- package/dist/fade-in.mjs.map +1 -0
- package/dist/feature-card.d.cts +23 -0
- package/dist/feature-card.d.ts +23 -0
- package/dist/feature-card.d.ts.map +1 -0
- package/dist/feature-card.js +38 -0
- package/dist/feature-card.js.map +1 -0
- package/dist/feature-card.mjs +4 -0
- package/dist/feature-card.mjs.map +1 -0
- package/dist/flowchart-parts.d.cts +61 -0
- package/dist/flowchart-parts.d.ts +61 -0
- package/dist/flowchart-parts.d.ts.map +1 -0
- package/dist/flowchart-parts.js +102 -0
- package/dist/flowchart-parts.js.map +1 -0
- package/dist/flowchart-parts.mjs +4 -0
- package/dist/flowchart-parts.mjs.map +1 -0
- package/dist/glossy-button.d.cts +21 -0
- package/dist/glossy-button.d.ts +21 -0
- package/dist/glossy-button.d.ts.map +1 -0
- package/dist/glossy-button.js +87 -0
- package/dist/glossy-button.js.map +1 -0
- package/dist/glossy-button.mjs +4 -0
- package/dist/glossy-button.mjs.map +1 -0
- package/dist/grainient.css +9 -0
- package/dist/grainient.css.map +1 -0
- package/dist/grainient.d.cts +5 -0
- package/dist/grainient.d.ts +5 -0
- package/dist/grainient.d.ts.map +1 -0
- package/dist/grainient.js +330 -0
- package/dist/grainient.js.map +1 -0
- package/dist/grainient.mjs +4 -0
- package/dist/grainient.mjs.map +1 -0
- package/dist/grainient.shader.d.cts +9 -0
- package/dist/grainient.shader.d.ts +9 -0
- package/dist/grainient.shader.d.ts.map +1 -0
- package/dist/grainient.types.d.cts +30 -0
- package/dist/grainient.types.d.ts +30 -0
- package/dist/grainient.types.d.ts.map +1 -0
- package/dist/highlighter.d.cts +47 -0
- package/dist/highlighter.d.ts +47 -0
- package/dist/highlighter.d.ts.map +1 -0
- package/dist/highlighter.js +125 -0
- package/dist/highlighter.js.map +1 -0
- package/dist/highlighter.mjs +5 -0
- package/dist/highlighter.mjs.map +1 -0
- package/dist/index.css +27 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +56 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2723 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +34 -0
- package/dist/index.mjs.map +1 -0
- package/dist/input.d.cts +15 -0
- package/dist/input.d.ts +15 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +110 -0
- package/dist/input.js.map +1 -0
- package/dist/input.mjs +4 -0
- package/dist/input.mjs.map +1 -0
- package/dist/lib/breakpoints.d.cts +36 -0
- package/dist/lib/breakpoints.d.ts +36 -0
- package/dist/lib/breakpoints.d.ts.map +1 -0
- package/dist/lib/breakpoints.js +41 -0
- package/dist/lib/breakpoints.js.map +1 -0
- package/dist/lib/breakpoints.mjs +3 -0
- package/dist/lib/breakpoints.mjs.map +1 -0
- package/dist/lib/cn.js +24 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/cn.mjs +3 -0
- package/dist/lib/cn.mjs.map +1 -0
- package/dist/lib/ease.d.cts +19 -0
- package/dist/lib/ease.d.ts +19 -0
- package/dist/lib/ease.d.ts.map +1 -0
- package/dist/lib/ease.js +16 -0
- package/dist/lib/ease.js.map +1 -0
- package/dist/lib/ease.mjs +3 -0
- package/dist/lib/ease.mjs.map +1 -0
- package/dist/lib/surface.d.cts +14 -0
- package/dist/lib/surface.d.ts +14 -0
- package/dist/lib/surface.d.ts.map +1 -0
- package/dist/lib/surface.js +40 -0
- package/dist/lib/surface.js.map +1 -0
- package/dist/lib/surface.mjs +3 -0
- package/dist/lib/surface.mjs.map +1 -0
- package/dist/lib/use-media-query.d.cts +9 -0
- package/dist/lib/use-media-query.d.ts +9 -0
- package/dist/lib/use-media-query.d.ts.map +1 -0
- package/dist/lib/use-media-query.js +19 -0
- package/dist/lib/use-media-query.js.map +1 -0
- package/dist/lib/use-media-query.mjs +3 -0
- package/dist/lib/use-media-query.mjs.map +1 -0
- package/dist/lib/utils.d.cts +25 -0
- package/dist/lib/utils.d.ts +25 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/liquid-metal.d.cts +24 -0
- package/dist/liquid-metal.d.ts +24 -0
- package/dist/liquid-metal.d.ts.map +1 -0
- package/dist/liquid-metal.js +43 -0
- package/dist/liquid-metal.js.map +1 -0
- package/dist/liquid-metal.mjs +4 -0
- package/dist/liquid-metal.mjs.map +1 -0
- package/dist/navigation-menu-icons.d.cts +5 -0
- package/dist/navigation-menu-icons.d.ts +5 -0
- package/dist/navigation-menu-icons.d.ts.map +1 -0
- package/dist/navigation-menu-icons.js +42 -0
- package/dist/navigation-menu-icons.js.map +1 -0
- package/dist/navigation-menu-icons.mjs +3 -0
- package/dist/navigation-menu-icons.mjs.map +1 -0
- package/dist/navigation-menu-styles.d.cts +45 -0
- package/dist/navigation-menu-styles.d.ts +45 -0
- package/dist/navigation-menu-styles.d.ts.map +1 -0
- package/dist/navigation-menu-styles.js +16 -0
- package/dist/navigation-menu-styles.js.map +1 -0
- package/dist/navigation-menu-styles.mjs +3 -0
- package/dist/navigation-menu-styles.mjs.map +1 -0
- package/dist/navigation-menu.d.cts +18 -0
- package/dist/navigation-menu.d.ts +18 -0
- package/dist/navigation-menu.d.ts.map +1 -0
- package/dist/navigation-menu.js +367 -0
- package/dist/navigation-menu.js.map +1 -0
- package/dist/navigation-menu.mjs +7 -0
- package/dist/navigation-menu.mjs.map +1 -0
- package/dist/password-input.d.cts +6 -0
- package/dist/password-input.d.ts +6 -0
- package/dist/password-input.d.ts.map +1 -0
- package/dist/password-input.js +174 -0
- package/dist/password-input.js.map +1 -0
- package/dist/password-input.mjs +5 -0
- package/dist/password-input.mjs.map +1 -0
- package/dist/rainbow-button.d.cts +16 -0
- package/dist/rainbow-button.d.ts +16 -0
- package/dist/rainbow-button.d.ts.map +1 -0
- package/dist/rainbow-button.js +49 -0
- package/dist/rainbow-button.js.map +1 -0
- package/dist/rainbow-button.mjs +4 -0
- package/dist/rainbow-button.mjs.map +1 -0
- package/dist/range-slider.d.cts +20 -0
- package/dist/range-slider.d.ts +20 -0
- package/dist/range-slider.d.ts.map +1 -0
- package/dist/range-slider.js +85 -0
- package/dist/range-slider.js.map +1 -0
- package/dist/range-slider.mjs +3 -0
- package/dist/range-slider.mjs.map +1 -0
- package/dist/rolling-badge.d.cts +11 -0
- package/dist/rolling-badge.d.ts +11 -0
- package/dist/rolling-badge.d.ts.map +1 -0
- package/dist/rolling-badge.js +71 -0
- package/dist/rolling-badge.js.map +1 -0
- package/dist/rolling-badge.mjs +4 -0
- package/dist/rolling-badge.mjs.map +1 -0
- package/dist/savings-badge.d.cts +10 -0
- package/dist/savings-badge.d.ts +10 -0
- package/dist/savings-badge.d.ts.map +1 -0
- package/dist/savings-badge.js +26 -0
- package/dist/savings-badge.js.map +1 -0
- package/dist/savings-badge.mjs +4 -0
- package/dist/savings-badge.mjs.map +1 -0
- package/dist/shine-border.d.cts +15 -0
- package/dist/shine-border.d.ts +15 -0
- package/dist/shine-border.d.ts.map +1 -0
- package/dist/shine-border.js +47 -0
- package/dist/shine-border.js.map +1 -0
- package/dist/shine-border.mjs +4 -0
- package/dist/shine-border.mjs.map +1 -0
- package/dist/sparkles-text.d.cts +22 -0
- package/dist/sparkles-text.d.ts +22 -0
- package/dist/sparkles-text.d.ts.map +1 -0
- package/dist/sparkles-text.js +87 -0
- package/dist/sparkles-text.js.map +1 -0
- package/dist/sparkles-text.mjs +5 -0
- package/dist/sparkles-text.mjs.map +1 -0
- package/dist/tabs.d.cts +16 -0
- package/dist/tabs.d.ts +16 -0
- package/dist/tabs.d.ts.map +1 -0
- package/dist/tabs.js +121 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tabs.mjs +4 -0
- package/dist/tabs.mjs.map +1 -0
- package/dist/theme-toggle.d.cts +10 -0
- package/dist/theme-toggle.d.ts +10 -0
- package/dist/theme-toggle.d.ts.map +1 -0
- package/dist/theme-toggle.js +251 -0
- package/dist/theme-toggle.js.map +1 -0
- package/dist/theme-toggle.mjs +7 -0
- package/dist/theme-toggle.mjs.map +1 -0
- package/package.json +428 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/dia-text-reveal.lines.tsx","../src/components/dia-text-reveal.sweep.ts","../src/components/dia-text-reveal.utils.ts","../src/components/dia-text-reveal.tsx"],"names":["jsx","motion"],"mappings":"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","file":"chunk-YKGP5JIL.mjs","sourcesContent":["'use client';\n\nimport { motion } from 'framer-motion';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '../lib/utils.js';\n\ntype ExitingLineProps = {\n text: string;\n textColor: string;\n duration: number;\n fallDuration: number;\n opacityEase: (t: number) => number;\n wrap?: boolean;\n onDone: () => void;\n};\n\ntype HeightClipperProps = {\n height?: number;\n delay: number;\n children: ReactNode;\n};\n\ntype WidthReservationProps = { texts: string[] };\n\nexport function HeightClipper({ height, delay, children }: HeightClipperProps) {\n return (\n <motion.span\n className=\"block w-full overflow-hidden\"\n animate={height === undefined ? {} : { height }}\n transition={{\n height: { duration: 0.4, ease: [0.4, 0, 0.2, 1], delay },\n }}\n >\n {children}\n </motion.span>\n );\n}\n\nexport function ExitingLine({ text, textColor, duration, fallDuration, opacityEase, wrap = false, onDone }: ExitingLineProps) {\n return (\n <motion.span\n aria-hidden={true}\n className={cn(\n wrap\n ? 'pointer-events-none absolute top-0 left-0 w-full'\n : 'pointer-events-none absolute top-0 left-1/2 whitespace-nowrap',\n )}\n style={{ color: textColor }}\n initial={wrap ? { opacity: 1, y: 0 } : { opacity: 1, x: '-50%', y: 0 }}\n animate={wrap ? { opacity: 0, y: 14 } : { opacity: 0, x: '-50%', y: 14 }}\n transition={{\n opacity: { duration, ease: opacityEase },\n y: { duration: fallDuration, ease: [0.22, 0.61, 0.36, 1] },\n }}\n onAnimationComplete={onDone}\n >\n {text}\n </motion.span>\n );\n}\n\nexport function WidthReservation({ texts }: WidthReservationProps) {\n return (\n <span aria-hidden={true} className=\"invisible block h-0 overflow-hidden\">\n {texts.map((t) => (\n <span key={t} className=\"block\">\n {t}\n </span>\n ))}\n </span>\n );\n}\n","/**\n * The moving gradient band that paints DiaTextReveal's glyphs, and the coverage math that\n * lets the outgoing line's fade track it exactly.\n *\n * The band moves by *sliding a static gradient*, not by rebuilding one per frame. Rebuilding\n * meant a JS callback, a style recalc, a fresh gradient rasterization and a\n * `background-clip: text` repaint on every frame — all main-thread-only work, so the sweep\n * stalled whenever the thread was contended (scrolling, WebGL render loops, React commits).\n * A fixed image offset by a CSS animation needs no script at all and lets the browser cache\n * the raster, which is what keeps the sweep moving while the page is being scrolled.\n */\n\nimport type { CSSProperties } from 'react';\n\n/** Half-width of the colour band, in percent of the line. */\nconst BAND_HALF = 17;\n/** Band centre at the start of a sweep — fully left of the line, so nothing is painted. */\nconst SWEEP_START = -BAND_HALF;\n/** Band centre at the end of a sweep — fully right of the line, so everything is painted. */\nconst SWEEP_END = 100 + BAND_HALF;\n\n/** Cubic in-out: the band accelerates in, then eases out. */\nconst sweepEaseFn = (t: number) => (t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2);\n\n/**\n * Fraction of the line the sweep has painted at `progress` (0–1 of the sweep's duration).\n */\nconst coverageAt = (progress: number) => Math.min(1, (sweepEaseFn(progress) * (SWEEP_END - SWEEP_START)) / 100);\n\n/**\n * Point in the sweep (0–1) at which the whole line is painted.\n */\nconst COVERAGE_SPAN = (() => {\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 40; i += 1) {\n const mid = (lo + hi) / 2;\n if (coverageAt(mid) < 1) lo = mid;\n else hi = mid;\n }\n return hi;\n})();\n\nconst EXIT_FADE_BIAS = 0.4;\n\n/** Easing for the outgoing line's fade, tracking how much of the incoming line is painted. */\nconst exitEase = (t: number) => coverageAt(t * COVERAGE_SPAN) ** EXIT_FADE_BIAS;\n\nconst makeExitEase = (leadFraction: number) => {\n if (leadFraction <= 0) return exitEase;\n if (leadFraction >= 1) return () => 0;\n return (t: number) => (t <= leadFraction ? 0 : exitEase((t - leadFraction) / (1 - leadFraction)));\n};\n\n/* ── Sliding-gradient geometry ───────────────────────────────────────── */\n\nconst SWEEP_SCALE = 3;\nconst BAND_HALF_IMAGE = BAND_HALF / SWEEP_SCALE;\n\nconst positionFor = (pos: number) => (pos - 50 * SWEEP_SCALE) / (1 - SWEEP_SCALE);\n\n/** Position holding the band fully left of the line — nothing painted. */\nconst SWEEP_FROM = `${positionFor(SWEEP_START).toFixed(3)}%`;\n/** Position holding the band fully right of the line — everything painted. */\nconst SWEEP_TO = `${positionFor(SWEEP_END).toFixed(3)}%`;\n/** `background-size` for the oversized image the animation slides. */\nconst SWEEP_SIZE = `${SWEEP_SCALE * 100}% 100%`;\n\nconst EASE_SAMPLES = 24;\nconst sweepEaseCss = `linear(${Array.from({ length: EASE_SAMPLES + 1 }, (_, i) => sweepEaseFn(i / EASE_SAMPLES).toFixed(5)).join(\n ', ',\n)})`;\n\nfunction buildSweepGradient(colors: string[], textColor: string) {\n const bandStart = 50 - BAND_HALF_IMAGE;\n const bandEnd = 50 + BAND_HALF_IMAGE;\n const n = colors.length;\n\n const parts: string[] = [`${textColor} 0%`, `${textColor} ${bandStart.toFixed(3)}%`];\n for (const [i, c] of colors.entries()) {\n const pct = n === 1 ? 50 : bandStart + (i / (n - 1)) * BAND_HALF_IMAGE * 2;\n parts.push(`${c} ${pct.toFixed(3)}%`);\n }\n parts.push(`transparent ${bandEnd.toFixed(3)}%`, 'transparent 100%');\n\n return `linear-gradient(90deg, ${parts.join(', ')})`;\n}\n\nexport type Sweep = { cycle: number; lead: boolean } | null;\n\ntype SweepStyleArgs = {\n colors: string[];\n textColor: string;\n duration: number;\n delay: number;\n sweep: Sweep;\n paused: boolean;\n reduced: boolean;\n};\n\nfunction buildSweepStyle({ colors, textColor, duration, delay, sweep, paused, reduced }: SweepStyleArgs) {\n return {\n color: 'transparent',\n backgroundClip: 'text',\n WebkitBackgroundClip: 'text',\n backgroundImage: buildSweepGradient(colors, textColor),\n backgroundRepeat: 'no-repeat',\n backgroundSize: SWEEP_SIZE,\n backgroundPositionX: reduced ? SWEEP_TO : SWEEP_FROM,\n '--dia-sweep-from': SWEEP_FROM,\n '--dia-sweep-to': SWEEP_TO,\n ...(sweep !== null &&\n !reduced && {\n animationName: sweep.cycle % 2 === 0 ? 'dia-sweep-a' : 'dia-sweep-b',\n animationDuration: `${duration}s`,\n animationDelay: `${delay}s`,\n animationTimingFunction: sweepEaseCss,\n animationFillMode: 'both',\n animationIterationCount: 1,\n animationPlayState: paused ? 'paused' : 'running',\n }),\n } satisfies CSSProperties & Record<`--${string}`, string>;\n}\n\nexport { buildSweepStyle, COVERAGE_SPAN, makeExitEase };\n","/** Measures the single-line (nowrap) rendered width of each text string. */\nexport function measureWidths(el: HTMLElement, texts: string[]) {\n const parent = el.parentElement;\n if (!parent) return texts.map(() => 0);\n\n const ghost = el.cloneNode();\n if (!(ghost instanceof HTMLElement)) return texts.map(() => 0);\n\n Object.assign(ghost.style, {\n position: 'absolute',\n visibility: 'hidden',\n pointerEvents: 'none',\n width: 'auto',\n whiteSpace: 'nowrap',\n });\n parent.appendChild(ghost);\n const widths = texts.map((t) => {\n ghost.textContent = t;\n return ghost.getBoundingClientRect().width;\n });\n ghost.remove();\n return widths;\n}\n","'use client';\n\nimport { motion, useInView, useReducedMotion } from 'framer-motion';\nimport type { AnimationEvent, ComponentPropsWithoutRef } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { cn } from '../lib/utils.js';\n\nimport { ExitingLine, HeightClipper, WidthReservation } from './dia-text-reveal.lines.js';\nimport { buildSweepStyle, COVERAGE_SPAN, makeExitEase, type Sweep } from './dia-text-reveal.sweep.js';\nimport { measureWidths } from './dia-text-reveal.utils.js';\nimport './dia-text-reveal.css';\n\nconst DEFAULT_COLORS = ['#c679c4', '#fa3d1d', '#ffb005', '#e1e1fe', '#0358f7'];\n\nconst EXIT_LEAD_RATIO = 0.3;\n\nexport interface DiaTextRevealProps\n extends Omit<ComponentPropsWithoutRef<typeof motion.span>, 'ref' | 'children' | 'style' | 'animate' | 'transition' | 'color'> {\n /** Text to reveal. Pass multiple strings to rotate when `repeat` is `true`. */\n text: string | string[];\n /** Colors sampled across the moving gradient band. */\n colors?: string[];\n /** CSS color for revealed text after the sweep. @defaultValue `\"var(--color-foreground)\"` */\n textColor?: string;\n /** Duration of one sweep pass, in seconds. @defaultValue `1` */\n duration?: number;\n /** Delay before the sweep starts, in seconds. @defaultValue `0` */\n delay?: number;\n /** When `text` is an array, replay the sweep and advance to the next string after each completion. */\n repeat?: boolean;\n /** Pause between cycles when `repeat` is `true`, in seconds. @defaultValue `0.5` */\n repeatDelay?: number;\n /** How long the outgoing line takes to fade/slide away, in seconds. @defaultValue the sweep's coverage window */\n exitDuration?: number;\n /** Head start given to the outgoing line, in seconds. @defaultValue `0.15 * duration` */\n exitLead?: number;\n /** If `true`, the animation starts only after the element enters the viewport. @defaultValue `true` */\n startOnView?: boolean;\n /** External gate: while `false`, the sweep is held at its start. @defaultValue `true` */\n start?: boolean;\n /** Passed to `useInView`: if `true`, in-view detection fires at most once. @defaultValue `true` */\n once?: boolean;\n /** Additional class names for the animated `span`. */\n className?: string;\n /** When `text` has multiple entries, use the widest string's width for layout. @defaultValue `false` */\n fixedWidth?: boolean;\n /** Allow the text to wrap onto multiple lines. @defaultValue `false` */\n wrap?: boolean;\n}\n\nexport function DiaTextReveal({\n text,\n colors = DEFAULT_COLORS,\n textColor = 'var(--color-foreground)',\n duration = 1,\n delay = 0,\n repeat = false,\n repeatDelay = 0.5,\n exitDuration,\n exitLead,\n startOnView = true,\n start = true,\n once = true,\n className,\n fixedWidth = false,\n wrap = false,\n ...props\n}: DiaTextRevealProps) {\n const texts = Array.isArray(text) ? text : [text];\n const isMulti = texts.length > 1;\n const prefersReducedMotion = useReducedMotion();\n const exitSpan = exitDuration ?? duration * COVERAGE_SPAN;\n const lead = Math.max(0, exitLead ?? duration * EXIT_LEAD_RATIO);\n const exitTotal = lead + exitSpan;\n const leadFraction = exitTotal > 0 ? lead / exitTotal : 0;\n const exitOpacityEase = useMemo(() => makeExitEase(leadFraction), [leadFraction]);\n\n const spanRef = useRef<HTMLSpanElement>(null);\n const optsRef = useRef({ repeat, repeatDelay, texts });\n optsRef.current = { repeat, repeatDelay, texts };\n\n const indexRef = useRef(0);\n const hasPlayedRef = useRef(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const pendingRepeatRef = useRef(false);\n\n const [activeIndex, setActiveIndex] = useState(0);\n const [sweep, setSweep] = useState<Sweep>(null);\n const [exiting, setExiting] = useState<{\n index: number;\n token: number;\n } | null>(null);\n const clearExiting = useCallback(() => setExiting(null), []);\n const [measuredWidths, setMeasuredWidths] = useState<number[]>([]);\n const [wrapHeight, setWrapHeight] = useState<{\n h: number;\n shrink: boolean;\n } | null>(null);\n const innerRef = useRef<HTMLSpanElement>(null);\n\n const isInView = useInView(spanRef, { once, amount: 0.1 });\n const isLiveInView = useInView(spanRef, {\n once: false,\n amount: 0.1,\n });\n\n // biome-ignore lint/plugin: measures live DOM layout (getBoundingClientRect on a ghost clone) — post-render measurement.\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-measures only when the text content changes; isMulti/texts are derived from the same text prop.\n useEffect(() => {\n const el = spanRef.current;\n if (!(el && isMulti) || wrap) return;\n const measure = () => setMeasuredWidths(measureWidths(el, texts));\n measure();\n if (document.fonts.status !== 'loaded') document.fonts.ready.then(measure);\n }, [Array.isArray(text) ? text.join('\\0') : text, isMulti, wrap, texts]);\n\n // biome-ignore lint/plugin: subscribes a ResizeObserver to live DOM layout.\n useEffect(() => {\n const el = innerRef.current;\n if (!(el && wrap && isMulti)) return;\n const observer = new ResizeObserver(([entry]) => {\n if (!entry) return;\n const h = entry.contentRect.height;\n setWrapHeight((prev) =>\n prev !== null && prev.h === h\n ? prev\n : {\n h,\n shrink: prev !== null && h < prev.h,\n },\n );\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [wrap, isMulti]);\n\n const advance = useCallback(() => {\n const opts = optsRef.current;\n const current = indexRef.current;\n const next = (current + 1) % opts.texts.length;\n indexRef.current = next;\n setExiting({ index: current, token: Date.now() });\n setActiveIndex(next);\n setSweep((prev) => ({\n cycle: (prev?.cycle ?? 0) + 1,\n lead: true,\n }));\n }, []);\n\n const scheduleRepeat = useCallback(() => {\n timerRef.current = setTimeout(() => {\n timerRef.current = undefined;\n advance();\n }, optsRef.current.repeatDelay * 1000);\n }, [advance]);\n\n const onSweepEnd = useCallback(\n (event: AnimationEvent<HTMLSpanElement>) => {\n if (!event.animationName.startsWith('dia-sweep')) return;\n if (!optsRef.current.repeat) return;\n scheduleRepeat();\n },\n [scheduleRepeat],\n );\n\n // biome-ignore lint/plugin: flips imperative animation state on a viewport/gate edge.\n useEffect(() => {\n if (prefersReducedMotion) return;\n if (startOnView && !isInView) return;\n if (!start) return;\n if (once && hasPlayedRef.current) return;\n hasPlayedRef.current = true;\n setSweep((prev) => (prev === null ? { cycle: 0, lead: false } : { cycle: prev.cycle + 1, lead: false }));\n }, [isInView, start, startOnView, once, prefersReducedMotion]);\n\n // biome-ignore lint/plugin: pauses/re-arms a pending timer on live viewport presence.\n useEffect(() => {\n if (!repeat || prefersReducedMotion) return;\n if (!isLiveInView) {\n if (timerRef.current === undefined) return;\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n pendingRepeatRef.current = true;\n } else if (pendingRepeatRef.current) {\n pendingRepeatRef.current = false;\n scheduleRepeat();\n }\n }, [isLiveInView, repeat, prefersReducedMotion, scheduleRepeat]);\n\n // biome-ignore lint/plugin: releases a pending timer on unmount.\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n const paused = repeat && sweep !== null && !isLiveInView;\n\n const revealStyle = buildSweepStyle({\n colors,\n textColor,\n duration,\n delay: delay + (sweep?.lead ? lead : 0),\n sweep,\n paused,\n reduced: prefersReducedMotion === true,\n });\n\n if (!isMulti)\n return (\n <motion.span\n ref={spanRef}\n className={cn('align-baseline text-inherit leading-[100%]', className)}\n style={revealStyle}\n {...props}\n onAnimationEnd={onSweepEnd}\n >\n {texts[activeIndex]}\n </motion.span>\n );\n\n const fixedW = !wrap && fixedWidth && measuredWidths.length > 0 ? Math.max(...measuredWidths) : undefined;\n const animatedW = wrap || fixedWidth ? undefined : measuredWidths[activeIndex];\n const animatedH = wrap ? wrapHeight?.h : undefined;\n const heightDelay = exiting !== null && wrapHeight?.shrink ? exitTotal : 0;\n\n const incoming = (\n <span\n ref={innerRef}\n className={cn('inline-block', wrap && 'w-full', !wrap && 'whitespace-nowrap')}\n style={revealStyle}\n onAnimationEnd={onSweepEnd}\n >\n {texts[activeIndex]}\n </span>\n );\n\n return (\n <motion.span\n ref={spanRef}\n className={cn(\n wrap\n ? 'relative inline-block w-full text-center align-baseline text-inherit'\n : 'relative inline-block whitespace-nowrap text-center align-baseline text-inherit leading-[100%]',\n className,\n )}\n style={{\n ...(fixedW !== undefined && { width: fixedW }),\n }}\n animate={{\n ...(animatedW !== undefined && { width: animatedW }),\n }}\n transition={{\n width: { duration: 0.4, ease: [0.4, 0, 0.2, 1] },\n }}\n {...props}\n >\n {wrap ? (\n <HeightClipper height={animatedH} delay={heightDelay}>\n <WidthReservation texts={texts} />\n {incoming}\n </HeightClipper>\n ) : (\n incoming\n )}\n\n {exiting && !prefersReducedMotion && (\n <ExitingLine\n key={exiting.token}\n text={texts[exiting.index]!}\n textColor={textColor}\n duration={0.4}\n fallDuration={0.25}\n opacityEase={exitOpacityEase}\n wrap={wrap}\n onDone={clearExiting}\n />\n )}\n </motion.span>\n );\n}\n"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { solidSurface } from './chunk-XZEDZVXT.mjs';
|
|
2
|
+
import { cn } from './chunk-QAWSH567.mjs';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var cardVariants = cva("text-foreground flex flex-col", {
|
|
7
|
+
variants: {
|
|
8
|
+
variant: {
|
|
9
|
+
default: "gap-6 rounded-2xl py-6",
|
|
10
|
+
inset: "rounded-2xl p-1"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
defaultVariants: {
|
|
14
|
+
variant: "default"
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
function Card({ className, variant = "default", level = 3, shadowLevel = 1, ...props }) {
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
"div",
|
|
20
|
+
{
|
|
21
|
+
"data-slot": "card",
|
|
22
|
+
"data-variant": variant,
|
|
23
|
+
"data-level": level,
|
|
24
|
+
className: cn(
|
|
25
|
+
cardVariants({ variant }),
|
|
26
|
+
solidSurface(level, shadowLevel),
|
|
27
|
+
// bg-muted overrides solidSurface's bg, making the outer a gray frame
|
|
28
|
+
// while keeping its shadow, rim, and --popup-surface.
|
|
29
|
+
variant === "inset" && "bg-muted",
|
|
30
|
+
className
|
|
31
|
+
),
|
|
32
|
+
...props
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
function CardHeader({ className, ...props }) {
|
|
37
|
+
return /* @__PURE__ */ jsx(
|
|
38
|
+
"div",
|
|
39
|
+
{
|
|
40
|
+
"data-slot": "card-header",
|
|
41
|
+
className: cn(
|
|
42
|
+
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start has-[[data-slot=card-action]]:grid-cols-[1fr_auto] [.border-b]:pb-6",
|
|
43
|
+
"[[data-variant=default]>_&]:gap-1.5 [[data-variant=default]>_&]:px-6",
|
|
44
|
+
"[[data-variant=inset]>_&]:px-3 [[data-variant=inset]>_&]:py-2 [[data-variant=inset]>_&]:pt-1",
|
|
45
|
+
className
|
|
46
|
+
),
|
|
47
|
+
...props
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
function CardTitle({ className, ...props }) {
|
|
52
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "card-title", className: cn("font-semibold [[data-variant=default]_&]:leading-none", className), ...props });
|
|
53
|
+
}
|
|
54
|
+
function CardDescription({ className, ...props }) {
|
|
55
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "card-description", className: cn("text-muted-foreground text-sm", className), ...props });
|
|
56
|
+
}
|
|
57
|
+
function CardAction({ className, ...props }) {
|
|
58
|
+
return /* @__PURE__ */ jsx(
|
|
59
|
+
"div",
|
|
60
|
+
{
|
|
61
|
+
"data-slot": "card-action",
|
|
62
|
+
className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className),
|
|
63
|
+
...props
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function CardContent({ className, ...props }) {
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
"div",
|
|
70
|
+
{
|
|
71
|
+
"data-slot": "card-content",
|
|
72
|
+
className: cn(
|
|
73
|
+
"[[data-variant=default]>_&]:px-6",
|
|
74
|
+
"[[data-variant=inset]>_&]:flex [[data-variant=inset]>_&]:flex-1 [[data-variant=inset]>_&]:flex-col [[data-variant=inset]>_&]:rounded-lg [[data-variant=inset]>_&]:bg-surface-3 [[data-variant=inset]>_&]:p-4 [[data-variant=inset]>_&]:shadow-elevated-3 [[data-variant=inset]>_&]:[--popup-surface:var(--surface-3)]",
|
|
75
|
+
className
|
|
76
|
+
),
|
|
77
|
+
...props
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
function CardFooter({ className, ...props }) {
|
|
82
|
+
return /* @__PURE__ */ jsx(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
"data-slot": "card-footer",
|
|
86
|
+
className: cn(
|
|
87
|
+
"flex items-center [.border-t]:pt-6",
|
|
88
|
+
"[[data-variant=default]>_&]:px-6",
|
|
89
|
+
"[[data-variant=inset]>_&]:mt-auto [[data-variant=inset]>_&]:justify-end [[data-variant=inset]>_&]:pt-4",
|
|
90
|
+
className
|
|
91
|
+
),
|
|
92
|
+
...props
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
|
|
98
|
+
//# sourceMappingURL=chunk-YM3U2OBE.mjs.map
|
|
99
|
+
//# sourceMappingURL=chunk-YM3U2OBE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/card.tsx"],"names":[],"mappings":";;;;;AAKA,IAAM,YAAA,GAAe,IAAI,+BAAA,EAAiC;AAAA,EACxD,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,wBAAA;AAAA,MACT,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAOD,SAAS,IAAA,CAAK,EAAE,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,KAAA,GAAQ,CAAA,EAAG,WAAA,GAAc,CAAA,EAAG,GAAG,KAAA,EAAM,EAAc;AACjG,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,MAAA;AAAA,MACV,cAAA,EAAc,OAAA;AAAA,MACd,YAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,YAAA,CAAa,EAAE,OAAA,EAAS,CAAA;AAAA,QACxB,YAAA,CAAa,OAAO,WAAW,CAAA;AAAA;AAAA;AAAA,QAG/B,YAAY,OAAA,IAAW,UAAA;AAAA,QACvB;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,iJAAA;AAAA,QACA,sEAAA;AAAA,QACA,8FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACvE,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,YAAA,EAAa,SAAA,EAAW,GAAG,uDAAA,EAAyD,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAE9H;AAEA,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC7E,EAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,kBAAA,EAAmB,SAAA,EAAW,GAAG,+BAAA,EAAiC,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AACjH;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,gEAAA,EAAkE,SAAS,CAAA;AAAA,MACxF,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,kCAAA;AAAA,QACA,uTAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oCAAA;AAAA,QACA,kCAAA;AAAA,QACA,wGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-YM3U2OBE.mjs","sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\nimport { type SurfaceLevel, solidSurface } from '../lib/surface.js';\nimport { cn } from '../lib/utils.js';\n\nconst cardVariants = cva('text-foreground flex flex-col', {\n variants: {\n variant: {\n default: 'gap-6 rounded-2xl py-6',\n inset: 'rounded-2xl p-1',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {\n level?: SurfaceLevel;\n shadowLevel?: SurfaceLevel;\n}\n\nfunction Card({ className, variant = 'default', level = 3, shadowLevel = 1, ...props }: CardProps) {\n return (\n <div\n data-slot=\"card\"\n data-variant={variant}\n data-level={level}\n className={cn(\n cardVariants({ variant }),\n solidSurface(level, shadowLevel),\n // bg-muted overrides solidSurface's bg, making the outer a gray frame\n // while keeping its shadow, rim, and --popup-surface.\n variant === 'inset' && 'bg-muted',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n '@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start has-[[data-slot=card-action]]:grid-cols-[1fr_auto] [.border-b]:pb-6',\n '[[data-variant=default]>_&]:gap-1.5 [[data-variant=default]>_&]:px-6',\n '[[data-variant=inset]>_&]:px-3 [[data-variant=inset]>_&]:py-2 [[data-variant=inset]>_&]:pt-1',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div data-slot=\"card-title\" className={cn('font-semibold [[data-variant=default]_&]:leading-none', className)} {...props} />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-description\" className={cn('text-muted-foreground text-sm', className)} {...props} />;\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\n '[[data-variant=default]>_&]:px-6',\n '[[data-variant=inset]>_&]:flex [[data-variant=inset]>_&]:flex-1 [[data-variant=inset]>_&]:flex-col [[data-variant=inset]>_&]:rounded-lg [[data-variant=inset]>_&]:bg-surface-3 [[data-variant=inset]>_&]:p-4 [[data-variant=inset]>_&]:shadow-elevated-3 [[data-variant=inset]>_&]:[--popup-surface:var(--surface-3)]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n 'flex items-center [.border-t]:pt-6',\n '[[data-variant=default]>_&]:px-6',\n '[[data-variant=inset]>_&]:mt-auto [[data-variant=inset]>_&]:justify-end [[data-variant=inset]>_&]:pt-4',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type { CardProps };\nexport { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* src/components/dia-text-reveal.css */
|
|
2
|
+
@keyframes dia-sweep-a {
|
|
3
|
+
from {
|
|
4
|
+
background-position-x: var(--dia-sweep-from, 83.5%);
|
|
5
|
+
}
|
|
6
|
+
to {
|
|
7
|
+
background-position-x: var(--dia-sweep-to, 16.5%);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
@keyframes dia-sweep-b {
|
|
11
|
+
from {
|
|
12
|
+
background-position-x: var(--dia-sweep-from, 83.5%);
|
|
13
|
+
}
|
|
14
|
+
to {
|
|
15
|
+
background-position-x: var(--dia-sweep-to, 16.5%);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/*# sourceMappingURL=dia-text-reveal.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/dia-text-reveal.css"],"sourcesContent":["/* Keyframes for DiaTextReveal's gradient sweep.\n\n The band is a static gradient several times wider than the line (see\n dia-text-reveal.sweep.ts); sweeping it is just sliding that image, so the only thing\n animating here is background-position-x. Keeping it in CSS is the point: the sweep then\n runs on the browser's animation clock instead of a requestAnimationFrame loop, so a busy\n main thread — scrolling, WebGL render loops, React commits — can no longer stall it.\n\n Two identical rules under different names. Re-assigning animation-name is what restarts a\n CSS animation, and the rotating variant needs a restart per line; the alternative,\n remounting the span, would leave wrap mode's ResizeObserver bound to a detached node.\n\n The endpoints are supplied as custom properties by the component, which derives them from\n the band geometry. The literal fallbacks match SWEEP_FROM / SWEEP_TO for the same defaults\n and only apply if those properties never land. */\n\n@keyframes dia-sweep-a {\n from {\n background-position-x: var(--dia-sweep-from, 83.5%);\n }\n to {\n background-position-x: var(--dia-sweep-to, 16.5%);\n }\n}\n\n@keyframes dia-sweep-b {\n from {\n background-position-x: var(--dia-sweep-from, 83.5%);\n }\n to {\n background-position-x: var(--dia-sweep-to, 16.5%);\n }\n}\n"],"mappings":";AAgBA,WAAW;AACT;AACE,2BAAuB,IAAI,gBAAgB,EAAE;AAC/C;AACA;AACE,2BAAuB,IAAI,cAAc,EAAE;AAC7C;AACF;AAEA,WAAW;AACT;AACE,2BAAuB,IAAI,gBAAgB,EAAE;AAC/C;AACA;AACE,2BAAuB,IAAI,cAAc,EAAE;AAC7C;AACF;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { motion } from 'framer-motion';
|
|
2
|
+
import type { ComponentPropsWithoutRef } from 'react';
|
|
3
|
+
import './dia-text-reveal.css';
|
|
4
|
+
export interface DiaTextRevealProps extends Omit<ComponentPropsWithoutRef<typeof motion.span>, 'ref' | 'children' | 'style' | 'animate' | 'transition' | 'color'> {
|
|
5
|
+
/** Text to reveal. Pass multiple strings to rotate when `repeat` is `true`. */
|
|
6
|
+
text: string | string[];
|
|
7
|
+
/** Colors sampled across the moving gradient band. */
|
|
8
|
+
colors?: string[];
|
|
9
|
+
/** CSS color for revealed text after the sweep. @defaultValue `"var(--color-foreground)"` */
|
|
10
|
+
textColor?: string;
|
|
11
|
+
/** Duration of one sweep pass, in seconds. @defaultValue `1` */
|
|
12
|
+
duration?: number;
|
|
13
|
+
/** Delay before the sweep starts, in seconds. @defaultValue `0` */
|
|
14
|
+
delay?: number;
|
|
15
|
+
/** When `text` is an array, replay the sweep and advance to the next string after each completion. */
|
|
16
|
+
repeat?: boolean;
|
|
17
|
+
/** Pause between cycles when `repeat` is `true`, in seconds. @defaultValue `0.5` */
|
|
18
|
+
repeatDelay?: number;
|
|
19
|
+
/** How long the outgoing line takes to fade/slide away, in seconds. @defaultValue the sweep's coverage window */
|
|
20
|
+
exitDuration?: number;
|
|
21
|
+
/** Head start given to the outgoing line, in seconds. @defaultValue `0.15 * duration` */
|
|
22
|
+
exitLead?: number;
|
|
23
|
+
/** If `true`, the animation starts only after the element enters the viewport. @defaultValue `true` */
|
|
24
|
+
startOnView?: boolean;
|
|
25
|
+
/** External gate: while `false`, the sweep is held at its start. @defaultValue `true` */
|
|
26
|
+
start?: boolean;
|
|
27
|
+
/** Passed to `useInView`: if `true`, in-view detection fires at most once. @defaultValue `true` */
|
|
28
|
+
once?: boolean;
|
|
29
|
+
/** Additional class names for the animated `span`. */
|
|
30
|
+
className?: string;
|
|
31
|
+
/** When `text` has multiple entries, use the widest string's width for layout. @defaultValue `false` */
|
|
32
|
+
fixedWidth?: boolean;
|
|
33
|
+
/** Allow the text to wrap onto multiple lines. @defaultValue `false` */
|
|
34
|
+
wrap?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function DiaTextReveal({ text, colors, textColor, duration, delay, repeat, repeatDelay, exitDuration, exitLead, startOnView, start, once, className, fixedWidth, wrap, ...props }: DiaTextRevealProps): import("react").JSX.Element;
|
|
37
|
+
//# sourceMappingURL=dia-text-reveal.d.ts.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { motion } from 'framer-motion';
|
|
2
|
+
import type { ComponentPropsWithoutRef } from 'react';
|
|
3
|
+
import './dia-text-reveal.css';
|
|
4
|
+
export interface DiaTextRevealProps extends Omit<ComponentPropsWithoutRef<typeof motion.span>, 'ref' | 'children' | 'style' | 'animate' | 'transition' | 'color'> {
|
|
5
|
+
/** Text to reveal. Pass multiple strings to rotate when `repeat` is `true`. */
|
|
6
|
+
text: string | string[];
|
|
7
|
+
/** Colors sampled across the moving gradient band. */
|
|
8
|
+
colors?: string[];
|
|
9
|
+
/** CSS color for revealed text after the sweep. @defaultValue `"var(--color-foreground)"` */
|
|
10
|
+
textColor?: string;
|
|
11
|
+
/** Duration of one sweep pass, in seconds. @defaultValue `1` */
|
|
12
|
+
duration?: number;
|
|
13
|
+
/** Delay before the sweep starts, in seconds. @defaultValue `0` */
|
|
14
|
+
delay?: number;
|
|
15
|
+
/** When `text` is an array, replay the sweep and advance to the next string after each completion. */
|
|
16
|
+
repeat?: boolean;
|
|
17
|
+
/** Pause between cycles when `repeat` is `true`, in seconds. @defaultValue `0.5` */
|
|
18
|
+
repeatDelay?: number;
|
|
19
|
+
/** How long the outgoing line takes to fade/slide away, in seconds. @defaultValue the sweep's coverage window */
|
|
20
|
+
exitDuration?: number;
|
|
21
|
+
/** Head start given to the outgoing line, in seconds. @defaultValue `0.15 * duration` */
|
|
22
|
+
exitLead?: number;
|
|
23
|
+
/** If `true`, the animation starts only after the element enters the viewport. @defaultValue `true` */
|
|
24
|
+
startOnView?: boolean;
|
|
25
|
+
/** External gate: while `false`, the sweep is held at its start. @defaultValue `true` */
|
|
26
|
+
start?: boolean;
|
|
27
|
+
/** Passed to `useInView`: if `true`, in-view detection fires at most once. @defaultValue `true` */
|
|
28
|
+
once?: boolean;
|
|
29
|
+
/** Additional class names for the animated `span`. */
|
|
30
|
+
className?: string;
|
|
31
|
+
/** When `text` has multiple entries, use the widest string's width for layout. @defaultValue `false` */
|
|
32
|
+
fixedWidth?: boolean;
|
|
33
|
+
/** Allow the text to wrap onto multiple lines. @defaultValue `false` */
|
|
34
|
+
wrap?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function DiaTextReveal({ text, colors, textColor, duration, delay, repeat, repeatDelay, exitDuration, exitLead, startOnView, start, once, className, fixedWidth, wrap, ...props }: DiaTextRevealProps): import("react").JSX.Element;
|
|
37
|
+
//# sourceMappingURL=dia-text-reveal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dia-text-reveal.d.ts","sourceRoot":"","sources":["../../src/components/dia-text-reveal.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAA+B,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAkB,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAQtE,OAAO,uBAAuB,CAAC;AAM/B,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,wBAAwB,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,CAAC;IAC7H,+EAA+E;IAC/E,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sGAAsG;IACtG,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iHAAiH;IACjH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uGAAuG;IACvG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yFAAyF;IACzF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mGAAmG;IACnG,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wGAAwG;IACxG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,MAAuB,EACvB,SAAqC,EACrC,QAAY,EACZ,KAAS,EACT,MAAc,EACd,WAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,WAAkB,EAClB,KAAY,EACZ,IAAW,EACX,SAAS,EACT,UAAkB,EAClB,IAAY,EACZ,GAAG,KAAK,EACT,EAAE,kBAAkB,+BAiNpB"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var framerMotion = require('framer-motion');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var clsx = require('clsx');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
function HeightClipper({ height, delay, children }) {
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
14
|
+
framerMotion.motion.span,
|
|
15
|
+
{
|
|
16
|
+
className: "block w-full overflow-hidden",
|
|
17
|
+
animate: height === void 0 ? {} : { height },
|
|
18
|
+
transition: {
|
|
19
|
+
height: { duration: 0.4, ease: [0.4, 0, 0.2, 1], delay }
|
|
20
|
+
},
|
|
21
|
+
children
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
function ExitingLine({ text, textColor, duration, fallDuration, opacityEase, wrap = false, onDone }) {
|
|
26
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
27
|
+
framerMotion.motion.span,
|
|
28
|
+
{
|
|
29
|
+
"aria-hidden": true,
|
|
30
|
+
className: cn(
|
|
31
|
+
wrap ? "pointer-events-none absolute top-0 left-0 w-full" : "pointer-events-none absolute top-0 left-1/2 whitespace-nowrap"
|
|
32
|
+
),
|
|
33
|
+
style: { color: textColor },
|
|
34
|
+
initial: wrap ? { opacity: 1, y: 0 } : { opacity: 1, x: "-50%", y: 0 },
|
|
35
|
+
animate: wrap ? { opacity: 0, y: 14 } : { opacity: 0, x: "-50%", y: 14 },
|
|
36
|
+
transition: {
|
|
37
|
+
opacity: { duration, ease: opacityEase },
|
|
38
|
+
y: { duration: fallDuration, ease: [0.22, 0.61, 0.36, 1] }
|
|
39
|
+
},
|
|
40
|
+
onAnimationComplete: onDone,
|
|
41
|
+
children: text
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
function WidthReservation({ texts }) {
|
|
46
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "invisible block h-0 overflow-hidden", children: texts.map((t) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block", children: t }, t)) });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// src/components/dia-text-reveal.sweep.ts
|
|
50
|
+
var BAND_HALF = 17;
|
|
51
|
+
var SWEEP_START = -BAND_HALF;
|
|
52
|
+
var SWEEP_END = 100 + BAND_HALF;
|
|
53
|
+
var sweepEaseFn = (t) => t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2;
|
|
54
|
+
var coverageAt = (progress) => Math.min(1, sweepEaseFn(progress) * (SWEEP_END - SWEEP_START) / 100);
|
|
55
|
+
var COVERAGE_SPAN = (() => {
|
|
56
|
+
let lo = 0;
|
|
57
|
+
let hi = 1;
|
|
58
|
+
for (let i = 0; i < 40; i += 1) {
|
|
59
|
+
const mid = (lo + hi) / 2;
|
|
60
|
+
if (coverageAt(mid) < 1) lo = mid;
|
|
61
|
+
else hi = mid;
|
|
62
|
+
}
|
|
63
|
+
return hi;
|
|
64
|
+
})();
|
|
65
|
+
var EXIT_FADE_BIAS = 0.4;
|
|
66
|
+
var exitEase = (t) => coverageAt(t * COVERAGE_SPAN) ** EXIT_FADE_BIAS;
|
|
67
|
+
var makeExitEase = (leadFraction) => {
|
|
68
|
+
if (leadFraction <= 0) return exitEase;
|
|
69
|
+
if (leadFraction >= 1) return () => 0;
|
|
70
|
+
return (t) => t <= leadFraction ? 0 : exitEase((t - leadFraction) / (1 - leadFraction));
|
|
71
|
+
};
|
|
72
|
+
var SWEEP_SCALE = 3;
|
|
73
|
+
var BAND_HALF_IMAGE = BAND_HALF / SWEEP_SCALE;
|
|
74
|
+
var positionFor = (pos) => (pos - 50 * SWEEP_SCALE) / (1 - SWEEP_SCALE);
|
|
75
|
+
var SWEEP_FROM = `${positionFor(SWEEP_START).toFixed(3)}%`;
|
|
76
|
+
var SWEEP_TO = `${positionFor(SWEEP_END).toFixed(3)}%`;
|
|
77
|
+
var SWEEP_SIZE = `${SWEEP_SCALE * 100}% 100%`;
|
|
78
|
+
var EASE_SAMPLES = 24;
|
|
79
|
+
var sweepEaseCss = `linear(${Array.from({ length: EASE_SAMPLES + 1 }, (_, i) => sweepEaseFn(i / EASE_SAMPLES).toFixed(5)).join(
|
|
80
|
+
", "
|
|
81
|
+
)})`;
|
|
82
|
+
function buildSweepGradient(colors, textColor) {
|
|
83
|
+
const bandStart = 50 - BAND_HALF_IMAGE;
|
|
84
|
+
const bandEnd = 50 + BAND_HALF_IMAGE;
|
|
85
|
+
const n = colors.length;
|
|
86
|
+
const parts = [`${textColor} 0%`, `${textColor} ${bandStart.toFixed(3)}%`];
|
|
87
|
+
for (const [i, c] of colors.entries()) {
|
|
88
|
+
const pct = n === 1 ? 50 : bandStart + i / (n - 1) * BAND_HALF_IMAGE * 2;
|
|
89
|
+
parts.push(`${c} ${pct.toFixed(3)}%`);
|
|
90
|
+
}
|
|
91
|
+
parts.push(`transparent ${bandEnd.toFixed(3)}%`, "transparent 100%");
|
|
92
|
+
return `linear-gradient(90deg, ${parts.join(", ")})`;
|
|
93
|
+
}
|
|
94
|
+
function buildSweepStyle({ colors, textColor, duration, delay, sweep, paused, reduced }) {
|
|
95
|
+
return {
|
|
96
|
+
color: "transparent",
|
|
97
|
+
backgroundClip: "text",
|
|
98
|
+
WebkitBackgroundClip: "text",
|
|
99
|
+
backgroundImage: buildSweepGradient(colors, textColor),
|
|
100
|
+
backgroundRepeat: "no-repeat",
|
|
101
|
+
backgroundSize: SWEEP_SIZE,
|
|
102
|
+
backgroundPositionX: reduced ? SWEEP_TO : SWEEP_FROM,
|
|
103
|
+
"--dia-sweep-from": SWEEP_FROM,
|
|
104
|
+
"--dia-sweep-to": SWEEP_TO,
|
|
105
|
+
...sweep !== null && !reduced && {
|
|
106
|
+
animationName: sweep.cycle % 2 === 0 ? "dia-sweep-a" : "dia-sweep-b",
|
|
107
|
+
animationDuration: `${duration}s`,
|
|
108
|
+
animationDelay: `${delay}s`,
|
|
109
|
+
animationTimingFunction: sweepEaseCss,
|
|
110
|
+
animationFillMode: "both",
|
|
111
|
+
animationIterationCount: 1,
|
|
112
|
+
animationPlayState: paused ? "paused" : "running"
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// src/components/dia-text-reveal.utils.ts
|
|
118
|
+
function measureWidths(el, texts) {
|
|
119
|
+
const parent = el.parentElement;
|
|
120
|
+
if (!parent) return texts.map(() => 0);
|
|
121
|
+
const ghost = el.cloneNode();
|
|
122
|
+
if (!(ghost instanceof HTMLElement)) return texts.map(() => 0);
|
|
123
|
+
Object.assign(ghost.style, {
|
|
124
|
+
position: "absolute",
|
|
125
|
+
visibility: "hidden",
|
|
126
|
+
pointerEvents: "none",
|
|
127
|
+
width: "auto",
|
|
128
|
+
whiteSpace: "nowrap"
|
|
129
|
+
});
|
|
130
|
+
parent.appendChild(ghost);
|
|
131
|
+
const widths = texts.map((t) => {
|
|
132
|
+
ghost.textContent = t;
|
|
133
|
+
return ghost.getBoundingClientRect().width;
|
|
134
|
+
});
|
|
135
|
+
ghost.remove();
|
|
136
|
+
return widths;
|
|
137
|
+
}
|
|
138
|
+
var DEFAULT_COLORS = ["#c679c4", "#fa3d1d", "#ffb005", "#e1e1fe", "#0358f7"];
|
|
139
|
+
var EXIT_LEAD_RATIO = 0.3;
|
|
140
|
+
function DiaTextReveal({
|
|
141
|
+
text,
|
|
142
|
+
colors = DEFAULT_COLORS,
|
|
143
|
+
textColor = "var(--color-foreground)",
|
|
144
|
+
duration = 1,
|
|
145
|
+
delay = 0,
|
|
146
|
+
repeat = false,
|
|
147
|
+
repeatDelay = 0.5,
|
|
148
|
+
exitDuration,
|
|
149
|
+
exitLead,
|
|
150
|
+
startOnView = true,
|
|
151
|
+
start = true,
|
|
152
|
+
once = true,
|
|
153
|
+
className,
|
|
154
|
+
fixedWidth = false,
|
|
155
|
+
wrap = false,
|
|
156
|
+
...props
|
|
157
|
+
}) {
|
|
158
|
+
const texts = Array.isArray(text) ? text : [text];
|
|
159
|
+
const isMulti = texts.length > 1;
|
|
160
|
+
const prefersReducedMotion = framerMotion.useReducedMotion();
|
|
161
|
+
const exitSpan = exitDuration ?? duration * COVERAGE_SPAN;
|
|
162
|
+
const lead = Math.max(0, exitLead ?? duration * EXIT_LEAD_RATIO);
|
|
163
|
+
const exitTotal = lead + exitSpan;
|
|
164
|
+
const leadFraction = exitTotal > 0 ? lead / exitTotal : 0;
|
|
165
|
+
const exitOpacityEase = react.useMemo(() => makeExitEase(leadFraction), [leadFraction]);
|
|
166
|
+
const spanRef = react.useRef(null);
|
|
167
|
+
const optsRef = react.useRef({ repeat, repeatDelay, texts });
|
|
168
|
+
optsRef.current = { repeat, repeatDelay, texts };
|
|
169
|
+
const indexRef = react.useRef(0);
|
|
170
|
+
const hasPlayedRef = react.useRef(false);
|
|
171
|
+
const timerRef = react.useRef(void 0);
|
|
172
|
+
const pendingRepeatRef = react.useRef(false);
|
|
173
|
+
const [activeIndex, setActiveIndex] = react.useState(0);
|
|
174
|
+
const [sweep, setSweep] = react.useState(null);
|
|
175
|
+
const [exiting, setExiting] = react.useState(null);
|
|
176
|
+
const clearExiting = react.useCallback(() => setExiting(null), []);
|
|
177
|
+
const [measuredWidths, setMeasuredWidths] = react.useState([]);
|
|
178
|
+
const [wrapHeight, setWrapHeight] = react.useState(null);
|
|
179
|
+
const innerRef = react.useRef(null);
|
|
180
|
+
const isInView = framerMotion.useInView(spanRef, { once, amount: 0.1 });
|
|
181
|
+
const isLiveInView = framerMotion.useInView(spanRef, {
|
|
182
|
+
once: false,
|
|
183
|
+
amount: 0.1
|
|
184
|
+
});
|
|
185
|
+
react.useEffect(() => {
|
|
186
|
+
const el = spanRef.current;
|
|
187
|
+
if (!(el && isMulti) || wrap) return;
|
|
188
|
+
const measure = () => setMeasuredWidths(measureWidths(el, texts));
|
|
189
|
+
measure();
|
|
190
|
+
if (document.fonts.status !== "loaded") document.fonts.ready.then(measure);
|
|
191
|
+
}, [Array.isArray(text) ? text.join("\0") : text, isMulti, wrap, texts]);
|
|
192
|
+
react.useEffect(() => {
|
|
193
|
+
const el = innerRef.current;
|
|
194
|
+
if (!(el && wrap && isMulti)) return;
|
|
195
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
196
|
+
if (!entry) return;
|
|
197
|
+
const h = entry.contentRect.height;
|
|
198
|
+
setWrapHeight(
|
|
199
|
+
(prev) => prev !== null && prev.h === h ? prev : {
|
|
200
|
+
h,
|
|
201
|
+
shrink: prev !== null && h < prev.h
|
|
202
|
+
}
|
|
203
|
+
);
|
|
204
|
+
});
|
|
205
|
+
observer.observe(el);
|
|
206
|
+
return () => observer.disconnect();
|
|
207
|
+
}, [wrap, isMulti]);
|
|
208
|
+
const advance = react.useCallback(() => {
|
|
209
|
+
const opts = optsRef.current;
|
|
210
|
+
const current = indexRef.current;
|
|
211
|
+
const next = (current + 1) % opts.texts.length;
|
|
212
|
+
indexRef.current = next;
|
|
213
|
+
setExiting({ index: current, token: Date.now() });
|
|
214
|
+
setActiveIndex(next);
|
|
215
|
+
setSweep((prev) => ({
|
|
216
|
+
cycle: (prev?.cycle ?? 0) + 1,
|
|
217
|
+
lead: true
|
|
218
|
+
}));
|
|
219
|
+
}, []);
|
|
220
|
+
const scheduleRepeat = react.useCallback(() => {
|
|
221
|
+
timerRef.current = setTimeout(() => {
|
|
222
|
+
timerRef.current = void 0;
|
|
223
|
+
advance();
|
|
224
|
+
}, optsRef.current.repeatDelay * 1e3);
|
|
225
|
+
}, [advance]);
|
|
226
|
+
const onSweepEnd = react.useCallback(
|
|
227
|
+
(event) => {
|
|
228
|
+
if (!event.animationName.startsWith("dia-sweep")) return;
|
|
229
|
+
if (!optsRef.current.repeat) return;
|
|
230
|
+
scheduleRepeat();
|
|
231
|
+
},
|
|
232
|
+
[scheduleRepeat]
|
|
233
|
+
);
|
|
234
|
+
react.useEffect(() => {
|
|
235
|
+
if (prefersReducedMotion) return;
|
|
236
|
+
if (startOnView && !isInView) return;
|
|
237
|
+
if (!start) return;
|
|
238
|
+
if (once && hasPlayedRef.current) return;
|
|
239
|
+
hasPlayedRef.current = true;
|
|
240
|
+
setSweep((prev) => prev === null ? { cycle: 0, lead: false } : { cycle: prev.cycle + 1, lead: false });
|
|
241
|
+
}, [isInView, start, startOnView, once, prefersReducedMotion]);
|
|
242
|
+
react.useEffect(() => {
|
|
243
|
+
if (!repeat || prefersReducedMotion) return;
|
|
244
|
+
if (!isLiveInView) {
|
|
245
|
+
if (timerRef.current === void 0) return;
|
|
246
|
+
clearTimeout(timerRef.current);
|
|
247
|
+
timerRef.current = void 0;
|
|
248
|
+
pendingRepeatRef.current = true;
|
|
249
|
+
} else if (pendingRepeatRef.current) {
|
|
250
|
+
pendingRepeatRef.current = false;
|
|
251
|
+
scheduleRepeat();
|
|
252
|
+
}
|
|
253
|
+
}, [isLiveInView, repeat, prefersReducedMotion, scheduleRepeat]);
|
|
254
|
+
react.useEffect(() => () => clearTimeout(timerRef.current), []);
|
|
255
|
+
const paused = repeat && sweep !== null && !isLiveInView;
|
|
256
|
+
const revealStyle = buildSweepStyle({
|
|
257
|
+
colors,
|
|
258
|
+
textColor,
|
|
259
|
+
duration,
|
|
260
|
+
delay: delay + (sweep?.lead ? lead : 0),
|
|
261
|
+
sweep,
|
|
262
|
+
paused,
|
|
263
|
+
reduced: prefersReducedMotion === true
|
|
264
|
+
});
|
|
265
|
+
if (!isMulti)
|
|
266
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
267
|
+
framerMotion.motion.span,
|
|
268
|
+
{
|
|
269
|
+
ref: spanRef,
|
|
270
|
+
className: cn("align-baseline text-inherit leading-[100%]", className),
|
|
271
|
+
style: revealStyle,
|
|
272
|
+
...props,
|
|
273
|
+
onAnimationEnd: onSweepEnd,
|
|
274
|
+
children: texts[activeIndex]
|
|
275
|
+
}
|
|
276
|
+
);
|
|
277
|
+
const fixedW = !wrap && fixedWidth && measuredWidths.length > 0 ? Math.max(...measuredWidths) : void 0;
|
|
278
|
+
const animatedW = wrap || fixedWidth ? void 0 : measuredWidths[activeIndex];
|
|
279
|
+
const animatedH = wrap ? wrapHeight?.h : void 0;
|
|
280
|
+
const heightDelay = exiting !== null && wrapHeight?.shrink ? exitTotal : 0;
|
|
281
|
+
const incoming = /* @__PURE__ */ jsxRuntime.jsx(
|
|
282
|
+
"span",
|
|
283
|
+
{
|
|
284
|
+
ref: innerRef,
|
|
285
|
+
className: cn("inline-block", wrap && "w-full", !wrap && "whitespace-nowrap"),
|
|
286
|
+
style: revealStyle,
|
|
287
|
+
onAnimationEnd: onSweepEnd,
|
|
288
|
+
children: texts[activeIndex]
|
|
289
|
+
}
|
|
290
|
+
);
|
|
291
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
292
|
+
framerMotion.motion.span,
|
|
293
|
+
{
|
|
294
|
+
ref: spanRef,
|
|
295
|
+
className: cn(
|
|
296
|
+
wrap ? "relative inline-block w-full text-center align-baseline text-inherit" : "relative inline-block whitespace-nowrap text-center align-baseline text-inherit leading-[100%]",
|
|
297
|
+
className
|
|
298
|
+
),
|
|
299
|
+
style: {
|
|
300
|
+
...fixedW !== void 0 && { width: fixedW }
|
|
301
|
+
},
|
|
302
|
+
animate: {
|
|
303
|
+
...animatedW !== void 0 && { width: animatedW }
|
|
304
|
+
},
|
|
305
|
+
transition: {
|
|
306
|
+
width: { duration: 0.4, ease: [0.4, 0, 0.2, 1] }
|
|
307
|
+
},
|
|
308
|
+
...props,
|
|
309
|
+
children: [
|
|
310
|
+
wrap ? /* @__PURE__ */ jsxRuntime.jsxs(HeightClipper, { height: animatedH, delay: heightDelay, children: [
|
|
311
|
+
/* @__PURE__ */ jsxRuntime.jsx(WidthReservation, { texts }),
|
|
312
|
+
incoming
|
|
313
|
+
] }) : incoming,
|
|
314
|
+
exiting && !prefersReducedMotion && /* @__PURE__ */ jsxRuntime.jsx(
|
|
315
|
+
ExitingLine,
|
|
316
|
+
{
|
|
317
|
+
text: texts[exiting.index],
|
|
318
|
+
textColor,
|
|
319
|
+
duration: 0.4,
|
|
320
|
+
fallDuration: 0.25,
|
|
321
|
+
opacityEase: exitOpacityEase,
|
|
322
|
+
wrap,
|
|
323
|
+
onDone: clearExiting
|
|
324
|
+
},
|
|
325
|
+
exiting.token
|
|
326
|
+
)
|
|
327
|
+
]
|
|
328
|
+
}
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
exports.DiaTextReveal = DiaTextReveal;
|
|
333
|
+
//# sourceMappingURL=dia-text-reveal.js.map
|
|
334
|
+
//# sourceMappingURL=dia-text-reveal.js.map
|