@heyramzi/ui 6.1.0 → 8.0.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 +32 -40
- package/README.md +10 -4
- package/package.json +31 -29
- package/scripts/sync-shadcn.mjs +29 -16
- package/scripts/sync-transitions.mjs +11 -11
- 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 -24
- 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 +17 -17
- 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/sliding-pill.ts +68 -0
- package/src/lib/theme-transition.ts +41 -13
- 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-actions.svelte +23 -0
- package/src/shadcn/code-block/code-block-content.svelte +55 -0
- package/src/shadcn/code-block/code-block-copy-button.svelte +10 -0
- package/src/shadcn/code-block/code-block-footer.svelte +20 -0
- package/src/shadcn/code-block/code-block-header.svelte +23 -0
- package/src/shadcn/code-block/code-block-line.svelte +71 -0
- package/src/shadcn/code-block/code-block-title.svelte +23 -0
- package/src/shadcn/code-block/code-block.svelte +47 -0
- package/src/shadcn/code-block/index.ts +42 -0
- 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/hooks/highlighter.ts +132 -0
- package/src/shadcn/hooks/use-highlighted-code.svelte.ts +98 -0
- package/src/shadcn/kbd/index.ts +10 -0
- package/src/shadcn/kbd/kbd-group.svelte +20 -0
- package/src/shadcn/kbd/kbd.svelte +23 -0
- package/src/shadcn/message-scroller/index.ts +28 -0
- package/src/shadcn/message-scroller/message-scroller-button.svelte +52 -0
- package/src/shadcn/message-scroller/message-scroller-content.svelte +17 -0
- package/src/shadcn/message-scroller/message-scroller-item.svelte +22 -0
- package/src/shadcn/message-scroller/message-scroller-provider.svelte +7 -0
- package/src/shadcn/message-scroller/message-scroller-viewport.svelte +20 -0
- package/src/shadcn/message-scroller/message-scroller.svelte +20 -0
- 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/tabs/tabs-list.svelte +13 -2
- package/src/shadcn/tabs/tabs-trigger.svelte +1 -1
- package/src/shadcn/toggle-group/toggle-group.svelte +10 -3
- package/src/shadcn/trace/index.ts +29 -0
- package/src/shadcn/trace/trace-collapsible-content.svelte +29 -0
- package/src/shadcn/trace/trace-collapsible-trigger.svelte +29 -0
- package/src/shadcn/trace/trace-collapsible.svelte +20 -0
- package/src/shadcn/trace/trace-description.svelte +20 -0
- package/src/shadcn/trace/trace-icon.svelte +24 -0
- package/src/shadcn/trace/trace-line.svelte +31 -0
- package/src/shadcn/trace/trace-title.svelte +20 -0
- package/src/shadcn/trace/trace.svelte +23 -0
- 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/ai/conversation/Conversation.svelte +0 -28
- package/src/ai/conversation/ConversationContent.svelte +0 -35
- package/src/ai/conversation/ConversationEmptyState.svelte +0 -46
- package/src/ai/conversation/ConversationScrollButton.svelte +0 -51
- package/src/ai/conversation/index.ts +0 -33
- package/src/ai/conversation/stick-to-bottom-context.svelte.ts +0 -131
- 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/charts/animated-value.css +0 -7
- package/src/charts/animated-value.svelte +0 -110
- package/src/charts/area-chart.css +0 -29
- package/src/charts/area-chart.svelte +0 -195
- package/src/charts/bar-chart.css +0 -119
- package/src/charts/bar-chart.svelte +0 -269
- package/src/charts/charts.css +0 -201
- package/src/charts/crosshair.svelte +0 -35
- package/src/charts/donut-chart.css +0 -56
- package/src/charts/donut-chart.svelte +0 -158
- package/src/charts/edge-fade.svelte +0 -43
- package/src/charts/edge-fade.ts +0 -16
- package/src/charts/figure.css +0 -100
- package/src/charts/figure.svelte +0 -122
- package/src/charts/gauge-chart.css +0 -94
- package/src/charts/gauge-chart.svelte +0 -303
- package/src/charts/hover-band.test.ts +0 -30
- package/src/charts/hover-band.ts +0 -21
- package/src/charts/hover-focus.svelte +0 -85
- package/src/charts/index.ts +0 -30
- package/src/charts/legend.css +0 -131
- package/src/charts/legend.svelte +0 -112
- package/src/charts/line-chart.css +0 -26
- package/src/charts/line-chart.svelte +0 -256
- package/src/charts/motion.ts +0 -19
- package/src/charts/number-chart.css +0 -168
- package/src/charts/number-chart.svelte +0 -177
- package/src/charts/primitives/chart-container.svelte +0 -57
- package/src/charts/primitives/chart-style.svelte +0 -36
- package/src/charts/primitives/chart-tooltip.svelte +0 -161
- package/src/charts/primitives/chart-utils.ts +0 -54
- package/src/charts/primitives/index.ts +0 -11
- package/src/charts/reveal.svelte +0 -61
- package/src/charts/ring-chart.css +0 -96
- package/src/charts/ring-chart.svelte +0 -158
- package/src/charts/sparkline.css +0 -45
- package/src/charts/sparkline.svelte +0 -140
- package/src/charts/stat-card.css +0 -103
- package/src/charts/stat-card.svelte +0 -267
- package/src/charts/time-series-chart.css +0 -28
- package/src/charts/time-series-chart.svelte +0 -179
- package/src/charts/trend-pill.css +0 -38
- package/src/charts/trend-pill.svelte +0 -48
- package/src/lib/hooks/is-mobile.svelte.ts +0 -11
- package/src/lib/utils.ts +0 -45
- package/src/showcase/AiSection.svelte +0 -157
- package/src/showcase/AnimationsSection.svelte +0 -1658
- package/src/showcase/ChartsSection.svelte +0 -458
- 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/conversation.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/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 -358
- 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.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/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 -17
- 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
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
export interface GenerationSteps {
|
|
3
|
+
completed: number;
|
|
4
|
+
total: number;
|
|
5
|
+
currentStep?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// No `variant` prop: bar, card and inline drew the same four facts three ways.
|
|
9
|
+
export interface GenerationProgressProps {
|
|
10
|
+
status: "idle" | "generating" | "failed";
|
|
11
|
+
progress?: GenerationSteps | null;
|
|
12
|
+
label?: string;
|
|
13
|
+
showElapsed?: boolean;
|
|
14
|
+
class?: string;
|
|
15
|
+
}
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<script lang="ts">
|
|
19
|
+
// =========================
|
|
20
|
+
// IMPORTS
|
|
21
|
+
// =========================
|
|
22
|
+
import { cn } from "@heyramzi/utils";
|
|
23
|
+
|
|
24
|
+
// =========================
|
|
25
|
+
// PROPS
|
|
26
|
+
// =========================
|
|
27
|
+
let {
|
|
28
|
+
status,
|
|
29
|
+
progress = null,
|
|
30
|
+
label,
|
|
31
|
+
showElapsed = false,
|
|
32
|
+
class: className,
|
|
33
|
+
}: GenerationProgressProps = $props();
|
|
34
|
+
|
|
35
|
+
// =========================
|
|
36
|
+
// STATE
|
|
37
|
+
// =========================
|
|
38
|
+
let elapsed = $state(0);
|
|
39
|
+
|
|
40
|
+
// =========================
|
|
41
|
+
// DERIVED
|
|
42
|
+
// =========================
|
|
43
|
+
let heading = $derived(label || "Generating");
|
|
44
|
+
let percent = $derived(progress && progress.total > 0 ? (progress.completed / progress.total) * 100 : 0);
|
|
45
|
+
|
|
46
|
+
// =========================
|
|
47
|
+
// EFFECTS
|
|
48
|
+
// =========================
|
|
49
|
+
$effect(() => {
|
|
50
|
+
if (!showElapsed || status !== "generating") {
|
|
51
|
+
elapsed = 0;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const interval = setInterval(() => {
|
|
56
|
+
elapsed += 1;
|
|
57
|
+
}, 1000);
|
|
58
|
+
|
|
59
|
+
return () => clearInterval(interval);
|
|
60
|
+
});
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<!-- ===========================
|
|
64
|
+
MARKUP
|
|
65
|
+
=========================== -->
|
|
66
|
+
{#if status === "failed"}
|
|
67
|
+
<div class={cn("gen gen-failed", className)}>
|
|
68
|
+
<div class="gen-head">
|
|
69
|
+
<span class="gen-dot"></span>
|
|
70
|
+
<span class="gen-label">Generation failed</span>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
{:else if status === "generating"}
|
|
74
|
+
<div class={cn("gen", className)}>
|
|
75
|
+
<div class="gen-head">
|
|
76
|
+
<span class="gen-dot"></span>
|
|
77
|
+
<!-- data-text carries the same string for the shimmer's ::before layer. -->
|
|
78
|
+
<span class="gen-label t-shimmer" data-text={heading}>{heading}</span>
|
|
79
|
+
<span class="gen-meta">
|
|
80
|
+
{#if progress}
|
|
81
|
+
<span class="gen-count">
|
|
82
|
+
<!-- #key is the reflow: Svelte drops the node and builds a new one,
|
|
83
|
+
which is what replays the pop-in on every step. -->
|
|
84
|
+
{#key progress.completed}
|
|
85
|
+
<span class="t-digit-group is-animating"><span class="t-digit">{progress.completed}</span></span>
|
|
86
|
+
{/key}<span class="gen-total">/{progress.total}</span>
|
|
87
|
+
</span>
|
|
88
|
+
{/if}
|
|
89
|
+
{#if showElapsed}
|
|
90
|
+
<span class="gen-elapsed">{elapsed}s</span>
|
|
91
|
+
{/if}
|
|
92
|
+
</span>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<div class="gen-track" data-indeterminate={progress ? undefined : true}>
|
|
96
|
+
<div class="gen-fill" style:transform={progress ? `scaleX(${percent / 100})` : undefined}></div>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
{#if progress?.currentStep}
|
|
100
|
+
{#key progress.currentStep}
|
|
101
|
+
<p class="gen-step">{progress.currentStep}</p>
|
|
102
|
+
{/key}
|
|
103
|
+
{/if}
|
|
104
|
+
</div>
|
|
105
|
+
{/if}
|
|
106
|
+
|
|
107
|
+
<!-- ===========================
|
|
108
|
+
STYLE
|
|
109
|
+
=========================== -->
|
|
110
|
+
<style>
|
|
111
|
+
/* ── Surface ─────────────────────────────────────────── */
|
|
112
|
+
.gen {
|
|
113
|
+
--shimmer-dur: 2200ms;
|
|
114
|
+
--shimmer-base: var(--color-brand-indigo);
|
|
115
|
+
/* The band is darker than the base on a pale tint and lighter on ink.
|
|
116
|
+
Otherwise the sweep looks like the label dropping out. */
|
|
117
|
+
--shimmer-highlight: color-mix(in oklab, black 45%, var(--color-brand-indigo));
|
|
118
|
+
--shimmer-band: 400%;
|
|
119
|
+
--shimmer-ease: linear;
|
|
120
|
+
--digit-dur: var(--duration-very-slow);
|
|
121
|
+
--digit-distance: var(--distance-base);
|
|
122
|
+
--digit-blur: var(--blur-small);
|
|
123
|
+
--digit-ease: var(--ease-smooth-out);
|
|
124
|
+
--digit-dir-x: 0;
|
|
125
|
+
--digit-dir-y: 1;
|
|
126
|
+
|
|
127
|
+
padding: 0.625rem 0.875rem;
|
|
128
|
+
border-radius: var(--radius-lg);
|
|
129
|
+
background: color-mix(in oklab, var(--color-brand-indigo) 10%, transparent);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
:global(.dark) .gen {
|
|
133
|
+
--shimmer-highlight: color-mix(in oklab, white 70%, var(--color-brand-indigo));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.gen-failed {
|
|
137
|
+
--shimmer-base: var(--color-destructive);
|
|
138
|
+
background: color-mix(in oklab, var(--color-destructive) 10%, transparent);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.gen-head {
|
|
142
|
+
display: flex;
|
|
143
|
+
align-items: center;
|
|
144
|
+
justify-content: space-between;
|
|
145
|
+
gap: 0.5rem;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.gen-dot {
|
|
149
|
+
flex: none;
|
|
150
|
+
width: 0.375rem;
|
|
151
|
+
height: 0.375rem;
|
|
152
|
+
border-radius: 9999px;
|
|
153
|
+
background: var(--color-brand-indigo);
|
|
154
|
+
animation: gen-pulse 1.8s var(--ease-in-out, ease-in-out) infinite;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.gen-failed .gen-dot {
|
|
158
|
+
background: var(--color-destructive);
|
|
159
|
+
animation: none;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.gen-label {
|
|
163
|
+
margin-inline-end: auto;
|
|
164
|
+
font-size: 0.75rem;
|
|
165
|
+
font-weight: 500;
|
|
166
|
+
line-height: 1.4;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* terra-600, not --color-destructive: that token is tuned for fills, and at
|
|
170
|
+
L=0.6 small text on the pale tint fails. Dark mode uses the lighter step. */
|
|
171
|
+
.gen-failed .gen-label {
|
|
172
|
+
color: var(--color-terra-600);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
:global(.dark) .gen-failed .gen-label {
|
|
176
|
+
color: var(--color-terra-400);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.gen-meta {
|
|
180
|
+
display: flex;
|
|
181
|
+
align-items: baseline;
|
|
182
|
+
gap: 0.375rem;
|
|
183
|
+
font-size: 0.75rem;
|
|
184
|
+
font-weight: 500;
|
|
185
|
+
font-variant-numeric: tabular-nums;
|
|
186
|
+
color: var(--color-brand-indigo);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.gen-count {
|
|
190
|
+
display: inline-flex;
|
|
191
|
+
align-items: baseline;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.gen-total,
|
|
195
|
+
.gen-elapsed {
|
|
196
|
+
opacity: 0.6;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* ── Track ───────────────────────────────────────────── */
|
|
200
|
+
.gen-track {
|
|
201
|
+
position: relative;
|
|
202
|
+
overflow: hidden;
|
|
203
|
+
margin-top: 0.5rem;
|
|
204
|
+
height: 0.25rem;
|
|
205
|
+
border-radius: 9999px;
|
|
206
|
+
background: color-mix(in oklab, var(--color-brand-indigo) 22%, transparent);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.gen-fill {
|
|
210
|
+
width: 100%;
|
|
211
|
+
height: 100%;
|
|
212
|
+
transform-origin: left;
|
|
213
|
+
border-radius: 9999px;
|
|
214
|
+
background: var(--color-brand-indigo);
|
|
215
|
+
transition: transform var(--duration-slow, 400ms) var(--ease-smooth-out, ease);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* A job with no step count still has to look like it is running, so the fill
|
|
219
|
+
becomes a band that sweeps instead of a length that grows. */
|
|
220
|
+
.gen-track[data-indeterminate] .gen-fill {
|
|
221
|
+
width: 38%;
|
|
222
|
+
transition: none;
|
|
223
|
+
animation: gen-sweep 1.5s var(--ease-in-out, ease-in-out) infinite;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.gen-step {
|
|
227
|
+
margin: 0.375rem 0 0;
|
|
228
|
+
overflow: hidden;
|
|
229
|
+
font-size: 0.75rem;
|
|
230
|
+
line-height: 1.5;
|
|
231
|
+
white-space: nowrap;
|
|
232
|
+
text-overflow: ellipsis;
|
|
233
|
+
/* Mix toward the foreground, not transparent: a 70% indigo wash on its
|
|
234
|
+
own track measured 2.9:1. This stays quieter than the label and AA. */
|
|
235
|
+
color: color-mix(in oklab, var(--color-brand-indigo) 70%, var(--color-foreground));
|
|
236
|
+
animation: gen-step-in var(--duration-quick, 150ms) var(--ease-in-out, ease-in-out) both;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
@keyframes gen-pulse {
|
|
240
|
+
0%,
|
|
241
|
+
100% {
|
|
242
|
+
opacity: 1;
|
|
243
|
+
}
|
|
244
|
+
50% {
|
|
245
|
+
opacity: 0.35;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
@keyframes gen-sweep {
|
|
250
|
+
0% {
|
|
251
|
+
translate: -110% 0;
|
|
252
|
+
}
|
|
253
|
+
100% {
|
|
254
|
+
translate: 290% 0;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
@keyframes gen-step-in {
|
|
259
|
+
from {
|
|
260
|
+
opacity: 0;
|
|
261
|
+
transform: translateY(var(--distance-micro, 4px));
|
|
262
|
+
filter: blur(var(--blur-small, 2px));
|
|
263
|
+
}
|
|
264
|
+
to {
|
|
265
|
+
opacity: 1;
|
|
266
|
+
transform: none;
|
|
267
|
+
filter: blur(0);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* ── transitions.dev: shimmer text ───────────────────── */
|
|
272
|
+
.t-shimmer {
|
|
273
|
+
position: relative;
|
|
274
|
+
display: inline-block;
|
|
275
|
+
color: var(--shimmer-base);
|
|
276
|
+
}
|
|
277
|
+
.t-shimmer::before {
|
|
278
|
+
content: attr(data-text);
|
|
279
|
+
position: absolute;
|
|
280
|
+
inset: 0;
|
|
281
|
+
pointer-events: none;
|
|
282
|
+
background-image: linear-gradient(
|
|
283
|
+
90deg,
|
|
284
|
+
transparent 0%,
|
|
285
|
+
transparent 40%,
|
|
286
|
+
var(--shimmer-highlight) 50%,
|
|
287
|
+
transparent 60%,
|
|
288
|
+
transparent 100%
|
|
289
|
+
);
|
|
290
|
+
background-size: var(--shimmer-band) 100%;
|
|
291
|
+
background-repeat: no-repeat;
|
|
292
|
+
-webkit-background-clip: text;
|
|
293
|
+
background-clip: text;
|
|
294
|
+
color: transparent;
|
|
295
|
+
-webkit-text-fill-color: transparent;
|
|
296
|
+
animation: t-shimmer var(--shimmer-dur) var(--shimmer-ease) infinite;
|
|
297
|
+
}
|
|
298
|
+
@keyframes t-shimmer {
|
|
299
|
+
0% {
|
|
300
|
+
background-position: 100% 0;
|
|
301
|
+
}
|
|
302
|
+
100% {
|
|
303
|
+
background-position: 0% 0;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/* ── transitions.dev: number pop-in ──────────────────── */
|
|
308
|
+
@keyframes t-digit-pop-in {
|
|
309
|
+
0% {
|
|
310
|
+
transform: translate(
|
|
311
|
+
calc(var(--digit-distance) * var(--digit-dir-x)),
|
|
312
|
+
calc(var(--digit-distance) * var(--digit-dir-y))
|
|
313
|
+
);
|
|
314
|
+
opacity: 0;
|
|
315
|
+
filter: blur(var(--digit-blur));
|
|
316
|
+
}
|
|
317
|
+
100% {
|
|
318
|
+
transform: translate(0, 0);
|
|
319
|
+
opacity: 1;
|
|
320
|
+
filter: blur(0);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.t-digit-group {
|
|
325
|
+
display: inline-flex;
|
|
326
|
+
align-items: baseline;
|
|
327
|
+
}
|
|
328
|
+
.t-digit {
|
|
329
|
+
display: inline-block;
|
|
330
|
+
will-change: transform, opacity, filter;
|
|
331
|
+
}
|
|
332
|
+
.t-digit-group.is-animating .t-digit {
|
|
333
|
+
animation: t-digit-pop-in var(--digit-dur) var(--digit-ease) both;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
@media (prefers-reduced-motion: reduce) {
|
|
337
|
+
.t-shimmer::before {
|
|
338
|
+
animation: none !important;
|
|
339
|
+
}
|
|
340
|
+
.t-digit-group.is-animating .t-digit,
|
|
341
|
+
.gen-dot,
|
|
342
|
+
.gen-step {
|
|
343
|
+
animation: none;
|
|
344
|
+
}
|
|
345
|
+
.gen-track[data-indeterminate] .gen-fill {
|
|
346
|
+
width: 100%;
|
|
347
|
+
animation: none;
|
|
348
|
+
opacity: 0.5;
|
|
349
|
+
}
|
|
350
|
+
.gen-fill {
|
|
351
|
+
transition: none;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
</style>
|
package/src/ai/index.ts
CHANGED
|
@@ -1,27 +1,3 @@
|
|
|
1
|
-
// =========================
|
|
2
|
-
// CONVERSATION (scroll container)
|
|
3
|
-
// =========================
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
Conversation,
|
|
7
|
-
ConversationContent,
|
|
8
|
-
ConversationEmptyState,
|
|
9
|
-
ConversationScrollButton,
|
|
10
|
-
StickToBottomContext,
|
|
11
|
-
getStickToBottomContext,
|
|
12
|
-
setStickToBottomContext,
|
|
13
|
-
type ConversationProps,
|
|
14
|
-
type ConversationContentProps,
|
|
15
|
-
type ConversationEmptyStateProps,
|
|
16
|
-
type ConversationScrollButtonProps,
|
|
17
|
-
} from "./conversation/index.js";
|
|
18
|
-
|
|
19
|
-
// =========================
|
|
20
|
-
// COMPOSER
|
|
21
|
-
// =========================
|
|
22
|
-
|
|
23
|
-
export { Composer, type ComposerProps } from "./composer/index.js";
|
|
24
|
-
|
|
25
1
|
// =========================
|
|
26
2
|
// TYPING DOTS
|
|
27
3
|
// =========================
|
|
@@ -117,3 +93,19 @@ export {
|
|
|
117
93
|
// =========================
|
|
118
94
|
|
|
119
95
|
export { PixelLoader, type PixelLoaderProps } from "./loading-state/index.js";
|
|
96
|
+
|
|
97
|
+
// =========================
|
|
98
|
+
// AI BUTTON
|
|
99
|
+
// =========================
|
|
100
|
+
|
|
101
|
+
export { AiButton, type AiButtonProps, type AiStatus } from "./ai-button/index.js";
|
|
102
|
+
|
|
103
|
+
// =========================
|
|
104
|
+
// GENERATION PROGRESS
|
|
105
|
+
// =========================
|
|
106
|
+
|
|
107
|
+
export {
|
|
108
|
+
GenerationProgress,
|
|
109
|
+
type GenerationProgressProps,
|
|
110
|
+
type GenerationSteps,
|
|
111
|
+
} from "./generation-progress/index.js";
|
|
@@ -5,14 +5,26 @@
|
|
|
5
5
|
export interface PromptInputProps extends Omit<HTMLFormAttributes, "onsubmit"> {
|
|
6
6
|
onSubmit?: (value: string, event: SubmitEvent) => void | Promise<void>;
|
|
7
7
|
class?: string;
|
|
8
|
+
/** A line under the input, for a send that failed. Cleared by passing null. */
|
|
9
|
+
error?: string | null;
|
|
10
|
+
/** Colour of the focus ring. Falls back to `--ring`. */
|
|
11
|
+
accent?: string;
|
|
8
12
|
children?: Snippet;
|
|
9
13
|
}
|
|
10
14
|
</script>
|
|
11
15
|
|
|
12
16
|
<script lang="ts">
|
|
13
17
|
import { cn } from "@heyramzi/utils";
|
|
18
|
+
import { fade } from "svelte/transition";
|
|
14
19
|
|
|
15
|
-
let {
|
|
20
|
+
let {
|
|
21
|
+
class: className,
|
|
22
|
+
onSubmit,
|
|
23
|
+
error = null,
|
|
24
|
+
accent,
|
|
25
|
+
children,
|
|
26
|
+
...rest
|
|
27
|
+
}: PromptInputProps = $props();
|
|
16
28
|
|
|
17
29
|
async function handleSubmit(event: SubmitEvent) {
|
|
18
30
|
event.preventDefault();
|
|
@@ -31,8 +43,14 @@
|
|
|
31
43
|
"focus-within:ring-1 focus-within:ring-[color:var(--ring,currentColor)]",
|
|
32
44
|
className,
|
|
33
45
|
)}
|
|
46
|
+
style:--ring={accent}
|
|
34
47
|
onsubmit={handleSubmit}
|
|
35
48
|
{...rest}
|
|
36
49
|
>
|
|
37
50
|
{@render children?.()}
|
|
51
|
+
{#if error}
|
|
52
|
+
<p role="alert" class="text-destructive px-3 pb-2 text-xs" in:fade={{ duration: 150 }}>
|
|
53
|
+
{error}
|
|
54
|
+
</p>
|
|
55
|
+
{/if}
|
|
38
56
|
</form>
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
status?: PromptInputStatus;
|
|
9
9
|
onStop?: () => void;
|
|
10
10
|
onclick?: (event: MouseEvent) => void;
|
|
11
|
+
/** Accessible name while idle. Translate at the call site. */
|
|
12
|
+
submitLabel?: string;
|
|
13
|
+
/** Accessible name while generating, when a click stops the run. */
|
|
14
|
+
stopLabel?: string;
|
|
11
15
|
class?: string;
|
|
12
16
|
variant?: ButtonVariant;
|
|
13
17
|
size?: ButtonSize;
|
|
@@ -18,7 +22,7 @@
|
|
|
18
22
|
<script lang="ts">
|
|
19
23
|
import { cn } from "@heyramzi/utils";
|
|
20
24
|
import { Button } from "../../shadcn/button/index.js";
|
|
21
|
-
import
|
|
25
|
+
import { Spinner } from "../../shadcn/spinner/index.js";
|
|
22
26
|
import SendIcon from "phosphor-svelte/lib/PaperPlaneRight";
|
|
23
27
|
import SquareIcon from "phosphor-svelte/lib/Square";
|
|
24
28
|
import XIcon from "phosphor-svelte/lib/X";
|
|
@@ -27,6 +31,8 @@
|
|
|
27
31
|
status = "ready",
|
|
28
32
|
onStop,
|
|
29
33
|
onclick,
|
|
34
|
+
submitLabel = "Submit",
|
|
35
|
+
stopLabel = "Stop",
|
|
30
36
|
variant = "default",
|
|
31
37
|
size = "default",
|
|
32
38
|
icon = true,
|
|
@@ -56,13 +62,13 @@
|
|
|
56
62
|
type={buttonType}
|
|
57
63
|
data-prompt-input-submit
|
|
58
64
|
onclick={handleClick}
|
|
59
|
-
aria-label={isGenerating ?
|
|
65
|
+
aria-label={isGenerating ? stopLabel : submitLabel}
|
|
60
66
|
class={cn("gap-1.5", className)}
|
|
61
67
|
>
|
|
62
68
|
{#if children}
|
|
63
69
|
{@render children()}
|
|
64
70
|
{:else if status === "submitted"}
|
|
65
|
-
<
|
|
71
|
+
<Spinner />
|
|
66
72
|
{:else if status === "streaming"}
|
|
67
73
|
<SquareIcon class="size-4" />
|
|
68
74
|
{:else if status === "error"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
</script>
|
|
11
11
|
|
|
12
12
|
<script lang="ts">
|
|
13
|
+
import { untrack } from "svelte";
|
|
13
14
|
import { cn } from "@heyramzi/utils";
|
|
14
15
|
import { Collapsible } from "../../shadcn/collapsible/index.js";
|
|
15
16
|
import { setReasoningContext } from "./reasoning-context.svelte.js";
|
|
@@ -23,18 +24,20 @@
|
|
|
23
24
|
...rest
|
|
24
25
|
}: ReasoningProps = $props();
|
|
25
26
|
|
|
26
|
-
// WHY: child parts read streaming/duration through
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
// WHY: child parts read streaming/duration through these getters, so $derived in
|
|
28
|
+
// the trigger reruns whenever the props change.
|
|
29
|
+
setReasoningContext({
|
|
30
|
+
get isStreaming() {
|
|
31
|
+
return isStreaming;
|
|
32
|
+
},
|
|
33
|
+
get duration() {
|
|
34
|
+
return duration;
|
|
35
|
+
},
|
|
32
36
|
});
|
|
33
|
-
setReasoningContext(ctx);
|
|
34
37
|
|
|
35
38
|
// WHY: auto-open on stream start and auto-close on stream end, but only on the
|
|
36
39
|
// transition itself so a user who toggles mid-stream is left alone.
|
|
37
|
-
let prev = isStreaming;
|
|
40
|
+
let prev = untrack(() => isStreaming);
|
|
38
41
|
$effect(() => {
|
|
39
42
|
if (isStreaming && !prev) open = true;
|
|
40
43
|
else if (!isStreaming && prev) open = false;
|
package/src/ambient.d.ts
ADDED
package/src/animations/README.md
CHANGED
|
@@ -17,49 +17,49 @@ The script writes pristine upstream copies to `.upstream/transitions/` and hashe
|
|
|
17
17
|
|
|
18
18
|
| File | Selector | Used by |
|
|
19
19
|
| --- | --- | --- |
|
|
20
|
-
| `accordion.css` | `.t-acc` | standalone |
|
|
21
20
|
| `avatar-group-hover.css` | `.t-avatar-group`, `.t-avatar` | standalone |
|
|
22
21
|
| `card-tilt.css` | `.t-tilt`, `.t-tilt-card`, `.t-tilt-glare` | standalone |
|
|
23
22
|
| `digit-pop-in.css` | `.t-digit` | standalone |
|
|
24
|
-
| `dropdown.css` | `.t-dropdown` |
|
|
25
|
-
| `icon-swap.css` | `.t-icon-swap` | standalone |
|
|
23
|
+
| `dropdown.css` | `.t-dropdown` | `shadcn/tooltip`, `dropdown-menu`, `popover`, `context-menu` and `select` content |
|
|
26
24
|
| `input-clear-dissolve.css` | `.t-clear`, `.t-clear-mirror`, `.t-clear-glow` | standalone |
|
|
27
25
|
| `input-shake.css` | `.t-input-wrap`, `.t-input`, `.t-error-msg` | (none, form layer moved to upsys) |
|
|
28
26
|
| `learn-more-hover.css` | `.t-learn`, `.t-learn-chevron` | standalone |
|
|
29
27
|
| `like-button.css` | `.t-like`, `.t-like-particles` | standalone |
|
|
30
28
|
| `modal.css` | `.t-modal`, `.t-modal-backdrop` | `shadcn/dialog`, `shadcn/alert-dialog` |
|
|
31
|
-
| `notification-badge.css` | `.t-badge` | standalone |
|
|
32
29
|
| `page-side-by-side.css` | `.t-page` | standalone |
|
|
33
|
-
| `panel.css` | `.t-panel` | (not yet wired) |
|
|
34
30
|
| `plus-menu-morph.css` | `.t-morph`, `.t-morph-plus`, `.t-morph-menu` | standalone |
|
|
35
|
-
| `reasoning-stream.css` | `.t-reason`, `.t-reason-viewport` | standalone |
|
|
36
31
|
| `resize.css` | `.t-resize` | standalone |
|
|
37
32
|
| `shimmer-text.css` | `.t-shimmer` | `thinking-states.css` |
|
|
38
|
-
| `skeleton-reveal.css` | `.t-skel` | standalone |
|
|
39
33
|
| `spinning-counter.css` | `.t-reel`, `.t-reel-col` | standalone |
|
|
40
|
-
| `streaming-text.css` | `.t-stream-w` | standalone |
|
|
41
34
|
| `success-check.css` | `.t-success-check` | standalone |
|
|
42
|
-
| `tabs-sliding.css` | `.t-tabs`, `.t-tab`, `.t-tabs-pill` | standalone |
|
|
43
35
|
| `text-swap.css` + `text-swap.ts` | `.t-text-swap` | standalone |
|
|
44
|
-
| `texts-reveal.css` | `.t-stagger`, `.t-stagger-line` | standalone |
|
|
45
36
|
| `thinking-states.css` | `.t-think`, `.t-think-text` | standalone |
|
|
46
|
-
| `tooltip.css` | `.t-tt-wrap`, `.t-tt`, `.t-tt-trigger` | standalone |
|
|
47
37
|
|
|
48
38
|
`index.css` is the barrel — imports all of the above.
|
|
49
39
|
|
|
50
|
-
##
|
|
40
|
+
## Fifteen upstream transitions that are not files here
|
|
51
41
|
|
|
52
42
|
One behaviour, one implementation. Where a component already did the job, the upstream recipe was merged into it or dropped, rather than shipped as a second way to do the same thing.
|
|
53
43
|
|
|
54
44
|
| Upstream | Where it lives instead |
|
|
55
45
|
| --- | --- |
|
|
56
|
-
| `toggle` | `shadcn/switch/switch.
|
|
57
|
-
| `checkbox-check` | `shadcn/checkbox/checkbox.
|
|
46
|
+
| `toggle` | `shadcn/switch/switch.svelte` — the thumb slide, on our switch. |
|
|
47
|
+
| `checkbox-check` | `shadcn/checkbox/checkbox.svelte` — the fill and border, on our checkbox. |
|
|
58
48
|
| `toast-open-close` | `shadcn/sonner` — svelte-sonner owns toast motion. |
|
|
59
49
|
| `banner-stacking` | `shadcn/sonner` — stacking and hover spread are what it does. |
|
|
60
50
|
| `matrix-dot-loader` | `ai/loading-state` — `PixelLoader` is the dot-grid loader. |
|
|
61
|
-
|
|
62
|
-
|
|
51
|
+
| `tabs-sliding` | `shadcn/tabs/tabs-list.svelte` with `lib/sliding-pill.ts` — the pill slides under the active tab. |
|
|
52
|
+
| `tooltip-open-close` | `shadcn/tooltip/tooltip-content.svelte` — wired through `.t-dropdown`. |
|
|
53
|
+
| `accordion` | `shadcn/accordion/accordion-content.svelte` — the expand and collapse keyframes. |
|
|
54
|
+
| `skeleton-loader-and-reveal` | `shadcn/skeleton/skeleton.svelte` — the pulse. |
|
|
55
|
+
| `notification-badge` | `shadcn/badge/badge.svelte` — the badge. |
|
|
56
|
+
| `reasoning-stream` | `ai/reasoning/ReasoningContent.svelte` — the reasoning body. |
|
|
57
|
+
| `streaming-text` | `effects/reveal/TextEffect.svelte` — word by word with a blur. |
|
|
58
|
+
| `texts-reveal` | `effects/reveal/TextEffect.svelte` — the staggered rise. |
|
|
59
|
+
| `panel-reveal` | `shadcn/sheet/sheet.css` — the sheet slide, imported by the sheet itself. |
|
|
60
|
+
| `icon-swap` | `effects/theme-toggle/ThemeToggle.svelte` — the sun, moon and monitor icons cross-fade. |
|
|
61
|
+
|
|
62
|
+
One more pair looks like a duplicate and is not: `spinning-counter` rolls a number between values, `digit-pop-in` updates one in place.
|
|
63
63
|
|
|
64
64
|
## How to consume
|
|
65
65
|
|
|
@@ -81,4 +81,4 @@ Every transition reads semantic CSS variables (`--modal-open-dur`, `--tilt-follo
|
|
|
81
81
|
|
|
82
82
|
So the scale is single-sourced when the design layer is imported, and the transition still runs at the shipped value when it is not. A value the scale has no token for — a 1000ms tilt return, a 90ms reel stagger — stays a literal rather than being rounded onto the nearest rung. Override any of them at `:root` or per-scope to retune without forking the CSS.
|
|
83
83
|
|
|
84
|
-
See the
|
|
84
|
+
See the `transitions-dev` skill in vibe-kit (`ai-doc/skills/design/motion/transitions-dev/SKILL.md`) for the full token list and the per-transition variables.
|
package/src/animations/index.css
CHANGED
|
@@ -1,34 +1,23 @@
|
|
|
1
1
|
/* Transitions.dev — bundle */
|
|
2
2
|
/* Source: https://github.com/Jakubantalik/transitions.dev */
|
|
3
|
-
/* Refresh the vendored upstream with `pnpm sync:transitions`.
|
|
4
|
-
transitions are not here because a component already owns them
|
|
5
|
-
|
|
6
|
-
shadcn/checkbox/checkbox.css. See README.md. */
|
|
3
|
+
/* Refresh the vendored upstream with `pnpm sync:transitions`. Fourteen free
|
|
4
|
+
transitions are not here because a component already owns them. See
|
|
5
|
+
README.md. */
|
|
7
6
|
|
|
8
7
|
@import "./modal.css";
|
|
9
|
-
@import "./icon-swap.css";
|
|
10
|
-
@import "./panel.css";
|
|
11
8
|
@import "./dropdown.css";
|
|
12
9
|
@import "./text-swap.css";
|
|
13
10
|
@import "./resize.css";
|
|
14
11
|
@import "./digit-pop-in.css";
|
|
15
|
-
@import "./notification-badge.css";
|
|
16
12
|
@import "./page-side-by-side.css";
|
|
17
13
|
@import "./input-shake.css";
|
|
18
14
|
@import "./success-check.css";
|
|
19
15
|
@import "./avatar-group-hover.css";
|
|
20
|
-
@import "./skeleton-reveal.css";
|
|
21
16
|
@import "./shimmer-text.css";
|
|
22
|
-
@import "./tabs-sliding.css";
|
|
23
|
-
@import "./tooltip.css";
|
|
24
|
-
@import "./texts-reveal.css";
|
|
25
17
|
@import "./input-clear-dissolve.css";
|
|
26
|
-
@import "./accordion.css";
|
|
27
18
|
@import "./learn-more-hover.css";
|
|
28
19
|
@import "./card-tilt.css";
|
|
29
20
|
@import "./plus-menu-morph.css";
|
|
30
21
|
@import "./like-button.css";
|
|
31
22
|
@import "./spinning-counter.css";
|
|
32
23
|
@import "./thinking-states.css";
|
|
33
|
-
@import "./reasoning-stream.css";
|
|
34
|
-
@import "./streaming-text.css";
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
/*
|
|
14
|
-
* The homes are not all in this folder:
|
|
14
|
+
* The homes are not all in this folder: fifteen live on the component that already did the job. See README.md.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|