@tensor_1/tokens 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/build/css/components.css +1 -1847
- package/build/css/styles.css +1 -2188
- package/package.json +12 -2
- package/styles/components/alert.css +16 -0
- package/styles/components/app-shell.css +37 -0
- package/styles/components/attachment.css +10 -0
- package/styles/components/audit-log.css +11 -0
- package/styles/components/avatar.css +25 -0
- package/styles/components/breadcrumbs.css +10 -0
- package/styles/components/button.css +49 -0
- package/styles/components/calendar.css +13 -0
- package/styles/components/card.css +9 -0
- package/styles/components/chart.css +9 -0
- package/styles/components/checkbox.css +20 -0
- package/styles/components/combobox.css +16 -0
- package/styles/components/command-palette.css +14 -0
- package/styles/components/comments.css +17 -0
- package/styles/components/contact-card.css +12 -0
- package/styles/components/description-list.css +6 -0
- package/styles/components/detail-layout.css +7 -0
- package/styles/components/drawer.css +24 -0
- package/styles/components/editorial-home.css +185 -0
- package/styles/components/file-upload.css +14 -0
- package/styles/components/flow.css +196 -0
- package/styles/components/form.css +14 -0
- package/styles/components/heartbeat.css +12 -0
- package/styles/components/inbox.css +13 -0
- package/styles/components/input.css +39 -0
- package/styles/components/kanban.css +14 -0
- package/styles/components/kbd.css +8 -0
- package/styles/components/labels.css +13 -0
- package/styles/components/lightbox.css +13 -0
- package/styles/components/link.css +98 -0
- package/styles/components/list.css +10 -0
- package/styles/components/media.css +9 -0
- package/styles/components/menu.css +15 -0
- package/styles/components/meter.css +9 -0
- package/styles/components/modal.css +31 -0
- package/styles/components/notification-center.css +14 -0
- package/styles/components/page-header.css +9 -0
- package/styles/components/pagination.css +14 -0
- package/styles/components/peek.css +46 -0
- package/styles/components/pipeline.css +9 -0
- package/styles/components/popover.css +11 -0
- package/styles/components/progress.css +12 -0
- package/styles/components/prose.css +27 -0
- package/styles/components/radio.css +20 -0
- package/styles/components/reactions.css +22 -0
- package/styles/components/segmented.css +12 -0
- package/styles/components/select.css +23 -0
- package/styles/components/sidebar.css +102 -0
- package/styles/components/sla.css +8 -0
- package/styles/components/slider.css +16 -0
- package/styles/components/spinner.css +10 -0
- package/styles/components/stat-tile.css +11 -0
- package/styles/components/states.css +13 -0
- package/styles/components/status-pill.css +37 -0
- package/styles/components/stepper.css +13 -0
- package/styles/components/steps.css +18 -0
- package/styles/components/switch.css +19 -0
- package/styles/components/table-toolbar.css +20 -0
- package/styles/components/table.css +160 -0
- package/styles/components/tabs.css +31 -0
- package/styles/components/tag-input.css +16 -0
- package/styles/components/textarea.css +15 -0
- package/styles/components/timeline.css +11 -0
- package/styles/components/toast.css +21 -0
- package/styles/components/tooltip.css +35 -0
- package/styles/components/tree.css +17 -0
- package/styles/components/typography.css +45 -0
- package/styles/components/utility-bits.css +14 -0
- package/styles/components/view-menu.css +14 -0
- package/styles/motion.css +35 -0
- package/styles/utilities.css +26 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/* uix tag input / multi-select chips — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-taginput {
|
|
4
|
+
display: flex; flex-wrap: wrap; align-items: center; gap: var(--uix-space-2); min-height: var(--uix-control-h); padding: var(--uix-space-1) var(--uix-space-2);
|
|
5
|
+
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface);
|
|
6
|
+
}
|
|
7
|
+
.uix-taginput:focus-within { border-color: var(--uix-ring); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
|
|
8
|
+
.uix-taginput__field { flex: 1; min-width: 80px; border: 0; outline: none; background: transparent; color: var(--uix-text); font: inherit; }
|
|
9
|
+
.uix-tag {
|
|
10
|
+
display: inline-flex; align-items: center; gap: var(--uix-space-1); padding: var(--uix-space-1) var(--uix-space-1) var(--uix-space-1) var(--uix-space-2); border-radius: var(--uix-radius-sm);
|
|
11
|
+
background: var(--uix-bg-active); color: var(--uix-text); font-size: var(--uix-text-meta);
|
|
12
|
+
}
|
|
13
|
+
.uix-tag__remove { display: grid; place-items: center; width: 16px; height: 16px; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; border-radius: var(--uix-radius-xs); }
|
|
14
|
+
.uix-tag__remove:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
15
|
+
.uix-tag__remove svg { width: 12px; height: 12px; }
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/* uix textarea — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-textarea {
|
|
4
|
+
width: 100%; min-height: 84px; padding: var(--uix-space-3) var(--uix-space-3); resize: vertical;
|
|
5
|
+
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md);
|
|
6
|
+
background: var(--uix-surface); color: var(--uix-text); font: inherit; font-size: var(--uix-text-body);
|
|
7
|
+
line-height: var(--uix-leading-body);
|
|
8
|
+
transition: border-color var(--uix-dur-fast) var(--uix-ease-out), box-shadow var(--uix-dur-fast) var(--uix-ease-out);
|
|
9
|
+
}
|
|
10
|
+
.uix-textarea::placeholder { color: var(--uix-text-muted); }
|
|
11
|
+
.uix-textarea:hover { border-color: var(--uix-border-strong); }
|
|
12
|
+
.uix-textarea:focus { outline: none; border-color: var(--uix-ring); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
|
|
13
|
+
.uix-textarea:disabled { opacity: .55; background: var(--uix-bg-subtle); }
|
|
14
|
+
.uix-textarea[aria-invalid="true"] { border-color: var(--uix-danger); }
|
|
15
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/* uix timeline / activity feed — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-timeline { display: flex; flex-direction: column; }
|
|
4
|
+
.uix-timeline__item { display: grid; grid-template-columns: 24px 1fr; gap: var(--uix-space-3); }
|
|
5
|
+
.uix-timeline__rail { display: flex; flex-direction: column; align-items: center; }
|
|
6
|
+
.uix-timeline__node { width: 12px; height: 12px; border-radius: 50%; background: var(--uix-accent); margin-top: var(--uix-space-1); flex: none; box-shadow: 0 0 0 3px var(--uix-brand-muted); }
|
|
7
|
+
.uix-timeline__line { width: 1px; flex: 1; background: var(--uix-border); margin: var(--uix-space-1) 0; }
|
|
8
|
+
.uix-timeline__item:last-child .uix-timeline__line { display: none; }
|
|
9
|
+
.uix-timeline__body { padding-bottom: var(--uix-space-5); }
|
|
10
|
+
.uix-timeline__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
11
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* uix toast / notification — depends only on --uix-* tokens. JS appends to .uix-toaster. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-toaster { position: fixed; bottom: 16px; right: 16px; z-index: var(--uix-z-toast); display: flex; flex-direction: column; gap: var(--uix-space-2); width: 340px; max-width: calc(100vw - 32px); }
|
|
4
|
+
.uix-toast {
|
|
5
|
+
display: flex; gap: var(--uix-space-3); align-items: flex-start; padding: var(--uix-space-3) var(--uix-space-4); border-radius: var(--uix-radius-md);
|
|
6
|
+
background: var(--uix-surface-2); border: 1px solid var(--uix-border); box-shadow: var(--uix-shadow-popover);
|
|
7
|
+
animation: uix-slide-in-right var(--uix-dur-slow) var(--uix-ease-out);
|
|
8
|
+
}
|
|
9
|
+
.uix-toast[data-leaving] { animation: uix-toast-out var(--uix-dur) var(--uix-ease-in) forwards; }
|
|
10
|
+
@keyframes uix-toast-out { to { opacity: 0; transform: translateX(16px); } }
|
|
11
|
+
.uix-toast__icon { flex: none; margin-top: 1px; }
|
|
12
|
+
.uix-toast__icon svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
|
|
13
|
+
.uix-toast__body { flex: 1; }
|
|
14
|
+
.uix-toast__title { font-weight: 600; font-size: var(--uix-text-body); }
|
|
15
|
+
.uix-toast__msg { font-size: var(--uix-text-meta); color: var(--uix-text-muted); margin-top: var(--uix-space-1); }
|
|
16
|
+
.uix-toast__close { border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; padding: var(--uix-space-1) var(--uix-space-2); border-radius: var(--uix-radius-xs); }
|
|
17
|
+
.uix-toast__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
18
|
+
.uix-toast--success .uix-toast__icon { color: var(--uix-success); }
|
|
19
|
+
.uix-toast--danger .uix-toast__icon { color: var(--uix-danger); }
|
|
20
|
+
.uix-toast--info .uix-toast__icon { color: var(--uix-info); }
|
|
21
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* uix tooltip. Two flavours, both depend only on --uix-* tokens:
|
|
2
|
+
• .uix-tooltip__bubble — the React <Tooltip>: renders in the top layer via the
|
|
3
|
+
Popover API, so it escapes any overflow:hidden/scroll ancestor (UIX-FIX-02).
|
|
4
|
+
JS sets position/left/top; CSS owns appearance + the fade.
|
|
5
|
+
• [data-uix-tip] — the legacy CSS-only tooltip, kept for back-compat. It is
|
|
6
|
+
position:absolute and so is clipped by an overflow ancestor; prefer <Tooltip>. */
|
|
7
|
+
@layer uix.components {
|
|
8
|
+
.uix-tooltip { display: inline-flex; }
|
|
9
|
+
|
|
10
|
+
.uix-tooltip__bubble {
|
|
11
|
+
position: fixed; margin: 0; inset: auto; border: 0;
|
|
12
|
+
width: max-content; max-width: 16rem;
|
|
13
|
+
background: var(--uix-text); color: var(--uix-bg-app);
|
|
14
|
+
font-size: var(--uix-text-meta); font-weight: 500; line-height: 1.4;
|
|
15
|
+
padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm);
|
|
16
|
+
box-shadow: var(--uix-shadow-popover); white-space: normal; pointer-events: none;
|
|
17
|
+
opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
|
|
18
|
+
}
|
|
19
|
+
.uix-tooltip__bubble:popover-open { opacity: 1; }
|
|
20
|
+
@starting-style { .uix-tooltip__bubble:popover-open { opacity: 0; } }
|
|
21
|
+
|
|
22
|
+
/* legacy CSS-only tooltip — clipped by overflow ancestors; superseded by .uix-tooltip__bubble */
|
|
23
|
+
[data-uix-tip] { position: relative; }
|
|
24
|
+
[data-uix-tip]::after {
|
|
25
|
+
content: attr(data-uix-tip); position: absolute; bottom: calc(100% + 6px); left: 50%;
|
|
26
|
+
transform: translateX(-50%) translateY(var(--uix-lift));
|
|
27
|
+
background: var(--uix-text); color: var(--uix-bg-app); font-size: var(--uix-text-meta); font-weight: 500;
|
|
28
|
+
padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm); white-space: nowrap; box-shadow: var(--uix-shadow-popover);
|
|
29
|
+
opacity: 0; pointer-events: none; z-index: var(--uix-z-tooltip);
|
|
30
|
+
transition: opacity var(--uix-dur-fast) var(--uix-ease-out), transform var(--uix-dur-fast) var(--uix-ease-out);
|
|
31
|
+
}
|
|
32
|
+
[data-uix-tip]:hover::after, [data-uix-tip]:focus-visible::after { opacity: 1; transform: translateX(-50%) translateY(0); }
|
|
33
|
+
/* when JS upgrades [data-uix-tip] to a top-layer bubble, drop the clipped CSS-only one */
|
|
34
|
+
.uix-has-js-tip [data-uix-tip]::after { content: none; }
|
|
35
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* uix tree view — WAI-ARIA tree (role=tree/treeitem/group). Depends only on --uix-* tokens.
|
|
2
|
+
ARIA (aria-expanded / aria-selected / aria-level) lives on the treeitem <li>, so the chevron,
|
|
3
|
+
selection, and collapse styling all key off the item, not the row (UIX-FIX-04). */
|
|
4
|
+
@layer uix.components {
|
|
5
|
+
.uix-tree, .uix-tree ul { list-style: none; margin: 0; padding: 0; }
|
|
6
|
+
.uix-tree__group { padding-left: var(--uix-space-5); }
|
|
7
|
+
.uix-tree__item { outline: none; } /* the focus ring is drawn on the row, below */
|
|
8
|
+
.uix-tree__row { display: flex; align-items: center; gap: var(--uix-space-2); padding: var(--uix-space-2) var(--uix-space-2); border-radius: var(--uix-radius-sm); cursor: pointer; color: var(--uix-text); font-size: var(--uix-text-body); }
|
|
9
|
+
.uix-tree__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
10
|
+
.uix-tree__item > .uix-tree__row:hover { background: var(--uix-bg-hover); }
|
|
11
|
+
.uix-tree__item[aria-selected="true"] > .uix-tree__row { background: var(--uix-bg-active); }
|
|
12
|
+
.uix-tree__item:focus-visible > .uix-tree__row { outline: 2px solid var(--uix-ring); outline-offset: -2px; }
|
|
13
|
+
.uix-tree__toggle { width: 16px; height: 16px; flex: none; display: grid; place-items: center; color: var(--uix-text-muted); transition: transform var(--uix-dur) var(--uix-ease-out); }
|
|
14
|
+
.uix-tree__toggle svg { width: 14px; height: 14px; }
|
|
15
|
+
.uix-tree__item[aria-expanded="false"] > .uix-tree__row .uix-tree__toggle { transform: rotate(-90deg); }
|
|
16
|
+
.uix-tree__item[aria-expanded="false"] > .uix-tree__group { display: none; }
|
|
17
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* uix typography utilities — class-based application of the --uix-text-* scale.
|
|
2
|
+
A `<span class="uix-text-h3">` reads identically to an `<h3>`; consumers reach
|
|
3
|
+
for these instead of re-deriving the scale inline. (House products migrating
|
|
4
|
+
off bespoke `type-*` classes map 1:1 onto these — same sizes/leading/weights.)
|
|
5
|
+
Depends only on --uix-* tokens. */
|
|
6
|
+
@layer uix.components {
|
|
7
|
+
.uix-text-display {
|
|
8
|
+
font-size: var(--uix-text-display); line-height: var(--uix-leading-display);
|
|
9
|
+
font-weight: 400; letter-spacing: var(--uix-tracking-tight); color: var(--uix-text);
|
|
10
|
+
}
|
|
11
|
+
.uix-text-h1 {
|
|
12
|
+
font-size: var(--uix-text-display); line-height: var(--uix-leading-display);
|
|
13
|
+
font-weight: 400; letter-spacing: var(--uix-tracking-tight); color: var(--uix-text);
|
|
14
|
+
}
|
|
15
|
+
.uix-text-h2 {
|
|
16
|
+
font-size: var(--uix-text-h2); line-height: var(--uix-leading-h2);
|
|
17
|
+
font-weight: 400; letter-spacing: -0.01em; color: var(--uix-text);
|
|
18
|
+
}
|
|
19
|
+
.uix-text-h3 {
|
|
20
|
+
font-size: var(--uix-text-h3); line-height: var(--uix-leading-h3);
|
|
21
|
+
font-weight: 700; color: var(--uix-text);
|
|
22
|
+
}
|
|
23
|
+
.uix-text-body {
|
|
24
|
+
font-size: var(--uix-text-body); line-height: var(--uix-leading-body);
|
|
25
|
+
font-weight: 400; color: var(--uix-text);
|
|
26
|
+
}
|
|
27
|
+
.uix-text-body-hushed {
|
|
28
|
+
font-size: var(--uix-text-body); line-height: var(--uix-leading-body);
|
|
29
|
+
font-weight: 400; color: var(--uix-text-hushed);
|
|
30
|
+
}
|
|
31
|
+
.uix-text-meta {
|
|
32
|
+
font-size: var(--uix-text-meta); line-height: var(--uix-leading-meta);
|
|
33
|
+
font-weight: 400; color: var(--uix-text-hushed);
|
|
34
|
+
}
|
|
35
|
+
.uix-text-eyebrow {
|
|
36
|
+
font-size: var(--uix-text-eyebrow); line-height: var(--uix-leading-eyebrow);
|
|
37
|
+
font-weight: 700; letter-spacing: var(--uix-tracking-eyebrow);
|
|
38
|
+
text-transform: uppercase; color: var(--uix-text-hushed);
|
|
39
|
+
}
|
|
40
|
+
.uix-text-data-hero {
|
|
41
|
+
font-size: var(--uix-text-data-hero); line-height: 1.1;
|
|
42
|
+
font-weight: 400; letter-spacing: -0.01em; color: var(--uix-text);
|
|
43
|
+
font-variant-numeric: tabular-nums;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/* uix utility/typography bits — code, pre, blockquote, divider, status dots. Depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-code { font-family: var(--uix-font-mono); font-size: .9em; background: var(--uix-bg-subtle); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-xs); padding: .1em .4em; color: var(--uix-text); }
|
|
4
|
+
.uix-pre { font-family: var(--uix-font-mono); font-size: var(--uix-text-meta); line-height: 1.5; background: var(--uix-bg-subtle); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); padding: var(--uix-space-4) var(--uix-space-4); overflow-x: auto; color: var(--uix-text); }
|
|
5
|
+
.uix-blockquote { border-left: 3px solid var(--uix-accent); padding: var(--uix-space-1) 0 var(--uix-space-1) var(--uix-space-4); color: var(--uix-text-hushed); font-style: italic; }
|
|
6
|
+
.uix-divider { height: 1px; background: var(--uix-border); border: 0; margin: var(--uix-space-4) 0; }
|
|
7
|
+
.uix-divider--label { display: flex; align-items: center; gap: var(--uix-space-3); color: var(--uix-text-muted); font-size: var(--uix-text-meta); background: transparent; height: auto; }
|
|
8
|
+
.uix-divider--label::before, .uix-divider--label::after { content: ""; flex: 1; height: 1px; background: var(--uix-border); }
|
|
9
|
+
.uix-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--uix-text-muted); }
|
|
10
|
+
.uix-dot--success { background: var(--uix-success); }
|
|
11
|
+
.uix-dot--warning { background: var(--uix-warning); }
|
|
12
|
+
.uix-dot--danger { background: var(--uix-danger); }
|
|
13
|
+
.uix-dot--info { background: var(--uix-info); }
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/* uix table View menu — consolidates density / zebra / freeze / columns into one popover.
|
|
2
|
+
Reuses .uix-popover (surface + animation), .uix-segmented, .uix-switch. Depends only on --uix-* tokens. */
|
|
3
|
+
@layer uix.components {
|
|
4
|
+
.uix-view-menu { min-width: 248px; padding: var(--uix-space-2); }
|
|
5
|
+
.uix-view-menu__group { padding: var(--uix-space-2) var(--uix-space-2); }
|
|
6
|
+
.uix-view-menu__group + .uix-view-menu__group { border-top: 1px solid var(--uix-border); }
|
|
7
|
+
.uix-view-menu__label { font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; color: var(--uix-text-muted); margin-bottom: var(--uix-space-2); }
|
|
8
|
+
.uix-view-menu__row { display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-3); font-size: var(--uix-text-body); color: var(--uix-text); cursor: pointer; }
|
|
9
|
+
.uix-view-menu__row + .uix-view-menu__row { margin-top: var(--uix-space-3); }
|
|
10
|
+
.uix-view-menu .uix-segmented { display: flex; width: 100%; }
|
|
11
|
+
.uix-view-menu .uix-segmented__option { flex: 1; text-align: center; }
|
|
12
|
+
.uix-view-menu__cols { display: flex; flex-direction: column; gap: var(--uix-space-1); max-height: 180px; overflow: auto; }
|
|
13
|
+
.uix-view-menu__cols .uix-menu__item { font-size: var(--uix-text-meta); }
|
|
14
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* uix motion — shared keyframes, enter/exit helpers, and the reduced-motion guard.
|
|
2
|
+
Components reference these tokens/keyframes; overlays pair the helpers with @starting-style. */
|
|
3
|
+
|
|
4
|
+
/* Reduced-motion guard — UNLAYERED so its !important beats every component transition. */
|
|
5
|
+
@media (prefers-reduced-motion: reduce) {
|
|
6
|
+
*, *::before, *::after {
|
|
7
|
+
animation-duration: .001ms !important;
|
|
8
|
+
animation-iteration-count: 1 !important;
|
|
9
|
+
transition-duration: .001ms !important;
|
|
10
|
+
scroll-behavior: auto !important;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Keyframes (cascade-neutral). */
|
|
15
|
+
@keyframes uix-fade-in { from { opacity: 0; } to { opacity: 1; } }
|
|
16
|
+
@keyframes uix-pop-in {
|
|
17
|
+
from { opacity: 0; transform: scale(.96) translateY(var(--uix-lift)); }
|
|
18
|
+
to { opacity: 1; transform: none; }
|
|
19
|
+
}
|
|
20
|
+
@keyframes uix-slide-in-right { from { opacity: 0; transform: translateX(16px); } to { opacity: 1; transform: none; } }
|
|
21
|
+
@keyframes uix-slide-in-up { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
|
|
22
|
+
@keyframes uix-spin { to { transform: rotate(1turn); } }
|
|
23
|
+
@keyframes uix-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
|
|
24
|
+
|
|
25
|
+
@layer uix.motion {
|
|
26
|
+
.uix-anim-fade { animation: uix-fade-in var(--uix-dur) var(--uix-ease-out); }
|
|
27
|
+
.uix-anim-pop { animation: uix-pop-in var(--uix-dur-fast) var(--uix-ease-out); }
|
|
28
|
+
.uix-anim-up { animation: uix-slide-in-up var(--uix-dur) var(--uix-ease-out); }
|
|
29
|
+
|
|
30
|
+
/* Hover-lift affordance for interactive cards/tiles. Gated so touch devices don't get a stuck hover. */
|
|
31
|
+
.uix-lift-hover { transition: transform var(--uix-dur-fast) var(--uix-ease-out), box-shadow var(--uix-dur-fast) var(--uix-ease-out); }
|
|
32
|
+
@media (hover: hover) and (pointer: fine) {
|
|
33
|
+
.uix-lift-hover:hover { transform: translateY(calc(-1 * var(--uix-lift))); box-shadow: var(--uix-shadow-popover); }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/* uix utilities — a few layout/a11y helpers. Keep this small; tokens + components do the heavy lifting. */
|
|
2
|
+
@layer uix.util {
|
|
3
|
+
/* visually hidden but available to screen readers */
|
|
4
|
+
.uix-visually-hidden {
|
|
5
|
+
position: absolute !important;
|
|
6
|
+
width: 1px; height: 1px;
|
|
7
|
+
padding: 0; margin: -1px;
|
|
8
|
+
overflow: hidden; clip: rect(0, 0, 0, 0);
|
|
9
|
+
white-space: nowrap; border: 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/* vertical rhythm — set gap via --gap (defaults to --uix-space-4 / 16px) */
|
|
13
|
+
.uix-stack { display: flex; flex-direction: column; gap: var(--gap, var(--uix-space-4)); }
|
|
14
|
+
/* horizontal grouping that wraps */
|
|
15
|
+
.uix-cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--gap, var(--uix-space-2)); }
|
|
16
|
+
|
|
17
|
+
.uix-truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
18
|
+
|
|
19
|
+
/* elevation — apply the surface shadow tokens as a utility (cards/panels,
|
|
20
|
+
floating popovers/menus/dialogs, pressed/active pills). In dark mode
|
|
21
|
+
--uix-shadow-sm resolves to the inset top highlight, so elevated surfaces
|
|
22
|
+
keep their lift cue without a heavy drop shadow. */
|
|
23
|
+
.uix-elevated { box-shadow: var(--uix-shadow-sm); }
|
|
24
|
+
.uix-elevated-popover { box-shadow: var(--uix-shadow-popover); }
|
|
25
|
+
.uix-elevated-pill { box-shadow: var(--uix-shadow-sm); }
|
|
26
|
+
}
|