@heyramzi/ui 2.6.0 → 2.8.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/package.json +1 -1
- package/src/ai/generation-progress/GenerationProgress.svelte +2 -2
- package/src/animations/README.md +1 -1
- package/src/animations/card-tilt.css +1 -1
- package/src/animations/digit-pop-in.css +1 -1
- package/src/animations/input-clear-dissolve.css +2 -2
- package/src/animations/learn-more-hover.css +2 -2
- package/src/animations/like-button.css +1 -1
- package/src/animations/plus-menu-morph.css +1 -1
- package/src/animations/success-check.css +5 -5
- package/src/brand/index.ts +12 -0
- package/src/canvas/headless/canvas-cleanup.test.ts +1 -1
- package/src/canvas/ops/ops.ts +1 -1
- package/src/charts/bar-chart.css +2 -1
- package/src/charts/charts.css +2 -1
- package/src/components/list-page/empty-state.svelte +1 -1
- package/src/design/index.css +7 -5
- package/src/effects/reveal/reveal.css +1 -1
- package/src/icons/trades.ts +1 -1
- package/src/lib/theme-transition.ts +6 -2
- package/src/shadcn/card/card-title.svelte +5 -1
- package/src/slides/theme.css +2 -2
- package/src/status/status-dot.svelte +3 -3
- package/src/tasks/gantt/gantt-grid.svelte +2 -2
- package/src/tasks/gantt/gantt.css +1 -1
- package/src/tasks/kanban-column.svelte +1 -1
- package/src/tasks/task-list.svelte +1 -1
- package/src/tasks/time/time-ring.svelte +1 -1
- package/src/tasks/time/time-tracker.svelte +1 -1
- package/src/tokens/craft.css +7 -5
- package/src/tokens/palette.css +10 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heyramzi/ui",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "Svelte 5 UI for apps: primitives, effects and animations, plus tasks, charts, slides, an editor, onboarding and a canvas as subpaths.",
|
|
5
5
|
"homepage": "https://ui.heyramzi.com",
|
|
6
6
|
"license": "MIT",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
--shimmer-highlight: color-mix(in oklab, black 45%, var(--color-brand));
|
|
125
125
|
--shimmer-band: 400%;
|
|
126
126
|
--shimmer-ease: linear;
|
|
127
|
-
--digit-dur: var(--duration-
|
|
127
|
+
--digit-dur: var(--duration-slow);
|
|
128
128
|
--digit-distance: var(--distance-base);
|
|
129
129
|
--digit-blur: var(--blur-small);
|
|
130
130
|
--digit-ease: var(--ease-smooth-out);
|
|
@@ -219,7 +219,7 @@
|
|
|
219
219
|
transform-origin: left;
|
|
220
220
|
border-radius: 9999px;
|
|
221
221
|
background: var(--color-brand);
|
|
222
|
-
transition: transform var(--duration-slow,
|
|
222
|
+
transition: transform var(--duration-slow, 300ms) var(--ease-smooth-out, ease);
|
|
223
223
|
}
|
|
224
224
|
|
|
225
225
|
/* A job with no step count still has to look like it is running, so the fill
|
package/src/animations/README.md
CHANGED
|
@@ -76,7 +76,7 @@ The two merged into components are the exception — `switch.svelte` and `checkb
|
|
|
76
76
|
Every transition reads semantic CSS variables (`--modal-open-dur`, `--tilt-follow`, `--think-swap`). Where the shared motion scale in `@heyramzi/ui/design` has a token at that exact value, the variable defaults to it and keeps the literal as the fallback:
|
|
77
77
|
|
|
78
78
|
```css
|
|
79
|
-
--toast-open: var(--duration-medium,
|
|
79
|
+
--toast-open: var(--duration-medium, 280ms);
|
|
80
80
|
```
|
|
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.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
--tilt-perspective: 1000px;
|
|
6
6
|
--tilt-return: 1000ms;
|
|
7
7
|
--tilt-return-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
8
|
-
--tilt-follow: var(--duration-slow,
|
|
8
|
+
--tilt-follow: var(--duration-slow, 300ms);
|
|
9
9
|
--tilt-follow-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
10
10
|
--tilt-glare-opacity: 0.32;
|
|
11
11
|
--tilt-glare-fade: 300ms;
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
:root {
|
|
11
11
|
--clear-dur: 1000ms;
|
|
12
|
-
--clear-out-dur: var(--duration-slow,
|
|
13
|
-
--clear-in-dur: var(--duration-slow,
|
|
12
|
+
--clear-out-dur: var(--duration-slow, 300ms);
|
|
13
|
+
--clear-in-dur: var(--duration-slow, 300ms);
|
|
14
14
|
--clear-out-fly: 12px;
|
|
15
15
|
--clear-in-fly: 12px;
|
|
16
16
|
--clear-out-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
:root {
|
|
4
4
|
--learn-shift: 2px;
|
|
5
5
|
--learn-spread: 8deg;
|
|
6
|
-
--learn-in: var(--duration-medium,
|
|
7
|
-
--learn-out: var(--duration-medium,
|
|
6
|
+
--learn-in: var(--duration-medium, 280ms);
|
|
7
|
+
--learn-out: var(--duration-medium, 280ms);
|
|
8
8
|
--learn-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
9
9
|
}
|
|
10
10
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
:root {
|
|
4
4
|
--like-color: #f40051;
|
|
5
5
|
--like-fill: var(--duration-quick, 150ms);
|
|
6
|
-
--like-pop: var(--duration-medium,
|
|
6
|
+
--like-pop: var(--duration-medium, 280ms);
|
|
7
7
|
--like-pop-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
8
8
|
--like-particle-dur: 600ms;
|
|
9
9
|
--like-particle-dist: 20px;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* transitions.dev `dropdown-menu-morph`: the trigger itself becomes the menu. Set the open
|
|
2
2
|
size on the consumer side, since these sizes are the upstream demo's. */
|
|
3
3
|
:root {
|
|
4
|
-
--morph-open-dur: var(--duration-medium,
|
|
4
|
+
--morph-open-dur: var(--duration-medium, 280ms);
|
|
5
5
|
--morph-close-dur: var(--duration-fast, 250ms);
|
|
6
6
|
--morph-ease: var(--ease-smooth-out);
|
|
7
7
|
--morph-close-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
:root {
|
|
10
|
-
--check-opacity-dur: var(--duration-
|
|
11
|
-
--check-rotate-dur: var(--duration-
|
|
10
|
+
--check-opacity-dur: var(--duration-slow, 300ms);
|
|
11
|
+
--check-rotate-dur: var(--duration-slow, 300ms);
|
|
12
12
|
--check-rotate-from: 80deg;
|
|
13
|
-
--check-bob-dur: var(--duration-
|
|
13
|
+
--check-bob-dur: var(--duration-slow, 300ms);
|
|
14
14
|
--check-y-amount: 40px;
|
|
15
|
-
--check-blur-dur: var(--duration-
|
|
15
|
+
--check-blur-dur: var(--duration-slow, 300ms);
|
|
16
16
|
--check-blur-from: 10px;
|
|
17
|
-
--check-path-dur: var(--duration-
|
|
17
|
+
--check-path-dur: var(--duration-slow, 300ms);
|
|
18
18
|
--check-path-delay: 80ms;
|
|
19
19
|
--check-ease-out: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
20
20
|
--check-ease-opacity: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
package/src/brand/index.ts
CHANGED
|
@@ -29,6 +29,14 @@ export type BrandColors = {
|
|
|
29
29
|
surfaceLight?: CssColor;
|
|
30
30
|
/** Borders on a light page. */
|
|
31
31
|
lineLight?: CssColor;
|
|
32
|
+
/** The key button on a light page. Falls back to the near-black neutral. */
|
|
33
|
+
primary?: CssColor;
|
|
34
|
+
/** Text on the key button on a light page. */
|
|
35
|
+
primaryForeground?: CssColor;
|
|
36
|
+
/** The key button on a dark page. Falls back to paper. */
|
|
37
|
+
primaryOnDark?: CssColor;
|
|
38
|
+
/** Text on the key button on a dark page. */
|
|
39
|
+
primaryForegroundOnDark?: CssColor;
|
|
32
40
|
};
|
|
33
41
|
|
|
34
42
|
export type BrandFonts = {
|
|
@@ -61,6 +69,10 @@ const COLOR_VARS = {
|
|
|
61
69
|
paper: "--brand-paper",
|
|
62
70
|
surfaceLight: "--brand-surface-light",
|
|
63
71
|
lineLight: "--brand-line-light",
|
|
72
|
+
primary: "--brand-primary",
|
|
73
|
+
primaryForeground: "--brand-primary-foreground",
|
|
74
|
+
primaryOnDark: "--brand-primary-on-dark",
|
|
75
|
+
primaryForegroundOnDark: "--brand-primary-foreground-on-dark",
|
|
64
76
|
} as const satisfies Record<keyof BrandColors, string>;
|
|
65
77
|
|
|
66
78
|
const FONT_VARS = {
|
|
@@ -3,7 +3,7 @@ import { sortParentsFirst, stripCallbacks } from "./canvas-cleanup.js";
|
|
|
3
3
|
import { makeNode } from "../test-utils.js";
|
|
4
4
|
import type { CanvasNode } from "../types.js";
|
|
5
5
|
|
|
6
|
-
/** Read serialized data as a loose record: these tests exercise
|
|
6
|
+
/** Read serialized data as a loose record: these tests exercise legacy fields
|
|
7
7
|
* that are no longer part of any per-type shape but must survive the denylist. */
|
|
8
8
|
function loose(node: { data: unknown }): Record<string, unknown> {
|
|
9
9
|
return node.data as Record<string, unknown>;
|
package/src/canvas/ops/ops.ts
CHANGED
|
@@ -36,7 +36,7 @@ export const patchNodeOp = z.object({
|
|
|
36
36
|
kind: z.literal("patchNode"),
|
|
37
37
|
nodeId: z.string().min(1),
|
|
38
38
|
data: z.record(z.string(), z.unknown()).optional(),
|
|
39
|
-
// Merged into the node's style object. A CSS-string style
|
|
39
|
+
// Merged into the node's style object. A legacy CSS-string style is replaced
|
|
40
40
|
// wholesale (there is nothing sane to merge into).
|
|
41
41
|
style: z.record(z.string(), z.unknown()).optional(),
|
|
42
42
|
width: z.number().optional(),
|
package/src/charts/bar-chart.css
CHANGED
|
@@ -55,7 +55,8 @@
|
|
|
55
55
|
transform-origin: bottom;
|
|
56
56
|
animation: hr-bar-grow var(--chart-motion-reveal, 1100ms)
|
|
57
57
|
var(--chart-ease-reveal, cubic-bezier(0.85, 0, 0.15, 1)) both;
|
|
58
|
-
transition: opacity var(--chart-motion-fast, 150ms)
|
|
58
|
+
transition: opacity var(--chart-motion-fast, 150ms)
|
|
59
|
+
var(--ease-in-out, cubic-bezier(0.77, 0, 0.175, 1));
|
|
59
60
|
}
|
|
60
61
|
.hr-bar-chart .hr-bar-bars:nth-of-type(2) {
|
|
61
62
|
animation-delay: var(--chart-stagger, 30ms);
|
package/src/charts/charts.css
CHANGED
|
@@ -174,7 +174,8 @@
|
|
|
174
174
|
/* bklit-ui's hover: the series drops to 0.3 and hover-focus.svelte redraws the
|
|
175
175
|
stretch around the point at full strength. */
|
|
176
176
|
.hr-hover-dim {
|
|
177
|
-
transition: opacity
|
|
177
|
+
transition: opacity var(--duration-slow, 300ms)
|
|
178
|
+
var(--ease-in-out, cubic-bezier(0.77, 0, 0.175, 1));
|
|
178
179
|
}
|
|
179
180
|
.hr-hover-dim.hr-hover-dimmed {
|
|
180
181
|
opacity: 0.3;
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
<style>
|
|
68
68
|
/* Never `:nth-child` here: one such rule makes every DOM insert on the page restyle its later siblings. */
|
|
69
69
|
:global(.t-empty) > :global(*) {
|
|
70
|
-
animation: t-empty-in var(--duration-
|
|
70
|
+
animation: t-empty-in var(--duration-slow) var(--ease-smooth-out) both;
|
|
71
71
|
animation-delay: calc((sibling-index() - 1) * var(--duration-stagger));
|
|
72
72
|
}
|
|
73
73
|
|
package/src/design/index.css
CHANGED
|
@@ -93,12 +93,13 @@
|
|
|
93
93
|
--duration-micro: 80ms;
|
|
94
94
|
--duration-quick: 150ms; /* every close, text swap, tooltip in */
|
|
95
95
|
--duration-fast: 250ms; /* every open, tabs, icon swap, page slide */
|
|
96
|
-
--duration-medium:
|
|
97
|
-
--duration-slow:
|
|
98
|
-
--duration-
|
|
96
|
+
--duration-medium: 280ms; /* panel close, toast close */
|
|
97
|
+
--duration-slow: 300ms; /* panel open, skeleton reveal, emphasis: badge, text reveal, success check. The UI ceiling. */
|
|
98
|
+
--duration-overlay: 500ms; /* modal, drawer, marketing explainer: the only place past 300ms */
|
|
99
|
+
--duration-loop: 500ms; /* one cycle of a spinner or flowing dash, not a transition */
|
|
99
100
|
|
|
100
101
|
--ease-smooth-out: cubic-bezier(0.22, 1, 0.36, 1); /* all surface motion */
|
|
101
|
-
--ease-in-out:
|
|
102
|
+
--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* swaps, cross-fades, on-screen movement */
|
|
102
103
|
--ease-out: ease-out; /* tooltips */
|
|
103
104
|
--ease-linear: linear; /* shimmer, pulse, spinner */
|
|
104
105
|
|
|
@@ -147,7 +148,8 @@
|
|
|
147
148
|
--transition-duration-fast: var(--duration-fast);
|
|
148
149
|
--transition-duration-medium: var(--duration-medium);
|
|
149
150
|
--transition-duration-slow: var(--duration-slow);
|
|
150
|
-
--transition-duration-
|
|
151
|
+
--transition-duration-overlay: var(--duration-overlay);
|
|
152
|
+
--transition-duration-loop: var(--duration-loop);
|
|
151
153
|
}
|
|
152
154
|
|
|
153
155
|
/* Each bits-ui variant matches v2's `data-open` and v1's `data-state`, and ships
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
.hr-reveal {
|
|
5
5
|
--hr-reveal-name: hr-reveal-fade;
|
|
6
6
|
--hr-reveal-play: paused;
|
|
7
|
-
--hr-reveal-duration: var(--duration-slow,
|
|
7
|
+
--hr-reveal-duration: var(--duration-slow, 300ms);
|
|
8
8
|
--hr-reveal-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
9
9
|
--hr-reveal-stagger: var(--duration-stagger, 40ms);
|
|
10
10
|
--hr-reveal-delay: 0ms;
|
package/src/icons/trades.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
/*
|
|
18
|
-
* car-garage, hammer / wave-saw-tool, helmet, trowel, grid-dots, leaf, car, crane. Svelte 5 port is ` @tabler/icons-svelte-runes` (runes, not
|
|
18
|
+
* car-garage, hammer / wave-saw-tool, helmet, trowel, grid-dots, leaf, car, crane. Svelte 5 port is ` @tabler/icons-svelte-runes` (runes, not legacy ` @tabler/icons-svelte`).
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import {
|
|
@@ -10,7 +10,7 @@ export interface RevealThemeOptions {
|
|
|
10
10
|
/** Where the wipe grows from: a click, an element, or a point in the viewport. */
|
|
11
11
|
export type RevealOrigin = MouseEvent | Element | { x: number; y: number };
|
|
12
12
|
|
|
13
|
-
const DEFAULT_DURATION =
|
|
13
|
+
const DEFAULT_DURATION = 300;
|
|
14
14
|
const STYLE_ID = "heyramzi-reveal-theme";
|
|
15
15
|
|
|
16
16
|
/**
|
|
@@ -22,7 +22,11 @@ export function revealTheme(
|
|
|
22
22
|
apply: () => void,
|
|
23
23
|
options: RevealThemeOptions = {},
|
|
24
24
|
): void {
|
|
25
|
-
const {
|
|
25
|
+
const {
|
|
26
|
+
skip = false,
|
|
27
|
+
duration = DEFAULT_DURATION,
|
|
28
|
+
easing = "cubic-bezier(0.77, 0, 0.175, 1)",
|
|
29
|
+
} = options;
|
|
26
30
|
const point = resolveOrigin(origin);
|
|
27
31
|
|
|
28
32
|
const prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
import type { HTMLAttributes } from "svelte/elements";
|
|
3
3
|
import { cn, type WithElementRef } from "../../lib/utils.js";
|
|
4
4
|
|
|
5
|
-
// WHY: card titles
|
|
5
|
+
// WHY: card titles render as a div by default for backwards compatibility,
|
|
6
|
+
|
|
7
|
+
// but a page whose sections are all cards ends up with no headings below the h1, so screen readers cannot navigate it by heading (WCAG 2.4.6).
|
|
8
|
+
|
|
9
|
+
// Pass `as="h2"` on real section titles.
|
|
6
10
|
let {
|
|
7
11
|
ref = $bindable(null),
|
|
8
12
|
class: className,
|
package/src/slides/theme.css
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
--deck-text-caption: 13px;
|
|
29
29
|
|
|
30
30
|
--deck-t-slide: var(--duration-fast, 250ms);
|
|
31
|
-
--deck-t-morph: var(--duration-slow,
|
|
31
|
+
--deck-t-morph: var(--duration-slow, 300ms);
|
|
32
32
|
--deck-t-quick: var(--duration-quick, 150ms);
|
|
33
33
|
--deck-stagger: var(--duration-stagger, 40ms);
|
|
34
34
|
--deck-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
|
|
133
133
|
/* A morph runs on the whole page, so it gets the deck's timing while it plays. */
|
|
134
134
|
html[data-deck-vt] ::view-transition-group(*) {
|
|
135
|
-
animation-duration: var(--duration-slow,
|
|
135
|
+
animation-duration: var(--duration-slow, 300ms);
|
|
136
136
|
animation-timing-function: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
137
137
|
}
|
|
138
138
|
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
|
|
154
154
|
.sd-fill {
|
|
155
155
|
transform-origin: 7px 7px;
|
|
156
|
-
animation: sd-fill-in var(--duration-slow,
|
|
156
|
+
animation: sd-fill-in var(--duration-slow, 300ms) var(--ease-smooth-out, ease-out) forwards;
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
@keyframes sd-fill-in {
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
|
|
170
170
|
.sd-pop {
|
|
171
171
|
transform-origin: 7px 7px;
|
|
172
|
-
animation: sd-pop-in var(--duration-medium,
|
|
172
|
+
animation: sd-pop-in var(--duration-medium, 280ms) var(--ease-smooth-out, ease-out) forwards;
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
@keyframes sd-pop-in {
|
|
@@ -190,7 +190,7 @@
|
|
|
190
190
|
.sd-check {
|
|
191
191
|
stroke-dasharray: 12;
|
|
192
192
|
stroke-dashoffset: 12;
|
|
193
|
-
animation: sd-trace var(--duration-medium,
|
|
193
|
+
animation: sd-trace var(--duration-medium, 280ms) var(--ease-smooth-out, ease-out)
|
|
194
194
|
var(--duration-quick, 120ms) forwards;
|
|
195
195
|
}
|
|
196
196
|
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
<style>
|
|
74
74
|
.g-today {
|
|
75
75
|
transform-origin: top;
|
|
76
|
-
animation: g-today-in var(--duration-
|
|
76
|
+
animation: g-today-in var(--duration-slow, 300ms)
|
|
77
77
|
var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
.g-arrow-line {
|
|
90
90
|
stroke-dasharray: 1;
|
|
91
91
|
stroke-dashoffset: 0;
|
|
92
|
-
animation: g-draw var(--duration-
|
|
92
|
+
animation: g-draw var(--duration-slow, 300ms)
|
|
93
93
|
var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) 300ms backwards;
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* Shared by the bar, the derived bar and the group summary: they all slide in the same way. */
|
|
2
2
|
.g-enter {
|
|
3
|
-
animation: g-bar-in var(--duration-slow,
|
|
3
|
+
animation: g-bar-in var(--duration-slow, 300ms)
|
|
4
4
|
var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
|
|
5
5
|
animation-delay: calc(var(--g-i, 0) * var(--duration-stagger, 40ms));
|
|
6
6
|
}
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
.kanban-column-expanding {
|
|
94
94
|
flex: 0 0 280px;
|
|
95
95
|
width: 280px;
|
|
96
|
-
animation: column-expand var(--duration-slow,
|
|
96
|
+
animation: column-expand var(--duration-slow, 300ms) var(--ease-smooth-out, ease-out) both;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
@keyframes column-expand {
|
|
@@ -408,7 +408,7 @@
|
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
.tl-row {
|
|
411
|
-
animation: tl-row-in var(--duration-slow,
|
|
411
|
+
animation: tl-row-in var(--duration-slow, 300ms)
|
|
412
412
|
var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
|
|
413
413
|
animation-delay: calc(var(--tl-i, 0) * var(--duration-stagger, 40ms));
|
|
414
414
|
transition: background-color var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out);
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
<style>
|
|
66
66
|
.time-ring-arc {
|
|
67
67
|
transition:
|
|
68
|
-
stroke-dasharray var(--duration-slow,
|
|
68
|
+
stroke-dasharray var(--duration-slow, 300ms)
|
|
69
69
|
var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)),
|
|
70
70
|
color var(--duration-fast, 250ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
|
|
71
71
|
}
|
package/src/tokens/craft.css
CHANGED
|
@@ -85,12 +85,13 @@
|
|
|
85
85
|
--duration-micro: 80ms;
|
|
86
86
|
--duration-quick: 150ms; /* every close, text swap, tooltip in */
|
|
87
87
|
--duration-fast: 250ms; /* every open, tabs, icon swap, page slide */
|
|
88
|
-
--duration-medium:
|
|
89
|
-
--duration-slow:
|
|
90
|
-
--duration-
|
|
88
|
+
--duration-medium: 280ms; /* panel close, toast close */
|
|
89
|
+
--duration-slow: 300ms; /* panel open, skeleton reveal, emphasis: badge, text reveal, success check. The UI ceiling. */
|
|
90
|
+
--duration-overlay: 500ms; /* modal, drawer, marketing explainer: the only place past 300ms */
|
|
91
|
+
--duration-loop: 500ms; /* one cycle of a spinner or flowing dash, not a transition */
|
|
91
92
|
|
|
92
93
|
--ease-smooth-out: cubic-bezier(0.22, 1, 0.36, 1); /* all surface motion */
|
|
93
|
-
--ease-in-out:
|
|
94
|
+
--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* swaps, cross-fades, on-screen movement */
|
|
94
95
|
--ease-out: ease-out; /* tooltips */
|
|
95
96
|
--ease-linear: linear; /* shimmer, pulse, spinner */
|
|
96
97
|
|
|
@@ -139,5 +140,6 @@
|
|
|
139
140
|
--transition-duration-fast: var(--duration-fast);
|
|
140
141
|
--transition-duration-medium: var(--duration-medium);
|
|
141
142
|
--transition-duration-slow: var(--duration-slow);
|
|
142
|
-
--transition-duration-
|
|
143
|
+
--transition-duration-overlay: var(--duration-overlay);
|
|
144
|
+
--transition-duration-loop: var(--duration-loop);
|
|
143
145
|
}
|
package/src/tokens/palette.css
CHANGED
|
@@ -38,6 +38,12 @@
|
|
|
38
38
|
--brand-surface-light: oklch(0.99 0 0); /* Cards on a light page */
|
|
39
39
|
--brand-line-light: oklch(0.91 0 0); /* Borders on a light page */
|
|
40
40
|
|
|
41
|
+
/* The key button. Each theme has its own pair, since a hue lifted for dark needs dark text. */
|
|
42
|
+
--brand-primary: var(--gray-900);
|
|
43
|
+
--brand-primary-foreground: var(--gray-50);
|
|
44
|
+
--brand-primary-on-dark: var(--brand-paper);
|
|
45
|
+
--brand-primary-foreground-on-dark: var(--gray-900);
|
|
46
|
+
|
|
41
47
|
/* === Tint scales ===
|
|
42
48
|
Mixed from the three hues so `--brand` alone yields 100 to 800; 400 is the colour lifted
|
|
43
49
|
for dark, 600 the colour itself. */
|
|
@@ -220,8 +226,8 @@
|
|
|
220
226
|
--color-popover: var(--brand-surface-light);
|
|
221
227
|
--color-popover-foreground: var(--gray-900);
|
|
222
228
|
|
|
223
|
-
--color-primary: var(--
|
|
224
|
-
--color-primary-foreground: var(--
|
|
229
|
+
--color-primary: var(--brand-primary);
|
|
230
|
+
--color-primary-foreground: var(--brand-primary-foreground);
|
|
225
231
|
|
|
226
232
|
--color-secondary: var(--gray-100);
|
|
227
233
|
--color-secondary-foreground: var(--gray-900);
|
|
@@ -320,8 +326,8 @@
|
|
|
320
326
|
--color-popover: var(--brand-surface);
|
|
321
327
|
--color-popover-foreground: var(--brand-paper);
|
|
322
328
|
|
|
323
|
-
--color-primary: var(--brand-
|
|
324
|
-
--color-primary-foreground: var(--
|
|
329
|
+
--color-primary: var(--brand-primary-on-dark);
|
|
330
|
+
--color-primary-foreground: var(--brand-primary-foreground-on-dark);
|
|
325
331
|
|
|
326
332
|
--color-secondary: var(--brand-raised);
|
|
327
333
|
--color-secondary-foreground: var(--brand-paper);
|