@jirawatpyk/aura-react 5.47.0 → 5.49.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 +11 -1
- package/dist/aura.bundle.js +15 -3
- package/dist/cjs/index.cjs +15 -3
- package/dist/esm/AppShell.js +14 -3
- package/dist/esm/PageHeader.js +1 -0
- package/dist/index.d.cts +6 -5
- package/dist/index.d.ts +6 -5
- package/dist/server/index.cjs +1 -0
- package/dist/server/index.d.cts +6 -2
- package/dist/server/index.d.ts +6 -2
- package/dist/server/index.js +1 -0
- package/dist/styles.css +26 -7
- package/dist/styles.layer.css +26 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -186,6 +186,16 @@ DataTable with sort and page in the URL (4.17): `onStateChange={({ sort, page })
|
|
|
186
186
|
- **Time zone**: `timeZone` on AuraProvider, DatePicker, DateRangePicker and Calendar decides "today" (the marker, `min`/`max="today"`, the first month shown); or pass `today` as an ISO date. `todayIn('Asia/Bangkok')` is exported from the root and `/server`.
|
|
187
187
|
- **Toasts** queue past three instead of dropping: six in a row all show, in order, three at a time.
|
|
188
188
|
|
|
189
|
+
## 5.49 — Chamber-OS addendum 56 (#155)
|
|
190
|
+
|
|
191
|
+
- **The short-screen threshold follows the browser's text size**: the height at which bottom bars stop pinning (5.48, #154) is `30rem`, not `480px`. In a media query `rem` is the browser's default font size (Chrome, Edge, Firefox; not iOS Dynamic Type or Safari's text size), not the page's `html` font size: 480px at the default 16px (nothing changes), 720px at 24px (an iPhone SE counts as short, an 844px phone keeps the bar), 960px at 32px (an 844px phone counts as short — it holds what a 422px screen holds at 16px). There the `actionsBarBelow` actions stay in the header, an ActionBar sits at the end of its container and AppShell's top bar scrolls away, as at 400% zoom. Changing the text size on an open page re-checks it (the bar-height tokens follow). The width breakpoints stay in px.
|
|
192
|
+
|
|
193
|
+
## 5.48 — Chamber-OS addendum 55 (#153–154)
|
|
194
|
+
|
|
195
|
+
- **The `actionsBarBelow` bar is now ActionBar's edge strip** (#153): the full width of the screen, on its bottom edge (or on a BottomNav's top edge), a top border only — no radius, no shadow — with ActionBar's inner padding (8px block, 16px start, 12px end) and the home-indicator inset inside it, as the save and bulk bars of an app built on `ActionBar position="container"` look. The page's end padding and `scroll-padding-bottom` follow the new height. The layout inside is unchanged.
|
|
196
|
+
- **Bottom bars on a short screen** (#154): on a screen 30rem tall or less — 480px at the browser's default 16px text, and since 5.49 (#155) it follows the default font size set in Chrome, Edge or Firefox (960px at 32px, 720px at 24px), so large-text users get the same room (iOS Dynamic Type and Safari's text-size controls don't change it); 400% zoom on a desktop (320×256 CSS px), a phone held sideways — `actionsBarBelow` no longer fixes the actions to the bottom: they stay in the header's own row (laid out by `actionsFullWidthBelow` if set), with no status line, page-end space or scroll padding; and an `ActionBar` (either `position`) stops sticking and sits at the end of its container, in the flow. AppShell's top bar scrolls away with the page there too, so a field reached backwards (Shift+Tab) isn't left under it, and `--aura-shell-bar-height` is 0 meanwhile, so nothing sticky (a DataTable `stickyHeader`) leaves a gap for it. A focused control is never under a bar there (WCAG 2.4.11, 1.4.10); taller than 30rem everything is as before. The width breakpoints stay in px. An ActionBar with `hidesBottomNav` still hides the BottomNav on a short screen while it sits at the end of its container. Wherever a BottomNav shows (any height), the page's `scroll-padding-bottom` now reserves its height, so a field tabbed into view stops above it.
|
|
197
|
+
- **`actionsBarLook="floating"`** keeps 5.45's card (inset 16px, lifted 12px, bordered all round, rounded, with the overlay shadow) — the look of `ActionBar position="viewport"`. Only the bar's look changed; nothing else about `actionsBarBelow`.
|
|
198
|
+
|
|
189
199
|
## 5.47 — Chamber-OS addendum 54 (#152)
|
|
190
200
|
|
|
191
201
|
- **PageHeader `size="compact"`**: 26px below 640px and 32px from 640px, on a 1.2 line — the staff and list boards' title, so a company name such as "Siam Nordic Trading Co., Ltd." takes two lines on a 390px phone instead of three. The **default stays 28px / 36px** (1.15), so DxT Monitor and other apps don't change; pass `size="compact"` (Chamber-OS: in its header wrapper) where the boards draw 26 / 32.
|
|
@@ -208,7 +218,7 @@ What Chamber-OS's own page header did that PageHeader didn't, so it can be rebui
|
|
|
208
218
|
|
|
209
219
|
## 5.45 — Chamber-OS addendum 52 (#150)
|
|
210
220
|
|
|
211
|
-
- **PageHeader `actionsBarBelow`** (#150): `'sm' | 'md'` — below 640px or 768px the header's `actions` become a bar fixed to the bottom of the screen
|
|
221
|
+
- **PageHeader `actionsBarBelow`** (#150): `'sm' | 'md'` — below 640px or 768px the header's `actions` become a bar fixed to the bottom of the screen (from 5.48 ActionBar's edge strip, `actionsBarLook="floating"` for this card; above a BottomNav, clear of the home indicator), and `actionsStatus` is its status line ("Total 10,700.00 THB incl. VAT · due 22 Oct 2026", a polite live region shown only in the bar).
|
|
212
222
|
```tsx
|
|
213
223
|
<PageHeader title="Invoice SC-2026-900001" actionsFullWidthBelow="sm" actionsBarBelow="sm"
|
|
214
224
|
actionsStatus="Total 10,700.00 THB incl. VAT · due 22 Oct 2026"
|
package/dist/aura.bundle.js
CHANGED
|
@@ -7864,6 +7864,7 @@ window.Aura = (() => {
|
|
|
7864
7864
|
(hide2 === "sm" || hide2 === "md" || hide2 === "lg") && "aura-page-header--title-hide-below-" + hide2,
|
|
7865
7865
|
(hide2 === "sm" || hide2 === "md" || hide2 === "lg") && !hasMeta && "has-no-meta",
|
|
7866
7866
|
bar && "aura-page-header--actions-bar-below-" + bar,
|
|
7867
|
+
bar && props.actionsBarLook === "floating" && "aura-page-header--actions-bar-floating",
|
|
7867
7868
|
size && "aura-page-header--" + size,
|
|
7868
7869
|
props.actionsAlign === "start" && "aura-page-header--actions-start",
|
|
7869
7870
|
props.className
|
|
@@ -8309,6 +8310,9 @@ window.Aura = (() => {
|
|
|
8309
8310
|
}
|
|
8310
8311
|
|
|
8311
8312
|
// src/AppShell.tsx
|
|
8313
|
+
function pinned(bar) {
|
|
8314
|
+
return getComputedStyle(bar).position !== "static";
|
|
8315
|
+
}
|
|
8312
8316
|
var AppShell = React48.forwardRef(function AppShell2(props, ref) {
|
|
8313
8317
|
const t = useStrings();
|
|
8314
8318
|
const bp = useBreakpoint();
|
|
@@ -8329,6 +8333,7 @@ window.Aura = (() => {
|
|
|
8329
8333
|
}
|
|
8330
8334
|
const rootRef = React48.useRef(null);
|
|
8331
8335
|
const barRef = React48.useRef(null);
|
|
8336
|
+
const probeRef = React48.useRef(null);
|
|
8332
8337
|
const mergedRef = useMergedRef(ref, rootRef);
|
|
8333
8338
|
const hasBar = !!(props.header || props.nav);
|
|
8334
8339
|
const barH = React48.useState(null);
|
|
@@ -8339,7 +8344,10 @@ window.Aura = (() => {
|
|
|
8339
8344
|
function() {
|
|
8340
8345
|
const root = rootRef.current, bar = barRef.current;
|
|
8341
8346
|
if (!root || !bar) return;
|
|
8342
|
-
root.style.setProperty(
|
|
8347
|
+
root.style.setProperty(
|
|
8348
|
+
"--aura-shell-bar-height",
|
|
8349
|
+
away || !pinned(bar) ? "0px" : bar.getBoundingClientRect().height + "px"
|
|
8350
|
+
);
|
|
8343
8351
|
},
|
|
8344
8352
|
[away]
|
|
8345
8353
|
);
|
|
@@ -8349,14 +8357,17 @@ window.Aura = (() => {
|
|
|
8349
8357
|
if (!root || !bar) return;
|
|
8350
8358
|
function sync() {
|
|
8351
8359
|
const h11 = bar.getBoundingClientRect().height;
|
|
8352
|
-
root.style.setProperty("--aura-shell-bar-height", awayRef.current ? "0px" : h11 + "px");
|
|
8360
|
+
root.style.setProperty("--aura-shell-bar-height", awayRef.current || !pinned(bar) ? "0px" : h11 + "px");
|
|
8353
8361
|
if (h11 > 0) barH[1](Math.round(h11));
|
|
8354
8362
|
}
|
|
8355
8363
|
sync();
|
|
8356
8364
|
const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(sync);
|
|
8357
8365
|
if (ro) ro.observe(bar);
|
|
8366
|
+
if (ro && probeRef.current) ro.observe(probeRef.current);
|
|
8367
|
+
window.addEventListener("resize", sync);
|
|
8358
8368
|
return function() {
|
|
8359
8369
|
if (ro) ro.disconnect();
|
|
8370
|
+
window.removeEventListener("resize", sync);
|
|
8360
8371
|
root.style.removeProperty("--aura-shell-bar-height");
|
|
8361
8372
|
};
|
|
8362
8373
|
},
|
|
@@ -8436,7 +8447,8 @@ window.Aura = (() => {
|
|
|
8436
8447
|
"aria-expanded": open
|
|
8437
8448
|
}
|
|
8438
8449
|
) : null,
|
|
8439
|
-
/* @__PURE__ */ React48.createElement("div", { className: "aura-shell__bar-content" }, props.header)
|
|
8450
|
+
/* @__PURE__ */ React48.createElement("div", { className: "aura-shell__bar-content" }, props.header),
|
|
8451
|
+
/* @__PURE__ */ React48.createElement("span", { className: "aura-shell__probe", "aria-hidden": "true", ref: probeRef })
|
|
8440
8452
|
) : null, /* @__PURE__ */ React48.createElement(
|
|
8441
8453
|
"main",
|
|
8442
8454
|
{
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -7846,6 +7846,7 @@ var PageHeader = React43.forwardRef(function PageHeader2(props, ref) {
|
|
|
7846
7846
|
(hide2 === "sm" || hide2 === "md" || hide2 === "lg") && "aura-page-header--title-hide-below-" + hide2,
|
|
7847
7847
|
(hide2 === "sm" || hide2 === "md" || hide2 === "lg") && !hasMeta && "has-no-meta",
|
|
7848
7848
|
bar && "aura-page-header--actions-bar-below-" + bar,
|
|
7849
|
+
bar && props.actionsBarLook === "floating" && "aura-page-header--actions-bar-floating",
|
|
7849
7850
|
size && "aura-page-header--" + size,
|
|
7850
7851
|
props.actionsAlign === "start" && "aura-page-header--actions-start",
|
|
7851
7852
|
props.className
|
|
@@ -8291,6 +8292,9 @@ function useHideOnScroll(enabled, el, media, from) {
|
|
|
8291
8292
|
}
|
|
8292
8293
|
|
|
8293
8294
|
// src/AppShell.tsx
|
|
8295
|
+
function pinned(bar) {
|
|
8296
|
+
return getComputedStyle(bar).position !== "static";
|
|
8297
|
+
}
|
|
8294
8298
|
var AppShell = React48.forwardRef(function AppShell2(props, ref) {
|
|
8295
8299
|
const t = useStrings();
|
|
8296
8300
|
const bp = useBreakpoint();
|
|
@@ -8311,6 +8315,7 @@ var AppShell = React48.forwardRef(function AppShell2(props, ref) {
|
|
|
8311
8315
|
}
|
|
8312
8316
|
const rootRef = React48.useRef(null);
|
|
8313
8317
|
const barRef = React48.useRef(null);
|
|
8318
|
+
const probeRef = React48.useRef(null);
|
|
8314
8319
|
const mergedRef = useMergedRef(ref, rootRef);
|
|
8315
8320
|
const hasBar = !!(props.header || props.nav);
|
|
8316
8321
|
const barH = React48.useState(null);
|
|
@@ -8321,7 +8326,10 @@ var AppShell = React48.forwardRef(function AppShell2(props, ref) {
|
|
|
8321
8326
|
function() {
|
|
8322
8327
|
const root = rootRef.current, bar = barRef.current;
|
|
8323
8328
|
if (!root || !bar) return;
|
|
8324
|
-
root.style.setProperty(
|
|
8329
|
+
root.style.setProperty(
|
|
8330
|
+
"--aura-shell-bar-height",
|
|
8331
|
+
away || !pinned(bar) ? "0px" : bar.getBoundingClientRect().height + "px"
|
|
8332
|
+
);
|
|
8325
8333
|
},
|
|
8326
8334
|
[away]
|
|
8327
8335
|
);
|
|
@@ -8331,14 +8339,17 @@ var AppShell = React48.forwardRef(function AppShell2(props, ref) {
|
|
|
8331
8339
|
if (!root || !bar) return;
|
|
8332
8340
|
function sync() {
|
|
8333
8341
|
const h11 = bar.getBoundingClientRect().height;
|
|
8334
|
-
root.style.setProperty("--aura-shell-bar-height", awayRef.current ? "0px" : h11 + "px");
|
|
8342
|
+
root.style.setProperty("--aura-shell-bar-height", awayRef.current || !pinned(bar) ? "0px" : h11 + "px");
|
|
8335
8343
|
if (h11 > 0) barH[1](Math.round(h11));
|
|
8336
8344
|
}
|
|
8337
8345
|
sync();
|
|
8338
8346
|
const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(sync);
|
|
8339
8347
|
if (ro) ro.observe(bar);
|
|
8348
|
+
if (ro && probeRef.current) ro.observe(probeRef.current);
|
|
8349
|
+
window.addEventListener("resize", sync);
|
|
8340
8350
|
return function() {
|
|
8341
8351
|
if (ro) ro.disconnect();
|
|
8352
|
+
window.removeEventListener("resize", sync);
|
|
8342
8353
|
root.style.removeProperty("--aura-shell-bar-height");
|
|
8343
8354
|
};
|
|
8344
8355
|
},
|
|
@@ -8418,7 +8429,8 @@ var AppShell = React48.forwardRef(function AppShell2(props, ref) {
|
|
|
8418
8429
|
"aria-expanded": open
|
|
8419
8430
|
}
|
|
8420
8431
|
) : null,
|
|
8421
|
-
/* @__PURE__ */ React48.createElement("div", { className: "aura-shell__bar-content" }, props.header)
|
|
8432
|
+
/* @__PURE__ */ React48.createElement("div", { className: "aura-shell__bar-content" }, props.header),
|
|
8433
|
+
/* @__PURE__ */ React48.createElement("span", { className: "aura-shell__probe", "aria-hidden": "true", ref: probeRef })
|
|
8422
8434
|
) : null, /* @__PURE__ */ React48.createElement(
|
|
8423
8435
|
"main",
|
|
8424
8436
|
{
|
package/dist/esm/AppShell.js
CHANGED
|
@@ -7,6 +7,9 @@ import { useStrings } from "./locale.js";
|
|
|
7
7
|
import { useBreakpoint } from "./responsive.js";
|
|
8
8
|
import { useHideOnScroll } from "./scrollHide.js";
|
|
9
9
|
import { IconMenu } from "./icons.js";
|
|
10
|
+
function pinned(bar) {
|
|
11
|
+
return getComputedStyle(bar).position !== "static";
|
|
12
|
+
}
|
|
10
13
|
const AppShell = React.forwardRef(function AppShell2(props, ref) {
|
|
11
14
|
const t = useStrings();
|
|
12
15
|
const bp = useBreakpoint();
|
|
@@ -27,6 +30,7 @@ const AppShell = React.forwardRef(function AppShell2(props, ref) {
|
|
|
27
30
|
}
|
|
28
31
|
const rootRef = React.useRef(null);
|
|
29
32
|
const barRef = React.useRef(null);
|
|
33
|
+
const probeRef = React.useRef(null);
|
|
30
34
|
const mergedRef = useMergedRef(ref, rootRef);
|
|
31
35
|
const hasBar = !!(props.header || props.nav);
|
|
32
36
|
const barH = React.useState(null);
|
|
@@ -37,7 +41,10 @@ const AppShell = React.forwardRef(function AppShell2(props, ref) {
|
|
|
37
41
|
function() {
|
|
38
42
|
const root = rootRef.current, bar = barRef.current;
|
|
39
43
|
if (!root || !bar) return;
|
|
40
|
-
root.style.setProperty(
|
|
44
|
+
root.style.setProperty(
|
|
45
|
+
"--aura-shell-bar-height",
|
|
46
|
+
away || !pinned(bar) ? "0px" : bar.getBoundingClientRect().height + "px"
|
|
47
|
+
);
|
|
41
48
|
},
|
|
42
49
|
[away]
|
|
43
50
|
);
|
|
@@ -47,14 +54,17 @@ const AppShell = React.forwardRef(function AppShell2(props, ref) {
|
|
|
47
54
|
if (!root || !bar) return;
|
|
48
55
|
function sync() {
|
|
49
56
|
const h = bar.getBoundingClientRect().height;
|
|
50
|
-
root.style.setProperty("--aura-shell-bar-height", awayRef.current ? "0px" : h + "px");
|
|
57
|
+
root.style.setProperty("--aura-shell-bar-height", awayRef.current || !pinned(bar) ? "0px" : h + "px");
|
|
51
58
|
if (h > 0) barH[1](Math.round(h));
|
|
52
59
|
}
|
|
53
60
|
sync();
|
|
54
61
|
const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(sync);
|
|
55
62
|
if (ro) ro.observe(bar);
|
|
63
|
+
if (ro && probeRef.current) ro.observe(probeRef.current);
|
|
64
|
+
window.addEventListener("resize", sync);
|
|
56
65
|
return function() {
|
|
57
66
|
if (ro) ro.disconnect();
|
|
67
|
+
window.removeEventListener("resize", sync);
|
|
58
68
|
root.style.removeProperty("--aura-shell-bar-height");
|
|
59
69
|
};
|
|
60
70
|
},
|
|
@@ -134,7 +144,8 @@ const AppShell = React.forwardRef(function AppShell2(props, ref) {
|
|
|
134
144
|
"aria-expanded": open
|
|
135
145
|
}
|
|
136
146
|
) : null,
|
|
137
|
-
/* @__PURE__ */ React.createElement("div", { className: "aura-shell__bar-content" }, props.header)
|
|
147
|
+
/* @__PURE__ */ React.createElement("div", { className: "aura-shell__bar-content" }, props.header),
|
|
148
|
+
/* @__PURE__ */ React.createElement("span", { className: "aura-shell__probe", "aria-hidden": "true", ref: probeRef })
|
|
138
149
|
) : null, /* @__PURE__ */ React.createElement(
|
|
139
150
|
"main",
|
|
140
151
|
{
|
package/dist/esm/PageHeader.js
CHANGED
|
@@ -40,6 +40,7 @@ const PageHeader = React.forwardRef(function PageHeader2(props, ref) {
|
|
|
40
40
|
(hide === "sm" || hide === "md" || hide === "lg") && "aura-page-header--title-hide-below-" + hide,
|
|
41
41
|
(hide === "sm" || hide === "md" || hide === "lg") && !hasMeta && "has-no-meta",
|
|
42
42
|
bar && "aura-page-header--actions-bar-below-" + bar,
|
|
43
|
+
bar && props.actionsBarLook === "floating" && "aura-page-header--actions-bar-floating",
|
|
43
44
|
size && "aura-page-header--" + size,
|
|
44
45
|
props.actionsAlign === "start" && "aura-page-header--actions-start",
|
|
45
46
|
props.className
|
package/dist/index.d.cts
CHANGED
|
@@ -1974,8 +1974,8 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
1974
1974
|
* meta line and actions stay; with no meta, the actions start the header. */
|
|
1975
1975
|
titleHideBelow?: "sm" | "md" | "lg" | undefined;
|
|
1976
1976
|
/** 5.45 (Chamber-OS 150): below this breakpoint (`sm` 640px, `md` 768px) the same `actions` — rendered once, so a
|
|
1977
|
-
* dialog trigger or test id is never doubled — become a bar fixed to the bottom of the screen
|
|
1978
|
-
* above a BottomNav, clear of the home indicator, `actionsStatus` as its status line. The page's end and a focused
|
|
1977
|
+
* dialog trigger or test id is never doubled — become a bar fixed to the bottom of the screen, ActionBar's edge
|
|
1978
|
+
* strip (5.48; `actionsBarLook`): above a BottomNav, clear of the home indicator, `actionsStatus` as its status line. The page's end and a focused
|
|
1979
1979
|
* field scroll clear of it (AppShell's content, or the body, gains the bar's height). With an IconButton among them
|
|
1980
1980
|
* the actions share one row, labels wrapping inside the buttons (as `actionsFullWidthBelow`, Chamber-OS 149); with only icon
|
|
1981
1981
|
* buttons the status and the icons share one row. From the breakpoint up nothing changes. Use it for a detail page's
|
|
@@ -1983,6 +1983,10 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
1983
1983
|
* have a transform, filter, backdrop-filter, will-change, paint/layout containment or `content-visibility: auto`, or it is placed
|
|
1984
1984
|
* against that ancestor instead of the screen — the main entry warns in development. */
|
|
1985
1985
|
actionsBarBelow?: "sm" | "md" | undefined;
|
|
1986
|
+
/** 5.48 (Chamber-OS 153): the bar's look. `edge` (default) is ActionBar's strip — the full width of the screen, on
|
|
1987
|
+
* its bottom edge (or above a BottomNav), a top border only, the home-indicator inset inside it. `floating` is 5.45's
|
|
1988
|
+
* card: inset 16px, lifted 12px, bordered all round with rounded corners and a shadow. */
|
|
1989
|
+
actionsBarLook?: "edge" | "floating" | undefined;
|
|
1986
1990
|
/** 5.45: the bar's status line ("Total 10,700.00 THB incl. VAT · due 22 Oct 2026"), shown only while the actions are
|
|
1987
1991
|
* a bar, in a polite live region. */
|
|
1988
1992
|
actionsStatus?: React$1.ReactNode | undefined;
|
|
@@ -2114,9 +2118,6 @@ export declare const STRINGS: {
|
|
|
2114
2118
|
};
|
|
2115
2119
|
export declare const TileGrid: React$1.ForwardRefExoticComponent<TileGridProps & React$1.RefAttributes<HTMLUListElement>>;
|
|
2116
2120
|
export declare const Sparkline: React$1.ForwardRefExoticComponent<SparklineProps & React$1.RefAttributes<SVGSVGElement>>;
|
|
2117
|
-
/** AppShell — side navigation + top bar + content. The nav is fixed from lg (1024px) up and a Drawer below it.
|
|
2118
|
-
* Which one shows is decided in CSS (4.16), so the server's HTML is already right on a phone and nothing shifts on
|
|
2119
|
-
* hydration; JavaScript only opens and closes the drawer. */
|
|
2120
2121
|
export declare const AppShell: React$1.ForwardRefExoticComponent<AppShellProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
2121
2122
|
/** ActionBar — a bar stuck to the bottom of the screen or of a card: a status line and the form's or selection's
|
|
2122
2123
|
* actions. It is `position: sticky`, so it stays in the flow at the end of its parent and never covers the last field. */
|
package/dist/index.d.ts
CHANGED
|
@@ -1974,8 +1974,8 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
1974
1974
|
* meta line and actions stay; with no meta, the actions start the header. */
|
|
1975
1975
|
titleHideBelow?: "sm" | "md" | "lg" | undefined;
|
|
1976
1976
|
/** 5.45 (Chamber-OS 150): below this breakpoint (`sm` 640px, `md` 768px) the same `actions` — rendered once, so a
|
|
1977
|
-
* dialog trigger or test id is never doubled — become a bar fixed to the bottom of the screen
|
|
1978
|
-
* above a BottomNav, clear of the home indicator, `actionsStatus` as its status line. The page's end and a focused
|
|
1977
|
+
* dialog trigger or test id is never doubled — become a bar fixed to the bottom of the screen, ActionBar's edge
|
|
1978
|
+
* strip (5.48; `actionsBarLook`): above a BottomNav, clear of the home indicator, `actionsStatus` as its status line. The page's end and a focused
|
|
1979
1979
|
* field scroll clear of it (AppShell's content, or the body, gains the bar's height). With an IconButton among them
|
|
1980
1980
|
* the actions share one row, labels wrapping inside the buttons (as `actionsFullWidthBelow`, Chamber-OS 149); with only icon
|
|
1981
1981
|
* buttons the status and the icons share one row. From the breakpoint up nothing changes. Use it for a detail page's
|
|
@@ -1983,6 +1983,10 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
1983
1983
|
* have a transform, filter, backdrop-filter, will-change, paint/layout containment or `content-visibility: auto`, or it is placed
|
|
1984
1984
|
* against that ancestor instead of the screen — the main entry warns in development. */
|
|
1985
1985
|
actionsBarBelow?: "sm" | "md" | undefined;
|
|
1986
|
+
/** 5.48 (Chamber-OS 153): the bar's look. `edge` (default) is ActionBar's strip — the full width of the screen, on
|
|
1987
|
+
* its bottom edge (or above a BottomNav), a top border only, the home-indicator inset inside it. `floating` is 5.45's
|
|
1988
|
+
* card: inset 16px, lifted 12px, bordered all round with rounded corners and a shadow. */
|
|
1989
|
+
actionsBarLook?: "edge" | "floating" | undefined;
|
|
1986
1990
|
/** 5.45: the bar's status line ("Total 10,700.00 THB incl. VAT · due 22 Oct 2026"), shown only while the actions are
|
|
1987
1991
|
* a bar, in a polite live region. */
|
|
1988
1992
|
actionsStatus?: React$1.ReactNode | undefined;
|
|
@@ -2114,9 +2118,6 @@ export declare const STRINGS: {
|
|
|
2114
2118
|
};
|
|
2115
2119
|
export declare const TileGrid: React$1.ForwardRefExoticComponent<TileGridProps & React$1.RefAttributes<HTMLUListElement>>;
|
|
2116
2120
|
export declare const Sparkline: React$1.ForwardRefExoticComponent<SparklineProps & React$1.RefAttributes<SVGSVGElement>>;
|
|
2117
|
-
/** AppShell — side navigation + top bar + content. The nav is fixed from lg (1024px) up and a Drawer below it.
|
|
2118
|
-
* Which one shows is decided in CSS (4.16), so the server's HTML is already right on a phone and nothing shifts on
|
|
2119
|
-
* hydration; JavaScript only opens and closes the drawer. */
|
|
2120
2121
|
export declare const AppShell: React$1.ForwardRefExoticComponent<AppShellProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
2121
2122
|
/** ActionBar — a bar stuck to the bottom of the screen or of a card: a status line and the form's or selection's
|
|
2122
2123
|
* actions. It is `position: sticky`, so it stays in the flow at the end of its parent and never covers the last field. */
|
package/dist/server/index.cjs
CHANGED
|
@@ -1471,6 +1471,7 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
|
|
|
1471
1471
|
(hide === "sm" || hide === "md" || hide === "lg") && "aura-page-header--title-hide-below-" + hide,
|
|
1472
1472
|
(hide === "sm" || hide === "md" || hide === "lg") && !hasMeta && "has-no-meta",
|
|
1473
1473
|
bar && "aura-page-header--actions-bar-below-" + bar,
|
|
1474
|
+
bar && props.actionsBarLook === "floating" && "aura-page-header--actions-bar-floating",
|
|
1474
1475
|
size && "aura-page-header--" + size,
|
|
1475
1476
|
props.actionsAlign === "start" && "aura-page-header--actions-start",
|
|
1476
1477
|
props.className
|
package/dist/server/index.d.cts
CHANGED
|
@@ -532,8 +532,8 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
532
532
|
* meta line and actions stay; with no meta, the actions start the header. */
|
|
533
533
|
titleHideBelow?: "sm" | "md" | "lg" | undefined;
|
|
534
534
|
/** 5.45 (Chamber-OS 150): below this breakpoint (`sm` 640px, `md` 768px) the same `actions` — rendered once, so a
|
|
535
|
-
* dialog trigger or test id is never doubled — become a bar fixed to the bottom of the screen
|
|
536
|
-
* above a BottomNav, clear of the home indicator, `actionsStatus` as its status line. The page's end and a focused
|
|
535
|
+
* dialog trigger or test id is never doubled — become a bar fixed to the bottom of the screen, ActionBar's edge
|
|
536
|
+
* strip (5.48; `actionsBarLook`): above a BottomNav, clear of the home indicator, `actionsStatus` as its status line. The page's end and a focused
|
|
537
537
|
* field scroll clear of it (AppShell's content, or the body, gains the bar's height). With an IconButton among them
|
|
538
538
|
* the actions share one row, labels wrapping inside the buttons (as `actionsFullWidthBelow`, Chamber-OS 149); with only icon
|
|
539
539
|
* buttons the status and the icons share one row. From the breakpoint up nothing changes. Use it for a detail page's
|
|
@@ -541,6 +541,10 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
541
541
|
* have a transform, filter, backdrop-filter, will-change, paint/layout containment or `content-visibility: auto`, or it is placed
|
|
542
542
|
* against that ancestor instead of the screen — the main entry warns in development. */
|
|
543
543
|
actionsBarBelow?: "sm" | "md" | undefined;
|
|
544
|
+
/** 5.48 (Chamber-OS 153): the bar's look. `edge` (default) is ActionBar's strip — the full width of the screen, on
|
|
545
|
+
* its bottom edge (or above a BottomNav), a top border only, the home-indicator inset inside it. `floating` is 5.45's
|
|
546
|
+
* card: inset 16px, lifted 12px, bordered all round with rounded corners and a shadow. */
|
|
547
|
+
actionsBarLook?: "edge" | "floating" | undefined;
|
|
544
548
|
/** 5.45: the bar's status line ("Total 10,700.00 THB incl. VAT · due 22 Oct 2026"), shown only while the actions are
|
|
545
549
|
* a bar, in a polite live region. */
|
|
546
550
|
actionsStatus?: React$1.ReactNode | undefined;
|
package/dist/server/index.d.ts
CHANGED
|
@@ -532,8 +532,8 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
532
532
|
* meta line and actions stay; with no meta, the actions start the header. */
|
|
533
533
|
titleHideBelow?: "sm" | "md" | "lg" | undefined;
|
|
534
534
|
/** 5.45 (Chamber-OS 150): below this breakpoint (`sm` 640px, `md` 768px) the same `actions` — rendered once, so a
|
|
535
|
-
* dialog trigger or test id is never doubled — become a bar fixed to the bottom of the screen
|
|
536
|
-
* above a BottomNav, clear of the home indicator, `actionsStatus` as its status line. The page's end and a focused
|
|
535
|
+
* dialog trigger or test id is never doubled — become a bar fixed to the bottom of the screen, ActionBar's edge
|
|
536
|
+
* strip (5.48; `actionsBarLook`): above a BottomNav, clear of the home indicator, `actionsStatus` as its status line. The page's end and a focused
|
|
537
537
|
* field scroll clear of it (AppShell's content, or the body, gains the bar's height). With an IconButton among them
|
|
538
538
|
* the actions share one row, labels wrapping inside the buttons (as `actionsFullWidthBelow`, Chamber-OS 149); with only icon
|
|
539
539
|
* buttons the status and the icons share one row. From the breakpoint up nothing changes. Use it for a detail page's
|
|
@@ -541,6 +541,10 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
541
541
|
* have a transform, filter, backdrop-filter, will-change, paint/layout containment or `content-visibility: auto`, or it is placed
|
|
542
542
|
* against that ancestor instead of the screen — the main entry warns in development. */
|
|
543
543
|
actionsBarBelow?: "sm" | "md" | undefined;
|
|
544
|
+
/** 5.48 (Chamber-OS 153): the bar's look. `edge` (default) is ActionBar's strip — the full width of the screen, on
|
|
545
|
+
* its bottom edge (or above a BottomNav), a top border only, the home-indicator inset inside it. `floating` is 5.45's
|
|
546
|
+
* card: inset 16px, lifted 12px, bordered all round with rounded corners and a shadow. */
|
|
547
|
+
actionsBarLook?: "edge" | "floating" | undefined;
|
|
544
548
|
/** 5.45: the bar's status line ("Total 10,700.00 THB incl. VAT · due 22 Oct 2026"), shown only while the actions are
|
|
545
549
|
* a bar, in a polite live region. */
|
|
546
550
|
actionsStatus?: React$1.ReactNode | undefined;
|
package/dist/server/index.js
CHANGED
|
@@ -1407,6 +1407,7 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
|
|
|
1407
1407
|
(hide === "sm" || hide === "md" || hide === "lg") && "aura-page-header--title-hide-below-" + hide,
|
|
1408
1408
|
(hide === "sm" || hide === "md" || hide === "lg") && !hasMeta && "has-no-meta",
|
|
1409
1409
|
bar && "aura-page-header--actions-bar-below-" + bar,
|
|
1410
|
+
bar && props.actionsBarLook === "floating" && "aura-page-header--actions-bar-floating",
|
|
1410
1411
|
size && "aura-page-header--" + size,
|
|
1411
1412
|
props.actionsAlign === "start" && "aura-page-header--actions-start",
|
|
1412
1413
|
props.className
|
package/dist/styles.css
CHANGED
|
@@ -1109,6 +1109,8 @@ a.aura-tab { text-decoration: none; }
|
|
|
1109
1109
|
--aura-shell-bar-height: 56px; /* 5.14 (Chamber-OS 104): the top bar's height, for sticky offsets under it */
|
|
1110
1110
|
}
|
|
1111
1111
|
.aura-shell--no-bar { --aura-shell-bar-height: 0px; }
|
|
1112
|
+
/* 5.49 (Chamber-OS 155): AppShell watches this for changes of the browser's text size (see the 30rem queries). */
|
|
1113
|
+
.aura-shell__probe { position: absolute; top: 0; inset-inline-start: 0; font-size: medium; width: 1em; height: 0; overflow: hidden; visibility: hidden; pointer-events: none; }
|
|
1112
1114
|
/* 5.35 (DxT Monitor 13): headerHideOnScroll — below lg the bar slides up out of view while the page scrolls down (its
|
|
1113
1115
|
* shadow too); AppShell sets the bar-height token to 0 meanwhile. */
|
|
1114
1116
|
.aura-shell__bar--hides { transition: transform var(--aura-duration-base) var(--aura-ease); }
|
|
@@ -1208,11 +1210,16 @@ a.aura-tab { text-decoration: none; }
|
|
|
1208
1210
|
.aura-page-header--actions-full-below-lg > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-btn, * > .aura-btn):not(.aura-icon-btn) { height: auto; min-height: var(--aura-button-height); white-space: normal; padding: var(--aura-space-2) var(--aura-space-3); line-height: 1.35; text-align: center; overflow-wrap: anywhere; hyphens: auto; border-radius: min(var(--aura-button-radius), 22px); }
|
|
1209
1211
|
.aura-page-header--actions-full-below-lg > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; } /* 5.45 (Chamber-OS addendum 52): centred on a taller button */
|
|
1210
1212
|
}
|
|
1211
|
-
/* 5.
|
|
1213
|
+
/* 5.48 (Chamber-OS 154): only on a screen taller than 30rem (5.49: 480px at the default text size) — on a short one (400% zoom, a phone held sideways) the
|
|
1214
|
+
* actions stay in the header's own row and the page keeps its full height.
|
|
1215
|
+
* 5.48 (Chamber-OS 153): the bar is ActionBar's edge strip (full width, on the bottom edge, top border, the safe area
|
|
1216
|
+
* inside); actionsBarLook="floating" keeps 5.45's inset card.
|
|
1217
|
+
* 5.45 (Chamber-OS 150): actionsBarBelow — the same actions become a fixed bar with a status line; the page gains its
|
|
1212
1218
|
* height (--aura-page-actions-height, measured on the client) so its end and a focused field scroll clear. */
|
|
1213
1219
|
.aura-page-header__status { display: none; }
|
|
1214
|
-
@media (max-width: 639.98px) {
|
|
1215
|
-
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions { position: fixed; z-index: var(--aura-z-bar); left:
|
|
1220
|
+
@media (max-width: 639.98px) and (min-height: 30.00125rem) {
|
|
1221
|
+
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions { position: fixed; z-index: var(--aura-z-bar); left: 0; right: 0; bottom: var(--aura-bottomnav-offset, 0px); box-sizing: border-box; min-height: 60px; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--aura-space-2); margin: 0; padding: var(--aura-space-2) var(--aura-space-3) calc(var(--aura-space-2) + max(0px, env(safe-area-inset-bottom, 0px) - var(--aura-bottomnav-offset, 0px))) var(--aura-space-4); background: var(--aura-bg-surface); color: var(--aura-fg-primary); border: 0; border-top: 1px solid var(--aura-border-default); border-radius: 0; box-shadow: none; transition: bottom var(--aura-duration-base) var(--aura-ease); }
|
|
1222
|
+
.aura-page-header--actions-bar-below-sm.aura-page-header--actions-bar-floating > .aura-page-header__actions { left: var(--aura-space-4); right: var(--aura-space-4); bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px))); padding-bottom: var(--aura-space-2); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay); }
|
|
1216
1223
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__status { display: block; flex: 1 1 100%; min-width: 0; font-size: max(14px, .875rem); line-height: 1.5; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
1217
1224
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :not(.aura-page-header__status) { flex: 1 1 0; min-width: max-content; }
|
|
1218
1225
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
@@ -1223,12 +1230,14 @@ a.aura-tab { text-decoration: none; }
|
|
|
1223
1230
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; }
|
|
1224
1231
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-btn, * > .aura-btn):not(.aura-icon-btn) { height: auto; min-height: var(--aura-button-height); white-space: normal; padding: var(--aura-space-2) var(--aura-space-3); line-height: 1.35; text-align: center; overflow-wrap: anywhere; hyphens: auto; border-radius: min(var(--aura-button-radius), 22px); }
|
|
1225
1232
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(:has(> .aura-btn, > * > .aura-btn)) > .aura-page-header__status { flex: 1 1 0; align-self: center; }
|
|
1226
|
-
:root:has(.aura-page-header--actions-bar-below-sm) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) +
|
|
1233
|
+
:root:has(.aura-page-header--actions-bar-below-sm) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) + var(--aura-space-3)); scroll-padding-bottom: var(--aura-page-actions-space); }
|
|
1234
|
+
:root:has(.aura-page-header--actions-bar-below-sm.aura-page-header--actions-bar-floating) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px)) + var(--aura-space-3)); }
|
|
1227
1235
|
:root:has(.aura-page-header--actions-bar-below-sm) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
|
|
1228
1236
|
:root:has(.aura-page-header--actions-bar-below-sm):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
|
|
1229
1237
|
}
|
|
1230
|
-
@media (max-width: 767.98px) {
|
|
1231
|
-
.aura-page-header--actions-bar-below-md > .aura-page-header__actions { position: fixed; z-index: var(--aura-z-bar); left:
|
|
1238
|
+
@media (max-width: 767.98px) and (min-height: 30.00125rem) {
|
|
1239
|
+
.aura-page-header--actions-bar-below-md > .aura-page-header__actions { position: fixed; z-index: var(--aura-z-bar); left: 0; right: 0; bottom: var(--aura-bottomnav-offset, 0px); box-sizing: border-box; min-height: 60px; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--aura-space-2); margin: 0; padding: var(--aura-space-2) var(--aura-space-3) calc(var(--aura-space-2) + max(0px, env(safe-area-inset-bottom, 0px) - var(--aura-bottomnav-offset, 0px))) var(--aura-space-4); background: var(--aura-bg-surface); color: var(--aura-fg-primary); border: 0; border-top: 1px solid var(--aura-border-default); border-radius: 0; box-shadow: none; transition: bottom var(--aura-duration-base) var(--aura-ease); }
|
|
1240
|
+
.aura-page-header--actions-bar-below-md.aura-page-header--actions-bar-floating > .aura-page-header__actions { left: var(--aura-space-4); right: var(--aura-space-4); bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px))); padding-bottom: var(--aura-space-2); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay); }
|
|
1232
1241
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__status { display: block; flex: 1 1 100%; min-width: 0; font-size: max(14px, .875rem); line-height: 1.5; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
1233
1242
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions > :not(.aura-page-header__status) { flex: 1 1 0; min-width: max-content; }
|
|
1234
1243
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
@@ -1239,7 +1248,8 @@ a.aura-tab { text-decoration: none; }
|
|
|
1239
1248
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; }
|
|
1240
1249
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-btn, * > .aura-btn):not(.aura-icon-btn) { height: auto; min-height: var(--aura-button-height); white-space: normal; padding: var(--aura-space-2) var(--aura-space-3); line-height: 1.35; text-align: center; overflow-wrap: anywhere; hyphens: auto; border-radius: min(var(--aura-button-radius), 22px); }
|
|
1241
1250
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(:has(> .aura-btn, > * > .aura-btn)) > .aura-page-header__status { flex: 1 1 0; align-self: center; }
|
|
1242
|
-
:root:has(.aura-page-header--actions-bar-below-md) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) +
|
|
1251
|
+
:root:has(.aura-page-header--actions-bar-below-md) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) + var(--aura-space-3)); scroll-padding-bottom: var(--aura-page-actions-space); }
|
|
1252
|
+
:root:has(.aura-page-header--actions-bar-below-md.aura-page-header--actions-bar-floating) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px)) + var(--aura-space-3)); }
|
|
1243
1253
|
:root:has(.aura-page-header--actions-bar-below-md) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
|
|
1244
1254
|
:root:has(.aura-page-header--actions-bar-below-md):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
|
|
1245
1255
|
}
|
|
@@ -2085,6 +2095,15 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
2085
2095
|
border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay);
|
|
2086
2096
|
}
|
|
2087
2097
|
.aura-actionbar--container { bottom: 0; border-top: 1px solid var(--aura-border-default); }
|
|
2098
|
+
/* 5.48 (Chamber-OS 154): on a short screen (30rem or less: 400% zoom, a phone held sideways) the bar stops sticking —
|
|
2099
|
+
* it stays at the end of its container, in the flow, so it never covers a focused field (WCAG 2.4.11, 1.4.10). */
|
|
2100
|
+
/* 5.49 (Chamber-OS 155): the threshold is 30rem, which in a media query is the browser's text size, not the page's:
|
|
2101
|
+
* 480px at the default 16px, 960px at 32px, so large text counts lines of text, not pixels. */
|
|
2102
|
+
@media (max-height: 30rem) { .aura-actionbar:not(.is-idle) { position: static; } }
|
|
2103
|
+
/* …and AppShell's top bar scrolls away with the page, so Shift+Tab never lands a field under it. */
|
|
2104
|
+
@media (max-height: 30rem) { .aura-shell__bar { position: static; } }
|
|
2105
|
+
/* 5.48: wherever a BottomNav shows, a field scrolled into view (Tab) stops above it, not under it. */
|
|
2106
|
+
:root { scroll-padding-bottom: var(--aura-bottomnav-offset, 0px); }
|
|
2088
2107
|
.aura-actionbar__inner { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2) var(--aura-space-3); min-height: 60px; box-sizing: border-box; padding-block: var(--aura-space-2); padding-inline: var(--aura-space-4) var(--aura-space-3); }
|
|
2089
2108
|
.aura-actionbar__status { flex: 1 1 8rem; min-width: 0; font-size: max(14px, .875rem); color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; }
|
|
2090
2109
|
.aura-actionbar__status:empty { flex-basis: 0; }
|
package/dist/styles.layer.css
CHANGED
|
@@ -1111,6 +1111,8 @@ a.aura-tab { text-decoration: none; }
|
|
|
1111
1111
|
--aura-shell-bar-height: 56px; /* 5.14 (Chamber-OS 104): the top bar's height, for sticky offsets under it */
|
|
1112
1112
|
}
|
|
1113
1113
|
.aura-shell--no-bar { --aura-shell-bar-height: 0px; }
|
|
1114
|
+
/* 5.49 (Chamber-OS 155): AppShell watches this for changes of the browser's text size (see the 30rem queries). */
|
|
1115
|
+
.aura-shell__probe { position: absolute; top: 0; inset-inline-start: 0; font-size: medium; width: 1em; height: 0; overflow: hidden; visibility: hidden; pointer-events: none; }
|
|
1114
1116
|
/* 5.35 (DxT Monitor 13): headerHideOnScroll — below lg the bar slides up out of view while the page scrolls down (its
|
|
1115
1117
|
* shadow too); AppShell sets the bar-height token to 0 meanwhile. */
|
|
1116
1118
|
.aura-shell__bar--hides { transition: transform var(--aura-duration-base) var(--aura-ease); }
|
|
@@ -1210,11 +1212,16 @@ a.aura-tab { text-decoration: none; }
|
|
|
1210
1212
|
.aura-page-header--actions-full-below-lg > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-btn, * > .aura-btn):not(.aura-icon-btn) { height: auto; min-height: var(--aura-button-height); white-space: normal; padding: var(--aura-space-2) var(--aura-space-3); line-height: 1.35; text-align: center; overflow-wrap: anywhere; hyphens: auto; border-radius: min(var(--aura-button-radius), 22px); }
|
|
1211
1213
|
.aura-page-header--actions-full-below-lg > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; } /* 5.45 (Chamber-OS addendum 52): centred on a taller button */
|
|
1212
1214
|
}
|
|
1213
|
-
/* 5.
|
|
1215
|
+
/* 5.48 (Chamber-OS 154): only on a screen taller than 30rem (5.49: 480px at the default text size) — on a short one (400% zoom, a phone held sideways) the
|
|
1216
|
+
* actions stay in the header's own row and the page keeps its full height.
|
|
1217
|
+
* 5.48 (Chamber-OS 153): the bar is ActionBar's edge strip (full width, on the bottom edge, top border, the safe area
|
|
1218
|
+
* inside); actionsBarLook="floating" keeps 5.45's inset card.
|
|
1219
|
+
* 5.45 (Chamber-OS 150): actionsBarBelow — the same actions become a fixed bar with a status line; the page gains its
|
|
1214
1220
|
* height (--aura-page-actions-height, measured on the client) so its end and a focused field scroll clear. */
|
|
1215
1221
|
.aura-page-header__status { display: none; }
|
|
1216
|
-
@media (max-width: 639.98px) {
|
|
1217
|
-
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions { position: fixed; z-index: var(--aura-z-bar); left:
|
|
1222
|
+
@media (max-width: 639.98px) and (min-height: 30.00125rem) {
|
|
1223
|
+
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions { position: fixed; z-index: var(--aura-z-bar); left: 0; right: 0; bottom: var(--aura-bottomnav-offset, 0px); box-sizing: border-box; min-height: 60px; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--aura-space-2); margin: 0; padding: var(--aura-space-2) var(--aura-space-3) calc(var(--aura-space-2) + max(0px, env(safe-area-inset-bottom, 0px) - var(--aura-bottomnav-offset, 0px))) var(--aura-space-4); background: var(--aura-bg-surface); color: var(--aura-fg-primary); border: 0; border-top: 1px solid var(--aura-border-default); border-radius: 0; box-shadow: none; transition: bottom var(--aura-duration-base) var(--aura-ease); }
|
|
1224
|
+
.aura-page-header--actions-bar-below-sm.aura-page-header--actions-bar-floating > .aura-page-header__actions { left: var(--aura-space-4); right: var(--aura-space-4); bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px))); padding-bottom: var(--aura-space-2); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay); }
|
|
1218
1225
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__status { display: block; flex: 1 1 100%; min-width: 0; font-size: max(14px, .875rem); line-height: 1.5; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
1219
1226
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :not(.aura-page-header__status) { flex: 1 1 0; min-width: max-content; }
|
|
1220
1227
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
@@ -1225,12 +1232,14 @@ a.aura-tab { text-decoration: none; }
|
|
|
1225
1232
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; }
|
|
1226
1233
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-btn, * > .aura-btn):not(.aura-icon-btn) { height: auto; min-height: var(--aura-button-height); white-space: normal; padding: var(--aura-space-2) var(--aura-space-3); line-height: 1.35; text-align: center; overflow-wrap: anywhere; hyphens: auto; border-radius: min(var(--aura-button-radius), 22px); }
|
|
1227
1234
|
.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(:has(> .aura-btn, > * > .aura-btn)) > .aura-page-header__status { flex: 1 1 0; align-self: center; }
|
|
1228
|
-
:root:has(.aura-page-header--actions-bar-below-sm) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) +
|
|
1235
|
+
:root:has(.aura-page-header--actions-bar-below-sm) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) + var(--aura-space-3)); scroll-padding-bottom: var(--aura-page-actions-space); }
|
|
1236
|
+
:root:has(.aura-page-header--actions-bar-below-sm.aura-page-header--actions-bar-floating) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px)) + var(--aura-space-3)); }
|
|
1229
1237
|
:root:has(.aura-page-header--actions-bar-below-sm) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
|
|
1230
1238
|
:root:has(.aura-page-header--actions-bar-below-sm):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
|
|
1231
1239
|
}
|
|
1232
|
-
@media (max-width: 767.98px) {
|
|
1233
|
-
.aura-page-header--actions-bar-below-md > .aura-page-header__actions { position: fixed; z-index: var(--aura-z-bar); left:
|
|
1240
|
+
@media (max-width: 767.98px) and (min-height: 30.00125rem) {
|
|
1241
|
+
.aura-page-header--actions-bar-below-md > .aura-page-header__actions { position: fixed; z-index: var(--aura-z-bar); left: 0; right: 0; bottom: var(--aura-bottomnav-offset, 0px); box-sizing: border-box; min-height: 60px; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--aura-space-2); margin: 0; padding: var(--aura-space-2) var(--aura-space-3) calc(var(--aura-space-2) + max(0px, env(safe-area-inset-bottom, 0px) - var(--aura-bottomnav-offset, 0px))) var(--aura-space-4); background: var(--aura-bg-surface); color: var(--aura-fg-primary); border: 0; border-top: 1px solid var(--aura-border-default); border-radius: 0; box-shadow: none; transition: bottom var(--aura-duration-base) var(--aura-ease); }
|
|
1242
|
+
.aura-page-header--actions-bar-below-md.aura-page-header--actions-bar-floating > .aura-page-header__actions { left: var(--aura-space-4); right: var(--aura-space-4); bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px))); padding-bottom: var(--aura-space-2); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay); }
|
|
1234
1243
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__status { display: block; flex: 1 1 100%; min-width: 0; font-size: max(14px, .875rem); line-height: 1.5; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
1235
1244
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions > :not(.aura-page-header__status) { flex: 1 1 0; min-width: max-content; }
|
|
1236
1245
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
@@ -1241,7 +1250,8 @@ a.aura-tab { text-decoration: none; }
|
|
|
1241
1250
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; }
|
|
1242
1251
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions:has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-btn, * > .aura-btn):not(.aura-icon-btn) { height: auto; min-height: var(--aura-button-height); white-space: normal; padding: var(--aura-space-2) var(--aura-space-3); line-height: 1.35; text-align: center; overflow-wrap: anywhere; hyphens: auto; border-radius: min(var(--aura-button-radius), 22px); }
|
|
1243
1252
|
.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(:has(> .aura-btn, > * > .aura-btn)) > .aura-page-header__status { flex: 1 1 0; align-self: center; }
|
|
1244
|
-
:root:has(.aura-page-header--actions-bar-below-md) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) +
|
|
1253
|
+
:root:has(.aura-page-header--actions-bar-below-md) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) + var(--aura-space-3)); scroll-padding-bottom: var(--aura-page-actions-space); }
|
|
1254
|
+
:root:has(.aura-page-header--actions-bar-below-md.aura-page-header--actions-bar-floating) { --aura-page-actions-space: calc(var(--aura-page-actions-height, 7rem) + var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px)) + var(--aura-space-3)); }
|
|
1245
1255
|
:root:has(.aura-page-header--actions-bar-below-md) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
|
|
1246
1256
|
:root:has(.aura-page-header--actions-bar-below-md):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
|
|
1247
1257
|
}
|
|
@@ -2087,6 +2097,15 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
2087
2097
|
border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay);
|
|
2088
2098
|
}
|
|
2089
2099
|
.aura-actionbar--container { bottom: 0; border-top: 1px solid var(--aura-border-default); }
|
|
2100
|
+
/* 5.48 (Chamber-OS 154): on a short screen (30rem or less: 400% zoom, a phone held sideways) the bar stops sticking —
|
|
2101
|
+
* it stays at the end of its container, in the flow, so it never covers a focused field (WCAG 2.4.11, 1.4.10). */
|
|
2102
|
+
/* 5.49 (Chamber-OS 155): the threshold is 30rem, which in a media query is the browser's text size, not the page's:
|
|
2103
|
+
* 480px at the default 16px, 960px at 32px, so large text counts lines of text, not pixels. */
|
|
2104
|
+
@media (max-height: 30rem) { .aura-actionbar:not(.is-idle) { position: static; } }
|
|
2105
|
+
/* …and AppShell's top bar scrolls away with the page, so Shift+Tab never lands a field under it. */
|
|
2106
|
+
@media (max-height: 30rem) { .aura-shell__bar { position: static; } }
|
|
2107
|
+
/* 5.48: wherever a BottomNav shows, a field scrolled into view (Tab) stops above it, not under it. */
|
|
2108
|
+
:root { scroll-padding-bottom: var(--aura-bottomnav-offset, 0px); }
|
|
2090
2109
|
.aura-actionbar__inner { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2) var(--aura-space-3); min-height: 60px; box-sizing: border-box; padding-block: var(--aura-space-2); padding-inline: var(--aura-space-4) var(--aura-space-3); }
|
|
2091
2110
|
.aura-actionbar__status { flex: 1 1 8rem; min-width: 0; font-size: max(14px, .875rem); color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; }
|
|
2092
2111
|
.aura-actionbar__status:empty { flex-basis: 0; }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jirawatpyk/aura-react",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.49.0",
|
|
4
4
|
"description": "AURA Design System — React components (Enterprise Standard, Human Creative). Thai-first: Buddhist-era dates, Thai collation.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|