@jirawatpyk/aura-react 5.28.0 → 5.30.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 +48 -0
- package/dist/aura.bundle.js +154 -29
- package/dist/cjs/index.cjs +154 -29
- package/dist/esm/Checkbox.js +4 -2
- package/dist/esm/DataTable.js +75 -8
- package/dist/esm/Field.js +2 -1
- package/dist/esm/Menu.js +61 -14
- package/dist/esm/RadioGroup.js +7 -2
- package/dist/esm/Select.js +2 -2
- package/dist/esm/Tag.js +1 -1
- package/dist/esm/TextField.js +2 -2
- package/dist/esm/Textarea.js +2 -2
- package/dist/esm/classes.js +5 -1
- package/dist/esm/internal.js +2 -1
- package/dist/index.d.cts +27 -0
- package/dist/index.d.ts +27 -0
- package/dist/styles.css +143 -38
- package/dist/styles.layer.css +143 -38
- package/package.json +1 -1
package/dist/esm/classes.js
CHANGED
|
@@ -8,6 +8,9 @@ function omit(src, keys) {
|
|
|
8
8
|
out[k] = src[k];
|
|
9
9
|
return out;
|
|
10
10
|
}
|
|
11
|
+
function touchClass(t) {
|
|
12
|
+
return t === "always" ? "is-touch-always" : !!t && "is-touch";
|
|
13
|
+
}
|
|
11
14
|
const TONES = ["neutral", "accent", "success", "warning", "danger"];
|
|
12
15
|
function tone(t) {
|
|
13
16
|
return TONES.indexOf(t) >= 0 ? t : "neutral";
|
|
@@ -29,5 +32,6 @@ export {
|
|
|
29
32
|
cx,
|
|
30
33
|
devWarnOnce,
|
|
31
34
|
omit,
|
|
32
|
-
tone
|
|
35
|
+
tone,
|
|
36
|
+
touchClass
|
|
33
37
|
};
|
package/dist/esm/internal.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import * as React from "react";
|
|
3
|
-
import { cx, omit, tone, devWarnOnce } from "./classes.js";
|
|
3
|
+
import { cx, omit, tone, devWarnOnce, touchClass } from "./classes.js";
|
|
4
4
|
function useMaybeControlled(value, initial, onChange) {
|
|
5
5
|
const s = React.useState(initial);
|
|
6
6
|
const wasSet = React.useState(value !== void 0);
|
|
@@ -89,6 +89,7 @@ export {
|
|
|
89
89
|
omit,
|
|
90
90
|
plainClick,
|
|
91
91
|
tone,
|
|
92
|
+
touchClass,
|
|
92
93
|
trapTab,
|
|
93
94
|
uid,
|
|
94
95
|
useIsoLayoutEffect,
|
package/dist/index.d.cts
CHANGED
|
@@ -114,6 +114,14 @@ export interface DataTableColumn<Row extends Record<string, any> = Record<string
|
|
|
114
114
|
* after the half-width fields (in column order; `cardOrder` doesn't move it), its label above and its text wrapping —
|
|
115
115
|
* a reason with its evidence. Default: today's rule. The grid is unchanged by any of them. */
|
|
116
116
|
card?: "hide" | "field" | "title" | "pill" | "footer" | "wide" | undefined;
|
|
117
|
+
/** How many text lines its loading skeleton draws (5.29, Chamber-OS 134) — 2 for a cell that shows two lines (a
|
|
118
|
+
* reason and its evidence), so the skeleton row is as tall as the real one with `rowHeight="auto"`. Default 1, at
|
|
119
|
+
* most 10; ignored on a `pill` column. */
|
|
120
|
+
skeletonLines?: number | undefined;
|
|
121
|
+
/** For a `card: 'footer'` or `actions` column whose buttons use `touchHeight` (5.29, Chamber-OS 134): its loading
|
|
122
|
+
* skeleton's bar is 44px below 640px and on a coarse pointer, as those buttons are. Without it the bar is the small
|
|
123
|
+
* button's 32px. */
|
|
124
|
+
skeletonTouch?: boolean | undefined;
|
|
117
125
|
/** The order of fields in a stacked card (5.13), lowest first; the grid's column order is unchanged. Fields
|
|
118
126
|
* without one sort by their column index (0-based). Screen readers and arrow keys follow the grid's order. */
|
|
119
127
|
cardOrder?: number | undefined;
|
|
@@ -327,6 +335,9 @@ export interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInpu
|
|
|
327
335
|
x: number;
|
|
328
336
|
y: number;
|
|
329
337
|
} | undefined;
|
|
338
|
+
/** A labelled checkbox's row is 44px (5.30, Chamber-OS 135), the one-line label centred: `true` below 640px or on a
|
|
339
|
+
* coarse pointer, `'always'` at every width. A bare box (no visible label) uses `hitArea` instead. */
|
|
340
|
+
touchHeight?: TouchHeight | undefined;
|
|
330
341
|
}
|
|
331
342
|
/** 32px round button holding one icon. */
|
|
332
343
|
export interface IconButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
@@ -385,6 +396,8 @@ export interface MenuProps {
|
|
|
385
396
|
* accessible description, read once when the menu opens. */
|
|
386
397
|
header?: React$1.ReactNode | undefined;
|
|
387
398
|
}
|
|
399
|
+
/** `true`: 44px below 640px or on a coarse pointer; `'always'`: 44px at every width (5.30). */
|
|
400
|
+
export type TouchHeight = boolean | "always";
|
|
388
401
|
export interface FieldProps {
|
|
389
402
|
/** Visible label; also the accessible name. */
|
|
390
403
|
label: string;
|
|
@@ -402,6 +415,10 @@ export interface TextFieldProps extends FieldProps, Omit<React$1.InputHTMLAttrib
|
|
|
402
415
|
icon?: IconInput | undefined;
|
|
403
416
|
/** Trailing unit, e.g. "THB". */
|
|
404
417
|
suffix?: React$1.ReactNode | undefined;
|
|
418
|
+
/** 44px box (5.30, Chamber-OS 135): `true` below 640px or on a coarse pointer, as Button's `touchHeight`; `'always'`
|
|
419
|
+
* at every width, also with a mouse in compact density — for a form whose spec asks for 44px targets everywhere.
|
|
420
|
+
* Default: the density's input height. */
|
|
421
|
+
touchHeight?: TouchHeight | undefined;
|
|
405
422
|
}
|
|
406
423
|
/** A password input with a show/hide button. All TextField props; `ref` reaches the input (react-hook-form `register`). */
|
|
407
424
|
export interface PasswordFieldProps extends Omit<TextFieldProps, "type" | "suffix"> {
|
|
@@ -523,6 +540,9 @@ export interface CommandProps {
|
|
|
523
540
|
className?: string | undefined;
|
|
524
541
|
}
|
|
525
542
|
export interface TextareaProps extends FieldProps, Omit<React$1.TextareaHTMLAttributes<HTMLTextAreaElement>, "required"> {
|
|
543
|
+
/** Accepted like the other fields' (5.30, Chamber-OS 135), so a form can pass it to every field. A Textarea is
|
|
544
|
+
* always at least 96px tall, well over the 44px target, so it changes nothing you can see. */
|
|
545
|
+
touchHeight?: TouchHeight | undefined;
|
|
526
546
|
}
|
|
527
547
|
export type SelectOption = string | {
|
|
528
548
|
value: string;
|
|
@@ -544,6 +564,10 @@ export interface SelectProps extends Omit<FieldProps, "label">, Omit<React$1.Sel
|
|
|
544
564
|
* option on the read-only ground, with no chevron; no click or key opens the list. The value is still submitted
|
|
545
565
|
* with the form (unlike `disabled`). Before JavaScript runs, the other options from `options` are disabled. */
|
|
546
566
|
readOnly?: boolean | undefined;
|
|
567
|
+
/** 44px box (5.30, Chamber-OS 135): `true` below 640px or on a coarse pointer, as Button's `touchHeight`; `'always'`
|
|
568
|
+
* at every width, also with a mouse in compact density — for a form whose spec asks for 44px targets everywhere.
|
|
569
|
+
* Default: the density's input height. */
|
|
570
|
+
touchHeight?: TouchHeight | undefined;
|
|
547
571
|
}
|
|
548
572
|
/** A compact filter for FilterBar (5.12): "Status All ▾", as wide as its words. */
|
|
549
573
|
export interface FilterSelectProps extends Omit<React$1.SelectHTMLAttributes<HTMLSelectElement>, "onChange" | "value" | "defaultValue" | "multiple" | "size" | "placeholder" | "required" | "children"> {
|
|
@@ -578,6 +602,9 @@ export interface RadioGroupProps extends FieldProps {
|
|
|
578
602
|
disabled?: boolean | undefined;
|
|
579
603
|
id?: string | undefined;
|
|
580
604
|
className?: string | undefined;
|
|
605
|
+
/** 44px rows (5.30, Chamber-OS 135), the one-line label centred: `true` below 640px or on a coarse pointer (touch
|
|
606
|
+
* screens already get it), `'always'` at every width, also with a mouse. Default: as tall as the control and label. */
|
|
607
|
+
touchHeight?: TouchHeight | undefined;
|
|
581
608
|
}
|
|
582
609
|
export interface SwitchProps {
|
|
583
610
|
label?: string | undefined;
|
package/dist/index.d.ts
CHANGED
|
@@ -114,6 +114,14 @@ export interface DataTableColumn<Row extends Record<string, any> = Record<string
|
|
|
114
114
|
* after the half-width fields (in column order; `cardOrder` doesn't move it), its label above and its text wrapping —
|
|
115
115
|
* a reason with its evidence. Default: today's rule. The grid is unchanged by any of them. */
|
|
116
116
|
card?: "hide" | "field" | "title" | "pill" | "footer" | "wide" | undefined;
|
|
117
|
+
/** How many text lines its loading skeleton draws (5.29, Chamber-OS 134) — 2 for a cell that shows two lines (a
|
|
118
|
+
* reason and its evidence), so the skeleton row is as tall as the real one with `rowHeight="auto"`. Default 1, at
|
|
119
|
+
* most 10; ignored on a `pill` column. */
|
|
120
|
+
skeletonLines?: number | undefined;
|
|
121
|
+
/** For a `card: 'footer'` or `actions` column whose buttons use `touchHeight` (5.29, Chamber-OS 134): its loading
|
|
122
|
+
* skeleton's bar is 44px below 640px and on a coarse pointer, as those buttons are. Without it the bar is the small
|
|
123
|
+
* button's 32px. */
|
|
124
|
+
skeletonTouch?: boolean | undefined;
|
|
117
125
|
/** The order of fields in a stacked card (5.13), lowest first; the grid's column order is unchanged. Fields
|
|
118
126
|
* without one sort by their column index (0-based). Screen readers and arrow keys follow the grid's order. */
|
|
119
127
|
cardOrder?: number | undefined;
|
|
@@ -327,6 +335,9 @@ export interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInpu
|
|
|
327
335
|
x: number;
|
|
328
336
|
y: number;
|
|
329
337
|
} | undefined;
|
|
338
|
+
/** A labelled checkbox's row is 44px (5.30, Chamber-OS 135), the one-line label centred: `true` below 640px or on a
|
|
339
|
+
* coarse pointer, `'always'` at every width. A bare box (no visible label) uses `hitArea` instead. */
|
|
340
|
+
touchHeight?: TouchHeight | undefined;
|
|
330
341
|
}
|
|
331
342
|
/** 32px round button holding one icon. */
|
|
332
343
|
export interface IconButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
@@ -385,6 +396,8 @@ export interface MenuProps {
|
|
|
385
396
|
* accessible description, read once when the menu opens. */
|
|
386
397
|
header?: React$1.ReactNode | undefined;
|
|
387
398
|
}
|
|
399
|
+
/** `true`: 44px below 640px or on a coarse pointer; `'always'`: 44px at every width (5.30). */
|
|
400
|
+
export type TouchHeight = boolean | "always";
|
|
388
401
|
export interface FieldProps {
|
|
389
402
|
/** Visible label; also the accessible name. */
|
|
390
403
|
label: string;
|
|
@@ -402,6 +415,10 @@ export interface TextFieldProps extends FieldProps, Omit<React$1.InputHTMLAttrib
|
|
|
402
415
|
icon?: IconInput | undefined;
|
|
403
416
|
/** Trailing unit, e.g. "THB". */
|
|
404
417
|
suffix?: React$1.ReactNode | undefined;
|
|
418
|
+
/** 44px box (5.30, Chamber-OS 135): `true` below 640px or on a coarse pointer, as Button's `touchHeight`; `'always'`
|
|
419
|
+
* at every width, also with a mouse in compact density — for a form whose spec asks for 44px targets everywhere.
|
|
420
|
+
* Default: the density's input height. */
|
|
421
|
+
touchHeight?: TouchHeight | undefined;
|
|
405
422
|
}
|
|
406
423
|
/** A password input with a show/hide button. All TextField props; `ref` reaches the input (react-hook-form `register`). */
|
|
407
424
|
export interface PasswordFieldProps extends Omit<TextFieldProps, "type" | "suffix"> {
|
|
@@ -523,6 +540,9 @@ export interface CommandProps {
|
|
|
523
540
|
className?: string | undefined;
|
|
524
541
|
}
|
|
525
542
|
export interface TextareaProps extends FieldProps, Omit<React$1.TextareaHTMLAttributes<HTMLTextAreaElement>, "required"> {
|
|
543
|
+
/** Accepted like the other fields' (5.30, Chamber-OS 135), so a form can pass it to every field. A Textarea is
|
|
544
|
+
* always at least 96px tall, well over the 44px target, so it changes nothing you can see. */
|
|
545
|
+
touchHeight?: TouchHeight | undefined;
|
|
526
546
|
}
|
|
527
547
|
export type SelectOption = string | {
|
|
528
548
|
value: string;
|
|
@@ -544,6 +564,10 @@ export interface SelectProps extends Omit<FieldProps, "label">, Omit<React$1.Sel
|
|
|
544
564
|
* option on the read-only ground, with no chevron; no click or key opens the list. The value is still submitted
|
|
545
565
|
* with the form (unlike `disabled`). Before JavaScript runs, the other options from `options` are disabled. */
|
|
546
566
|
readOnly?: boolean | undefined;
|
|
567
|
+
/** 44px box (5.30, Chamber-OS 135): `true` below 640px or on a coarse pointer, as Button's `touchHeight`; `'always'`
|
|
568
|
+
* at every width, also with a mouse in compact density — for a form whose spec asks for 44px targets everywhere.
|
|
569
|
+
* Default: the density's input height. */
|
|
570
|
+
touchHeight?: TouchHeight | undefined;
|
|
547
571
|
}
|
|
548
572
|
/** A compact filter for FilterBar (5.12): "Status All ▾", as wide as its words. */
|
|
549
573
|
export interface FilterSelectProps extends Omit<React$1.SelectHTMLAttributes<HTMLSelectElement>, "onChange" | "value" | "defaultValue" | "multiple" | "size" | "placeholder" | "required" | "children"> {
|
|
@@ -578,6 +602,9 @@ export interface RadioGroupProps extends FieldProps {
|
|
|
578
602
|
disabled?: boolean | undefined;
|
|
579
603
|
id?: string | undefined;
|
|
580
604
|
className?: string | undefined;
|
|
605
|
+
/** 44px rows (5.30, Chamber-OS 135), the one-line label centred: `true` below 640px or on a coarse pointer (touch
|
|
606
|
+
* screens already get it), `'always'` at every width, also with a mouse. Default: as tall as the control and label. */
|
|
607
|
+
touchHeight?: TouchHeight | undefined;
|
|
581
608
|
}
|
|
582
609
|
export interface SwitchProps {
|
|
583
610
|
label?: string | undefined;
|
package/dist/styles.css
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
border: 0;
|
|
13
13
|
background: transparent;
|
|
14
14
|
color: inherit;
|
|
15
|
-
font-family: inherit
|
|
15
|
+
font-family: var(--font-sans); /* 5.30: not inherit — a trigger outside a styled root fell back to Arial */
|
|
16
16
|
font-size: 13px;
|
|
17
17
|
font-weight: 500;
|
|
18
18
|
line-height: 1;
|
|
@@ -44,6 +44,19 @@ button.aura-btn--secondary[aria-disabled='true']:hover, button.aura-btn--ghost[a
|
|
|
44
44
|
button.aura-btn--danger-secondary[aria-disabled='true']:hover { background: transparent; }
|
|
45
45
|
button.aura-btn--danger[aria-disabled='true']:hover { background: var(--aura-button-danger-bg); }
|
|
46
46
|
button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-shadow-creative); transform: none; }
|
|
47
|
+
/* 5.30: a disabled filled button (primary, danger, creative) is a quiet grey fill with muted text, not a faded copy of
|
|
48
|
+
* itself — faded ink read as a separate grey button, faded red as pink. Outline and ghost buttons keep the fade. */
|
|
49
|
+
.aura-btn:is(.aura-btn--primary, .aura-btn--danger, .aura-btn--creative):is(:disabled, [aria-disabled='true']:not(.is-loading)),
|
|
50
|
+
.aura-btn:is(.aura-btn--primary, .aura-btn--danger, .aura-btn--creative):is(:disabled, [aria-disabled='true']:not(.is-loading)):hover {
|
|
51
|
+
opacity: 1; background: var(--aura-button-disabled-bg); color: var(--aura-button-disabled-fg); border-color: transparent; box-shadow: none;
|
|
52
|
+
}
|
|
53
|
+
/* Forced colours drop the fills: filled buttons get a 1px edge (as outline buttons have), and a disabled or gated one
|
|
54
|
+
* (still focusable) shows GrayText and keeps the fade, without changing size. */
|
|
55
|
+
@media (forced-colors: active) {
|
|
56
|
+
.aura-btn:is(.aura-btn--primary, .aura-btn--danger) { border: 1px solid ButtonText; }
|
|
57
|
+
.aura-btn.aura-btn:is(:disabled, [aria-disabled='true']:not(.is-loading)),
|
|
58
|
+
.aura-btn.aura-btn.aura-btn:is(:disabled, [aria-disabled='true']:not(.is-loading)):hover { color: GrayText; border-color: GrayText; opacity: var(--aura-disabled-opacity); }
|
|
59
|
+
}
|
|
47
60
|
.aura-btn.is-loading:active { transform: none; }
|
|
48
61
|
|
|
49
62
|
/* Focus — ADDED: the source defines none. Solid 2px ring, 2px offset, on every interactive element. */
|
|
@@ -93,10 +106,17 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
|
|
|
93
106
|
color: var(--aura-fg-primary);
|
|
94
107
|
}
|
|
95
108
|
.aura-table__scroll { position: relative; overflow: auto; overscroll-behavior: contain; height: var(--aura-table-h, auto); }
|
|
109
|
+
/* 5.30: more columns past the end edge — a soft shadow over the grid's end edge (not over its scrollbars, its footer
|
|
110
|
+
* or the column button), so it reads as scrolling sideways. JavaScript places it (top, height, scrollbar inset). */
|
|
111
|
+
.aura-table__edge {
|
|
112
|
+
position: absolute; z-index: 4; inset-inline-end: var(--aura-edge-sb, 0px); top: var(--aura-edge-top, 0px); height: var(--aura-edge-h, 0px);
|
|
113
|
+
width: 16px; pointer-events: none; background: linear-gradient(to left, var(--aura-scroll-shadow), transparent);
|
|
114
|
+
}
|
|
115
|
+
.aura-table__edge:dir(rtl) { background: linear-gradient(to right, var(--aura-scroll-shadow), transparent); }
|
|
96
116
|
.aura-table__head {
|
|
97
117
|
position: sticky; top: 0; z-index: 3; box-sizing: border-box; /* the hairline is inside the row height */
|
|
98
118
|
display: flex; height: var(--aura-table-row-height); min-width: var(--aura-row-min, 0);
|
|
99
|
-
background: var(--aura-bg
|
|
119
|
+
background: var(--aura-table-head-bg);
|
|
100
120
|
border-bottom: 1px solid var(--aura-border-default);
|
|
101
121
|
font-family: var(--font-mono); font-size: 12px; color: var(--aura-fg-secondary);
|
|
102
122
|
}
|
|
@@ -169,7 +189,7 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
|
|
|
169
189
|
.aura-table__gutter--end { position: static; }
|
|
170
190
|
.aura-table__picker {
|
|
171
191
|
position: absolute; top: 0; right: 0; z-index: 5; width: var(--aura-space-12); height: calc(var(--aura-table-row-height) - 1px);
|
|
172
|
-
display: flex; align-items: center; justify-content: center; background: var(--aura-bg
|
|
192
|
+
display: flex; align-items: center; justify-content: center; background: var(--aura-table-head-bg); border-top-right-radius: calc(var(--aura-card-radius) - 1px);
|
|
173
193
|
}
|
|
174
194
|
.aura-table__gutter--end.has-picker {
|
|
175
195
|
width: var(--aura-space-12); position: sticky; left: auto; right: 0;
|
|
@@ -270,7 +290,7 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
|
|
|
270
290
|
display: inline-flex; align-items: center; justify-content: center;
|
|
271
291
|
border: 1.5px solid var(--aura-border-control); border-radius: var(--aura-radius-xs);
|
|
272
292
|
}
|
|
273
|
-
.aura-menu__check.is-on { background: var(--aura-
|
|
293
|
+
.aura-menu__check.is-on { background: var(--aura-control-checked-bg); border-color: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); }
|
|
274
294
|
.aura-menu__check.is-on .aura-icon { color: inherit; }
|
|
275
295
|
.aura-menu__item--danger, .aura-menu__item--danger .aura-icon { color: var(--aura-fg-danger); }
|
|
276
296
|
.aura-menu__item--danger:hover, .aura-menu__item--danger:focus { background: var(--aura-alert-danger-bg); color: var(--aura-alert-danger-fg); }
|
|
@@ -280,8 +300,8 @@ a.aura-menu__item { text-decoration: none; box-sizing: border-box; }
|
|
|
280
300
|
flex: none; box-sizing: border-box; width: 16px; height: 16px; border-radius: var(--aura-radius-full);
|
|
281
301
|
border: 1px solid var(--aura-border-control); display: inline-flex; align-items: center; justify-content: center;
|
|
282
302
|
}
|
|
283
|
-
.aura-menu__radio.is-on { border-color: var(--aura-
|
|
284
|
-
.aura-menu__radio.is-on::after { content: ''; width: 8px; height: 8px; border-radius: var(--aura-radius-full); background: var(--aura-
|
|
303
|
+
.aura-menu__radio.is-on { border-color: var(--aura-control-checked-bg); }
|
|
304
|
+
.aura-menu__radio.is-on::after { content: ''; width: 8px; height: 8px; border-radius: var(--aura-radius-full); background: var(--aura-control-checked-bg); }
|
|
285
305
|
/* 5.7: a header above the items (who is signed in), set off by a hairline like a separator. */
|
|
286
306
|
.aura-menu__header { margin: calc(-1 * var(--aura-space-1)) calc(-1 * var(--aura-space-1)) var(--aura-space-1); padding: var(--aura-space-3); border-bottom: 1px solid var(--aura-border-default); color: var(--aura-fg-secondary); font-size: 12px; line-height: 18px; overflow-wrap: anywhere; }
|
|
287
307
|
.aura-menu__header > * { margin: 0; }
|
|
@@ -338,6 +358,16 @@ a.aura-icon-btn { text-decoration: none; }
|
|
|
338
358
|
.aura-skel--pill { width: 72px; height: 20px; }
|
|
339
359
|
.aura-skel--box { width: var(--aura-icon-sm); height: var(--aura-icon-sm); border-radius: var(--aura-radius-xs); }
|
|
340
360
|
@media (prefers-reduced-motion: reduce) { .aura-skel { animation: none; } }
|
|
361
|
+
/* 5.29 (Chamber-OS 134): a DataTable skeleton row stands in for the real one — text lines (skeletonLines) on the 20px
|
|
362
|
+
* line, and a button-height bar where row actions go: 32px, or 44px under the touchHeight rule with the column's
|
|
363
|
+
* skeletonTouch; full width in a card footer. */
|
|
364
|
+
.aura-skel--action { flex: none; width: var(--aura-button-height-sm); height: var(--aura-button-height-sm); border-radius: var(--aura-button-radius); } /* 5.30: the button's own shape */
|
|
365
|
+
.aura-skel--action.is-footer { width: 100%; }
|
|
366
|
+
.aura-table__td.is-end > .aura-skel-lines { align-items: flex-end; }
|
|
367
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
368
|
+
.aura-skel--action.is-touch { height: var(--aura-touch-target); }
|
|
369
|
+
.aura-skel--action.is-touch:not(.is-footer) { width: var(--aura-touch-target); }
|
|
370
|
+
}
|
|
341
371
|
.aura-sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
|
|
342
372
|
|
|
343
373
|
/* Empty state */
|
|
@@ -363,12 +393,12 @@ a.aura-icon-btn { text-decoration: none; }
|
|
|
363
393
|
box-sizing: border-box; width: 100%; height: 100%;
|
|
364
394
|
display: inline-flex; align-items: center; justify-content: center;
|
|
365
395
|
border: 1.5px solid var(--aura-border-control); border-radius: var(--aura-radius-xs);
|
|
366
|
-
background: var(--aura-bg-surface); color: var(--aura-
|
|
396
|
+
background: var(--aura-bg-surface); color: var(--aura-control-checked-fg);
|
|
367
397
|
transition: background var(--aura-duration-fast) var(--aura-ease), border-color var(--aura-duration-fast) var(--aura-ease);
|
|
368
398
|
pointer-events: none;
|
|
369
399
|
}
|
|
370
400
|
.aura-check__input:checked + .aura-check__box,
|
|
371
|
-
.aura-check__input:indeterminate + .aura-check__box { background: var(--aura-
|
|
401
|
+
.aura-check__input:indeterminate + .aura-check__box { background: var(--aura-control-checked-bg); border-color: var(--aura-control-checked-bg); }
|
|
372
402
|
.aura-check__input:focus-visible + .aura-check__box { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
|
|
373
403
|
.aura-table__mono { font-family: var(--font-mono); }
|
|
374
404
|
|
|
@@ -381,6 +411,7 @@ a.aura-icon-btn { text-decoration: none; }
|
|
|
381
411
|
border-radius: var(--aura-radius-full);
|
|
382
412
|
padding: 2px var(--aura-space-2) 2px 6px;
|
|
383
413
|
font-size: 11px;
|
|
414
|
+
font-weight: 500; /* 5.30 (Chamber-OS 137): medium everywhere, not the parent's weight; Badge stays 600 */
|
|
384
415
|
line-height: 16px;
|
|
385
416
|
white-space: nowrap;
|
|
386
417
|
background: var(--aura-status-neutral-bg);
|
|
@@ -511,30 +542,31 @@ a.aura-icon-btn { text-decoration: none; }
|
|
|
511
542
|
border: 1.5px solid var(--aura-border-control); background: var(--aura-bg-input); cursor: inherit;
|
|
512
543
|
transition: border-width var(--aura-duration-fast) var(--aura-ease);
|
|
513
544
|
}
|
|
514
|
-
.aura-radio:checked { border: 5px solid var(--aura-
|
|
545
|
+
.aura-radio:checked { border: 5px solid var(--aura-control-checked-bg); background: var(--aura-control-checked-fg); }
|
|
515
546
|
.aura-radio:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
|
|
516
547
|
.aura-radio-group.is-invalid .aura-radio:not(:checked) { border-color: var(--aura-border-danger); }
|
|
517
548
|
|
|
518
549
|
.aura-switch-row { display: flex; align-items: flex-start; gap: var(--aura-space-3); font-family: var(--font-sans); }
|
|
519
550
|
/* 5.10.1: disabled rows, on or off, are treated alike and stay readable — the label turns secondary, the description
|
|
520
|
-
* keeps its colour (often the reason it's locked) — and only the switch fades: off to the disabled opacity, on
|
|
551
|
+
* keeps its colour (often the reason it's locked) — and only the switch fades: off to the disabled opacity, on keeps its track and fades its thumb (5.30: the violet track at 0.75 fell under 3:1),
|
|
521
552
|
* ≥3:1 apart in both themes, so "locked on" never looks like "off". */
|
|
522
553
|
.aura-switch-row.is-disabled { cursor: not-allowed; }
|
|
523
554
|
.aura-switch-row.is-disabled .aura-choice__label { color: var(--aura-fg-secondary); cursor: not-allowed; }
|
|
524
555
|
.aura-switch:disabled { opacity: var(--aura-disabled-opacity); }
|
|
525
|
-
.aura-switch.is-on:disabled { opacity:
|
|
556
|
+
.aura-switch.is-on:disabled { opacity: 1; } /* 5.30: the violet track stays whole (faded, it fell under 3:1 from off)… */
|
|
557
|
+
.aura-switch.is-on:disabled .aura-switch__thumb { opacity: 0.6; } /* …and the thumb fades, so it doesn't look enabled */
|
|
526
558
|
.aura-switch {
|
|
527
559
|
position: relative; flex: none; box-sizing: border-box; margin: 0; padding: 0;
|
|
528
560
|
width: var(--aura-switch-width); height: var(--aura-switch-height); border-radius: var(--aura-radius-full);
|
|
529
561
|
border: 0; background: var(--aura-border-control); cursor: pointer;
|
|
530
562
|
transition: background var(--aura-duration-fast) var(--aura-ease);
|
|
531
563
|
}
|
|
532
|
-
.aura-switch.is-on { background: var(--aura-
|
|
564
|
+
.aura-switch.is-on { background: var(--aura-control-checked-bg); }
|
|
533
565
|
.aura-switch__thumb {
|
|
534
566
|
position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: var(--aura-radius-full);
|
|
535
567
|
background: var(--aura-bg-surface); transition: transform var(--aura-duration-fast) var(--aura-ease);
|
|
536
568
|
}
|
|
537
|
-
.aura-switch.is-on .aura-switch__thumb { transform: translateX(16px); background: var(--aura-
|
|
569
|
+
.aura-switch.is-on .aura-switch__thumb { transform: translateX(16px); background: var(--aura-control-checked-fg); }
|
|
538
570
|
.aura-switch:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
|
|
539
571
|
.aura-switch:disabled { cursor: not-allowed; }
|
|
540
572
|
/* 5.19 (Chamber-OS 113): a read-only switch keeps its colours (a locked "on" reads as on at full contrast) and stays
|
|
@@ -707,7 +739,7 @@ a.aura-icon-btn { text-decoration: none; }
|
|
|
707
739
|
transition: color var(--aura-duration-fast) var(--aura-ease), border-color var(--aura-duration-fast) var(--aura-ease);
|
|
708
740
|
}
|
|
709
741
|
.aura-tab:hover { color: var(--aura-fg-primary); }
|
|
710
|
-
.aura-tab.is-active { color: var(--aura-fg-primary); border-bottom-color: var(--aura-
|
|
742
|
+
.aura-tab.is-active { color: var(--aura-fg-primary); border-bottom-color: var(--aura-control-checked-bg); }
|
|
711
743
|
.aura-tab:disabled, .aura-tab.is-disabled { opacity: var(--aura-disabled-opacity); cursor: not-allowed; }
|
|
712
744
|
a.aura-tab { text-decoration: none; }
|
|
713
745
|
.aura-tab:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: -4px; border-radius: var(--aura-radius-xs); }
|
|
@@ -914,7 +946,7 @@ a.aura-tab { text-decoration: none; }
|
|
|
914
946
|
.aura-cal__day:hover { background: var(--aura-bg-surface-hover); }
|
|
915
947
|
.aura-cal__day.is-outside { color: var(--aura-fg-tertiary); }
|
|
916
948
|
.aura-cal__day.is-today { box-shadow: inset 0 0 0 1px var(--aura-border-control); font-weight: 600; }
|
|
917
|
-
.aura-cal__day.is-selected { background: var(--aura-
|
|
949
|
+
.aura-cal__day.is-selected { background: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); box-shadow: none; }
|
|
918
950
|
.aura-cal__day:disabled, .aura-cal__day[aria-disabled='true'] { opacity: var(--aura-disabled-opacity); cursor: not-allowed; background: transparent; text-decoration: line-through; }
|
|
919
951
|
.aura-cal__day:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; }
|
|
920
952
|
.aura-cal__grid td.is-in-range { background: var(--aura-bg-selected); }
|
|
@@ -927,7 +959,7 @@ a.aura-tab { text-decoration: none; }
|
|
|
927
959
|
font: inherit; font-size: 13px; font-variant-numeric: tabular-nums; cursor: pointer;
|
|
928
960
|
}
|
|
929
961
|
.aura-cal__year:hover { background: var(--aura-bg-surface-hover); }
|
|
930
|
-
.aura-cal__year.is-selected { background: var(--aura-
|
|
962
|
+
.aura-cal__year.is-selected { background: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); }
|
|
931
963
|
.aura-cal__foot { display: flex; justify-content: space-between; margin-top: var(--aura-space-2); padding-top: var(--aura-space-2); border-top: 1px solid var(--aura-border-subtle); }
|
|
932
964
|
.aura-cal__link {
|
|
933
965
|
height: var(--aura-control-sm); padding: 0 var(--aura-space-2); border: 0; border-radius: var(--aura-radius-sm);
|
|
@@ -1041,8 +1073,10 @@ a.aura-tab { text-decoration: none; }
|
|
|
1041
1073
|
.aura-shell__content:not(.is-flush) > .aura-container { padding-left: 0; padding-right: 0; }
|
|
1042
1074
|
|
|
1043
1075
|
/* Totals row (4.19): under the body, a strong top edge; sticky at the bottom of a `height` table with stickyFooter. */
|
|
1044
|
-
.
|
|
1045
|
-
|
|
1076
|
+
/* 5.30: a 2px hairline-colour rule over the totals (border-strong was a glaring white line in dark); a pinned totals row
|
|
1077
|
+
* casts a soft shadow over the rows scrolling under it. */
|
|
1078
|
+
.aura-table__total { background: var(--aura-table-head-bg); border-top: 2px solid var(--aura-border-default); font-weight: 600; }
|
|
1079
|
+
.aura-table__total.is-sticky { position: sticky; bottom: 0; z-index: 3; box-shadow: 0 -6px 8px -6px var(--aura-scroll-shadow); }
|
|
1046
1080
|
.aura-table__total .aura-table__td.is-end { font-variant-numeric: tabular-nums; }
|
|
1047
1081
|
.aura-tooltip--above { transform: translateY(-100%); max-width: min(var(--aura-tooltip-max), 90vw); white-space: normal; }
|
|
1048
1082
|
|
|
@@ -1135,7 +1169,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
|
|
|
1135
1169
|
.aura-badge {
|
|
1136
1170
|
display: inline-flex; align-items: center; gap: 4px; height: 20px; padding: 0 var(--aura-space-2); box-sizing: border-box;
|
|
1137
1171
|
border-radius: var(--aura-radius-full); border: 1px solid transparent; font-family: var(--font-sans); font-size: 11px; font-weight: 600; line-height: 1; white-space: nowrap; font-variant-numeric: tabular-nums;
|
|
1138
|
-
background: var(--aura-
|
|
1172
|
+
background: var(--aura-status-neutral-bg); color: var(--aura-status-neutral-fg); /* 5.30: surface-hover vanished on the light canvas */
|
|
1139
1173
|
}
|
|
1140
1174
|
.aura-badge--accent { background: var(--aura-alert-info-bg); color: var(--aura-alert-info-fg); }
|
|
1141
1175
|
.aura-badge--success { background: var(--aura-alert-success-bg); color: var(--aura-alert-success-fg); }
|
|
@@ -1198,7 +1232,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
|
|
|
1198
1232
|
.aura-empty { display: flex; flex-direction: column; align-items: center; text-align: center; gap: var(--aura-space-2); padding: var(--aura-space-12) var(--aura-space-6); font-family: var(--font-sans); color: var(--aura-fg-primary); }
|
|
1199
1233
|
.aura-empty.is-sm { padding: var(--aura-space-6) var(--aura-space-4); }
|
|
1200
1234
|
.aura-empty.is-bordered { border: 1px dashed var(--aura-border-control); border-radius: var(--aura-radius-lg); }
|
|
1201
|
-
.aura-empty__icon { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; margin-bottom: var(--aura-space-2); border-radius: var(--aura-radius-full); background: var(--aura-
|
|
1235
|
+
.aura-empty__icon { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; margin-bottom: var(--aura-space-2); border-radius: var(--aura-radius-full); background: var(--aura-status-neutral-bg); color: var(--aura-fg-secondary); }
|
|
1202
1236
|
.aura-empty.is-sm .aura-empty__icon { width: 36px; height: 36px; }
|
|
1203
1237
|
.aura-empty__title { margin: 0; font-size: 16px; line-height: 1.5; font-weight: 600; }
|
|
1204
1238
|
.aura-empty__text { margin: 0; max-width: 44ch; font-size: 14px; line-height: 1.6; color: var(--aura-fg-secondary); }
|
|
@@ -1216,7 +1250,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
|
|
|
1216
1250
|
border: 0; border-radius: var(--aura-radius-full); background: transparent; color: var(--aura-fg-primary); font: inherit; font-variant-numeric: tabular-nums; text-decoration: none; cursor: pointer;
|
|
1217
1251
|
}
|
|
1218
1252
|
.aura-page:hover { background: var(--aura-bg-surface-hover); }
|
|
1219
|
-
.aura-page.is-current { background: var(--aura-
|
|
1253
|
+
.aura-page.is-current { background: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); font-weight: 600; }
|
|
1220
1254
|
.aura-page:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
|
|
1221
1255
|
.aura-pagination__gap { min-width: 24px; text-align: center; color: var(--aura-fg-secondary); }
|
|
1222
1256
|
.aura-pagination__compact { display: none; padding: 0 var(--aura-space-2); color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; }
|
|
@@ -1310,7 +1344,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1310
1344
|
color: var(--aura-fg-secondary); font-size: 13px; font-weight: 600; font-variant-numeric: tabular-nums;
|
|
1311
1345
|
}
|
|
1312
1346
|
.aura-stepper__marker .aura-icon { width: 16px; height: 16px; }
|
|
1313
|
-
.aura-stepper__item.is-done .aura-stepper__marker { background: var(--aura-
|
|
1347
|
+
.aura-stepper__item.is-done .aura-stepper__marker { background: var(--aura-control-checked-bg); border-color: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); }
|
|
1314
1348
|
.aura-stepper__item.is-current .aura-stepper__marker { border: 2px solid var(--aura-fg-accent); color: var(--aura-fg-accent); }
|
|
1315
1349
|
.aura-stepper__text { display: flex; flex-direction: column; min-width: 0; padding-top: 4px; }
|
|
1316
1350
|
.aura-stepper__label { font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--aura-fg-secondary); }
|
|
@@ -1323,12 +1357,12 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1323
1357
|
}
|
|
1324
1358
|
.aura-stepper--horizontal .aura-stepper__step { flex-direction: column; gap: var(--aura-space-2); }
|
|
1325
1359
|
.aura-stepper--horizontal .aura-stepper__text { padding-top: 0; }
|
|
1326
|
-
.aura-stepper--horizontal .aura-stepper__item.is-done::after { background: var(--aura-
|
|
1360
|
+
.aura-stepper--horizontal .aura-stepper__item.is-done::after { background: var(--aura-control-checked-bg); }
|
|
1327
1361
|
.aura-stepper--vertical .aura-stepper__item { flex: none; padding-bottom: var(--aura-space-5); }
|
|
1328
1362
|
.aura-stepper--vertical .aura-stepper__item:not(:last-child)::after {
|
|
1329
1363
|
content: ""; position: absolute; left: 14px; top: 32px; bottom: 4px; width: 1px; background: var(--aura-border-control);
|
|
1330
1364
|
}
|
|
1331
|
-
.aura-stepper--vertical .aura-stepper__item.is-done::after { background: var(--aura-
|
|
1365
|
+
.aura-stepper--vertical .aura-stepper__item.is-done::after { background: var(--aura-control-checked-bg); }
|
|
1332
1366
|
.aura-stepper__compact { display: none; margin: var(--aura-space-2) 0 0; font-size: 13px; }
|
|
1333
1367
|
.aura-stepper__count { color: var(--aura-fg-secondary); margin-right: var(--aura-space-2); }
|
|
1334
1368
|
.aura-stepper__compact-label { font-weight: 600; }
|
|
@@ -1347,15 +1381,16 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1347
1381
|
.aura-segmented.is-full { display: flex; width: 100%; }
|
|
1348
1382
|
.aura-segmented__option {
|
|
1349
1383
|
flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
|
|
1350
|
-
height:
|
|
1384
|
+
height: calc(var(--aura-input-height) - 6px); /* 5.30: the control is as tall as a field beside it (2px padding, 1px edge) */
|
|
1385
|
+
padding: 0 var(--aura-space-4); box-sizing: border-box;
|
|
1351
1386
|
border: 0; border-radius: var(--aura-radius-full); background: transparent; color: var(--aura-fg-secondary);
|
|
1352
1387
|
font: inherit; font-size: 13px; font-weight: 500; white-space: nowrap; cursor: pointer;
|
|
1353
1388
|
transition: background-color var(--aura-duration-fast) var(--aura-ease), color var(--aura-duration-fast) var(--aura-ease), box-shadow var(--aura-duration-fast) var(--aura-ease);
|
|
1354
1389
|
}
|
|
1355
1390
|
.aura-segmented.is-full .aura-segmented__option { flex: 1 1 0; min-width: 0; }
|
|
1356
|
-
.aura-segmented__option.is-icon { padding: 0; width:
|
|
1391
|
+
.aura-segmented__option.is-icon { padding: 0; width: calc(var(--aura-input-height) - 6px); } /* 5.30: square */
|
|
1357
1392
|
.aura-segmented__option:hover:not(:disabled):not(.is-selected) { color: var(--aura-fg-primary); }
|
|
1358
|
-
.aura-segmented__option.is-selected { background: var(--aura-bg
|
|
1393
|
+
.aura-segmented__option.is-selected { background: var(--aura-segmented-thumb-bg); color: var(--aura-fg-primary); font-weight: 600; box-shadow: inset 0 0 0 1px var(--aura-border-control), var(--aura-shadow-enterprise); } /* 5.2: the edge marks the choice at 3:1; the fill alone was 1.04:1 on the track */
|
|
1359
1394
|
.aura-segmented__option:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; }
|
|
1360
1395
|
.aura-segmented__option:disabled { opacity: var(--aura-disabled-opacity); cursor: default; }
|
|
1361
1396
|
.aura-segmented--sm .aura-segmented__option { height: 24px; padding: 0 var(--aura-space-3); font-size: 12px; }
|
|
@@ -1453,11 +1488,33 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1453
1488
|
.aura-check--labelled .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
|
|
1454
1489
|
.aura-switch-row:not(.is-disabled):not(.is-readonly) { cursor: pointer; }
|
|
1455
1490
|
.aura-radio-group__list { gap: 0; }
|
|
1456
|
-
.aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); }
|
|
1491
|
+
.aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
|
|
1492
|
+
}
|
|
1493
|
+
/* 5.30 (Chamber-OS 135): `touchHeight` on TextField, Textarea, Select, RadioGroup and Checkbox — 44px boxes and choice
|
|
1494
|
+
* rows (a one-line label centred), below 640px or on a coarse pointer (is-touch) or at every width (is-touch-always).
|
|
1495
|
+
* The field's own --aura-input-height wins over any density around it. */
|
|
1496
|
+
.aura-field.is-touch-always { --aura-input-height: var(--aura-touch-target); }
|
|
1497
|
+
.aura-radio-group.is-touch-always .aura-choice, .aura-check--labelled.is-touch-always {
|
|
1498
|
+
box-sizing: border-box; min-height: var(--aura-touch-target); padding-block: calc((var(--aura-touch-target) - 20px) / 2);
|
|
1499
|
+
}
|
|
1500
|
+
.aura-check--labelled.is-touch-always .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
|
|
1501
|
+
.aura-radio-group.is-touch-always .aura-radio-group__list { gap: 0; }
|
|
1502
|
+
.aura-radio-group.is-touch-always .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
|
|
1503
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1504
|
+
.aura-field.is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1505
|
+
.aura-radio-group.is-touch .aura-choice, .aura-check--labelled.is-touch {
|
|
1506
|
+
box-sizing: border-box; min-height: var(--aura-touch-target); padding-block: calc((var(--aura-touch-target) - 20px) / 2);
|
|
1507
|
+
}
|
|
1508
|
+
.aura-check--labelled.is-touch .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
|
|
1509
|
+
.aura-radio-group.is-touch .aura-radio-group__list { gap: 0; }
|
|
1510
|
+
.aura-radio-group.is-touch .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
|
|
1457
1511
|
}
|
|
1458
1512
|
|
|
1459
1513
|
/* PasswordField: the show/hide IconButton sits in the suffix slot, 6px from the edge */
|
|
1460
1514
|
.aura-password .aura-input__suffix { padding-right: 6px; display: flex; align-items: center; }
|
|
1515
|
+
/* 5.30: a button inside a field (show password) is as quiet as the field's other icons until hovered. */
|
|
1516
|
+
.aura-input .aura-icon-btn { color: var(--aura-fg-secondary); }
|
|
1517
|
+
.aura-input .aura-icon-btn:hover:not(:disabled) { color: var(--aura-fg-primary); }
|
|
1461
1518
|
|
|
1462
1519
|
/* FormErrorSummary: a danger alert whose items link to their fields */
|
|
1463
1520
|
.aura-error-summary:focus-visible, .aura-error-summary:focus { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
|
|
@@ -1550,6 +1607,12 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1550
1607
|
.aura-filterselect__name { flex: none; white-space: nowrap; color: var(--aura-fg-secondary); }
|
|
1551
1608
|
.aura-filterselect__value { min-width: 0; font-weight: 500; overflow-wrap: anywhere; }
|
|
1552
1609
|
.aura-filterselect__chevron { flex: none; width: 14px; height: 14px; color: var(--aura-fg-secondary); }
|
|
1610
|
+
/* 5.30: from 640px the face has a field's inset and text size, like the search box beside it; phones keep the tight
|
|
1611
|
+
* face so three filters and a chip share one row. */
|
|
1612
|
+
@media (min-width: 640px) {
|
|
1613
|
+
.aura-filterselect__face { padding-inline: var(--aura-space-3) var(--aura-space-2); font-size: 14px; }
|
|
1614
|
+
.aura-filterselect__chevron { width: var(--aura-icon-sm); height: var(--aura-icon-sm); }
|
|
1615
|
+
}
|
|
1553
1616
|
.aura-filterselect.is-open .aura-filterselect__chevron { transform: rotate(180deg); }
|
|
1554
1617
|
.aura-filterselect__face:focus-visible, .aura-filterselect:has(.aura-filterselect__native:focus-visible) .aura-filterselect__face {
|
|
1555
1618
|
outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; border-color: var(--aura-border-strong);
|
|
@@ -1719,21 +1782,35 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1719
1782
|
/* DataTable's grid look — mono header band, hairlines, 20px outer radius — on plain <table> markup, with wrapping text. */
|
|
1720
1783
|
.aura-tbl-wrap {
|
|
1721
1784
|
overflow-x: auto; border: 1px solid var(--aura-border-default); border-radius: var(--aura-card-radius);
|
|
1722
|
-
|
|
1785
|
+
color: var(--aura-fg-primary); font-family: var(--font-sans);
|
|
1786
|
+
/* 5.30: a table wider than its box shows a soft shadow at the edge that has more to scroll to (CSS only: the covers
|
|
1787
|
+
* scroll with the content, the shadows stay with the box). Body rows show it; the header band and totals rows, with
|
|
1788
|
+
* their own fill, cover it. Set --aura-tbl-bg if you give the box another ground. A flush table has none. */
|
|
1789
|
+
background:
|
|
1790
|
+
linear-gradient(to right, var(--aura-tbl-bg, var(--aura-bg-surface)) 30%, transparent) left / 32px 100% no-repeat local,
|
|
1791
|
+
linear-gradient(to left, var(--aura-tbl-bg, var(--aura-bg-surface)) 30%, transparent) right / 32px 100% no-repeat local,
|
|
1792
|
+
linear-gradient(to right, var(--aura-scroll-shadow), transparent) left / 12px 100% no-repeat scroll,
|
|
1793
|
+
linear-gradient(to left, var(--aura-scroll-shadow), transparent) right / 12px 100% no-repeat scroll,
|
|
1794
|
+
var(--aura-tbl-bg, var(--aura-bg-surface));
|
|
1723
1795
|
}
|
|
1724
1796
|
.aura-tbl { width: 100%; border-collapse: collapse; border-spacing: 0; font-size: 13px; line-height: 20px; }
|
|
1725
|
-
.aura-tbl__caption { caption-side: top; padding: var(--aura-space-4) var(--aura-space-6)
|
|
1797
|
+
.aura-tbl__caption { caption-side: top; padding: var(--aura-space-4) var(--aura-space-6) var(--aura-space-3); text-align: left; font-size: 14px; font-weight: 600; }
|
|
1798
|
+
/* 5.30: from 640px a cell is at least 10ch wide, so the table never squeezes a column to one letter; a longer word (an
|
|
1799
|
+
* email, a URL) still breaks to fit instead of widening the table. Phones keep fitting the box: use stackBelow there. */
|
|
1726
1800
|
.aura-tbl__th, .aura-tbl__td { padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); text-align: left; vertical-align: top; overflow-wrap: anywhere; }
|
|
1801
|
+
@media (min-width: 640px) { .aura-tbl__th, .aura-tbl__td { min-width: 10ch; } }
|
|
1727
1802
|
.aura-tbl__th:first-child, .aura-tbl__td:first-child { padding-left: var(--aura-space-6); }
|
|
1728
1803
|
.aura-tbl__th:last-child, .aura-tbl__td:last-child { padding-right: var(--aura-space-6); }
|
|
1729
1804
|
.aura-tbl__head .aura-tbl__th {
|
|
1730
|
-
background: var(--aura-bg
|
|
1805
|
+
background: var(--aura-table-head-bg); border-bottom: 1px solid var(--aura-border-default);
|
|
1731
1806
|
font-family: var(--font-mono); font-size: 12px; font-weight: 400; color: var(--aura-fg-secondary); white-space: nowrap;
|
|
1732
1807
|
}
|
|
1733
1808
|
.aura-tbl__body .aura-tbl__row + .aura-tbl__row > * { border-top: 1px solid var(--aura-border-default); }
|
|
1734
1809
|
.aura-tbl__body .aura-tbl__th { font-weight: 500; }
|
|
1735
|
-
.aura-tbl__foot > .aura-tbl__row > * { background: var(--aura-bg
|
|
1736
|
-
.aura-tbl__foot > .aura-tbl__row:first-child > * { border-top:
|
|
1810
|
+
.aura-tbl__foot > .aura-tbl__row > * { background: var(--aura-table-head-bg); font-weight: 600; }
|
|
1811
|
+
.aura-tbl__foot > .aura-tbl__row:first-child > * { border-top: 2px solid var(--aura-border-default); }
|
|
1812
|
+
/* 5.30: with several totals rows (Subtotal, VAT, Total) the last one reads as the total. */
|
|
1813
|
+
.aura-tbl__foot > .aura-tbl__row:last-child:not(:first-child) > * { font-size: 14px; font-weight: 700; }
|
|
1737
1814
|
.aura-tbl__foot > .aura-tbl__row + .aura-tbl__row > * { border-top: 1px solid var(--aura-border-default); }
|
|
1738
1815
|
.aura-tbl .is-end { text-align: right; }
|
|
1739
1816
|
.aura-tbl .is-center { text-align: center; }
|
|
@@ -1777,7 +1854,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1777
1854
|
@container aura-tbl (width < 768px) {
|
|
1778
1855
|
.aura-tbl--stack-md, .aura-tbl--stack-md > .aura-tbl__body, .aura-tbl--stack-md > .aura-tbl__foot, .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { display: block; }
|
|
1779
1856
|
.aura-tbl--stack-md > .aura-tbl__head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
|
|
1780
|
-
.aura-tbl--stack-md > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4)
|
|
1857
|
+
.aura-tbl--stack-md > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) var(--aura-space-3); }
|
|
1781
1858
|
.aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { height: auto; padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); }
|
|
1782
1859
|
.aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row + .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row:first-child { border-top: 1px solid var(--aura-border-default); }
|
|
1783
1860
|
.aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
|
|
@@ -1801,7 +1878,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1801
1878
|
@container aura-tbl (width < 640px) {
|
|
1802
1879
|
.aura-tbl--stack-sm, .aura-tbl--stack-sm > .aura-tbl__body, .aura-tbl--stack-sm > .aura-tbl__foot, .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { display: block; }
|
|
1803
1880
|
.aura-tbl--stack-sm > .aura-tbl__head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
|
|
1804
|
-
.aura-tbl--stack-sm > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4)
|
|
1881
|
+
.aura-tbl--stack-sm > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) var(--aura-space-3); }
|
|
1805
1882
|
.aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { height: auto; padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); }
|
|
1806
1883
|
.aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row + .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row:first-child { border-top: 1px solid var(--aura-border-default); }
|
|
1807
1884
|
.aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
|
|
@@ -1835,7 +1912,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1835
1912
|
margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
|
|
1836
1913
|
border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
|
|
1837
1914
|
}
|
|
1838
|
-
.aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg
|
|
1915
|
+
.aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-table-head-bg); }
|
|
1839
1916
|
.aura-tbl--cards.aura-tbl--stack-md > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
|
|
1840
1917
|
.aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
|
|
1841
1918
|
}
|
|
@@ -1848,7 +1925,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1848
1925
|
margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
|
|
1849
1926
|
border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
|
|
1850
1927
|
}
|
|
1851
|
-
.aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg
|
|
1928
|
+
.aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-table-head-bg); }
|
|
1852
1929
|
.aura-tbl--cards.aura-tbl--stack-sm > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
|
|
1853
1930
|
.aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
|
|
1854
1931
|
}
|
|
@@ -1952,7 +2029,13 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1952
2029
|
/* 5.22: a footer row ends the card with no margin under it, so the card keeps its full 16px. */
|
|
1953
2030
|
.aura-table__row:has(> [data-card='footer']:not(.is-blank)) { padding-bottom: var(--aura-space-4); }
|
|
1954
2031
|
.aura-table__row--skeleton .aura-table__td { display: flex; }
|
|
1955
|
-
.
|
|
2032
|
+
/* 5.29: a skeleton field shows its label above a bar on the field's value line (15px: 13px text, normal line
|
|
2033
|
+
* height — 1lh, so it follows the font), as a real field does; the title keeps the 20px line. */
|
|
2034
|
+
.aura-table__row--skeleton .aura-table__td[data-label] { flex-direction: column; align-items: stretch; }
|
|
2035
|
+
.aura-table__row--skeleton .aura-table__td > .aura-skel:not(.aura-skel--pill):not(.aura-skel--action) { margin: 5px 0; }
|
|
2036
|
+
.aura-table__row--skeleton .aura-table__td[data-label] .aura-skel:not(.aura-skel--pill):not(.aura-skel--action) { margin: 2.5px 0; margin: calc((1lh - 10px) / 2) 0; }
|
|
2037
|
+
.aura-table__row--skeleton .aura-table__td > .aura-skel-lines { align-items: flex-start; }
|
|
2038
|
+
.aura-table__total { background: var(--aura-table-head-bg); }
|
|
1956
2039
|
.aura-table__total > .is-blank { display: none; }
|
|
1957
2040
|
.aura-table__foot { border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); margin-top: var(--aura-space-2); background: var(--aura-bg-surface); }
|
|
1958
2041
|
.aura-table__empty { background: var(--aura-bg-surface); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); }
|
|
@@ -1982,3 +2065,25 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1982
2065
|
.aura-tabs--segmented .aura-tab.aura-segmented__option.is-selected { outline: none; border: 2px solid Highlight; }
|
|
1983
2066
|
.aura-tabs--segmented .aura-tab.aura-segmented__option:focus-visible { outline: 2px dashed CanvasText; outline-offset: -5px; }
|
|
1984
2067
|
}
|
|
2068
|
+
|
|
2069
|
+
/* 5.30: Thai needs more room than Latin — tone marks and vowels stack above and below the line. Where the page or a
|
|
2070
|
+
* part of it is Thai (lang="th"), small labels are at least 12px and lines are taller. */
|
|
2071
|
+
.aura-pill:lang(th), .aura-badge:lang(th), .aura-tab__count:lang(th) { font-size: 12px; }
|
|
2072
|
+
.aura-pill:lang(th) { line-height: 18px; }
|
|
2073
|
+
.aura-skel--pill:lang(th) { height: 22px; } /* the loading pill stays as tall as the Thai one */
|
|
2074
|
+
.aura-bottomnav__item:lang(th) { font-size: 12px; line-height: 18px; }
|
|
2075
|
+
.aura-stepper__desc:lang(th) { font-size: 13px; line-height: 1.6; }
|
|
2076
|
+
.aura-nav__label:lang(th) { line-height: 22px; }
|
|
2077
|
+
/* 5.30 (audit D): field labels, hints and errors and choice descriptions get Thai line room; a stacked card's field
|
|
2078
|
+
* labels are 12px in the sans face (the mono face has no Thai), and a stacked DataTable card's values sit on a set
|
|
2079
|
+
* 1.6 line, so a loading card (its bars follow 1lh) is as tall as one with Thai text. */
|
|
2080
|
+
.aura-field__label:lang(th), .aura-field__hint:lang(th), .aura-field__error:lang(th) { line-height: 1.6; }
|
|
2081
|
+
.aura-choice__desc:lang(th), .aura-check__desc:lang(th) { font-size: 13px; line-height: 1.6; }
|
|
2082
|
+
.aura-tbl__row > .aura-tbl__td[data-label]:lang(th)::before, .aura-table__td[data-label]:lang(th)::before { font-family: var(--font-sans); font-size: 12px; line-height: 18px; }
|
|
2083
|
+
.aura-table--stacked .aura-table__td[data-label]:lang(th) { line-height: 1.6; }
|
|
2084
|
+
|
|
2085
|
+
/* 5.30: a plain link (no class) inside AURA's surfaces takes the accent colour instead of the browser's blue. Zero
|
|
2086
|
+
* specificity, so any rule of yours for links wins. */
|
|
2087
|
+
:where(.aura-card, .aura-stat, .aura-alert, .aura-empty, .aura-field, .aura-tabs__panel, .aura-shell__main, .aura-tbl, .aura-table, .aura-dialog) :where(a:not([class])) {
|
|
2088
|
+
color: var(--aura-fg-accent); text-underline-offset: 2px;
|
|
2089
|
+
}
|