@tensor_1/tokens 2.31.0 → 2.33.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 +3 -1
- package/build/css/components.css +1 -1
- package/build/css/styles.css +1 -1
- package/build/css/tokens.css +66 -40
- package/build/tailwind/preset.cjs +15 -0
- package/build/tailwind/theme.css +15 -0
- package/build/ts/tokens.d.ts +1 -1
- package/build/ts/tokens.js +82 -40
- package/package.json +1 -1
- package/styles/components/alert.css +13 -2
- package/styles/components/calendar.css +28 -6
- package/styles/components/card.css +15 -1
- package/styles/components/combobox.css +26 -2
- package/styles/components/dashboard-grid.css +87 -0
- package/styles/components/date-range-picker.css +36 -4
- package/styles/components/file-upload.css +11 -4
- package/styles/components/labels.css +2 -1
- package/styles/components/list.css +2 -2
- package/styles/components/menu.css +7 -0
- package/styles/components/meter.css +5 -0
- package/styles/components/pipeline.css +2 -2
- package/styles/components/rule-builder.css +2 -0
- package/styles/components/scheduling-calendar.css +206 -22
- package/styles/components/segmented.css +2 -1
- package/styles/components/select.css +88 -1
- package/styles/components/sla.css +1 -1
- package/styles/components/spinner.css +2 -0
- package/styles/components/stat-tile.css +1 -1
- package/styles/components/status-pill.css +10 -2
- package/styles/components/steps.css +12 -0
- package/styles/components/table-toolbar.css +14 -7
- package/styles/components/tag-input.css +14 -5
- package/styles/components/text-diff.css +50 -0
- package/styles/components/toast.css +2 -2
- package/styles/components/view-menu.css +7 -2
- package/tokens/base/color.json +23 -8
- package/tokens/base/size.json +1 -0
- package/tokens/dark/color.json +43 -32
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/* DashboardGrid (HAR-1555): the layout grid for dashboard widgets. Items span 1 column,
|
|
2
|
+
2 columns or the full row, and the column count follows the GRID'S OWN WIDTH (a container
|
|
3
|
+
query), not the viewport, so a dashboard beside an open sidebar gets fewer columns.
|
|
4
|
+
|
|
5
|
+
How it works: the grid always has 12 equal tracks (12 is divisible by 1, 2, 3 and 4). A
|
|
6
|
+
container query on the grid picks the column count, and each child spans 12 / columns
|
|
7
|
+
tracks (span 2: twice that, never more than 12). Span 2 therefore clamps to the columns
|
|
8
|
+
there are, and a full item is `grid-column: 1 / -1` at every width.
|
|
9
|
+
|
|
10
|
+
Column breakpoints (grid width): sm 36rem · md 48rem · lg 60rem · xl 80rem. They are sized
|
|
11
|
+
for widgets of about 280–320 px: 2 columns from 36rem, 3 from 60rem, 4 from 80rem.
|
|
12
|
+
Without a column class: 1 column, 2 from sm, 3 from lg. Any column class replaces those
|
|
13
|
+
defaults at every width it covers (the defaults are zero-specificity `:where()` rules).
|
|
14
|
+
|
|
15
|
+
Each item is an inline-size container (`uix-dashboard-grid-item`), so a chart or card inside
|
|
16
|
+
can use @container queries or cqi units against the item's width. */
|
|
17
|
+
@layer uix.components {
|
|
18
|
+
.uix-dashboard-grid {
|
|
19
|
+
--dashboard-grid-gap: var(--uix-space-4);
|
|
20
|
+
container: uix-dashboard-grid / inline-size;
|
|
21
|
+
display: grid;
|
|
22
|
+
grid-template-columns: repeat(12, minmax(0, 1fr));
|
|
23
|
+
/* 11 column gaps sit between the 12 tracks. Capping each at 1/12 of the width keeps a very
|
|
24
|
+
narrow grid from being pushed wider than its box by the gaps alone. */
|
|
25
|
+
column-gap: min(var(--dashboard-grid-gap), calc(100% / 12));
|
|
26
|
+
row-gap: var(--dashboard-grid-gap);
|
|
27
|
+
min-width: 0;
|
|
28
|
+
}
|
|
29
|
+
.uix-dashboard-grid--gap-sm { --dashboard-grid-gap: var(--uix-space-3); }
|
|
30
|
+
.uix-dashboard-grid--gap-lg { --dashboard-grid-gap: var(--uix-space-6); }
|
|
31
|
+
|
|
32
|
+
/* Every direct child is a cell. --dashboard-grid-one / -two are the tracks a span-1 / span-2
|
|
33
|
+
child takes at the current width; the rules below set them. */
|
|
34
|
+
.uix-dashboard-grid > * { grid-column: span var(--dashboard-grid-one, 12); min-width: 0; }
|
|
35
|
+
.uix-dashboard-grid > .uix-dashboard-grid__item--span-2 { grid-column: span var(--dashboard-grid-two, 12); }
|
|
36
|
+
|
|
37
|
+
/* The item fills its row (widgets in one row share a height) and is the container its
|
|
38
|
+
content sizes against. Its last child takes the spare height. */
|
|
39
|
+
.uix-dashboard-grid__item {
|
|
40
|
+
container: uix-dashboard-grid-item / inline-size;
|
|
41
|
+
display: flex;
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
}
|
|
44
|
+
.uix-dashboard-grid__item > :last-child { flex-grow: 1; }
|
|
45
|
+
|
|
46
|
+
/* Base (any width). Default: 1 column. */
|
|
47
|
+
:where(.uix-dashboard-grid) > * { --dashboard-grid-one: 12; --dashboard-grid-two: 12; }
|
|
48
|
+
.uix-dashboard-grid--cols-1 > * { --dashboard-grid-one: 12; --dashboard-grid-two: 12; }
|
|
49
|
+
.uix-dashboard-grid--cols-2 > * { --dashboard-grid-one: 6; --dashboard-grid-two: 12; }
|
|
50
|
+
.uix-dashboard-grid--cols-3 > * { --dashboard-grid-one: 4; --dashboard-grid-two: 8; }
|
|
51
|
+
.uix-dashboard-grid--cols-4 > * { --dashboard-grid-one: 3; --dashboard-grid-two: 6; }
|
|
52
|
+
|
|
53
|
+
@container uix-dashboard-grid (min-width: 36rem) {
|
|
54
|
+
/* Default: 2 columns. */
|
|
55
|
+
:where(.uix-dashboard-grid) > * { --dashboard-grid-one: 6; --dashboard-grid-two: 12; }
|
|
56
|
+
.uix-dashboard-grid--sm-cols-1 > * { --dashboard-grid-one: 12; --dashboard-grid-two: 12; }
|
|
57
|
+
.uix-dashboard-grid--sm-cols-2 > * { --dashboard-grid-one: 6; --dashboard-grid-two: 12; }
|
|
58
|
+
.uix-dashboard-grid--sm-cols-3 > * { --dashboard-grid-one: 4; --dashboard-grid-two: 8; }
|
|
59
|
+
.uix-dashboard-grid--sm-cols-4 > * { --dashboard-grid-one: 3; --dashboard-grid-two: 6; }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@container uix-dashboard-grid (min-width: 48rem) {
|
|
63
|
+
.uix-dashboard-grid--md-cols-1 > * { --dashboard-grid-one: 12; --dashboard-grid-two: 12; }
|
|
64
|
+
.uix-dashboard-grid--md-cols-2 > * { --dashboard-grid-one: 6; --dashboard-grid-two: 12; }
|
|
65
|
+
.uix-dashboard-grid--md-cols-3 > * { --dashboard-grid-one: 4; --dashboard-grid-two: 8; }
|
|
66
|
+
.uix-dashboard-grid--md-cols-4 > * { --dashboard-grid-one: 3; --dashboard-grid-two: 6; }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@container uix-dashboard-grid (min-width: 60rem) {
|
|
70
|
+
/* Default: 3 columns. */
|
|
71
|
+
:where(.uix-dashboard-grid) > * { --dashboard-grid-one: 4; --dashboard-grid-two: 8; }
|
|
72
|
+
.uix-dashboard-grid--lg-cols-1 > * { --dashboard-grid-one: 12; --dashboard-grid-two: 12; }
|
|
73
|
+
.uix-dashboard-grid--lg-cols-2 > * { --dashboard-grid-one: 6; --dashboard-grid-two: 12; }
|
|
74
|
+
.uix-dashboard-grid--lg-cols-3 > * { --dashboard-grid-one: 4; --dashboard-grid-two: 8; }
|
|
75
|
+
.uix-dashboard-grid--lg-cols-4 > * { --dashboard-grid-one: 3; --dashboard-grid-two: 6; }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@container uix-dashboard-grid (min-width: 80rem) {
|
|
79
|
+
.uix-dashboard-grid--xl-cols-1 > * { --dashboard-grid-one: 12; --dashboard-grid-two: 12; }
|
|
80
|
+
.uix-dashboard-grid--xl-cols-2 > * { --dashboard-grid-one: 6; --dashboard-grid-two: 12; }
|
|
81
|
+
.uix-dashboard-grid--xl-cols-3 > * { --dashboard-grid-one: 4; --dashboard-grid-two: 8; }
|
|
82
|
+
.uix-dashboard-grid--xl-cols-4 > * { --dashboard-grid-one: 3; --dashboard-grid-two: 6; }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Last, so it wins over every span rule above: the whole row at every width. */
|
|
86
|
+
.uix-dashboard-grid > .uix-dashboard-grid__item--full { grid-column: 1 / -1; }
|
|
87
|
+
}
|
|
@@ -5,12 +5,44 @@
|
|
|
5
5
|
.uix-date-range-picker__month h4 { margin-bottom:var(--uix-space-2); text-align:center; }
|
|
6
6
|
.uix-date-range-picker__weekdays,.uix-date-range-picker__grid { display:grid; grid-template-columns:repeat(7,1fr); }
|
|
7
7
|
.uix-date-range-picker__weekdays span { padding:var(--uix-space-1); color:var(--uix-text-muted); text-align:center; font-size:var(--uix-text-meta); }
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
/* Day cell (HAR-1570): one shape for every state. The button is a transparent square;
|
|
9
|
+
::after is the circle (hover, start/end, today, focus), concentric with the cell, and
|
|
10
|
+
::before is the range band, exactly the circle's height so band and circle meet with
|
|
11
|
+
no notches. A start/end cell draws half a band toward its neighbour, and only when
|
|
12
|
+
that neighbour is in range, so a lone start (or a one-day range) has no band. The
|
|
13
|
+
half band uses logical insets, so RTL mirrors on its own. */
|
|
14
|
+
.uix-date-range-picker__grid button { position:relative; isolation:isolate; aspect-ratio:1; min-width:2rem; border:0; border-radius:0; background:transparent; color:var(--uix-text); }
|
|
15
|
+
.uix-date-range-picker__grid button::before,
|
|
16
|
+
.uix-date-range-picker__grid button::after { content:""; position:absolute; z-index:calc(-1 * var(--uix-z-raised)); pointer-events:none; }
|
|
17
|
+
.uix-date-range-picker__grid button::before { inset:3px 0; }
|
|
18
|
+
.uix-date-range-picker__grid button::after { inset:3px; border-radius:50%; }
|
|
19
|
+
.uix-date-range-picker__grid button:hover:not(:disabled)::after { background:var(--uix-bg-hover); }
|
|
20
|
+
.uix-date-range-picker__grid button[data-in-range]::before { background:var(--uix-brand-muted); }
|
|
21
|
+
.uix-date-range-picker__grid button[data-in-range]:hover:not(:disabled)::after { background:color-mix(in srgb, var(--uix-accent) 18%, transparent); }
|
|
22
|
+
.uix-date-range-picker__grid button[data-range-edge]::before { background:none; }
|
|
23
|
+
.uix-date-range-picker__grid button[data-range-edge="start"]:has(+ [data-in-range])::before { inset-inline-start:50%; background:var(--uix-brand-muted); }
|
|
24
|
+
.uix-date-range-picker__grid [data-in-range] + button[data-range-edge="end"]::before { inset-inline-end:50%; background:var(--uix-brand-muted); }
|
|
25
|
+
.uix-date-range-picker__grid button[data-range-edge] { color:var(--uix-accent-fg); font-weight:600; }
|
|
26
|
+
.uix-date-range-picker__grid button[data-range-edge]::after,
|
|
27
|
+
.uix-date-range-picker__grid button[data-range-edge]:hover:not(:disabled)::after { background:var(--uix-accent); }
|
|
28
|
+
.uix-date-range-picker__grid button[aria-current="date"]::after { box-shadow:inset 0 0 0 1px var(--uix-text-muted); }
|
|
29
|
+
/* Focus: a round ring with a surface gap; a plain ring would merge into the accent circle. */
|
|
30
|
+
.uix-date-range-picker__grid button:focus-visible { z-index:var(--uix-z-raised); outline:none; }
|
|
31
|
+
.uix-date-range-picker__grid button:focus-visible::after { box-shadow:0 0 0 2px var(--uix-surface), 0 0 0 4px var(--uix-ring); }
|
|
32
|
+
.uix-date-range-picker__grid button[aria-current="date"]:focus-visible::after { box-shadow:inset 0 0 0 1px var(--uix-text-muted), 0 0 0 2px var(--uix-surface), 0 0 0 4px var(--uix-ring); }
|
|
12
33
|
.uix-date-range-picker__grid button:disabled { color:var(--uix-text-hushed); text-decoration:line-through; }
|
|
13
34
|
.uix-date-range-picker__selection { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
|
|
14
35
|
.uix-date-range-picker--invalid { border-color:var(--uix-danger); }
|
|
15
36
|
@media (max-width:640px) { .uix-date-range-picker__months { grid-template-columns:1fr; } }
|
|
37
|
+
/* Forced colours drop backgrounds and box-shadows: the edges keep a Highlight circle,
|
|
38
|
+
in-range days an underline, today and focus a system-colour outline on the circle. */
|
|
39
|
+
@media (forced-colors:active) {
|
|
40
|
+
.uix-date-range-picker__grid button[data-range-edge] { forced-color-adjust:none; color:HighlightText; }
|
|
41
|
+
.uix-date-range-picker__grid button[data-range-edge]::after,
|
|
42
|
+
.uix-date-range-picker__grid button[data-range-edge]:hover:not(:disabled)::after { forced-color-adjust:none; background:Highlight; }
|
|
43
|
+
.uix-date-range-picker__grid button[data-in-range]:not([data-range-edge]) { text-decoration-line:underline; text-decoration-thickness:.15em; text-underline-offset:.2em; }
|
|
44
|
+
.uix-date-range-picker__grid button[data-in-range]:not([data-range-edge]):disabled { text-decoration-line:underline line-through; }
|
|
45
|
+
.uix-date-range-picker__grid button[aria-current="date"]::after { outline:1px solid CanvasText; outline-offset:-1px; }
|
|
46
|
+
.uix-date-range-picker__grid button:focus-visible::after { outline:2px solid CanvasText; outline-offset:2px; }
|
|
47
|
+
}
|
|
16
48
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
.uix-dropzone:hover, .uix-dropzone[data-dragover] { border-color: var(--uix-accent); background: var(--uix-brand-muted); color: var(--uix-text); }
|
|
10
10
|
.uix-dropzone svg { width: var(--uix-icon-lg); height: var(--uix-icon-lg); }
|
|
11
11
|
.uix-filelist { display: flex; flex-direction: column; gap: var(--uix-space-2); margin-top: var(--uix-space-3); }
|
|
12
|
+
.uix-filelist:empty { display: none; }
|
|
12
13
|
.uix-filelist__item { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-2) var(--uix-space-3); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); font-size: var(--uix-text-meta); color: var(--uix-text); }
|
|
13
14
|
.uix-filelist__size { margin-left: auto; color: var(--uix-text-muted); }
|
|
14
15
|
}
|
|
@@ -17,18 +18,24 @@
|
|
|
17
18
|
@layer uix.components {
|
|
18
19
|
/* :not(label) — BrandProfiles has long put this class on its upload label as a hook. */
|
|
19
20
|
.uix-file-upload:not(label) { display: grid; gap: var(--uix-space-3); min-width: 0; }
|
|
21
|
+
/* HAR-1630: a grid item's automatic minimum is its longest unbreakable word, so an
|
|
22
|
+
80-character file name (in a row, or in a "not an accepted type" message) widened the whole
|
|
23
|
+
component past a 288 px rail. One column that may shrink, and text that breaks anywhere. */
|
|
24
|
+
.uix-file-upload:not(label) { grid-template-columns: minmax(0, 1fr); }
|
|
25
|
+
.uix-file-upload:not(label) > * { min-width: 0; }
|
|
26
|
+
.uix-file-upload .uix-dropzone > * { max-width: 100%; }
|
|
20
27
|
.uix-file-upload[data-disabled] .uix-dropzone { opacity: .6; cursor: not-allowed; }
|
|
21
|
-
.uix-file-upload__hint { font-size: var(--uix-text-meta); }
|
|
22
|
-
.uix-file-upload__errors { margin: 0; padding-left: 1.1em; color: var(--uix-danger-text); font-size: var(--uix-text-meta); }
|
|
28
|
+
.uix-file-upload__hint { font-size: var(--uix-text-meta); overflow-wrap: anywhere; }
|
|
29
|
+
.uix-file-upload__errors { margin: 0; padding-left: 1.1em; color: var(--uix-danger-text); font-size: var(--uix-text-meta); overflow-wrap: anywhere; }
|
|
23
30
|
.uix-file-upload__list { margin: 0; padding: 0; list-style: none; }
|
|
24
31
|
.uix-file-upload__item { align-items: flex-start; }
|
|
25
32
|
.uix-file-upload__item[data-status="error"] { border-color: var(--uix-danger-border); }
|
|
26
33
|
.uix-file-upload__thumb { width: 40px; height: 40px; flex: none; object-fit: cover; border-radius: var(--uix-radius-sm); }
|
|
27
34
|
.uix-file-upload__body { flex: 1; display: grid; gap: var(--uix-space-1); min-width: 0; }
|
|
28
|
-
.uix-file-upload__name { min-width: 0; overflow-wrap:
|
|
35
|
+
.uix-file-upload__name { min-width: 0; overflow-wrap: anywhere; font-weight: 500; }
|
|
29
36
|
.uix-file-upload__meta { display: flex; flex-wrap: wrap; gap: var(--uix-space-1) var(--uix-space-3); color: var(--uix-text-muted); }
|
|
30
37
|
.uix-file-upload__meta > * { white-space: nowrap; }
|
|
31
38
|
.uix-file-upload__item[data-status="done"] .uix-file-upload__status { color: var(--uix-success); }
|
|
32
|
-
.uix-file-upload__error { color: var(--uix-danger-text); }
|
|
39
|
+
.uix-file-upload__error { color: var(--uix-danger-text); overflow-wrap: anywhere; }
|
|
33
40
|
.uix-file-upload__actions { display: flex; align-items: center; gap: var(--uix-space-1); flex: none; }
|
|
34
41
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* uix label / tag taxonomy — colored via --label-color (set to a --uix-chart-* token). */
|
|
2
2
|
@layer uix.components {
|
|
3
|
-
.uix-
|
|
3
|
+
/* the tag pill, never a form label (that is .uix-field__label; HAR-1573) */
|
|
4
|
+
.uix-label:not(label) {
|
|
4
5
|
display: inline-flex; align-items: center; gap: var(--uix-space-2); padding: 1px var(--uix-space-2); border-radius: var(--uix-radius-sm);
|
|
5
6
|
font-size: var(--uix-text-meta); font-weight: 500;
|
|
6
7
|
background: color-mix(in srgb, var(--label-color, var(--uix-accent)) 16%, transparent);
|
|
@@ -4,7 +4,7 @@
|
|
|
4
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
5
|
.uix-list__item:last-child { border-bottom: 0; }
|
|
6
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); }
|
|
7
|
+
.uix-list__title { display: block; font-weight: 500; }
|
|
8
|
+
.uix-list__meta { display: block; font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
9
9
|
.uix-list__trail { margin-left: auto; display: flex; align-items: center; gap: var(--uix-space-2); }
|
|
10
10
|
}
|
|
@@ -25,3 +25,10 @@
|
|
|
25
25
|
.uix-menu__item[aria-disabled="true"] { opacity: .5; cursor: default; }
|
|
26
26
|
.uix-menu__item[aria-disabled="true"]:hover { background: transparent; }
|
|
27
27
|
}
|
|
28
|
+
|
|
29
|
+
/* Radio and checkbox rows (HAR-1629): a fixed check column, so checked and unchecked text lines up. */
|
|
30
|
+
@layer uix.components {
|
|
31
|
+
.uix-menu__check { display: inline-flex; flex: none; width: var(--uix-icon-sm); height: var(--uix-icon-sm); color: var(--uix-link); }
|
|
32
|
+
.uix-menu__item .uix-menu__check svg { width: 100%; height: 100%; color: inherit; }
|
|
33
|
+
.uix-menu__item[aria-checked="true"] { font-weight: 500; }
|
|
34
|
+
}
|
|
@@ -6,4 +6,9 @@
|
|
|
6
6
|
.uix-meter__fill[data-tone="danger"] { background: var(--uix-danger); }
|
|
7
7
|
.uix-meter__fill[data-tone="attention"] { background: var(--uix-attention); }
|
|
8
8
|
.uix-meter__fill[data-tone="overdue"] { background: var(--uix-overdue); }
|
|
9
|
+
/* not a status (HAR-1606): a share or a count. Both clear 3:1 against the track in light and
|
|
10
|
+
dark for every theme (packages/tokens/tests/meter-contrast.test.mjs). The accent fill is
|
|
11
|
+
--uix-accent-text, not --uix-accent: the raw accent of a bright brand is 2.62:1 on the track. */
|
|
12
|
+
.uix-meter__fill[data-tone="neutral"] { background: var(--uix-text-muted); }
|
|
13
|
+
.uix-meter__fill[data-tone="accent"] { background: var(--uix-accent-text); }
|
|
9
14
|
}
|
|
@@ -122,11 +122,11 @@
|
|
|
122
122
|
}
|
|
123
123
|
.uix-pipeline__stage[data-state="blocked"] .uix-pipeline__state::before { border-radius: var(--uix-radius-xs); }
|
|
124
124
|
.uix-pipeline__title {
|
|
125
|
-
overflow: hidden; color: var(--uix-text); font-size: var(--uix-text-body); font-weight: 600;
|
|
125
|
+
display: block; overflow: hidden; color: var(--uix-text); font-size: var(--uix-text-body); font-weight: 600;
|
|
126
126
|
line-height: var(--uix-leading-body); text-overflow: ellipsis; white-space: nowrap;
|
|
127
127
|
}
|
|
128
128
|
.uix-pipeline__description {
|
|
129
|
-
margin-top: var(--uix-space-1); color: var(--uix-text-muted);
|
|
129
|
+
display: block; margin-top: var(--uix-space-1); color: var(--uix-text-muted);
|
|
130
130
|
font-size: var(--uix-text-meta); font-weight: 400; line-height: var(--uix-leading-meta);
|
|
131
131
|
}
|
|
132
132
|
.uix-pipeline__meta {
|
|
@@ -3,6 +3,8 @@
|
|
|
3
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
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
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
|
+
/* a fixed combinator (HAR-1618): the Match choice as plain text, where the select was */
|
|
7
|
+
.uix-rule-builder__match { font-size:var(--uix-text-meta); font-weight:400; color:var(--uix-text-muted); }
|
|
6
8
|
.uix-rule-builder__rows { display:grid; gap:var(--uix-space-3); }
|
|
7
9
|
.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
10
|
.uix-rule-builder__nested { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--uix-space-2); align-items:start; }
|
|
@@ -1,29 +1,213 @@
|
|
|
1
|
+
/* uix scheduling calendar (React `SchedulingCalendar`). Depends only on --uix-* tokens.
|
|
2
|
+
|
|
3
|
+
COLOUR MAP. Every colour the calendar paints is named once in the first rule and read from
|
|
4
|
+
there; no other rule names a --uix-* colour. One name has one meaning:
|
|
5
|
+
--calendar-band-* the band, the only dimension that takes a hue (only `high` is filled)
|
|
6
|
+
--calendar-status-* the state channel: line style, weight and dimming, never a hue
|
|
7
|
+
--calendar-window-* windows: neutral, told apart by pattern and visible label
|
|
8
|
+
--calendar-marker-* markers: a shape or icon with text
|
|
9
|
+
--calendar-chrome-* cells, lines, headings and controls
|
|
10
|
+
To retune a colour, change its line in the map (HAR-1506, HAR-1562). */
|
|
1
11
|
@layer uix.components {
|
|
2
|
-
.uix-scheduling-calendar {
|
|
12
|
+
.uix-scheduling-calendar {
|
|
13
|
+
--calendar-chrome-text: var(--uix-text);
|
|
14
|
+
--calendar-chrome-text-quiet: var(--uix-text-muted);
|
|
15
|
+
--calendar-chrome-surface: var(--uix-surface);
|
|
16
|
+
--calendar-chrome-surface-quiet: var(--uix-bg-subtle);
|
|
17
|
+
--calendar-chrome-line: var(--uix-border);
|
|
18
|
+
--calendar-chrome-line-strong: var(--uix-border-strong);
|
|
19
|
+
--calendar-status-surface: var(--uix-surface);
|
|
20
|
+
--calendar-status-surface-quiet: var(--uix-bg-subtle);
|
|
21
|
+
--calendar-status-edge: var(--uix-neutral-border);
|
|
22
|
+
--calendar-status-edge-strong: var(--uix-neutral-solid);
|
|
23
|
+
--calendar-status-text: var(--uix-text);
|
|
24
|
+
--calendar-status-text-dim: var(--uix-text-muted);
|
|
25
|
+
--calendar-band-medium-edge: var(--uix-neutral-solid);
|
|
26
|
+
--calendar-band-high-fill: var(--uix-danger);
|
|
27
|
+
--calendar-band-high-text: var(--uix-danger-fg);
|
|
28
|
+
--calendar-window-surface: var(--uix-neutral-bg);
|
|
29
|
+
--calendar-window-ink: var(--uix-neutral-solid);
|
|
30
|
+
--calendar-window-edge: var(--uix-neutral-border);
|
|
31
|
+
--calendar-window-text: var(--uix-text);
|
|
32
|
+
--calendar-marker-ink: var(--uix-text);
|
|
33
|
+
--calendar-chrome-now: var(--uix-text);
|
|
34
|
+
--calendar-chrome-ghost: var(--uix-neutral-solid);
|
|
35
|
+
--calendar-chrome-ghost-surface: var(--uix-neutral-bg);
|
|
36
|
+
|
|
37
|
+
/* geometry: one head line, then the lanes kept for spans, then the chip rows */
|
|
38
|
+
--calendar-pad: var(--uix-space-1);
|
|
39
|
+
--calendar-pad-inline: 0.0625rem;
|
|
40
|
+
--calendar-head: 1.5rem;
|
|
41
|
+
--calendar-lane: 1.25rem;
|
|
42
|
+
--calendar-chip: 1.25rem;
|
|
43
|
+
--calendar-gap: 0.125rem;
|
|
44
|
+
--calendar-hour: 3rem;
|
|
45
|
+
--calendar-gutter: 3.5rem;
|
|
46
|
+
|
|
47
|
+
display:grid; gap:var(--uix-space-3); min-width:0; color:var(--calendar-chrome-text);
|
|
48
|
+
}
|
|
3
49
|
.uix-scheduling-calendar__header { display:flex; align-items:center; justify-content:space-between; gap:var(--uix-space-3); flex-wrap:wrap; }
|
|
50
|
+
.uix-scheduling-calendar__notice { padding:var(--uix-space-2) var(--uix-space-3); border:1px solid var(--calendar-chrome-line); border-radius:var(--uix-radius-sm); background:var(--calendar-chrome-surface-quiet); font-size:var(--uix-text-meta); }
|
|
51
|
+
.uix-scheduling-calendar__notice > :first-child { margin-top:0; } .uix-scheduling-calendar__notice > :last-child { margin-bottom:0; }
|
|
52
|
+
|
|
4
53
|
/* position:relative makes the scroller the containing block, so visually hidden text in a day (entry states, badge words) is clipped with it instead of widening the page */
|
|
5
|
-
.uix-scheduling-calendar__grid { position:relative; display:grid; grid-template-columns:repeat(7,minmax(6.5rem,1fr)); border-top:1px solid var(--
|
|
6
|
-
.uix-scheduling-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
54
|
+
.uix-scheduling-calendar__grid { position:relative; display:grid; grid-template-columns:repeat(7,minmax(6.5rem,1fr)); border-top:1px solid var(--calendar-chrome-line); border-left:1px solid var(--calendar-chrome-line); overflow:auto; }
|
|
55
|
+
.uix-scheduling-calendar__weekday { padding:var(--uix-space-1) var(--uix-space-2); border-right:1px solid var(--calendar-chrome-line); border-bottom:1px solid var(--calendar-chrome-line); background:var(--calendar-chrome-surface-quiet); color:var(--calendar-chrome-text-quiet); font-size:var(--uix-text-meta); font-weight:600; text-align:right; }
|
|
56
|
+
|
|
57
|
+
/* One week is one grid row: the seven day cells, and over them the spans, each drawn once.
|
|
58
|
+
Cells and spans all sit in row 1 with a set column, so a span never pushes a cell aside. */
|
|
59
|
+
.uix-scheduling-calendar__week { grid-column:1 / -1; display:grid; grid-template-columns:repeat(7,minmax(6.5rem,1fr)); grid-template-rows:minmax(0,1fr); }
|
|
60
|
+
.uix-scheduling-calendar__day { grid-row:1; display:flex; flex-direction:column; min-width:0; min-height:8rem; padding:var(--calendar-pad) var(--calendar-pad-inline); border-right:1px solid var(--calendar-chrome-line); border-bottom:1px solid var(--calendar-chrome-line); background:var(--calendar-chrome-surface); }
|
|
61
|
+
.uix-scheduling-calendar__day:nth-child(1) { grid-column:1; } .uix-scheduling-calendar__day:nth-child(2) { grid-column:2; } .uix-scheduling-calendar__day:nth-child(3) { grid-column:3; } .uix-scheduling-calendar__day:nth-child(4) { grid-column:4; }
|
|
62
|
+
.uix-scheduling-calendar__day:nth-child(5) { grid-column:5; } .uix-scheduling-calendar__day:nth-child(6) { grid-column:6; } .uix-scheduling-calendar__day:nth-child(7) { grid-column:7; }
|
|
63
|
+
.uix-scheduling-calendar__day[data-outside] { background:var(--calendar-chrome-surface-quiet); color:var(--calendar-chrome-text-quiet); }
|
|
64
|
+
/* Fixed geometry: the consumer cut the list and "+N" opens elsewhere, so every cell keeps one
|
|
65
|
+
height: the head, every lane a row may use (the caps), the chip rows and the "+N" line. A row
|
|
66
|
+
that uses fewer lanes starts its chips higher and leaves the rest of the cell empty. */
|
|
67
|
+
.uix-scheduling-calendar__grid[data-fixed] .uix-scheduling-calendar__week {
|
|
68
|
+
height:calc(2 * var(--calendar-pad) + var(--calendar-head) + var(--uix-scheduling-calendar-lane-cap,0) * var(--calendar-lane) + (var(--uix-scheduling-calendar-chips,3) + 1) * (var(--calendar-chip) + var(--calendar-gap)) + 1px);
|
|
69
|
+
}
|
|
70
|
+
.uix-scheduling-calendar__grid[data-fixed] .uix-scheduling-calendar__day { min-height:0; overflow:hidden; }
|
|
71
|
+
|
|
72
|
+
.uix-scheduling-calendar__dayhead { display:flex; align-items:center; gap:var(--uix-space-1); min-width:0; height:var(--calendar-head); flex:none; }
|
|
10
73
|
.uix-scheduling-calendar__dayhead > .uix-scheduling-calendar__date { flex:1 1 auto; width:auto; }
|
|
11
74
|
.uix-scheduling-calendar__badge { display:inline-flex; align-items:center; min-width:0; overflow:hidden; white-space:nowrap; font-size:var(--uix-text-meta); }
|
|
12
|
-
.uix-scheduling-
|
|
13
|
-
.uix-scheduling-
|
|
14
|
-
.uix-scheduling-calendar__date {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
.uix-scheduling-calendar__entries { display:grid; gap:var(--uix-
|
|
18
|
-
.uix-scheduling-
|
|
19
|
-
.uix-scheduling-
|
|
20
|
-
|
|
21
|
-
|
|
75
|
+
.uix-scheduling-calendar__count { flex:none; font-size:var(--uix-text-meta); font-weight:600; font-variant-numeric:tabular-nums; }
|
|
76
|
+
.uix-scheduling-calendar__date { display:block; flex:none; width:100%; height:var(--calendar-head); padding:0 var(--uix-space-1); border:0; border-radius:var(--uix-radius-xs); background:transparent; color:inherit; text-align:right; font-size:var(--uix-text-meta); font-variant-numeric:tabular-nums; outline-offset:-2px; }
|
|
77
|
+
button.uix-scheduling-calendar__date:hover { background:var(--calendar-chrome-surface-quiet); }
|
|
78
|
+
|
|
79
|
+
/* The chips start below the lanes this row keeps for spans. */
|
|
80
|
+
.uix-scheduling-calendar__entries { display:grid; gap:var(--calendar-gap); min-width:0; margin-top:calc(var(--uix-scheduling-calendar-lanes,0) * var(--calendar-lane)); }
|
|
81
|
+
.uix-scheduling-calendar__more { justify-self:start; display:inline-flex; align-items:center; height:var(--calendar-chip); padding:0 var(--uix-space-1); border:0; border-radius:var(--uix-radius-xs); background:transparent; color:var(--calendar-chrome-text); font-size:var(--uix-text-meta); font-weight:600; text-align:left; white-space:nowrap; outline-offset:-2px; }
|
|
82
|
+
button.uix-scheduling-calendar__more { cursor:pointer; } button.uix-scheduling-calendar__more:hover { background:var(--calendar-chrome-surface-quiet); }
|
|
83
|
+
|
|
84
|
+
/* An item: a chip in its day, or a span over several days. The default look is the
|
|
85
|
+
`committed` status with no band: a plain outlined chip. */
|
|
86
|
+
.uix-scheduling-calendar__entry { display:flex; align-items:center; gap:var(--calendar-gap); min-width:0; height:var(--calendar-chip); padding:0 0.125rem; border:1px solid var(--calendar-status-edge); border-radius:var(--uix-radius-xs); background:var(--calendar-status-surface); color:var(--calendar-status-text); overflow:hidden; text-align:left; white-space:nowrap; font-size:var(--uix-text-meta); cursor:pointer; outline-offset:-2px; }
|
|
87
|
+
/* A long title is cut at the chip edge with no ellipsis: in a narrow day column the "…" would
|
|
88
|
+
cost one and a half of the few title characters there is room for. */
|
|
89
|
+
.uix-scheduling-calendar__entry-text { flex:1 1 auto; min-width:0; overflow:hidden; }
|
|
90
|
+
.uix-scheduling-calendar__time { font-variant-numeric:tabular-nums; color:var(--calendar-chrome-text-quiet); }
|
|
91
|
+
.uix-scheduling-calendar__entry[data-band="high"] .uix-scheduling-calendar__time { color:inherit; }
|
|
92
|
+
.uix-scheduling-calendar__title { font-weight:500; }
|
|
93
|
+
.uix-scheduling-calendar__entry[data-status="live"] .uix-scheduling-calendar__title { font-weight:600; }
|
|
94
|
+
.uix-scheduling-calendar__markers { flex:none; display:inline-flex; align-items:center; gap:var(--calendar-gap); }
|
|
95
|
+
|
|
96
|
+
/* status: line style, weight and dimming only */
|
|
97
|
+
:is(.uix-scheduling-calendar__entry,.uix-scheduling-calendar__swatch)[data-status="tentative"] { border-style:dashed; border-color:var(--calendar-status-edge-strong); }
|
|
98
|
+
.uix-scheduling-calendar__entry[data-status="live"] { font-weight:600; border-color:var(--calendar-status-edge-strong); }
|
|
99
|
+
/* the live dot is a border, so it survives forced colours */
|
|
100
|
+
.uix-scheduling-calendar__entry[data-status="live"]::before,.uix-scheduling-calendar__swatch[data-status="live"]::before { content:""; flex:none; margin-right:var(--calendar-gap); border:0.1875rem solid currentColor; border-radius:50%; }
|
|
101
|
+
:is(.uix-scheduling-calendar__entry,.uix-scheduling-calendar__swatch)[data-status="done"] { border-style:none none solid; background:var(--calendar-status-surface-quiet); color:var(--calendar-status-text-dim); }
|
|
102
|
+
:is(.uix-scheduling-calendar__entry,.uix-scheduling-calendar__swatch)[data-status="dead"] { border-style:dotted; border-color:var(--calendar-status-edge-strong); color:var(--calendar-status-text-dim); }
|
|
103
|
+
.uix-scheduling-calendar__entry[data-status="dead"] .uix-scheduling-calendar__entry-text { text-decoration:line-through; }
|
|
104
|
+
.uix-scheduling-calendar__swatch[data-status="dead"]::after { content:""; width:100%; border-top:1px solid currentColor; }
|
|
105
|
+
|
|
106
|
+
/* band: `medium` is a heavier leading edge, `high` is the one fill */
|
|
107
|
+
:is(.uix-scheduling-calendar__entry,.uix-scheduling-calendar__swatch)[data-band="medium"] { border-left:3px solid var(--calendar-band-medium-edge); }
|
|
108
|
+
:is(.uix-scheduling-calendar__entry,.uix-scheduling-calendar__swatch)[data-band="high"] { border-color:var(--calendar-band-high-fill); background:var(--calendar-band-high-fill); color:var(--calendar-band-high-text); }
|
|
109
|
+
:is(.uix-scheduling-calendar__entry,.uix-scheduling-calendar__swatch)[data-band="high"]:is([data-status="tentative"],[data-status="dead"],[data-status="done"]) { border-color:var(--calendar-band-high-text); }
|
|
110
|
+
.uix-scheduling-calendar__entry[data-band="high"]:focus-visible { outline-color:var(--calendar-band-high-text); }
|
|
111
|
+
|
|
112
|
+
/* spans and windows: placed in the week row by the layout, one lane each */
|
|
113
|
+
.uix-scheduling-calendar__span,.uix-scheduling-calendar__window,.uix-scheduling-calendar__rowmore { grid-row:1; align-self:start; height:calc(var(--calendar-lane) - var(--calendar-gap)); margin-top:calc(var(--calendar-pad) + var(--calendar-head) + var(--uix-scheduling-calendar-lane,0) * var(--calendar-lane)); margin-inline:var(--calendar-pad-inline); }
|
|
114
|
+
:is(.uix-scheduling-calendar__span,.uix-scheduling-calendar__window)[data-continues-before] { margin-left:0; border-left-style:dashed; border-top-left-radius:0; border-bottom-left-radius:0; }
|
|
115
|
+
:is(.uix-scheduling-calendar__span,.uix-scheduling-calendar__window)[data-continues-after] { margin-right:0; border-right-style:dashed; border-top-right-radius:0; border-bottom-right-radius:0; }
|
|
116
|
+
.uix-scheduling-calendar__window { display:flex; align-items:center; min-width:0; padding:0 var(--uix-space-1); border:1px solid var(--calendar-window-edge); border-radius:var(--uix-radius-xs); background-color:var(--calendar-window-surface); color:var(--calendar-window-text); overflow:hidden; text-align:left; white-space:nowrap; font-size:var(--uix-text-meta); cursor:pointer; outline-offset:-2px; }
|
|
117
|
+
/* the label sits on its own patch of the window colour, so the hatch never runs under the words */
|
|
118
|
+
.uix-scheduling-calendar__window-text { display:inline-flex; gap:var(--uix-space-1); min-width:0; max-width:100%; padding:0 var(--uix-space-1); border-radius:var(--uix-radius-xs); background:var(--calendar-window-surface); overflow:hidden; }
|
|
119
|
+
.uix-scheduling-calendar__window-kind { flex:none; font-weight:600; }
|
|
120
|
+
.uix-scheduling-calendar__window-name { flex:0 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; }
|
|
121
|
+
.uix-scheduling-calendar__window-scope { flex:0 2 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; font-style:italic; }
|
|
122
|
+
.uix-scheduling-calendar__window[data-global] { border-color:var(--calendar-window-ink); border-width:2px; }
|
|
123
|
+
:is(.uix-scheduling-calendar__window,.uix-scheduling-calendar__swatch)[data-pattern="diagonal"] { background-image:repeating-linear-gradient(45deg,var(--calendar-window-ink) 0 1px,transparent 1px 6px); }
|
|
124
|
+
:is(.uix-scheduling-calendar__window,.uix-scheduling-calendar__swatch)[data-pattern="cross"] { background-image:repeating-linear-gradient(45deg,var(--calendar-window-ink) 0 1px,transparent 1px 6px),repeating-linear-gradient(-45deg,var(--calendar-window-ink) 0 1px,transparent 1px 6px); }
|
|
125
|
+
:is(.uix-scheduling-calendar__window,.uix-scheduling-calendar__swatch)[data-pattern="dotted"] { background-image:radial-gradient(circle,var(--calendar-window-ink) 1px,transparent 1.5px); background-size:5px 5px; }
|
|
126
|
+
.uix-scheduling-calendar__swatch[data-pattern] { border-color:var(--calendar-window-edge); background-color:var(--calendar-window-surface); }
|
|
127
|
+
/* "+N" for the spans of this row that got no lane: on the last kept lane, at the row end */
|
|
128
|
+
.uix-scheduling-calendar__rowmore { grid-column:7; justify-self:end; display:inline-flex; align-items:center; margin-top:calc(var(--calendar-pad) + var(--calendar-head) + (var(--uix-scheduling-calendar-lanes,1) - 1) * var(--calendar-lane)); padding:0 var(--uix-space-1); border:1px solid var(--calendar-chrome-line-strong); border-radius:var(--uix-radius-xs); background:var(--calendar-chrome-surface); color:var(--calendar-chrome-text); font-size:var(--uix-text-meta); font-weight:600; font-variant-numeric:tabular-nums; outline-offset:-2px; }
|
|
129
|
+
button.uix-scheduling-calendar__rowmore { cursor:pointer; } button.uix-scheduling-calendar__rowmore:hover { background:var(--calendar-chrome-surface-quiet); }
|
|
130
|
+
|
|
131
|
+
/* markers: a shape (or the consumer's icon) with text; the text is in the accessible name */
|
|
132
|
+
.uix-scheduling-calendar__marker { flex:none; display:inline-flex; align-items:center; color:var(--calendar-marker-ink); }
|
|
133
|
+
.uix-scheduling-calendar__entry .uix-scheduling-calendar__marker { color:inherit; }
|
|
134
|
+
.uix-scheduling-calendar__marker-icon { display:inline-flex; width:0.6875rem; height:0.6875rem; }
|
|
135
|
+
.uix-scheduling-calendar__marker-icon > svg { width:100%; height:100%; }
|
|
136
|
+
.uix-scheduling-calendar__marker[data-glyph]::before { content:""; width:0.625rem; height:0.625rem; background:currentColor; }
|
|
137
|
+
.uix-scheduling-calendar__marker[data-glyph="neutral"]::before { border-radius:50%; }
|
|
138
|
+
.uix-scheduling-calendar__marker[data-glyph="warning"]::before { clip-path:polygon(50% 0,100% 100%,0 100%); }
|
|
139
|
+
.uix-scheduling-calendar__marker[data-glyph="refused"]::before { clip-path:polygon(20% 0,50% 30%,80% 0,100% 20%,70% 50%,100% 80%,80% 100%,50% 70%,20% 100%,0 80%,30% 50%,0 20%); }
|
|
140
|
+
|
|
141
|
+
.uix-scheduling-calendar__empty { grid-column:1 / -1; position:sticky; left:0; padding:var(--uix-space-3); border-right:1px solid var(--calendar-chrome-line); border-bottom:1px solid var(--calendar-chrome-line); background:var(--calendar-chrome-surface); color:var(--calendar-chrome-text-quiet); }
|
|
142
|
+
|
|
22
143
|
.uix-scheduling-calendar__agenda ol { display:grid; gap:var(--uix-space-2); margin:0; padding:0; list-style:none; }
|
|
23
|
-
.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(--
|
|
24
|
-
.uix-scheduling-calendar__agenda li>button>span:first-child { display:grid; gap:var(--uix-space-1); } .uix-scheduling-calendar__agenda li>button
|
|
25
|
-
.uix-scheduling-
|
|
26
|
-
|
|
27
|
-
.uix-scheduling-calendar__legend
|
|
28
|
-
.uix-scheduling-
|
|
144
|
+
.uix-scheduling-calendar__agenda li>button { width:100%; display:flex; align-items:center; justify-content:space-between; gap:var(--uix-space-3); padding:var(--uix-space-3); border:1px solid var(--calendar-chrome-line); border-radius:var(--uix-radius-md); background:var(--calendar-chrome-surface); color:var(--calendar-chrome-text); text-align:left; }
|
|
145
|
+
.uix-scheduling-calendar__agenda li>button>span:first-child { flex:1 1 auto; display:grid; gap:var(--uix-space-1); min-width:0; } .uix-scheduling-calendar__agenda li>button>span:first-child>span { color:var(--calendar-chrome-text-quiet); font-size:var(--uix-text-meta); }
|
|
146
|
+
.uix-scheduling-calendar__status { flex:none; color:var(--calendar-chrome-text-quiet); font-size:var(--uix-text-meta); }
|
|
147
|
+
|
|
148
|
+
.uix-scheduling-calendar__legend { display:flex; flex-wrap:wrap; align-items:center; gap:var(--uix-space-2) var(--uix-space-3); font-size:var(--uix-text-meta); color:var(--calendar-chrome-text-quiet); }
|
|
149
|
+
.uix-scheduling-calendar__legend-list { display:flex; flex-wrap:wrap; gap:var(--uix-space-2) var(--uix-space-3); margin:0; padding:0; list-style:none; }
|
|
150
|
+
.uix-scheduling-calendar__legend-list > li { display:inline-flex; align-items:center; gap:var(--uix-space-1); margin:0; }
|
|
151
|
+
.uix-scheduling-calendar__legend-caption { flex:1 1 100%; margin:0; }
|
|
152
|
+
.uix-scheduling-calendar__swatch { flex:none; display:inline-flex; align-items:center; justify-content:center; width:1.5rem; height:0.875rem; border:1px solid var(--calendar-status-edge); border-radius:var(--uix-radius-xs); background:var(--calendar-status-surface); color:var(--calendar-status-text); }
|
|
153
|
+
.uix-scheduling-calendar__swatch > svg { width:0.75rem; height:0.75rem; }
|
|
154
|
+
/* the built-in legend of the deprecated `state` values: the same shapes, no hue */
|
|
155
|
+
.uix-scheduling-calendar__legend > span[data-state]::before { content:""; display:inline-block; width:0.625rem; height:0.625rem; margin-right:var(--uix-space-1); border:1px solid var(--calendar-status-edge-strong); border-radius:var(--uix-radius-xs); vertical-align:middle; }
|
|
156
|
+
.uix-scheduling-calendar__legend > span[data-state="in-progress"]::before { border:0.1875rem solid var(--calendar-status-text); border-radius:50%; width:0; height:0; }
|
|
157
|
+
.uix-scheduling-calendar__legend > span:is([data-state="conflicted"],[data-state="blackout-violation"])::before { border:0; border-radius:0; background:var(--calendar-marker-ink); clip-path:polygon(50% 0,100% 100%,0 100%); }
|
|
158
|
+
|
|
159
|
+
/* ── Week / Day time grid (HAR-1509) ─────────────────────────────────────────────────────────
|
|
160
|
+
Four stacked rows share one column template: the day heads, the window strip, the top lane
|
|
161
|
+
and the hours. A day column is as tall as its day: --uix-scheduling-calendar-hours is the
|
|
162
|
+
real length of that day, so a clock-change day is shorter or longer than its neighbours.
|
|
163
|
+
Items are placed from --uix-scheduling-calendar-offset / -length (real hours) alone. */
|
|
164
|
+
.uix-scheduling-calendar__timegrid { position:relative; display:grid; min-width:0; overflow-x:auto; border:1px solid var(--calendar-chrome-line); border-radius:var(--uix-radius-sm); background:var(--calendar-chrome-surface); }
|
|
165
|
+
.uix-scheduling-calendar__tg-head,.uix-scheduling-calendar__tg-strip,.uix-scheduling-calendar__tg-body { display:grid; grid-template-columns:var(--calendar-gutter) repeat(var(--uix-scheduling-calendar-days,7),minmax(6.5rem,1fr)); min-width:calc(var(--calendar-gutter) + var(--uix-scheduling-calendar-days,7) * 6.5rem); }
|
|
166
|
+
.uix-scheduling-calendar__timegrid[data-view="day"] > :is(.uix-scheduling-calendar__tg-head,.uix-scheduling-calendar__tg-strip,.uix-scheduling-calendar__tg-body) { grid-template-columns:var(--calendar-gutter) minmax(0,1fr); min-width:0; }
|
|
167
|
+
.uix-scheduling-calendar__tg-head { background:var(--calendar-chrome-surface-quiet); }
|
|
168
|
+
.uix-scheduling-calendar__tg-zone { align-self:center; padding:var(--uix-space-1); color:var(--calendar-chrome-text-quiet); font-size:var(--uix-text-meta); line-height:1.2; text-align:right; overflow-wrap:anywhere; }
|
|
169
|
+
.uix-scheduling-calendar__tg-dayhead { display:flex; flex-wrap:wrap; align-items:center; align-content:center; gap:0 var(--uix-space-1); min-width:0; padding:var(--uix-space-1); border-left:1px solid var(--calendar-chrome-line); font-size:var(--uix-text-meta); overflow:hidden; }
|
|
170
|
+
.uix-scheduling-calendar__tg-dayhead > .uix-scheduling-calendar__date { flex:none; width:auto; height:var(--calendar-head); font-weight:600; text-align:left; white-space:nowrap; }
|
|
171
|
+
.uix-scheduling-calendar__tg-dayhead > .uix-scheduling-calendar__markers { flex:0 1 auto; min-width:0; max-width:100%; overflow:hidden; }
|
|
172
|
+
.uix-scheduling-calendar__tg-dayhead > .uix-scheduling-calendar__more { flex:none; margin-left:auto; }
|
|
173
|
+
.uix-scheduling-calendar__marker-label { margin-left:var(--calendar-gap); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
174
|
+
|
|
175
|
+
/* the window strip and the top lane: one grid row per lane, a bounded height */
|
|
176
|
+
.uix-scheduling-calendar__tg-strip { grid-auto-rows:var(--calendar-lane); align-items:center; padding:var(--calendar-gap) 0; border-top:1px solid var(--calendar-chrome-line); }
|
|
177
|
+
.uix-scheduling-calendar__tg-strip > :is(.uix-scheduling-calendar__window,.uix-scheduling-calendar__tg-span,.uix-scheduling-calendar__tg-ghost,.uix-scheduling-calendar__rowmore) { grid-row:calc(var(--uix-scheduling-calendar-lane,0) + 1); align-self:center; height:calc(var(--calendar-lane) - var(--calendar-gap)); margin:0 var(--calendar-pad-inline); }
|
|
178
|
+
.uix-scheduling-calendar__tg-strip > .uix-scheduling-calendar__rowmore { grid-column:-2 / -1; grid-row:var(--uix-scheduling-calendar-lanes,1); justify-self:end; }
|
|
179
|
+
.uix-scheduling-calendar__tg-top { min-height:calc(var(--calendar-lane) + 2 * var(--calendar-gap)); }
|
|
180
|
+
:is(.uix-scheduling-calendar__tg-span,.uix-scheduling-calendar__window)[data-continues-before] { border-left-style:dashed; border-top-left-radius:0; border-bottom-left-radius:0; }
|
|
181
|
+
:is(.uix-scheduling-calendar__tg-span,.uix-scheduling-calendar__window)[data-continues-after] { border-right-style:dashed; border-top-right-radius:0; border-bottom-right-radius:0; }
|
|
182
|
+
|
|
183
|
+
/* the hours */
|
|
184
|
+
.uix-scheduling-calendar__tg-body { position:relative; grid-template-rows:calc(var(--uix-scheduling-calendar-hours,1) * var(--calendar-hour)); border-top:1px solid var(--calendar-chrome-line); }
|
|
185
|
+
.uix-scheduling-calendar__tg-gutter { grid-column:1; grid-row:1; position:relative; }
|
|
186
|
+
.uix-scheduling-calendar__tg-hour { position:absolute; top:calc(var(--uix-scheduling-calendar-offset,0) * var(--calendar-hour)); right:var(--uix-space-1); padding-top:var(--calendar-gap); color:var(--calendar-chrome-text-quiet); font-size:var(--uix-text-meta); font-variant-numeric:tabular-nums; line-height:1; text-align:right; pointer-events:none; }
|
|
187
|
+
.uix-scheduling-calendar__tg-hour--inline { right:auto; left:var(--calendar-gap); }
|
|
188
|
+
.uix-scheduling-calendar__tg-offset { display:block; }
|
|
189
|
+
/* one painted background draws every hour line of a column: no element per hour */
|
|
190
|
+
.uix-scheduling-calendar__tg-column { grid-row:1; align-self:start; position:relative; min-width:0; height:calc(var(--uix-scheduling-calendar-hours,1) * var(--calendar-hour)); border-left:1px solid var(--calendar-chrome-line); background-image:repeating-linear-gradient(to bottom,var(--calendar-chrome-line) 0 1px,transparent 1px var(--calendar-hour)); }
|
|
191
|
+
.uix-scheduling-calendar__tg-item { position:absolute; top:calc(var(--uix-scheduling-calendar-offset,0) * var(--calendar-hour)); left:calc(var(--uix-scheduling-calendar-lane,0) / var(--uix-scheduling-calendar-lanes,1) * 100%); width:calc(100% / var(--uix-scheduling-calendar-lanes,1) - 2px); height:max(calc(var(--uix-scheduling-calendar-length,1) * var(--calendar-hour) - 1px),0.875rem); align-items:flex-start; padding:0 0.125rem; line-height:1rem; }
|
|
192
|
+
.uix-scheduling-calendar__tg-item > .uix-scheduling-calendar__entry-text { white-space:normal; overflow-wrap:anywhere; max-height:100%; }
|
|
193
|
+
.uix-scheduling-calendar__tg-item[data-lines="1"] > .uix-scheduling-calendar__entry-text { white-space:nowrap; overflow-wrap:normal; }
|
|
194
|
+
.uix-scheduling-calendar__tg-item > .uix-scheduling-calendar__markers { height:1rem; }
|
|
195
|
+
.uix-scheduling-calendar__tg-from { flex:1 1 auto; min-width:0; overflow:hidden; white-space:nowrap; font-style:italic; }
|
|
196
|
+
/* an item that crosses midnight: two parts with the shared edge left open */
|
|
197
|
+
.uix-scheduling-calendar__tg-item[data-part="start"] { border-bottom-style:dashed; border-bottom-left-radius:0; border-bottom-right-radius:0; }
|
|
198
|
+
.uix-scheduling-calendar__tg-item[data-part="continuation"] { border-top-style:dashed; border-top-left-radius:0; border-top-right-radius:0; }
|
|
199
|
+
:is(.uix-scheduling-calendar__tg-item,.uix-scheduling-calendar__tg-span)[data-movable] { cursor:grab; }
|
|
200
|
+
/* a pending move: an outline where the item would go; the item itself stays put */
|
|
201
|
+
.uix-scheduling-calendar__tg-ghost { border:2px dashed var(--calendar-chrome-ghost); border-radius:var(--uix-radius-xs); background:var(--calendar-chrome-ghost-surface); opacity:0.7; pointer-events:none; }
|
|
202
|
+
.uix-scheduling-calendar__tg-ghost[data-sent] { border-style:dotted; }
|
|
203
|
+
.uix-scheduling-calendar__tg-column > .uix-scheduling-calendar__tg-ghost { position:absolute; left:0; right:0; top:calc(var(--uix-scheduling-calendar-offset,0) * var(--calendar-hour)); height:max(calc(var(--uix-scheduling-calendar-length,1) * var(--calendar-hour)),0.875rem); }
|
|
204
|
+
.uix-scheduling-calendar__tg-now { position:absolute; left:0; right:0; top:calc(var(--uix-scheduling-calendar-offset,0) * var(--calendar-hour)); border-top:2px solid var(--calendar-chrome-now); pointer-events:none; }
|
|
205
|
+
.uix-scheduling-calendar__tg-now::before { content:""; position:absolute; left:0; top:-0.3125rem; border:0.25rem solid var(--calendar-chrome-now); border-radius:50%; }
|
|
206
|
+
/* a window that applies to everything also tints its hours, behind the items: a flat, quiet
|
|
207
|
+
tint (the hatch stays on its bar in the strip) */
|
|
208
|
+
.uix-scheduling-calendar__tg-shade[data-pattern] { grid-row:1; background-color:var(--calendar-window-surface); opacity:0.45; pointer-events:none; }
|
|
209
|
+
/* the narrowest lane worth drawing: an item that shows a time and six title characters */
|
|
210
|
+
.uix-scheduling-calendar__tg-probe { position:absolute; left:0; top:0; height:0; padding:0 0.125rem; border:0 solid transparent; border-width:0 1px; visibility:hidden; overflow:hidden; white-space:nowrap; font-size:var(--uix-text-meta); pointer-events:none; }
|
|
211
|
+
|
|
212
|
+
.uix-scheduling-calendar__state { padding:var(--uix-space-8); border:1px dashed var(--calendar-chrome-line-strong); border-radius:var(--uix-radius-lg); text-align:center; }
|
|
29
213
|
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
transition: background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
|
|
12
12
|
}
|
|
13
13
|
.uix-segmented__option:hover { color: var(--uix-text); }
|
|
14
|
-
|
|
14
|
+
/* aria-checked: a `selection="radio"` group (HAR-1604) */
|
|
15
|
+
.uix-segmented__option:is([aria-pressed="true"], [aria-checked="true"]) { background: var(--uix-surface); color: var(--uix-text); box-shadow: var(--uix-shadow-sm); }
|
|
15
16
|
.uix-segmented__option:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 1px; }
|
|
16
17
|
}
|