@tensor_1/tokens 2.11.0 → 2.13.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 +8 -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/brand-profiles.css +12 -0
- package/styles/components/breadcrumbs.css +10 -0
- package/styles/components/builder-canvas.css +17 -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/color-picker.css +14 -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/date-range-picker.css +16 -0
- package/styles/components/description-list.css +6 -0
- package/styles/components/detail-layout.css +7 -0
- package/styles/components/diff-viewer.css +14 -0
- package/styles/components/drawer.css +24 -0
- package/styles/components/editorial-home.css +188 -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/license-position-bar.css +8 -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/match-review.css +11 -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/metric-input.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/relationship-graph.css +21 -0
- package/styles/components/rule-builder.css +17 -0
- package/styles/components/scheduling-calendar.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,98 @@
|
|
|
1
|
+
/* uix link patterns — the quiet link, for anchors whose CONTAINER is the affordance.
|
|
2
|
+
*
|
|
3
|
+
* The base layer styles anchors as in-text content links: --uix-link colour, and
|
|
4
|
+
* classless [href] anchors carry a persistent underline (WCAG 1.4.1 / link-in-text-block —
|
|
5
|
+
* a link sitting inside a run of same-coloured prose must not be distinguished by colour
|
|
6
|
+
* alone). That contract is right for prose and wrong for composition slots where the
|
|
7
|
+
* surrounding row/card already communicates interactivity: framework <Link>s passed into
|
|
8
|
+
* kit title slots and table cells rendered brand-blue + bold + underlined — unreadable
|
|
9
|
+
* noise at list density (TENSOR INTRA-04, operator-rejected).
|
|
10
|
+
*
|
|
11
|
+
* A quiet link inherits the surrounding text colour and shows its underline on
|
|
12
|
+
* hover/focus. The global :focus-visible ring (base.css) still fires, so the keyboard
|
|
13
|
+
* affordance never rests on the underline alone. WCAG 1.4.1 is not in play for anything
|
|
14
|
+
* below: the link is the WHOLE text of its block — a title, a name, a data cell — or it
|
|
15
|
+
* is the block itself. It is never a phrase inside a sentence.
|
|
16
|
+
*
|
|
17
|
+
* A slot earns quiet-BY-DEFAULT only when BOTH hold:
|
|
18
|
+
* (i) the anchor fills a named title/name slot or a data cell — the link text IS the
|
|
19
|
+
* block, not a phrase inside running copy; and
|
|
20
|
+
* (ii) the surrounding row/card/tile already reads as interactive (hover state, cursor,
|
|
21
|
+
* bordered unit), or the slot is that record's primary label.
|
|
22
|
+
*
|
|
23
|
+
* Deliberate exclusions, so the next person doesn't "finish the job":
|
|
24
|
+
* • Prose and message bodies — .uix-prose, .uix-note, .uix-notice__copy,
|
|
25
|
+
* .uix-timeline__body, .uix-audit__detail, .uix-notif copy. Links there sit inside
|
|
26
|
+
* sentences: 1.4.1 applies and the base treatment is correct.
|
|
27
|
+
* • .uix-alert, .uix-toast, .uix-peek__title — nothing else in those containers signals
|
|
28
|
+
* that the link navigates, so the colour IS the affordance. peek.css sets --uix-link
|
|
29
|
+
* on its title anchor on purpose; do not quiet it.
|
|
30
|
+
* • .uix-comment__author — a byline renders "Author · 22m ago", so the name is a phrase
|
|
31
|
+
* inside a text run, not the whole block, and .uix-comment__meta is not interactive.
|
|
32
|
+
* It fails test (i) above. Products wanting the GitHub-style quiet byline opt in with
|
|
33
|
+
* .uix-link--quiet; that is what the utility is for.
|
|
34
|
+
* • .uix-navitem, .uix-breadcrumbs a, .uix-section-link are already quiet by their own
|
|
35
|
+
* design and need no class here.
|
|
36
|
+
*
|
|
37
|
+
* Four forms:
|
|
38
|
+
* 1 · `.uix-link--quiet` — the opt-in utility, for block links outside the registry.
|
|
39
|
+
* 2 · TITLE / NAME SLOTS — quiet by default. `:not(.uix-btn)` so an anchor deliberately
|
|
40
|
+
* styled as a button inside a title slot keeps its button treatment.
|
|
41
|
+
* 3 · DATA CELLS — table cells and description-list values. `:not([class])` so
|
|
42
|
+
* class-bearing anchors (`.uix-btn--link`, pills, tags) stay styled.
|
|
43
|
+
* 4 · CONTAINER ANCHORS — the anchor IS the kit block (`<a class="uix-card">`). Without
|
|
44
|
+
* this the base `a { color }` tints every word in the block brand-blue.
|
|
45
|
+
* Depends only on --uix-* tokens. */
|
|
46
|
+
@layer uix.components {
|
|
47
|
+
.uix-link--quiet,
|
|
48
|
+
|
|
49
|
+
/* 2 · title / name slots */
|
|
50
|
+
:is(
|
|
51
|
+
/* editorial-home */
|
|
52
|
+
.uix-featured__title, .uix-rail-card__title, .uix-news-lead__title,
|
|
53
|
+
.uix-content-list__title, .uix-rundown__item-title, .uix-event-row__title,
|
|
54
|
+
.uix-status-row__name,
|
|
55
|
+
/* records, rows, cards */
|
|
56
|
+
.uix-card__title, .uix-list__title, .uix-inbox__subject, .uix-kanban__card-title,
|
|
57
|
+
.uix-media__name, .uix-attachment__name, .uix-contact__name, .uix-user-chip__name,
|
|
58
|
+
.uix-audit__actor
|
|
59
|
+
) a:not(.uix-btn),
|
|
60
|
+
|
|
61
|
+
/* 3 · data cells */
|
|
62
|
+
:is(.uix-table td, .uix-dl dd) a:not([class]),
|
|
63
|
+
|
|
64
|
+
/* 4 · container anchors */
|
|
65
|
+
a:is(
|
|
66
|
+
.uix-card, .uix-stat, .uix-list__item, .uix-inbox__item, .uix-kanban__card,
|
|
67
|
+
.uix-notif, .uix-media, .uix-attachment, .uix-contact, .uix-cmdk__item,
|
|
68
|
+
.uix-content-list__item, .uix-event-row, .uix-status-row
|
|
69
|
+
) { color: inherit; text-decoration: none; }
|
|
70
|
+
|
|
71
|
+
.uix-link--quiet:is(:hover, :focus-visible),
|
|
72
|
+
|
|
73
|
+
:is(
|
|
74
|
+
.uix-featured__title, .uix-rail-card__title, .uix-news-lead__title,
|
|
75
|
+
.uix-content-list__title, .uix-rundown__item-title, .uix-event-row__title,
|
|
76
|
+
.uix-status-row__name,
|
|
77
|
+
.uix-card__title, .uix-list__title, .uix-inbox__subject, .uix-kanban__card-title,
|
|
78
|
+
.uix-media__name, .uix-attachment__name, .uix-contact__name, .uix-user-chip__name,
|
|
79
|
+
.uix-audit__actor
|
|
80
|
+
) a:not(.uix-btn):is(:hover, :focus-visible),
|
|
81
|
+
|
|
82
|
+
:is(.uix-table td, .uix-dl dd) a:not([class]):is(:hover, :focus-visible) { text-decoration: underline; }
|
|
83
|
+
|
|
84
|
+
/* Container anchors never underline: the anchor wraps the whole block, so an underline
|
|
85
|
+
would strike through every word in it. They take the kit's standard row-hover tint
|
|
86
|
+
instead — the same --uix-bg-hover that .uix-list__item / .uix-inbox__item / .uix-cmdk__item
|
|
87
|
+
already use, so containers with a hover of their own just restate it. */
|
|
88
|
+
a:is(
|
|
89
|
+
.uix-card, .uix-stat, .uix-list__item, .uix-inbox__item, .uix-kanban__card,
|
|
90
|
+
.uix-notif, .uix-media, .uix-attachment, .uix-contact, .uix-cmdk__item,
|
|
91
|
+
.uix-content-list__item, .uix-event-row, .uix-status-row
|
|
92
|
+
):is(:hover, :focus-visible) { background: var(--uix-bg-hover); }
|
|
93
|
+
|
|
94
|
+
/* Container anchors that declare no display of their own would render inline as an <a>.
|
|
95
|
+
The rest of form 4 (flex/grid rows) set theirs already and must NOT be overridden —
|
|
96
|
+
link.css is imported last, so a blanket display here would flatten them. */
|
|
97
|
+
a:is(.uix-card, .uix-stat, .uix-kanban__card) { display: block; }
|
|
98
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/* uix list + list-item — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-list { display: flex; flex-direction: column; border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); overflow: hidden; background: var(--uix-surface); }
|
|
4
|
+
.uix-list__item { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-4) var(--uix-space-5); border-bottom: 1px solid var(--uix-border); }
|
|
5
|
+
.uix-list__item:last-child { border-bottom: 0; }
|
|
6
|
+
.uix-list__item:hover { background: var(--uix-bg-hover); }
|
|
7
|
+
.uix-list__title { font-weight: 500; }
|
|
8
|
+
.uix-list__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
9
|
+
.uix-list__trail { margin-left: auto; display: flex; align-items: center; gap: var(--uix-space-2); }
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
@layer uix.components {
|
|
2
|
+
.uix-match-review { display:grid; gap:var(--uix-space-3); color:var(--uix-text); }
|
|
3
|
+
.uix-match-review__summary { display:grid; gap:var(--uix-space-3); padding:var(--uix-space-4); border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); background:var(--uix-surface); } .uix-match-review__summary>div:first-child { display:flex; justify-content:space-between; gap:var(--uix-space-3); } .uix-match-review__summary>div:first-child span { color:var(--uix-text-muted); }
|
|
4
|
+
.uix-match-review__incoming { display:grid; grid-template-columns:repeat(auto-fit,minmax(10rem,1fr)); gap:var(--uix-space-2); } .uix-match-review__incoming span { display:grid; gap:var(--uix-space-1); } .uix-match-review__incoming b { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
|
|
5
|
+
.uix-match-review__bulk { display:flex; align-items:center; gap:var(--uix-space-2); padding:var(--uix-space-2) var(--uix-space-3); border-radius:var(--uix-radius-md); background:var(--uix-brand-muted); }
|
|
6
|
+
.uix-match-review__table-wrap { overflow:auto; border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); }
|
|
7
|
+
.uix-match-review__table { min-width:54rem; } .uix-match-review__table tr[data-status="resolved"] { background:var(--uix-success-bg); }
|
|
8
|
+
.uix-match-review__confidence { font-variant-numeric:tabular-nums; font-weight:600; }
|
|
9
|
+
.uix-match-review__actions { display:flex; flex-wrap:wrap; gap:var(--uix-space-1); }
|
|
10
|
+
.uix-match-review--state { justify-items:start; padding:var(--uix-space-6); border:1px dashed var(--uix-border-strong); border-radius:var(--uix-radius-lg); }
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* uix media / device-asset card — image (or icon placeholder) + name + meta. Depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-media { display: flex; gap: var(--uix-space-3); align-items: center; }
|
|
4
|
+
.uix-media__thumb { width: 64px; height: 64px; flex: none; border-radius: var(--uix-radius-md); overflow: hidden; background: var(--uix-bg-subtle); border: 1px solid var(--uix-border); display: grid; place-items: center; }
|
|
5
|
+
.uix-media__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
|
6
|
+
.uix-media__thumb svg { width: 28px; height: 28px; color: var(--uix-text-muted); }
|
|
7
|
+
.uix-media__name { font-weight: 600; }
|
|
8
|
+
.uix-media__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
9
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/* uix menu / dropdown / context menu — popover-anchored surface. Depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-menu { min-width: 200px; margin: 0; padding: var(--uix-space-1); list-style: none; background: var(--uix-surface-2); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); box-shadow: var(--uix-shadow-popover); }
|
|
4
|
+
.uix-menu__item {
|
|
5
|
+
display: flex; align-items: center; gap: var(--uix-space-3); width: 100%; text-align: left; padding: var(--uix-space-2) var(--uix-space-3);
|
|
6
|
+
border: 0; background: transparent; border-radius: var(--uix-radius-sm); color: var(--uix-text); font: inherit; font-size: var(--uix-text-body); cursor: pointer;
|
|
7
|
+
}
|
|
8
|
+
.uix-menu__item svg { width: var(--uix-icon-md); height: var(--uix-icon-md); color: var(--uix-text-muted); }
|
|
9
|
+
.uix-menu__item:hover, .uix-menu__item[data-active] { background: var(--uix-bg-hover); }
|
|
10
|
+
.uix-menu__item--danger { color: var(--uix-danger-text); }
|
|
11
|
+
.uix-menu__item--danger svg { color: var(--uix-danger-text); }
|
|
12
|
+
.uix-menu__item .uix-kbd { margin-left: auto; }
|
|
13
|
+
.uix-menu__sep { height: 1px; background: var(--uix-border); margin: var(--uix-space-1) 0; }
|
|
14
|
+
.uix-menu__label { font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; color: var(--uix-text-muted); padding: var(--uix-space-2) var(--uix-space-3) var(--uix-space-1); }
|
|
15
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* uix meter / utilization bar (threshold tones) — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-meter { height: 8px; background: var(--uix-bg-active); border-radius: var(--uix-radius-pill); overflow: hidden; }
|
|
4
|
+
.uix-meter__fill { height: 100%; border-radius: inherit; background: var(--uix-success); transition: width var(--uix-dur) var(--uix-ease-out); }
|
|
5
|
+
.uix-meter__fill[data-tone="warning"] { background: var(--uix-warning); }
|
|
6
|
+
.uix-meter__fill[data-tone="danger"] { background: var(--uix-danger); }
|
|
7
|
+
.uix-meter__fill[data-tone="attention"] { background: var(--uix-attention); }
|
|
8
|
+
.uix-meter__fill[data-tone="overdue"] { background: var(--uix-overdue); }
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
@layer uix.components {
|
|
2
|
+
.uix-metric-input { display:grid; gap:var(--uix-space-2); color:var(--uix-text); }
|
|
3
|
+
.uix-metric-input__control { position:relative; display:grid; grid-template-columns:minmax(0,1fr) auto auto; align-items:stretch; max-width:22rem; }
|
|
4
|
+
.uix-metric-input__control .uix-input { border-top-right-radius:0; border-bottom-right-radius:0; font-variant-numeric:tabular-nums; }
|
|
5
|
+
.uix-metric-input__unit { display:flex; align-items:center; padding-inline:var(--uix-space-3); border-block:1px solid var(--uix-border-strong); background:var(--uix-bg-subtle); color:var(--uix-text-muted); }
|
|
6
|
+
.uix-metric-input__steps { display:grid; width:2.5rem; }
|
|
7
|
+
.uix-metric-input__step { border:1px solid var(--uix-border-strong); background:var(--uix-surface); color:var(--uix-text); line-height:1; } .uix-metric-input__step:first-child { border-top-right-radius:var(--uix-radius-md); } .uix-metric-input__step:last-child { border-top:0; border-bottom-right-radius:var(--uix-radius-md); }
|
|
8
|
+
.uix-metric-input__step:hover { background:var(--uix-bg-hover); } .uix-metric-input--invalid .uix-metric-input__control { color:var(--uix-danger-text); }
|
|
9
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* uix modal / dialog — native <dialog>, animated enter/exit via @starting-style + allow-discrete. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-dialog {
|
|
4
|
+
margin: auto; width: 100%; max-width: min(520px, 92vw); padding: 0; color: var(--uix-text);
|
|
5
|
+
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg);
|
|
6
|
+
background: var(--uix-surface-2); box-shadow: var(--uix-shadow-overlay);
|
|
7
|
+
opacity: 0; transform: translateY(8px) scale(.98);
|
|
8
|
+
transition: opacity var(--uix-dur-slow) var(--uix-ease-out), transform var(--uix-dur-slow) var(--uix-ease-out),
|
|
9
|
+
overlay var(--uix-dur-slow) allow-discrete, display var(--uix-dur-slow) allow-discrete;
|
|
10
|
+
/* Author display values for both states required for the fade-in to animate: the allow-discrete
|
|
11
|
+
`display` transition only engages with author values, which also lets @starting-style fire.
|
|
12
|
+
With only the UA dialog display, the modal stays at opacity:0. Closed = none; open = block. */
|
|
13
|
+
display: none;
|
|
14
|
+
}
|
|
15
|
+
.uix-dialog[open] { opacity: 1; transform: none; display: block; }
|
|
16
|
+
@starting-style { .uix-dialog[open] { opacity: 0; transform: translateY(8px) scale(.98); } }
|
|
17
|
+
.uix-dialog::backdrop {
|
|
18
|
+
background: var(--uix-scrim); opacity: 0;
|
|
19
|
+
transition: opacity var(--uix-dur-slow) var(--uix-ease-out), overlay var(--uix-dur-slow) allow-discrete, display var(--uix-dur-slow) allow-discrete;
|
|
20
|
+
}
|
|
21
|
+
.uix-dialog[open]::backdrop { opacity: 1; }
|
|
22
|
+
@starting-style { .uix-dialog[open]::backdrop { opacity: 0; } }
|
|
23
|
+
|
|
24
|
+
.uix-dialog__header { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-4) var(--uix-space-5); border-bottom: 1px solid var(--uix-border); }
|
|
25
|
+
.uix-dialog__title { font-size: var(--uix-text-h3); font-weight: 600; }
|
|
26
|
+
.uix-dialog__close { margin-left: auto; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; width: 30px; height: 30px; display: grid; place-items: center; border-radius: var(--uix-radius-sm); }
|
|
27
|
+
.uix-dialog__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
28
|
+
.uix-dialog__close svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
|
|
29
|
+
.uix-dialog__body { padding: var(--uix-space-5); color: var(--uix-text-hushed); }
|
|
30
|
+
.uix-dialog__footer { display: flex; gap: var(--uix-space-2); justify-content: flex-end; padding: var(--uix-space-4) var(--uix-space-5); border-top: 1px solid var(--uix-border); }
|
|
31
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/* uix notification center — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-notifs { background: var(--uix-surface-2); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); overflow: hidden; }
|
|
4
|
+
.uix-notifs__head { display: flex; align-items: center; padding: var(--uix-space-3) var(--uix-space-4); border-bottom: 1px solid var(--uix-border); font-weight: 600; }
|
|
5
|
+
.uix-notif { display: grid; grid-template-columns: auto 1fr; gap: var(--uix-space-3); padding: var(--uix-space-3) var(--uix-space-4); border-bottom: 1px solid var(--uix-border); }
|
|
6
|
+
.uix-notif:last-child { border-bottom: 0; }
|
|
7
|
+
.uix-notif[data-unread] { background: var(--uix-brand-muted); }
|
|
8
|
+
.uix-notif__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--uix-accent); margin-top: var(--uix-space-2); }
|
|
9
|
+
.uix-notif[data-unread] .uix-notif__dot { background: var(--uix-accent); }
|
|
10
|
+
.uix-notif:not([data-unread]) .uix-notif__dot { background: transparent; }
|
|
11
|
+
.uix-notif__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
12
|
+
/* on the unread brand-muted tint, muted meta dips below AA — hushed composites darker on the tint */
|
|
13
|
+
.uix-notif[data-unread] .uix-notif__meta { color: var(--uix-text-hushed); }
|
|
14
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* uix page header — title/subtitle/actions row. Depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-page-header { display: flex; align-items: flex-start; gap: var(--uix-space-5); flex-wrap: wrap; padding-bottom: var(--uix-space-6); margin-bottom: var(--uix-space-7); border-bottom: 1px solid var(--uix-border); }
|
|
4
|
+
.uix-page-header__titles { flex: 1; min-width: 220px; }
|
|
5
|
+
.uix-page-header__eyebrow { font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; font-weight: 600; color: var(--uix-text-muted); margin-bottom: var(--uix-space-2); }
|
|
6
|
+
.uix-page-header__title { font-size: var(--uix-text-h2); font-weight: 600; letter-spacing: var(--uix-tracking-tight); }
|
|
7
|
+
.uix-page-header__subtitle { color: var(--uix-text-muted); font-size: var(--uix-text-meta); margin-top: var(--uix-space-2); max-width: 70ch; }
|
|
8
|
+
.uix-page-header__actions { display: flex; gap: var(--uix-space-2); align-items: center; flex-wrap: wrap; }
|
|
9
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/* uix pagination — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-pagination { display: inline-flex; align-items: center; gap: var(--uix-space-1); }
|
|
4
|
+
.uix-pagination__btn {
|
|
5
|
+
min-width: 32px; height: 32px; padding: 0 var(--uix-space-2); display: inline-flex; align-items: center; justify-content: center;
|
|
6
|
+
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-sm); background: var(--uix-surface);
|
|
7
|
+
color: var(--uix-text); font: inherit; font-size: var(--uix-text-meta); line-height: 1; cursor: pointer;
|
|
8
|
+
transition: background-color var(--uix-dur-fast) var(--uix-ease-out), border-color var(--uix-dur-fast) var(--uix-ease-out);
|
|
9
|
+
}
|
|
10
|
+
.uix-pagination__btn:hover { background: var(--uix-bg-hover); }
|
|
11
|
+
.uix-pagination__btn[aria-current="page"] { background: var(--uix-accent); border-color: var(--uix-accent); color: var(--uix-accent-fg); }
|
|
12
|
+
.uix-pagination__btn:disabled { opacity: .45; pointer-events: none; }
|
|
13
|
+
.uix-pagination__ellipsis { padding: 0 var(--uix-space-1); color: var(--uix-text-muted); }
|
|
14
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/* uix side-peek drawer (the §5.8 peek pattern, reused by table rows + sidebar items).
|
|
2
|
+
Native <dialog>, slides from the right; keyboard ↑/↓ navigates records (app.js). */
|
|
3
|
+
@layer uix.components {
|
|
4
|
+
.uix-peek {
|
|
5
|
+
margin: 0 0 0 auto; height: 100dvh; max-height: 100dvh; width: var(--uix-peek-w); padding: 0; color: var(--uix-text);
|
|
6
|
+
border: 0; border-left: 1px solid var(--uix-border); border-radius: 0;
|
|
7
|
+
background: var(--uix-surface); box-shadow: var(--uix-shadow-overlay);
|
|
8
|
+
transform: translateX(100%);
|
|
9
|
+
transition: transform var(--uix-dur-slow) var(--uix-ease-out),
|
|
10
|
+
overlay var(--uix-dur-slow) allow-discrete, display var(--uix-dur-slow) allow-discrete;
|
|
11
|
+
/* Author display values for BOTH states are required for the slide-in to animate: the
|
|
12
|
+
allow-discrete `display` transition only engages with author values, and that gating also
|
|
13
|
+
lets the @starting-style entrance fire. With only the UA dialog display, the panel stays
|
|
14
|
+
parked at translateX(100%). Closed = none; open = flex. */
|
|
15
|
+
display: none;
|
|
16
|
+
}
|
|
17
|
+
.uix-peek[open] { transform: none; display: flex; flex-direction: column; }
|
|
18
|
+
@starting-style { .uix-peek[open] { transform: translateX(100%); } }
|
|
19
|
+
.uix-peek::backdrop {
|
|
20
|
+
background: var(--uix-scrim); opacity: 0;
|
|
21
|
+
transition: opacity var(--uix-dur-slow) var(--uix-ease-out), overlay var(--uix-dur-slow) allow-discrete, display var(--uix-dur-slow) allow-discrete;
|
|
22
|
+
}
|
|
23
|
+
.uix-peek[open]::backdrop { opacity: 1; }
|
|
24
|
+
@starting-style { .uix-peek[open]::backdrop { opacity: 0; } }
|
|
25
|
+
|
|
26
|
+
.uix-peek__header { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-4) var(--uix-space-4); border-bottom: 1px solid var(--uix-border); }
|
|
27
|
+
.uix-peek__nav { display: inline-flex; gap: var(--uix-space-1); }
|
|
28
|
+
.uix-peek__navbtn { width: 28px; height: 28px; display: grid; place-items: center; border: 1px solid var(--uix-border); background: var(--uix-surface); color: var(--uix-text); border-radius: var(--uix-radius-sm); cursor: pointer; }
|
|
29
|
+
.uix-peek__navbtn:hover { background: var(--uix-bg-hover); }
|
|
30
|
+
.uix-peek__title { font-size: var(--uix-text-h3); font-weight: 600; }
|
|
31
|
+
.uix-peek__title a { color: var(--uix-link); }
|
|
32
|
+
.uix-peek__close { margin-left: auto; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; width: 30px; height: 30px; display: grid; place-items: center; border-radius: var(--uix-radius-sm); }
|
|
33
|
+
.uix-peek__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
34
|
+
.uix-peek__body { padding: var(--uix-space-5); overflow-y: auto; flex: 1; }
|
|
35
|
+
.uix-peek__hint { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
36
|
+
.uix-peek__footer { display: flex; gap: var(--uix-space-2); padding: var(--uix-space-4) var(--uix-space-4); border-top: 1px solid var(--uix-border); }
|
|
37
|
+
|
|
38
|
+
/* a table wired to open the peek (app.js sets data-uix-rowpeek): its rows read as clickable,
|
|
39
|
+
since clicking a ticket row is the queue's primary way to open the side-peek. */
|
|
40
|
+
[data-uix-rowpeek] tbody tr { cursor: pointer; }
|
|
41
|
+
[data-uix-rowpeek] tbody tr:hover td { background: var(--uix-bg-hover); }
|
|
42
|
+
|
|
43
|
+
/* Column sizing + the id-cell click-through pattern now live in table.css (one story for
|
|
44
|
+
"table cells"). Size columns with .uix-col--w-* / .uix-col--flex + .uix-col--truncate
|
|
45
|
+
instead of the old [data-uix-table-v2] :nth-child(2) title cap. */
|
|
46
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* uix deal / pipeline stage bar — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-pipeline { display: flex; gap: var(--uix-space-1); }
|
|
4
|
+
.uix-pipeline__stage { flex: 1; text-align: center; padding: var(--uix-space-2) var(--uix-space-2); font-size: var(--uix-text-meta); color: var(--uix-text-muted); background: var(--uix-bg-subtle); }
|
|
5
|
+
.uix-pipeline__stage:first-child { border-radius: var(--uix-radius-pill) 0 0 var(--uix-radius-pill); }
|
|
6
|
+
.uix-pipeline__stage:last-child { border-radius: 0 var(--uix-radius-pill) var(--uix-radius-pill) 0; }
|
|
7
|
+
.uix-pipeline__stage[data-state="done"] { background: var(--uix-accent); color: var(--uix-accent-fg); }
|
|
8
|
+
.uix-pipeline__stage[data-state="active"] { background: var(--uix-brand-muted); color: var(--uix-link); font-weight: 600; }
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/* uix popover — generic anchored surface via the native Popover API; animated with @starting-style. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-popover { margin: 0; padding: var(--uix-space-2); background: var(--uix-surface-2); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); box-shadow: var(--uix-shadow-popover); color: var(--uix-text); }
|
|
4
|
+
[popover].uix-popover {
|
|
5
|
+
opacity: 0; transform: translateY(calc(-1 * var(--uix-lift)));
|
|
6
|
+
transition: opacity var(--uix-dur-fast) var(--uix-ease-out), transform var(--uix-dur-fast) var(--uix-ease-out),
|
|
7
|
+
overlay var(--uix-dur-fast) allow-discrete, display var(--uix-dur-fast) allow-discrete;
|
|
8
|
+
}
|
|
9
|
+
[popover].uix-popover:popover-open { opacity: 1; transform: none; }
|
|
10
|
+
@starting-style { [popover].uix-popover:popover-open { opacity: 0; transform: translateY(calc(-1 * var(--uix-lift))); } }
|
|
11
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* uix progress bar + ring — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-progress { height: 8px; background: var(--uix-bg-active); border-radius: var(--uix-radius-pill); overflow: hidden; }
|
|
4
|
+
.uix-progress__bar { height: 100%; background: var(--uix-accent); border-radius: inherit; transition: width var(--uix-dur) var(--uix-ease-out); }
|
|
5
|
+
.uix-progress--indeterminate { position: relative; }
|
|
6
|
+
.uix-progress--indeterminate .uix-progress__bar { width: 40%; animation: uix-progress-slide 1.2s var(--uix-ease-in-out) infinite; }
|
|
7
|
+
@keyframes uix-progress-slide { 0% { transform: translateX(-110%); } 100% { transform: translateX(280%); } }
|
|
8
|
+
|
|
9
|
+
.uix-ring { width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center;
|
|
10
|
+
background: conic-gradient(var(--uix-accent) calc(var(--val, .66) * 360deg), var(--uix-bg-active) 0); }
|
|
11
|
+
.uix-ring__inner { width: 32px; height: 32px; border-radius: 50%; background: var(--uix-surface); display: grid; place-items: center; font-size: var(--uix-text-meta); font-weight: 600; }
|
|
12
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* uix prose content card + note callouts — for KB articles, descriptions, release notes. Depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-prose { max-width: 66ch; color: var(--uix-text); }
|
|
4
|
+
.uix-prose > * + * { margin-top: var(--uix-space-3); }
|
|
5
|
+
.uix-prose h3 { font-size: var(--uix-text-h2); font-weight: 600; }
|
|
6
|
+
.uix-prose h4 { font-size: var(--uix-text-h3); font-weight: 600; margin-top: var(--uix-space-5); }
|
|
7
|
+
.uix-prose p { line-height: var(--uix-leading-body); color: var(--uix-text-hushed); }
|
|
8
|
+
.uix-prose a { color: var(--uix-link); }
|
|
9
|
+
.uix-prose ul, .uix-prose ol { padding-left: var(--uix-space-5); }
|
|
10
|
+
.uix-prose li + li { margin-top: var(--uix-space-1); }
|
|
11
|
+
.uix-prose code { font-family: var(--uix-font-mono); font-size: .9em; background: var(--uix-bg-subtle); padding: 1px var(--uix-space-2); border-radius: var(--uix-radius-xs); }
|
|
12
|
+
.uix-prose blockquote { border-left: 3px solid var(--uix-border-strong); padding-left: var(--uix-space-3); color: var(--uix-text-muted); }
|
|
13
|
+
|
|
14
|
+
.uix-note { display: flex; gap: var(--uix-space-3); padding: var(--uix-space-3) var(--uix-space-4); border-radius: var(--uix-radius-md); border: 1px solid var(--uix-border); background: var(--uix-surface); }
|
|
15
|
+
.uix-note__icon { flex: none; }
|
|
16
|
+
.uix-note__icon svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
|
|
17
|
+
.uix-note__body { font-size: var(--uix-text-body); color: var(--uix-text); }
|
|
18
|
+
.uix-note__body > * + * { margin-top: var(--uix-space-2); }
|
|
19
|
+
.uix-note--info { background: var(--uix-info-bg); border-color: color-mix(in srgb, var(--uix-info) 30%, transparent); }
|
|
20
|
+
.uix-note--info .uix-note__icon { color: var(--uix-info); }
|
|
21
|
+
.uix-note--success { background: var(--uix-success-bg); border-color: color-mix(in srgb, var(--uix-success) 30%, transparent); }
|
|
22
|
+
.uix-note--success .uix-note__icon { color: var(--uix-success); }
|
|
23
|
+
.uix-note--warning { background: var(--uix-warning-bg); border-color: color-mix(in srgb, var(--uix-warning) 30%, transparent); }
|
|
24
|
+
.uix-note--warning .uix-note__icon { color: var(--uix-warning); }
|
|
25
|
+
.uix-note--danger { background: var(--uix-danger-bg); border-color: color-mix(in srgb, var(--uix-danger) 30%, transparent); }
|
|
26
|
+
.uix-note--danger .uix-note__icon { color: var(--uix-danger); }
|
|
27
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* uix radio + radio-group — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-radio-group { display: flex; flex-direction: column; gap: var(--uix-space-2); }
|
|
4
|
+
.uix-radio { display: inline-flex; align-items: center; gap: var(--uix-space-2); cursor: pointer; font-size: var(--uix-text-body); color: var(--uix-text); }
|
|
5
|
+
.uix-radio > input { position: absolute; opacity: 0; width: 1px; height: 1px; }
|
|
6
|
+
.uix-radio__dot {
|
|
7
|
+
width: 18px; height: 18px; flex: none; border-radius: 50%;
|
|
8
|
+
border: 1px solid var(--uix-border-strong); background: var(--uix-surface);
|
|
9
|
+
display: grid; place-items: center;
|
|
10
|
+
transition: border-color var(--uix-dur-fast) var(--uix-ease-out);
|
|
11
|
+
}
|
|
12
|
+
.uix-radio__dot::after {
|
|
13
|
+
content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--uix-accent);
|
|
14
|
+
opacity: 0; transform: scale(.4); transition: opacity var(--uix-dur-fast) var(--uix-ease-out), transform var(--uix-dur-fast) var(--uix-ease-spring);
|
|
15
|
+
}
|
|
16
|
+
.uix-radio > input:checked + .uix-radio__dot { border-color: var(--uix-accent); }
|
|
17
|
+
.uix-radio > input:checked + .uix-radio__dot::after { opacity: 1; transform: none; }
|
|
18
|
+
.uix-radio > input:focus-visible + .uix-radio__dot { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
|
|
19
|
+
.uix-radio > input:disabled ~ * { opacity: .5; }
|
|
20
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* uix emoji reactions — pills with counts + an add-reaction picker popover. Depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-reactions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--uix-space-2); margin-top: var(--uix-space-2); }
|
|
4
|
+
.uix-reaction {
|
|
5
|
+
display: inline-flex; align-items: center; gap: var(--uix-space-2); padding: 1px var(--uix-space-2); line-height: 1.7;
|
|
6
|
+
border-radius: var(--uix-radius-pill); border: 1px solid var(--uix-border); background: var(--uix-surface);
|
|
7
|
+
color: var(--uix-text-hushed); font: inherit; font-size: var(--uix-text-meta); cursor: pointer;
|
|
8
|
+
}
|
|
9
|
+
.uix-reaction:hover { border-color: var(--uix-border-strong); }
|
|
10
|
+
.uix-reaction[data-mine] { background: var(--uix-brand-muted); border-color: var(--uix-accent); color: var(--uix-accent); }
|
|
11
|
+
.uix-reaction__count { font-variant-numeric: tabular-nums; }
|
|
12
|
+
.uix-reaction-add {
|
|
13
|
+
display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 24px;
|
|
14
|
+
border-radius: var(--uix-radius-pill); border: 1px dashed var(--uix-border-strong); background: transparent;
|
|
15
|
+
color: var(--uix-text-muted); cursor: pointer;
|
|
16
|
+
}
|
|
17
|
+
.uix-reaction-add:hover { color: var(--uix-text); border-color: var(--uix-text-muted); }
|
|
18
|
+
.uix-reaction-add svg { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
|
|
19
|
+
.uix-emoji-picker { display: flex; flex-wrap: wrap; gap: var(--uix-space-1); width: 196px; }
|
|
20
|
+
.uix-emoji-picker__btn { font-size: 18px; line-height: 1; padding: var(--uix-space-2); border: 0; background: transparent; border-radius: var(--uix-radius-sm); cursor: pointer; }
|
|
21
|
+
.uix-emoji-picker__btn:hover { background: var(--uix-bg-hover); }
|
|
22
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
@layer uix.components {
|
|
2
|
+
.uix-relationship-graph { display:grid; gap:var(--uix-space-3); color:var(--uix-text); }
|
|
3
|
+
.uix-relationship-graph__toolbar { display:flex; flex-wrap:wrap; align-items:center; gap:var(--uix-space-1); } .uix-relationship-graph__toolbar button,.uix-relationship-graph__list-actions button { padding:var(--uix-space-2); border:1px solid var(--uix-border); border-radius:var(--uix-radius-sm); background:var(--uix-surface); color:var(--uix-text); }
|
|
4
|
+
.uix-relationship-graph__toolbar span,.uix-relationship-graph__bounded { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
|
|
5
|
+
.uix-relationship-graph__visual { min-height:22rem; border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); overflow:hidden; background:var(--uix-bg-subtle); }
|
|
6
|
+
.uix-relationship-graph__visual svg { display:block; width:100%; height:22rem; }
|
|
7
|
+
.uix-relationship-graph__edge { stroke:var(--uix-border-strong); stroke-width:2; } .uix-relationship-graph__edge[data-highlighted] { stroke:var(--uix-accent); stroke-width:4; } .uix-relationship-graph__edge[data-conflicted] { stroke:var(--uix-danger); stroke-dasharray:6 4; }
|
|
8
|
+
.uix-relationship-graph__node { cursor:pointer; } .uix-relationship-graph__node rect { fill:var(--uix-surface); stroke:var(--uix-border-strong); stroke-width:2; } .uix-relationship-graph__node text { fill:var(--uix-text); font-family:var(--uix-font-sans); font-size:var(--uix-text-meta); }
|
|
9
|
+
.uix-relationship-graph__node[data-selected] rect,.uix-relationship-graph__node[data-highlighted] rect { fill:var(--uix-brand-muted); stroke:var(--uix-accent); stroke-width:3; } .uix-relationship-graph__node[data-conflicted] rect { fill:var(--uix-danger-bg); stroke:var(--uix-danger); stroke-dasharray:4 2; }
|
|
10
|
+
.uix-relationship-graph__node:focus-visible rect { stroke:var(--uix-ring); stroke-width:4; }
|
|
11
|
+
.uix-relationship-graph__legend { display:flex; gap:var(--uix-space-4); flex-wrap:wrap; margin:0; padding:0; list-style:none; color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
|
|
12
|
+
.uix-relationship-graph__legend li::before { content:""; display:inline-block; width:.8rem; height:.8rem; margin-right:var(--uix-space-1); border:2px solid var(--uix-chart-1); border-radius:var(--uix-radius-pill); vertical-align:middle; }
|
|
13
|
+
.uix-relationship-graph__list { padding:var(--uix-space-3); border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); background:var(--uix-surface); }
|
|
14
|
+
.uix-relationship-graph__list>ul { display:grid; gap:var(--uix-space-2); margin:var(--uix-space-2) 0 0; padding:0; list-style:none; }
|
|
15
|
+
.uix-relationship-graph__list li { display:flex; justify-content:space-between; gap:var(--uix-space-2); padding:var(--uix-space-2); border-radius:var(--uix-radius-md); background:var(--uix-bg-subtle); }
|
|
16
|
+
.uix-relationship-graph__list li>button:first-child { display:grid; gap:var(--uix-space-1); flex:1; border:0; background:transparent; color:var(--uix-text); text-align:left; } .uix-relationship-graph__list li>button span { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
|
|
17
|
+
.uix-relationship-graph__list-actions { display:flex; flex-wrap:wrap; gap:var(--uix-space-1); }
|
|
18
|
+
.uix-relationship-graph--compact .uix-relationship-graph__visual,.uix-relationship-graph--compact .uix-relationship-graph__visual svg { min-height:16rem; height:16rem; }
|
|
19
|
+
.uix-relationship-graph--state { padding:var(--uix-space-8); border:1px dashed var(--uix-border-strong); border-radius:var(--uix-radius-lg); }
|
|
20
|
+
@media (max-width:640px) { .uix-relationship-graph__list li { display:grid; } }
|
|
21
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
@layer uix.components {
|
|
2
|
+
.uix-rule-builder { display:grid; gap:var(--uix-space-4); color:var(--uix-text); }
|
|
3
|
+
.uix-rule-builder__group,.uix-rule-builder__actions { min-width:0; padding:var(--uix-space-4); border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); background:var(--uix-surface); }
|
|
4
|
+
.uix-rule-builder__group-heading { display:flex; align-items:center; gap:var(--uix-space-3); padding:0 var(--uix-space-2); font-weight:600; }
|
|
5
|
+
.uix-rule-builder__group-heading label { display:flex; align-items:center; gap:var(--uix-space-2); font-size:var(--uix-text-meta); font-weight:400; }
|
|
6
|
+
.uix-rule-builder__rows { display:grid; gap:var(--uix-space-3); }
|
|
7
|
+
.uix-rule-builder__condition,.uix-rule-builder__action { display:grid; grid-template-columns:minmax(9rem,1fr) minmax(9rem,1fr) minmax(10rem,1.4fr) auto; gap:var(--uix-space-2); align-items:start; padding:var(--uix-space-3); border-radius:var(--uix-radius-md); background:var(--uix-bg-subtle); }
|
|
8
|
+
.uix-rule-builder__nested { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--uix-space-2); align-items:start; }
|
|
9
|
+
.uix-rule-builder__nested .uix-rule-builder__group { border-left:3px solid var(--uix-accent); }
|
|
10
|
+
.uix-rule-builder__row-actions,.uix-rule-builder__add { display:flex; flex-wrap:wrap; gap:var(--uix-space-1); }
|
|
11
|
+
.uix-rule-builder__add { margin-top:var(--uix-space-3); }
|
|
12
|
+
.uix-rule-builder__actions { display:grid; gap:var(--uix-space-3); }
|
|
13
|
+
.uix-rule-builder__validation { padding:var(--uix-space-3); border-radius:var(--uix-radius-md); background:var(--uix-bg-subtle); color:var(--uix-text-muted); }
|
|
14
|
+
.uix-rule-builder__validation:has(ul),.uix-rule-builder__invalid { color:var(--uix-danger-text); background:var(--uix-danger-bg); }
|
|
15
|
+
.uix-rule-builder--summary { padding:var(--uix-space-4); border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); background:var(--uix-surface); }
|
|
16
|
+
@media (max-width:760px) { .uix-rule-builder__condition,.uix-rule-builder__action { grid-template-columns:1fr; } .uix-rule-builder__nested { grid-template-columns:1fr; } }
|
|
17
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
@layer uix.components {
|
|
2
|
+
.uix-scheduling-calendar { display:grid; gap:var(--uix-space-3); color:var(--uix-text); }
|
|
3
|
+
.uix-scheduling-calendar__header { display:flex; align-items:center; justify-content:space-between; gap:var(--uix-space-3); flex-wrap:wrap; }
|
|
4
|
+
.uix-scheduling-calendar__grid { display:grid; grid-template-columns:repeat(7,minmax(6.5rem,1fr)); border-top:1px solid var(--uix-border); border-left:1px solid var(--uix-border); overflow:auto; }
|
|
5
|
+
.uix-scheduling-calendar__day { min-height:8rem; padding:var(--uix-space-2); border-right:1px solid var(--uix-border); border-bottom:1px solid var(--uix-border); background:var(--uix-surface); }
|
|
6
|
+
.uix-scheduling-calendar__day[data-outside] { background:var(--uix-bg-subtle); color:var(--uix-text-muted); }
|
|
7
|
+
.uix-scheduling-calendar__date { display:block; width:100%; border:0; background:transparent; color:inherit; text-align:right; font-size:var(--uix-text-meta); }
|
|
8
|
+
.uix-scheduling-calendar__overlay { display:block; margin-block:var(--uix-space-1); padding:var(--uix-space-1) var(--uix-space-2); border-radius:var(--uix-radius-sm); background:var(--uix-info-bg); color:var(--uix-info-text); font-size:var(--uix-text-meta); }
|
|
9
|
+
.uix-scheduling-calendar__overlay[data-kind="blackout"] { background:var(--uix-danger-bg); color:var(--uix-danger-text); }
|
|
10
|
+
.uix-scheduling-calendar__entries { display:grid; gap:var(--uix-space-1); }
|
|
11
|
+
.uix-scheduling-calendar__entry { min-width:100%; padding:var(--uix-space-1) var(--uix-space-2); border:0; border-left:3px solid var(--uix-info); border-radius:var(--uix-radius-sm); background:var(--uix-info-bg); color:var(--uix-info-text); overflow:hidden; text-align:left; text-overflow:ellipsis; white-space:nowrap; font-size:var(--uix-text-meta); }
|
|
12
|
+
.uix-scheduling-calendar__entry[data-state="conflicted"],.uix-scheduling-calendar__entry[data-state="blackout-violation"] { border-color:var(--uix-danger); background:var(--uix-danger-bg); color:var(--uix-danger-text); }
|
|
13
|
+
.uix-scheduling-calendar__entry[data-state="in-progress"] { border-color:var(--uix-success); background:var(--uix-success-bg); color:var(--uix-text); }
|
|
14
|
+
.uix-scheduling-calendar__entry:not([data-range-start]) { border-top-left-radius:0; border-bottom-left-radius:0; } .uix-scheduling-calendar__entry:not([data-range-end]) { border-top-right-radius:0; border-bottom-right-radius:0; }
|
|
15
|
+
.uix-scheduling-calendar__agenda ol { display:grid; gap:var(--uix-space-2); margin:0; padding:0; list-style:none; }
|
|
16
|
+
.uix-scheduling-calendar__agenda li>button { width:100%; display:flex; justify-content:space-between; gap:var(--uix-space-3); padding:var(--uix-space-3); border:1px solid var(--uix-border); border-radius:var(--uix-radius-md); background:var(--uix-surface); color:var(--uix-text); text-align:left; }
|
|
17
|
+
.uix-scheduling-calendar__agenda li>button>span:first-child { display:grid; gap:var(--uix-space-1); } .uix-scheduling-calendar__agenda li>button span span { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
|
|
18
|
+
.uix-scheduling-calendar__legend { display:flex; flex-wrap:wrap; gap:var(--uix-space-3); font-size:var(--uix-text-meta); color:var(--uix-text-muted); }
|
|
19
|
+
.uix-scheduling-calendar__legend span::before { content:""; display:inline-block; width:.75rem; height:.75rem; margin-right:var(--uix-space-1); border:2px solid var(--uix-info); border-radius:var(--uix-radius-xs); background:var(--uix-info-bg); vertical-align:middle; }
|
|
20
|
+
.uix-scheduling-calendar__legend span[data-state="conflicted"]::before,.uix-scheduling-calendar__legend span[data-state="blackout-violation"]::before { border-color:var(--uix-danger); background:var(--uix-danger-bg); } .uix-scheduling-calendar__legend span[data-state="in-progress"]::before { border-color:var(--uix-success); background:var(--uix-success-bg); }
|
|
21
|
+
.uix-scheduling-calendar__state { padding:var(--uix-space-8); border:1px dashed var(--uix-border-strong); border-radius:var(--uix-radius-lg); text-align:center; }
|
|
22
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* uix segmented control — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-segmented { display: inline-flex; padding: var(--uix-space-1); gap: var(--uix-space-1); background: var(--uix-bg-subtle); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); }
|
|
4
|
+
.uix-segmented__option {
|
|
5
|
+
border: 0; background: transparent; color: var(--uix-text-hushed); font: inherit; font-size: var(--uix-text-meta); font-weight: 500;
|
|
6
|
+
padding: var(--uix-space-2) var(--uix-space-3); border-radius: calc(var(--uix-radius-md) - 3px); cursor: pointer;
|
|
7
|
+
transition: background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
|
|
8
|
+
}
|
|
9
|
+
.uix-segmented__option:hover { color: var(--uix-text); }
|
|
10
|
+
.uix-segmented__option[aria-selected="true"], .uix-segmented__option[aria-pressed="true"] { background: var(--uix-surface); color: var(--uix-text); box-shadow: var(--uix-shadow-sm); }
|
|
11
|
+
.uix-segmented__option:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 1px; }
|
|
12
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* uix select (native, styled) — depends only on --uix-* tokens. */
|
|
2
|
+
@layer uix.components {
|
|
3
|
+
.uix-select {
|
|
4
|
+
height: var(--uix-control-h); width: 100%; padding: 0 var(--uix-space-8) 0 var(--uix-space-3); appearance: none;
|
|
5
|
+
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md);
|
|
6
|
+
background-color: var(--uix-surface); color: var(--uix-text); font: inherit; font-size: var(--uix-text-body); cursor: pointer;
|
|
7
|
+
background-repeat: no-repeat; background-position: right 12px center;
|
|
8
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23737373' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
|
|
9
|
+
transition: border-color var(--uix-dur-fast) var(--uix-ease-out), box-shadow var(--uix-dur-fast) var(--uix-ease-out);
|
|
10
|
+
}
|
|
11
|
+
.uix-select:hover { border-color: var(--uix-border-strong); }
|
|
12
|
+
.uix-select:focus { outline: none; border-color: var(--uix-ring); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
|
|
13
|
+
.uix-select:disabled { opacity: .55; cursor: not-allowed; background-color: var(--uix-bg-subtle); }
|
|
14
|
+
.uix-select--sm { height: 28px; font-size: var(--uix-text-meta); }
|
|
15
|
+
|
|
16
|
+
/* command-palette-style rich select: a trigger that opens a .uix-cmdk popover (search + options) */
|
|
17
|
+
.uix-select-trigger { display: inline-flex; align-items: center; gap: var(--uix-space-2); height: var(--uix-control-h); padding: 0 var(--uix-space-3); min-width: 220px;
|
|
18
|
+
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); color: var(--uix-text);
|
|
19
|
+
font: inherit; font-size: var(--uix-text-body); cursor: pointer; transition: border-color var(--uix-dur-fast) var(--uix-ease-out); }
|
|
20
|
+
.uix-select-trigger:hover { border-color: var(--uix-border-strong); }
|
|
21
|
+
.uix-select-trigger:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
|
|
22
|
+
.uix-select-trigger__chevron { margin-left: auto; color: var(--uix-text-muted); width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
|
|
23
|
+
}
|