@heyramzi/ui 7.0.0 → 8.1.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/COMPONENTS.md +28 -17
- package/README.md +6 -2
- package/package.json +25 -15
- package/scripts/sync-shadcn.mjs +17 -13
- package/scripts/sync-transitions.mjs +11 -11
- package/src/agents/agent-avatar.svelte +67 -114
- package/src/agents/agent-cast.svelte +31 -7
- package/src/agents/demo.svelte +55 -8
- package/src/agents/helpers.ts +58 -0
- package/src/agents/page-state.ts +70 -0
- package/src/agents/types.ts +3 -1
- package/src/ai/ai-button/AiButton.svelte +86 -0
- package/src/ai/ai-button/index.ts +4 -0
- package/src/ai/confirmation/Confirmation.svelte +8 -8
- package/src/ai/confirmation/confirmation-context.svelte.ts +2 -2
- package/src/ai/generation-progress/GenerationProgress.svelte +354 -0
- package/src/ai/generation-progress/index.ts +7 -0
- package/src/ai/index.ts +16 -6
- package/src/ai/prompt-input/PromptInput.svelte +19 -1
- package/src/ai/prompt-input/PromptInputSubmit.svelte +9 -3
- package/src/ai/reasoning/Reasoning.svelte +11 -8
- package/src/ambient.d.ts +4 -0
- package/src/animations/README.md +14 -14
- package/src/animations/index.css +3 -14
- package/src/animations/upstream-coverage.test.ts +1 -1
- package/src/components/copy/clipboard.test.ts +206 -0
- package/src/components/copy/clipboard.ts +49 -0
- package/src/components/copy/copied.svelte.ts +39 -0
- package/src/components/copy/copy-button.svelte +175 -0
- package/src/components/copy/copy-button.test.ts +110 -0
- package/src/components/copy/index.ts +3 -0
- package/src/components/data-table/data-table.test.ts +134 -0
- package/src/components/data-table/data-table.ts +77 -0
- package/src/components/data-table/index.ts +20 -0
- package/src/components/data-table/infinite-scroll.svelte +69 -0
- package/src/components/data-table/pagination.svelte +62 -0
- package/src/components/data-table/row-arrow.svelte +28 -0
- package/src/components/data-table/row-context-menu.svelte +106 -0
- package/src/components/data-table/row-context-menu.test.ts +18 -0
- package/src/components/data-table/sortable-head.svelte +56 -0
- package/src/components/data-table/table-skeleton.svelte +83 -0
- package/src/components/hold-to-confirm/hold-to-confirm.svelte +232 -0
- package/src/components/hold-to-confirm/index.ts +1 -0
- package/src/components/icon/icon.svelte +23 -0
- package/src/components/icon/index.ts +1 -0
- package/src/components/language-flag/index.ts +1 -0
- package/src/components/language-flag/language-flag.svelte +60 -0
- package/src/components/list-page/detail-empty.svelte +50 -0
- package/src/components/list-page/detail-header.svelte +107 -0
- package/src/components/list-page/detail-panel.svelte +90 -0
- package/src/components/list-page/detail-row.svelte +36 -0
- package/src/components/list-page/detail-stack.svelte +33 -0
- package/src/components/list-page/empty-state.svelte +91 -0
- package/src/components/list-page/filter-item.svelte +49 -0
- package/src/components/list-page/filter-popover.svelte +88 -0
- package/src/components/list-page/filter-section.ts +12 -0
- package/src/components/list-page/grouped-list.svelte +116 -0
- package/src/components/list-page/index.ts +28 -0
- package/src/components/list-page/list-page-shell.svelte +195 -0
- package/src/components/list-page/list-table.ts +19 -0
- package/src/components/list-page/master-detail.svelte +206 -0
- package/src/components/list-page/master-detail.test.ts +37 -0
- package/src/components/list-page/notice-bar.svelte +68 -0
- package/src/components/list-page/prev-next.svelte +104 -0
- package/src/components/list-page/queue-rail.ts +25 -0
- package/src/components/list-page/rail-body.svelte +29 -0
- package/src/components/list-page/rail-empty.svelte +51 -0
- package/src/components/list-page/rail-head.svelte +49 -0
- package/src/components/list-page/rail-row.svelte +163 -0
- package/src/components/list-page/section-host.ts +24 -0
- package/src/components/list-page/section-label.svelte +39 -0
- package/src/components/list-page/step.test.ts +21 -0
- package/src/components/list-page/step.ts +10 -0
- package/src/components/list-page/toolbar-search.svelte +63 -0
- package/src/components/list-page/toolbar-trigger.ts +23 -0
- package/src/components/list-page/types.ts +1 -0
- package/src/components/locale-switch/index.ts +1 -0
- package/src/components/locale-switch/locale-switch.svelte +59 -0
- package/src/components/mark/index.ts +1 -0
- package/src/components/mark/mark.svelte +70 -0
- package/src/components/open-in/index.ts +6 -0
- package/src/components/open-in/open-in.svelte +106 -0
- package/src/components/picker/index.ts +4 -0
- package/src/components/picker/mark-picker.svelte +84 -0
- package/src/components/picker/picker.svelte +143 -0
- package/src/components/picker/trigger.ts +42 -0
- package/src/components/picker/types.ts +26 -0
- package/src/components/segmented/animated-tabs.svelte +175 -0
- package/src/components/segmented/collapse.test.ts +49 -0
- package/src/components/segmented/collapse.ts +39 -0
- package/src/components/segmented/index.ts +41 -0
- package/src/components/segmented/section-runs.svelte +79 -0
- package/src/components/segmented/segment.svelte +106 -0
- package/src/components/segmented/segmented-filter.svelte +125 -0
- package/src/components/segmented/segmented-nav.svelte +82 -0
- package/src/components/segmented/segmented-overflow.svelte +85 -0
- package/src/components/segmented/segmented-track.svelte +181 -0
- package/src/components/segmented/segmented.test.ts +20 -0
- package/src/components/segmented/segmented.ts +80 -0
- package/src/components/star-rating-input/index.ts +9 -0
- package/src/components/star-rating-input/star-rating-input.svelte +256 -0
- package/src/components/svg/index.ts +1 -0
- package/src/components/svg/svg.svelte +9 -0
- package/src/effects/border-beam/BorderBeam.svelte +1 -1
- package/src/effects/image-comparison/ImageComparison.css +42 -8
- package/src/effects/image-comparison/ImageComparison.svelte +138 -21
- package/src/effects/image-comparison/compare.test.ts +17 -0
- package/src/effects/image-comparison/compare.ts +5 -0
- package/src/effects/interactive-hover-button/InteractiveHoverButton.svelte +338 -0
- package/src/effects/magic-card/MagicCard.css +47 -0
- package/src/effects/magic-card/MagicCard.svelte +57 -0
- package/src/effects/marquee/Marquee.css +27 -1
- package/src/effects/marquee/Marquee.svelte +67 -3
- package/src/effects/reveal/index.ts +2 -1
- package/src/effects/reveal/observe.test.ts +60 -0
- package/src/effects/reveal/observe.ts +33 -1
- package/src/effects/reveal/types.ts +7 -0
- package/src/effects/theme-toggle/ThemeToggle.css +199 -6
- package/src/effects/theme-toggle/ThemeToggle.svelte +51 -26
- package/src/gallery.test.ts +52 -0
- package/src/index.ts +5 -1
- package/src/lib/panel.ts +7 -1
- package/src/lib/theme-transition.ts +37 -11
- package/src/lib/tone.ts +48 -0
- package/src/shadcn/accordion/accordion-trigger.svelte +15 -6
- package/src/shadcn/alert/alert.svelte +3 -1
- package/src/shadcn/badge/badge.svelte +8 -7
- package/src/shadcn/breadcrumb/breadcrumb-ellipsis.svelte +2 -2
- package/src/shadcn/breadcrumb/breadcrumb-separator.svelte +2 -2
- package/src/shadcn/calendar/calendar-month-select.svelte +2 -2
- package/src/shadcn/calendar/calendar-next-button.svelte +2 -2
- package/src/shadcn/calendar/calendar-prev-button.svelte +2 -2
- package/src/shadcn/calendar/calendar-year-select.svelte +2 -2
- package/src/shadcn/calendar/calendar.svelte +6 -0
- package/src/shadcn/code-block/code-block-copy-button.svelte +6 -55
- package/src/shadcn/command/index.ts +3 -0
- package/src/shadcn/field/index.ts +3 -0
- package/src/shadcn/field/simple-field.svelte +71 -0
- package/src/shadcn/field/simple-field.test.ts +47 -0
- package/src/shadcn/message-scroller/message-scroller-button.svelte +2 -2
- package/src/shadcn/radio-group/radio-group-item.svelte +3 -2
- package/src/shadcn/sheet/sheet-content.svelte +1 -0
- package/src/shadcn/sheet/sheet.css +48 -0
- package/src/shadcn/sonner/sonner.svelte +7 -10
- package/src/shadcn/toggle-group/toggle-group.svelte +10 -3
- package/src/shadcn/trace/trace-collapsible-trigger.svelte +2 -2
- package/src/ai/composer/Composer.css +0 -108
- package/src/ai/composer/Composer.svelte +0 -111
- package/src/ai/composer/index.ts +0 -10
- package/src/animations/accordion.css +0 -58
- package/src/animations/icon-swap.css +0 -43
- package/src/animations/notification-badge.css +0 -81
- package/src/animations/panel.css +0 -86
- package/src/animations/reasoning-stream.css +0 -49
- package/src/animations/skeleton-reveal.css +0 -97
- package/src/animations/streaming-text.css +0 -31
- package/src/animations/tabs-sliding.css +0 -83
- package/src/animations/texts-reveal.css +0 -70
- package/src/animations/tooltip.css +0 -72
- package/src/animations/view-transition-reveal.ts +0 -74
- package/src/lib/utils.ts +0 -45
- package/src/showcase/AiSection.svelte +0 -150
- package/src/showcase/AnimationsSection.svelte +0 -1658
- package/src/showcase/EffectsSection.svelte +0 -152
- package/src/showcase/ShadcnSection.svelte +0 -27
- package/src/showcase/ShowcaseImport.svelte +0 -126
- package/src/showcase/ShowcaseList.svelte +0 -132
- package/src/showcase/ShowcaseNav.svelte +0 -247
- package/src/showcase/ShowcaseSection.svelte +0 -112
- package/src/showcase/ShowcaseShell.svelte +0 -55
- package/src/showcase/ShowcaseStage.svelte +0 -342
- package/src/showcase/ShowcaseVariant.svelte +0 -109
- package/src/showcase/assets/image-reveal/art-1.jpg +0 -0
- package/src/showcase/assets/image-reveal/art-2.jpg +0 -0
- package/src/showcase/assets/image-reveal/art-3.jpg +0 -0
- package/src/showcase/check.svg +0 -1
- package/src/showcase/chevron-arms.svg +0 -2
- package/src/showcase/chevron-down.svg +0 -1
- package/src/showcase/copy.svg +0 -2
- package/src/showcase/demos/ai/confirmation.svelte +0 -59
- package/src/showcase/demos/ai/loading-state.svelte +0 -19
- package/src/showcase/demos/ai/prompt-input.svelte +0 -57
- package/src/showcase/demos/ai/reasoning.svelte +0 -19
- package/src/showcase/demos/ai/thinking-dots.svelte +0 -15
- package/src/showcase/demos/ai/voice-waveform.svelte +0 -24
- package/src/showcase/demos/effects/animated-beam.svelte +0 -50
- package/src/showcase/demos/effects/animated-group.svelte +0 -47
- package/src/showcase/demos/effects/border-beam-default.svelte +0 -20
- package/src/showcase/demos/effects/border-beam-line.svelte +0 -20
- package/src/showcase/demos/effects/border-beam-mono.svelte +0 -20
- package/src/showcase/demos/effects/border-beam-sunset.svelte +0 -20
- package/src/showcase/demos/effects/image-comparison.svelte +0 -25
- package/src/showcase/demos/effects/image-reveal.svelte +0 -49
- package/src/showcase/demos/effects/in-view.svelte +0 -41
- package/src/showcase/demos/effects/integrations-hub.svelte +0 -82
- package/src/showcase/demos/effects/magnetic.svelte +0 -31
- package/src/showcase/demos/effects/marquee.svelte +0 -33
- package/src/showcase/demos/effects/progressive-blur.svelte +0 -47
- package/src/showcase/demos/effects/spotlight.svelte +0 -40
- package/src/showcase/demos/effects/text-effect.svelte +0 -55
- package/src/showcase/demos/shadcn/accordion.svelte +0 -45
- package/src/showcase/demos/shadcn/alert-dialog.svelte +0 -23
- package/src/showcase/demos/shadcn/alert.svelte +0 -30
- package/src/showcase/demos/shadcn/attachment.svelte +0 -71
- package/src/showcase/demos/shadcn/avatar.svelte +0 -30
- package/src/showcase/demos/shadcn/badge.svelte +0 -26
- package/src/showcase/demos/shadcn/breadcrumb.svelte +0 -34
- package/src/showcase/demos/shadcn/bubble.svelte +0 -36
- package/src/showcase/demos/shadcn/button.svelte +0 -11
- package/src/showcase/demos/shadcn/calendar.svelte +0 -8
- package/src/showcase/demos/shadcn/card.svelte +0 -39
- package/src/showcase/demos/shadcn/checkbox.svelte +0 -39
- package/src/showcase/demos/shadcn/code-block.svelte +0 -80
- package/src/showcase/demos/shadcn/collapsible.svelte +0 -20
- package/src/showcase/demos/shadcn/command.svelte +0 -48
- package/src/showcase/demos/shadcn/context-menu.svelte +0 -54
- package/src/showcase/demos/shadcn/demo-harness.svelte +0 -12
- package/src/showcase/demos/shadcn/demos.test.ts +0 -20
- package/src/showcase/demos/shadcn/dialog.svelte +0 -38
- package/src/showcase/demos/shadcn/dropdown-menu.svelte +0 -59
- package/src/showcase/demos/shadcn/empty.svelte +0 -29
- package/src/showcase/demos/shadcn/field.svelte +0 -115
- package/src/showcase/demos/shadcn/hover-card.svelte +0 -32
- package/src/showcase/demos/shadcn/index.ts +0 -382
- package/src/showcase/demos/shadcn/input-otp.svelte +0 -19
- package/src/showcase/demos/shadcn/input.svelte +0 -5
- package/src/showcase/demos/shadcn/label.svelte +0 -11
- package/src/showcase/demos/shadcn/marker.svelte +0 -30
- package/src/showcase/demos/shadcn/message-scroller.svelte +0 -44
- package/src/showcase/demos/shadcn/message.svelte +0 -75
- package/src/showcase/demos/shadcn/popover.svelte +0 -36
- package/src/showcase/demos/shadcn/progress.svelte +0 -13
- package/src/showcase/demos/shadcn/radio-group.svelte +0 -19
- package/src/showcase/demos/shadcn/scroll-area.svelte +0 -18
- package/src/showcase/demos/shadcn/select.svelte +0 -29
- package/src/showcase/demos/shadcn/separator.svelte +0 -12
- package/src/showcase/demos/shadcn/sheet.svelte +0 -48
- package/src/showcase/demos/shadcn/skeleton.svelte +0 -11
- package/src/showcase/demos/shadcn/slider.svelte +0 -7
- package/src/showcase/demos/shadcn/sonner.svelte +0 -18
- package/src/showcase/demos/shadcn/spinner.svelte +0 -11
- package/src/showcase/demos/shadcn/switch.svelte +0 -9
- package/src/showcase/demos/shadcn/table.svelte +0 -76
- package/src/showcase/demos/shadcn/tabs.svelte +0 -62
- package/src/showcase/demos/shadcn/textarea.svelte +0 -5
- package/src/showcase/demos/shadcn/toggle-group.svelte +0 -18
- package/src/showcase/demos/shadcn/toggle.svelte +0 -14
- package/src/showcase/demos/shadcn/tooltip.svelte +0 -13
- package/src/showcase/demos/shadcn/trace.svelte +0 -51
- package/src/showcase/heart.svg +0 -1
- package/src/showcase/index.ts +0 -38
- package/src/showcase/kit.test.ts +0 -72
- package/src/showcase/kit.ts +0 -16
- package/src/showcase/plus.svg +0 -1
- package/src/showcase/showcase-shell.css +0 -91
- package/src/showcase/stacked-section.css +0 -15
- package/src/showcase/success-check.svg +0 -1
- package/src/showcase/types.ts +0 -29
- package/src/svg-raw.d.ts +0 -7
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/* Transitions.dev — Texts reveal */
|
|
2
|
-
/* Source: https://github.com/Jakubantalik/transitions.dev */
|
|
3
|
-
|
|
4
|
-
/*
|
|
5
|
-
Usage:
|
|
6
|
-
<div class="t-stagger">
|
|
7
|
-
<strong class="t-stagger-line t-stagger-line--1">…</strong>
|
|
8
|
-
<span class="t-stagger-line t-stagger-line--2">…</span>
|
|
9
|
-
</div>
|
|
10
|
-
|
|
11
|
-
State:
|
|
12
|
-
Add .is-shown to play the staggered entrance. Add .is-hiding
|
|
13
|
-
(and remove .is-shown) to fade out in place over 200ms,
|
|
14
|
-
independent of the entrance timing.
|
|
15
|
-
|
|
16
|
-
Add more lines with .t-stagger-line--N and
|
|
17
|
-
transition-delay: calc(var(--stagger-stagger) * (N - 1)).
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
:root {
|
|
21
|
-
--stagger-dur: var(--duration-very-slow, 500ms);
|
|
22
|
-
--stagger-distance: var(--distance-medium, 12px);
|
|
23
|
-
--stagger-stagger: var(--duration-stagger, 40ms);
|
|
24
|
-
--stagger-blur: var(--blur-medium, 3px);
|
|
25
|
-
--stagger-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* Lines start translated down + blurred + invisible; .is-shown
|
|
29
|
-
on the parent flips them to their resting state. The second
|
|
30
|
-
line's transition-delay holds it back by --stagger-stagger so
|
|
31
|
-
the eye lands on the headline first. */
|
|
32
|
-
.t-stagger-line {
|
|
33
|
-
display: block;
|
|
34
|
-
opacity: 0;
|
|
35
|
-
transform: translateY(var(--stagger-distance));
|
|
36
|
-
filter: blur(var(--stagger-blur));
|
|
37
|
-
transition:
|
|
38
|
-
opacity var(--stagger-dur) var(--stagger-ease),
|
|
39
|
-
transform var(--stagger-dur) var(--stagger-ease),
|
|
40
|
-
filter var(--stagger-dur) var(--stagger-ease);
|
|
41
|
-
will-change: transform, opacity, filter;
|
|
42
|
-
}
|
|
43
|
-
.t-stagger-line--2 {
|
|
44
|
-
transition-delay: var(--stagger-stagger);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.t-stagger.is-shown .t-stagger-line {
|
|
48
|
-
opacity: 1;
|
|
49
|
-
transform: translateY(0);
|
|
50
|
-
filter: blur(0);
|
|
51
|
-
}
|
|
52
|
-
/* Exit decouples from the stagger: same fade for every line,
|
|
53
|
-
no Y return, no blur — so the disappearance reads as a single
|
|
54
|
-
quiet fade instead of a reverse reveal. */
|
|
55
|
-
.t-stagger.is-hiding .t-stagger-line {
|
|
56
|
-
opacity: 0;
|
|
57
|
-
transform: translateY(0);
|
|
58
|
-
filter: blur(0);
|
|
59
|
-
transition:
|
|
60
|
-
opacity 200ms ease,
|
|
61
|
-
transform 0s linear,
|
|
62
|
-
filter 0s linear;
|
|
63
|
-
transition-delay: 0s;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
@media (prefers-reduced-motion: reduce) {
|
|
67
|
-
.t-stagger-line {
|
|
68
|
-
transition: none !important;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/* Transitions.dev — Tooltip open / close */
|
|
2
|
-
/* Source: https://github.com/Jakubantalik/transitions.dev */
|
|
3
|
-
|
|
4
|
-
/*
|
|
5
|
-
Usage:
|
|
6
|
-
<span class="t-tt-wrap">
|
|
7
|
-
<button class="t-tt-trigger" aria-describedby="tt-1">…</button>
|
|
8
|
-
<span class="t-tt" id="tt-1" role="tooltip">Tooltip text</span>
|
|
9
|
-
</span>
|
|
10
|
-
|
|
11
|
-
Pure CSS — no JS. The wrap (not the trigger) is the hover
|
|
12
|
-
target so the pointer can drift onto the tooltip without
|
|
13
|
-
flicker. transition-delay only applies in the hover/focus
|
|
14
|
-
rule, so leaving snaps it to 0 and the disappear plays
|
|
15
|
-
immediately.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
:root {
|
|
19
|
-
--tt-in-dur: var(--duration-quick, 150ms);
|
|
20
|
-
--tt-out-dur: 50ms;
|
|
21
|
-
--tt-scale: var(--scale-small, 0.98);
|
|
22
|
-
--tt-delay: 80ms;
|
|
23
|
-
--tt-in-ease: var(--ease-out, ease-out);
|
|
24
|
-
--tt-out-ease: var(--ease-out, ease-out);
|
|
25
|
-
--tt-bg: #ffffff;
|
|
26
|
-
--tt-fg: #2f2f2f;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
.t-tt-wrap {
|
|
30
|
-
position: relative;
|
|
31
|
-
display: inline-block;
|
|
32
|
-
}
|
|
33
|
-
.t-tt {
|
|
34
|
-
position: absolute;
|
|
35
|
-
bottom: calc(100% + 8px);
|
|
36
|
-
left: 50%;
|
|
37
|
-
transform: translate(-50%, 0) scale(var(--tt-scale));
|
|
38
|
-
transform-origin: 50% 100%;
|
|
39
|
-
padding: 8px 12px;
|
|
40
|
-
border-radius: 8px;
|
|
41
|
-
background: var(--tt-bg);
|
|
42
|
-
color: var(--tt-fg);
|
|
43
|
-
white-space: nowrap;
|
|
44
|
-
box-shadow:
|
|
45
|
-
0 0 0 1px rgba(0, 0, 0, 0.06),
|
|
46
|
-
0 2px 6px 0 rgba(0, 0, 0, 0.05),
|
|
47
|
-
0 4px 42px 0 rgba(0, 0, 0, 0.06);
|
|
48
|
-
opacity: 0;
|
|
49
|
-
pointer-events: none;
|
|
50
|
-
/* Default rule controls the LEAVE state. transition-delay
|
|
51
|
-
stays unset so leaving plays without delay. */
|
|
52
|
-
transition:
|
|
53
|
-
opacity var(--tt-out-dur) var(--tt-out-ease),
|
|
54
|
-
transform var(--tt-out-dur) var(--tt-out-ease);
|
|
55
|
-
}
|
|
56
|
-
/* The delay belongs ONLY to the hover rule so leaving the
|
|
57
|
-
trigger snaps the delay back to 0 and the disappear plays
|
|
58
|
-
immediately. */
|
|
59
|
-
.t-tt-wrap:hover .t-tt,
|
|
60
|
-
.t-tt-trigger:focus-visible + .t-tt {
|
|
61
|
-
opacity: 1;
|
|
62
|
-
transform: translate(-50%, 0) scale(1);
|
|
63
|
-
transition-duration: var(--tt-in-dur);
|
|
64
|
-
transition-timing-function: var(--tt-in-ease);
|
|
65
|
-
transition-delay: var(--tt-delay);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
@media (prefers-reduced-motion: reduce) {
|
|
69
|
-
.t-tt {
|
|
70
|
-
transition: none !important;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
export type ViewTransitionRevealOrigin = MouseEvent | { x: number; y: number } | HTMLElement;
|
|
2
|
-
|
|
3
|
-
export type ViewTransitionRevealOptions = {
|
|
4
|
-
duration?: number;
|
|
5
|
-
easing?: string;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
const STYLE_ID = "heyramzi-view-transition-reveal";
|
|
9
|
-
|
|
10
|
-
export function viewTransitionReveal(
|
|
11
|
-
origin: ViewTransitionRevealOrigin,
|
|
12
|
-
apply: () => void,
|
|
13
|
-
options?: ViewTransitionRevealOptions,
|
|
14
|
-
): void {
|
|
15
|
-
const prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
16
|
-
|
|
17
|
-
// WHY: feature-detect both API presence and reduced-motion to keep callers
|
|
18
|
-
// from having to branch.
|
|
19
|
-
if (typeof document === "undefined" || !document.startViewTransition || prefersReduced) {
|
|
20
|
-
apply();
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const { x, y } = resolveOrigin(origin);
|
|
25
|
-
const duration = options?.duration ?? 400;
|
|
26
|
-
const easing = options?.easing ?? "ease-in-out";
|
|
27
|
-
const endRadius = Math.hypot(
|
|
28
|
-
Math.max(x, window.innerWidth - x),
|
|
29
|
-
Math.max(y, window.innerHeight - y),
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
ensureStyles();
|
|
33
|
-
|
|
34
|
-
const transition = document.startViewTransition(() => {
|
|
35
|
-
apply();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
transition.ready.then(() => {
|
|
39
|
-
document.documentElement.animate(
|
|
40
|
-
{
|
|
41
|
-
clipPath: [`circle(0px at ${x}px ${y}px)`, `circle(${endRadius}px at ${x}px ${y}px)`],
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
duration,
|
|
45
|
-
easing,
|
|
46
|
-
pseudoElement: "::view-transition-new(root)",
|
|
47
|
-
},
|
|
48
|
-
);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function resolveOrigin(origin: ViewTransitionRevealOrigin): { x: number; y: number } {
|
|
53
|
-
if (origin instanceof HTMLElement) {
|
|
54
|
-
const rect = origin.getBoundingClientRect();
|
|
55
|
-
return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };
|
|
56
|
-
}
|
|
57
|
-
if (typeof MouseEvent !== "undefined" && origin instanceof MouseEvent) {
|
|
58
|
-
const target = origin.currentTarget instanceof HTMLElement ? origin.currentTarget : null;
|
|
59
|
-
if (target) {
|
|
60
|
-
const rect = target.getBoundingClientRect();
|
|
61
|
-
return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };
|
|
62
|
-
}
|
|
63
|
-
return { x: origin.clientX, y: origin.clientY };
|
|
64
|
-
}
|
|
65
|
-
return { x: origin.x, y: origin.y };
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function ensureStyles(): void {
|
|
69
|
-
if (document.getElementById(STYLE_ID)) return;
|
|
70
|
-
const style = document.createElement("style");
|
|
71
|
-
style.id = STYLE_ID;
|
|
72
|
-
style.textContent = `::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal;}`;
|
|
73
|
-
document.head.appendChild(style);
|
|
74
|
-
}
|
package/src/lib/utils.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { type ClassValue, clsx } from "clsx";
|
|
2
|
-
import { twMerge } from "tailwind-merge";
|
|
3
|
-
|
|
4
|
-
/** Merge conditional class names and de-duplicate conflicting Tailwind utilities. */
|
|
5
|
-
export function cn(...inputs: ClassValue[]) {
|
|
6
|
-
return twMerge(clsx(inputs));
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export type WithElementRef<T, U extends HTMLElement = HTMLElement> = T & {
|
|
10
|
-
ref?: U | null;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export type WithoutChildren<T> = T extends { children?: unknown } ? Omit<T, "children"> : T;
|
|
14
|
-
|
|
15
|
-
export type WithoutChild<T> = T extends { child?: unknown } ? Omit<T, "child"> : T;
|
|
16
|
-
|
|
17
|
-
export type WithoutChildrenOrChild<T> = WithoutChildren<WithoutChild<T>>;
|
|
18
|
-
|
|
19
|
-
export type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };
|
|
20
|
-
|
|
21
|
-
export function Ok<T>(value: T): Result<T, never> {
|
|
22
|
-
return { ok: true, value };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function Err<E>(error: E): Result<never, E> {
|
|
26
|
-
return { ok: false, error };
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Run a function and return a result instead of throwing. */
|
|
30
|
-
export function tryCatch<T>(fn: () => T): Result<T> {
|
|
31
|
-
try {
|
|
32
|
-
return { ok: true, value: fn() } as Result<T>;
|
|
33
|
-
} catch (error) {
|
|
34
|
-
return { ok: false, error: error as Error };
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** Await a function and return a result instead of rejecting. */
|
|
39
|
-
export async function tryCatchAsync<T>(fn: () => Promise<T>): Promise<Result<T>> {
|
|
40
|
-
try {
|
|
41
|
-
return { ok: true, value: await fn() } as Result<T>;
|
|
42
|
-
} catch (error) {
|
|
43
|
-
return { ok: false, error: error as Error };
|
|
44
|
-
}
|
|
45
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
<!-- ========================== -->
|
|
2
|
-
<!-- IMPORTS -->
|
|
3
|
-
<!-- ========================== -->
|
|
4
|
-
<script lang="ts">
|
|
5
|
-
import ShowcaseStage from "./ShowcaseStage.svelte";
|
|
6
|
-
import Prompt from "./demos/ai/prompt-input.svelte";
|
|
7
|
-
import LoadingStateDemo from "./demos/ai/loading-state.svelte";
|
|
8
|
-
import ThinkingDotsDemo from "./demos/ai/thinking-dots.svelte";
|
|
9
|
-
import Reasoning from "./demos/ai/reasoning.svelte";
|
|
10
|
-
import Confirm from "./demos/ai/confirmation.svelte";
|
|
11
|
-
import VoiceWaveformDemo from "./demos/ai/voice-waveform.svelte";
|
|
12
|
-
import type { Component } from "svelte";
|
|
13
|
-
|
|
14
|
-
// =========================
|
|
15
|
-
// TYPES
|
|
16
|
-
// =========================
|
|
17
|
-
type Demo = { title: string; note: string; Comp: Component; path: string };
|
|
18
|
-
|
|
19
|
-
// =========================
|
|
20
|
-
// STATE
|
|
21
|
-
// =========================
|
|
22
|
-
// The order is the order a turn happens in: the surface it is said on, the waiting, the thinking, the decision, and last the voice.
|
|
23
|
-
const demos: Demo[] = [
|
|
24
|
-
{
|
|
25
|
-
title: "PromptInput",
|
|
26
|
-
note: "Suggestions, textarea, status-aware submit.",
|
|
27
|
-
Comp: Prompt,
|
|
28
|
-
path: "import { PromptInput, PromptInputBody, PromptInputTextarea, PromptInputToolbar, PromptInputSubmit, Suggestions, Suggestion } from '@heyramzi/ui/ai';",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
title: "PixelLoader",
|
|
32
|
-
note: "Pixel-grid loader with shimmer and elapsed time.",
|
|
33
|
-
Comp: LoadingStateDemo,
|
|
34
|
-
path: "import { PixelLoader } from '@heyramzi/ui/ai';",
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
title: "ThinkingDots",
|
|
38
|
-
note: "The quiet wait, with a label.",
|
|
39
|
-
Comp: ThinkingDotsDemo,
|
|
40
|
-
path: "import { ThinkingDots } from '@heyramzi/ui/ai';",
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
title: "Reasoning",
|
|
44
|
-
note: "Auto-opens while streaming, shows think time.",
|
|
45
|
-
Comp: Reasoning,
|
|
46
|
-
path: "import { Reasoning, ReasoningTrigger, ReasoningContent } from '@heyramzi/ui/ai';",
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
title: "Confirmation",
|
|
50
|
-
note: "Tool-call approval with resolved states.",
|
|
51
|
-
Comp: Confirm,
|
|
52
|
-
path: "import { Confirmation, ConfirmationTitle, ConfirmationRequest, ConfirmationAccepted, ConfirmationRejected, ConfirmationActions, ConfirmationAction } from '@heyramzi/ui/ai';",
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
title: "VoiceWaveform",
|
|
56
|
-
note: "Tap to toggle the active state.",
|
|
57
|
-
Comp: VoiceWaveformDemo,
|
|
58
|
-
path: "import { VoiceWaveform } from '@heyramzi/ui/ai';",
|
|
59
|
-
},
|
|
60
|
-
];
|
|
61
|
-
</script>
|
|
62
|
-
|
|
63
|
-
<!-- ========================== -->
|
|
64
|
-
<!-- MARKUP -->
|
|
65
|
-
<!-- ========================== -->
|
|
66
|
-
<div class="ai-stack">
|
|
67
|
-
{#each demos as d (d.title)}
|
|
68
|
-
<ShowcaseStage title={d.title} note={d.note} importPath={d.path} wide>
|
|
69
|
-
<div class="ai-demo"><d.Comp /></div>
|
|
70
|
-
</ShowcaseStage>
|
|
71
|
-
{/each}
|
|
72
|
-
</div>
|
|
73
|
-
|
|
74
|
-
<!-- ========================== -->
|
|
75
|
-
<!-- STYLE -->
|
|
76
|
-
<!-- ========================== -->
|
|
77
|
-
<style>
|
|
78
|
-
/*
|
|
79
|
-
* One item per row, which is how beautifului.dev lays its AI set out and what this section is judged against. The two-column grid it replaces made every
|
|
80
|
-
*/
|
|
81
|
-
|
|
82
|
-
/*
|
|
83
|
-
* band as tall as its taller half, so a one-line chip row sat in 21rem of
|
|
84
|
-
*/
|
|
85
|
-
|
|
86
|
-
/*
|
|
87
|
-
* nothing next to a conversation, and the eye had two places to be on every scroll step. A single column also lets each demo keep the width it was
|
|
88
|
-
*/
|
|
89
|
-
|
|
90
|
-
/*
|
|
91
|
-
* designed for instead of a track that changes with the viewport.
|
|
92
|
-
*/
|
|
93
|
-
.ai-stack {
|
|
94
|
-
display: flex;
|
|
95
|
-
flex-direction: column;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/* The dashed rule is the separator, not a card edge: these are entries in one
|
|
99
|
-
list, and a solid border would read as a stack of boxes. */
|
|
100
|
-
.ai-stack > :global(.sc-stage) {
|
|
101
|
-
padding-block: 2rem;
|
|
102
|
-
border-bottom: 1px dashed
|
|
103
|
-
color-mix(in oklab, var(--color-border, var(--border)) 80%, transparent);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.ai-stack > :global(.sc-stage:last-child) {
|
|
107
|
-
border-bottom: 0;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/*
|
|
111
|
-
* Title and note on one baseline, the way a numbered list entry reads. The stage stacks them by default because a 310px grid column cannot hold both;
|
|
112
|
-
*/
|
|
113
|
-
|
|
114
|
-
/*
|
|
115
|
-
* at full width it can, and the stacked form leaves the note orphaned under a hanging indent.
|
|
116
|
-
*/
|
|
117
|
-
@media (min-width: 40rem) {
|
|
118
|
-
.ai-stack > :global(.sc-stage) :global(.sc-stage-name) {
|
|
119
|
-
flex-direction: row;
|
|
120
|
-
align-items: baseline;
|
|
121
|
-
gap: 0.625rem;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
.ai-stack > :global(.sc-stage) :global(.sc-stage-name p) {
|
|
125
|
-
padding-inline-start: 0;
|
|
126
|
-
overflow: hidden;
|
|
127
|
-
text-overflow: ellipsis;
|
|
128
|
-
white-space: nowrap;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/*
|
|
133
|
-
* 17rem is beautifului.dev's 272px demo surface. Every ground on the page is the same height, so the list scrolls at one rhythm however tall the demo
|
|
134
|
-
*/
|
|
135
|
-
|
|
136
|
-
/*
|
|
137
|
-
* inside it happens to be.
|
|
138
|
-
*/
|
|
139
|
-
.ai-stack > :global(.sc-stage) > :global(.sc-ground) {
|
|
140
|
-
min-height: 17rem;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/* The demo is centred inside the full-width ground rather than stretched
|
|
144
|
-
across it: a prompt bar at 1400px is not a prompt bar, it is a banner. */
|
|
145
|
-
.ai-demo {
|
|
146
|
-
width: 100%;
|
|
147
|
-
max-width: 30rem;
|
|
148
|
-
margin-inline: auto;
|
|
149
|
-
}
|
|
150
|
-
</style>
|