@jirawatpyk/aura-react 5.73.0 → 5.74.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 CHANGED
@@ -186,6 +186,10 @@ 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.74 — Chamber-OS addendum 94 (#193)
190
+
191
+ - **A PageHeader bar with nothing left in it goes:** when every direct child of the phone bar but the status line (looking through `display: contents` wrappers) is hidden — the `hidden` attribute, `display: none`, `visibility: hidden` set on it, or visually hidden text (an `aria-describedby` note: `.sr-only`-style classes, or an inline absolutely positioned, clipped box) — and no text sits in it, the strip takes no box and the page loses its bar padding and `scroll-padding` (`--aura-page-actions-height` is `0px`), as if there were no bar. A status alone is not a bar. It applies to `actionsBar`'s strip and to the plain `actionsBarBelow` bar, and follows a child being shown or hidden (its `hidden`, `class` or `style`), added or removed, at most once a frame — for a pay bar that hides, not unmounts, once paying succeeds. A bar under a `visibility: hidden` ancestor (a page-enter gate) is not taken for empty. The client marks the header `data-aura-bar="empty"` or `"shown"`; before it does (server HTML), `actionsBar`'s strip whose element children are all `hidden` or visually hidden already goes, though the page padding waits for the client. From the breakpoint up nothing changes. A `:has(> [hidden])` stand-in can go once your PageHeaders render on the client. The `hidden` attribute is trusted as hidden: don't give a hidden child a class that displays it anyway (Tailwind v3's `flex` beats the browser's `[hidden]`).
192
+
189
193
  ## 5.73 — Chamber-OS addendum 93 follow-up (#192)
190
194
 
191
195
  - **Hidden bars, every way a tab panel hides them:** the edge ActionBar and PageHeader's `actionsBarBelow` bar now share one rule. The newest bar that is pinned and on screen sets the page's clearance (`--aura-actionbar-height`, `--aura-page-actions-height`). A bar with no box (`display: none`), `visibility: hidden`, or inside `content-visibility: hidden` (`hidden="until-found"`) is skipped. A visibility switch resizes nothing, so the bars are re-read after any click, key press, focus move, transition, find-in-page reveal (`beforematch`) or history change; a switch made by a timer or a resolved request is caught at the next of those.
@@ -425,7 +425,7 @@ window.Aura = (() => {
425
425
  const v = getComputedStyle(el).visibility;
426
426
  return v !== "hidden" && v !== "collapse";
427
427
  }
428
- function barStack(name, onMany) {
428
+ function barStack(name, onMany, onRead) {
429
429
  const els = [];
430
430
  let frame = 0;
431
431
  const docEvents = ["click", "keydown", "focusin", "transitionend", "beforematch"];
@@ -433,6 +433,7 @@ window.Aura = (() => {
433
433
  function write() {
434
434
  if (frame) cancelAnimationFrame(frame);
435
435
  frame = 0;
436
+ if (onRead) onRead();
436
437
  const root = document.documentElement;
437
438
  let shown = null, boxed = null, pinned2 = false, many = 0;
438
439
  for (let i = els.length - 1; i >= 0; i--) {
@@ -8227,12 +8228,41 @@ window.Aura = (() => {
8227
8228
  });
8228
8229
 
8229
8230
  // src/PageHeaderClient.tsx
8230
- var bars = barStack("--aura-page-actions-height", function() {
8231
- devWarnOnce(
8232
- "pageheader-bar-twice",
8233
- "PageHeader actionsBarBelow: two bars are on screen at once and overlap at the bottom of the screen. Give it to one PageHeader per page (one per tab panel is fine: only the shown one counts)."
8234
- );
8235
- });
8231
+ var bars = barStack(
8232
+ "--aura-page-actions-height",
8233
+ function() {
8234
+ devWarnOnce(
8235
+ "pageheader-bar-twice",
8236
+ "PageHeader actionsBarBelow: two bars are on screen at once and overlap at the bottom of the screen. Give it to one PageHeader per page (one per tab panel is fine: only the shown one counts)."
8237
+ );
8238
+ },
8239
+ function() {
8240
+ marks.forEach(function(m) {
8241
+ m();
8242
+ });
8243
+ }
8244
+ );
8245
+ var UNSEEN = ".aura-page-header__status, .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text";
8246
+ function noneShown(el, barVisible) {
8247
+ for (let n3 = el.firstChild; n3; n3 = n3.nextSibling) {
8248
+ if (n3.nodeType === 3) {
8249
+ if ((n3.textContent || "").trim()) return false;
8250
+ continue;
8251
+ }
8252
+ if (n3.nodeType !== 1) continue;
8253
+ const c = n3;
8254
+ if (c.hidden || c.matches(UNSEEN)) continue;
8255
+ const s = getComputedStyle(c);
8256
+ if (s.display === "none") continue;
8257
+ if (barVisible && (s.visibility === "hidden" || s.visibility === "collapse")) continue;
8258
+ const inline = c.getAttribute("style") || "";
8259
+ if (/position:\s*absolute/.test(inline) && /clip/.test(inline)) continue;
8260
+ if (s.display === "contents" && noneShown(c, barVisible)) continue;
8261
+ return false;
8262
+ }
8263
+ return true;
8264
+ }
8265
+ var marks = /* @__PURE__ */ new Set();
8236
8266
  var PageHeader3 = React45.forwardRef(function PageHeader4(props, ref) {
8237
8267
  const own = React45.useRef(null);
8238
8268
  const merged = useMergedRef(ref, own);
@@ -8246,8 +8276,15 @@ window.Aura = (() => {
8246
8276
  split ? ":scope > .aura-page-header__actions > .aura-page-header__bar" : ":scope > .aura-page-header__actions"
8247
8277
  );
8248
8278
  if (!el) return;
8279
+ const head = own.current;
8249
8280
  let checked = false;
8281
+ function mark() {
8282
+ const empty = noneShown(el, getComputedStyle(el).visibility === "visible");
8283
+ const state = empty ? "empty" : "shown";
8284
+ if (head.getAttribute("data-aura-bar") !== state) head.setAttribute("data-aura-bar", state);
8285
+ }
8250
8286
  function sync() {
8287
+ mark();
8251
8288
  bars.write();
8252
8289
  if (!checked && getComputedStyle(el).position === "fixed" && (checked = true, fixedTrapped(el)))
8253
8290
  devWarnOnce(
@@ -8255,14 +8292,35 @@ window.Aura = (() => {
8255
8292
  "PageHeader actionsBarBelow: an ancestor has a transform, filter, will-change or paint containment, so the fixed bar is placed against it instead of the screen. Remove it from the page header's ancestors."
8256
8293
  );
8257
8294
  }
8295
+ mark();
8296
+ marks.add(mark);
8258
8297
  bars.add(el);
8298
+ const mo = typeof MutationObserver === "undefined" ? null : new MutationObserver(function() {
8299
+ if (!frame) frame = requestAnimationFrame(later);
8300
+ });
8301
+ let frame = 0;
8302
+ function later() {
8303
+ frame = 0;
8304
+ sync();
8305
+ }
8306
+ if (mo)
8307
+ mo.observe(el, {
8308
+ childList: true,
8309
+ subtree: true,
8310
+ attributes: true,
8311
+ attributeFilter: ["hidden", "class", "style"]
8312
+ });
8259
8313
  const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(sync);
8260
8314
  if (ro) ro.observe(el, { box: "border-box" });
8261
8315
  window.addEventListener("resize", sync);
8262
8316
  sync();
8263
8317
  return function() {
8264
8318
  if (ro) ro.disconnect();
8319
+ if (mo) mo.disconnect();
8320
+ if (frame) cancelAnimationFrame(frame);
8321
+ marks.delete(mark);
8265
8322
  window.removeEventListener("resize", sync);
8323
+ head.removeAttribute("data-aura-bar");
8266
8324
  bars.remove(el);
8267
8325
  };
8268
8326
  },
@@ -407,7 +407,7 @@ function onScreen(el) {
407
407
  const v = getComputedStyle(el).visibility;
408
408
  return v !== "hidden" && v !== "collapse";
409
409
  }
410
- function barStack(name, onMany) {
410
+ function barStack(name, onMany, onRead) {
411
411
  const els = [];
412
412
  let frame = 0;
413
413
  const docEvents = ["click", "keydown", "focusin", "transitionend", "beforematch"];
@@ -415,6 +415,7 @@ function barStack(name, onMany) {
415
415
  function write() {
416
416
  if (frame) cancelAnimationFrame(frame);
417
417
  frame = 0;
418
+ if (onRead) onRead();
418
419
  const root = document.documentElement;
419
420
  let shown = null, boxed = null, pinned2 = false, many = 0;
420
421
  for (let i = els.length - 1; i >= 0; i--) {
@@ -8209,12 +8210,41 @@ var PageHeader = React44.forwardRef(function PageHeader2(props, ref) {
8209
8210
  });
8210
8211
 
8211
8212
  // src/PageHeaderClient.tsx
8212
- var bars = barStack("--aura-page-actions-height", function() {
8213
- devWarnOnce(
8214
- "pageheader-bar-twice",
8215
- "PageHeader actionsBarBelow: two bars are on screen at once and overlap at the bottom of the screen. Give it to one PageHeader per page (one per tab panel is fine: only the shown one counts)."
8216
- );
8217
- });
8213
+ var bars = barStack(
8214
+ "--aura-page-actions-height",
8215
+ function() {
8216
+ devWarnOnce(
8217
+ "pageheader-bar-twice",
8218
+ "PageHeader actionsBarBelow: two bars are on screen at once and overlap at the bottom of the screen. Give it to one PageHeader per page (one per tab panel is fine: only the shown one counts)."
8219
+ );
8220
+ },
8221
+ function() {
8222
+ marks.forEach(function(m) {
8223
+ m();
8224
+ });
8225
+ }
8226
+ );
8227
+ var UNSEEN = ".aura-page-header__status, .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text";
8228
+ function noneShown(el, barVisible) {
8229
+ for (let n3 = el.firstChild; n3; n3 = n3.nextSibling) {
8230
+ if (n3.nodeType === 3) {
8231
+ if ((n3.textContent || "").trim()) return false;
8232
+ continue;
8233
+ }
8234
+ if (n3.nodeType !== 1) continue;
8235
+ const c = n3;
8236
+ if (c.hidden || c.matches(UNSEEN)) continue;
8237
+ const s = getComputedStyle(c);
8238
+ if (s.display === "none") continue;
8239
+ if (barVisible && (s.visibility === "hidden" || s.visibility === "collapse")) continue;
8240
+ const inline = c.getAttribute("style") || "";
8241
+ if (/position:\s*absolute/.test(inline) && /clip/.test(inline)) continue;
8242
+ if (s.display === "contents" && noneShown(c, barVisible)) continue;
8243
+ return false;
8244
+ }
8245
+ return true;
8246
+ }
8247
+ var marks = /* @__PURE__ */ new Set();
8218
8248
  var PageHeader3 = React45.forwardRef(function PageHeader4(props, ref) {
8219
8249
  const own = React45.useRef(null);
8220
8250
  const merged = useMergedRef(ref, own);
@@ -8228,8 +8258,15 @@ var PageHeader3 = React45.forwardRef(function PageHeader4(props, ref) {
8228
8258
  split ? ":scope > .aura-page-header__actions > .aura-page-header__bar" : ":scope > .aura-page-header__actions"
8229
8259
  );
8230
8260
  if (!el) return;
8261
+ const head = own.current;
8231
8262
  let checked = false;
8263
+ function mark() {
8264
+ const empty = noneShown(el, getComputedStyle(el).visibility === "visible");
8265
+ const state = empty ? "empty" : "shown";
8266
+ if (head.getAttribute("data-aura-bar") !== state) head.setAttribute("data-aura-bar", state);
8267
+ }
8232
8268
  function sync() {
8269
+ mark();
8233
8270
  bars.write();
8234
8271
  if (!checked && getComputedStyle(el).position === "fixed" && (checked = true, fixedTrapped(el)))
8235
8272
  devWarnOnce(
@@ -8237,14 +8274,35 @@ var PageHeader3 = React45.forwardRef(function PageHeader4(props, ref) {
8237
8274
  "PageHeader actionsBarBelow: an ancestor has a transform, filter, will-change or paint containment, so the fixed bar is placed against it instead of the screen. Remove it from the page header's ancestors."
8238
8275
  );
8239
8276
  }
8277
+ mark();
8278
+ marks.add(mark);
8240
8279
  bars.add(el);
8280
+ const mo = typeof MutationObserver === "undefined" ? null : new MutationObserver(function() {
8281
+ if (!frame) frame = requestAnimationFrame(later);
8282
+ });
8283
+ let frame = 0;
8284
+ function later() {
8285
+ frame = 0;
8286
+ sync();
8287
+ }
8288
+ if (mo)
8289
+ mo.observe(el, {
8290
+ childList: true,
8291
+ subtree: true,
8292
+ attributes: true,
8293
+ attributeFilter: ["hidden", "class", "style"]
8294
+ });
8241
8295
  const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(sync);
8242
8296
  if (ro) ro.observe(el, { box: "border-box" });
8243
8297
  window.addEventListener("resize", sync);
8244
8298
  sync();
8245
8299
  return function() {
8246
8300
  if (ro) ro.disconnect();
8301
+ if (mo) mo.disconnect();
8302
+ if (frame) cancelAnimationFrame(frame);
8303
+ marks.delete(mark);
8247
8304
  window.removeEventListener("resize", sync);
8305
+ head.removeAttribute("data-aura-bar");
8248
8306
  bars.remove(el);
8249
8307
  };
8250
8308
  },
@@ -2,12 +2,41 @@
2
2
  import * as React from "react";
3
3
  import { PageHeader as StaticPageHeader } from "./PageHeader.js";
4
4
  import { barStack, devWarnOnce, fixedTrapped as trapped, useMergedRef } from "./internal.js";
5
- const bars = barStack("--aura-page-actions-height", function() {
6
- devWarnOnce(
7
- "pageheader-bar-twice",
8
- "PageHeader actionsBarBelow: two bars are on screen at once and overlap at the bottom of the screen. Give it to one PageHeader per page (one per tab panel is fine: only the shown one counts)."
9
- );
10
- });
5
+ const bars = barStack(
6
+ "--aura-page-actions-height",
7
+ function() {
8
+ devWarnOnce(
9
+ "pageheader-bar-twice",
10
+ "PageHeader actionsBarBelow: two bars are on screen at once and overlap at the bottom of the screen. Give it to one PageHeader per page (one per tab panel is fine: only the shown one counts)."
11
+ );
12
+ },
13
+ function() {
14
+ marks.forEach(function(m) {
15
+ m();
16
+ });
17
+ }
18
+ );
19
+ const UNSEEN = ".aura-page-header__status, .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text";
20
+ function noneShown(el, barVisible) {
21
+ for (let n = el.firstChild; n; n = n.nextSibling) {
22
+ if (n.nodeType === 3) {
23
+ if ((n.textContent || "").trim()) return false;
24
+ continue;
25
+ }
26
+ if (n.nodeType !== 1) continue;
27
+ const c = n;
28
+ if (c.hidden || c.matches(UNSEEN)) continue;
29
+ const s = getComputedStyle(c);
30
+ if (s.display === "none") continue;
31
+ if (barVisible && (s.visibility === "hidden" || s.visibility === "collapse")) continue;
32
+ const inline = c.getAttribute("style") || "";
33
+ if (/position:\s*absolute/.test(inline) && /clip/.test(inline)) continue;
34
+ if (s.display === "contents" && noneShown(c, barVisible)) continue;
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+ const marks = /* @__PURE__ */ new Set();
11
40
  const PageHeader = React.forwardRef(function PageHeader2(props, ref) {
12
41
  const own = React.useRef(null);
13
42
  const merged = useMergedRef(ref, own);
@@ -21,8 +50,15 @@ const PageHeader = React.forwardRef(function PageHeader2(props, ref) {
21
50
  split ? ":scope > .aura-page-header__actions > .aura-page-header__bar" : ":scope > .aura-page-header__actions"
22
51
  );
23
52
  if (!el) return;
53
+ const head = own.current;
24
54
  let checked = false;
55
+ function mark() {
56
+ const empty = noneShown(el, getComputedStyle(el).visibility === "visible");
57
+ const state = empty ? "empty" : "shown";
58
+ if (head.getAttribute("data-aura-bar") !== state) head.setAttribute("data-aura-bar", state);
59
+ }
25
60
  function sync() {
61
+ mark();
26
62
  bars.write();
27
63
  if (!checked && getComputedStyle(el).position === "fixed" && (checked = true, trapped(el)))
28
64
  devWarnOnce(
@@ -30,14 +66,35 @@ const PageHeader = React.forwardRef(function PageHeader2(props, ref) {
30
66
  "PageHeader actionsBarBelow: an ancestor has a transform, filter, will-change or paint containment, so the fixed bar is placed against it instead of the screen. Remove it from the page header's ancestors."
31
67
  );
32
68
  }
69
+ mark();
70
+ marks.add(mark);
33
71
  bars.add(el);
72
+ const mo = typeof MutationObserver === "undefined" ? null : new MutationObserver(function() {
73
+ if (!frame) frame = requestAnimationFrame(later);
74
+ });
75
+ let frame = 0;
76
+ function later() {
77
+ frame = 0;
78
+ sync();
79
+ }
80
+ if (mo)
81
+ mo.observe(el, {
82
+ childList: true,
83
+ subtree: true,
84
+ attributes: true,
85
+ attributeFilter: ["hidden", "class", "style"]
86
+ });
34
87
  const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(sync);
35
88
  if (ro) ro.observe(el, { box: "border-box" });
36
89
  window.addEventListener("resize", sync);
37
90
  sync();
38
91
  return function() {
39
92
  if (ro) ro.disconnect();
93
+ if (mo) mo.disconnect();
94
+ if (frame) cancelAnimationFrame(frame);
95
+ marks.delete(mark);
40
96
  window.removeEventListener("resize", sync);
97
+ head.removeAttribute("data-aura-bar");
41
98
  bars.remove(el);
42
99
  };
43
100
  },
@@ -124,7 +124,7 @@ function onScreen(el) {
124
124
  const v = getComputedStyle(el).visibility;
125
125
  return v !== "hidden" && v !== "collapse";
126
126
  }
127
- function barStack(name, onMany) {
127
+ function barStack(name, onMany, onRead) {
128
128
  const els = [];
129
129
  let frame = 0;
130
130
  const docEvents = ["click", "keydown", "focusin", "transitionend", "beforematch"];
@@ -132,6 +132,7 @@ function barStack(name, onMany) {
132
132
  function write() {
133
133
  if (frame) cancelAnimationFrame(frame);
134
134
  frame = 0;
135
+ if (onRead) onRead();
135
136
  const root = document.documentElement;
136
137
  let shown = null, boxed = null, pinned = false, many = 0;
137
138
  for (let i = els.length - 1; i >= 0; i--) {
package/dist/styles.css CHANGED
@@ -1357,6 +1357,10 @@ summary.aura-link::-webkit-details-marker { display: none; }
1357
1357
  .aura-page-header__actions.is-split:not(:has(> :not(.aura-page-header__bar))) { display: contents; }
1358
1358
  @media (max-width: 639.98px) and (min-height: 30.00125rem) {
1359
1359
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar { display: flex; flex: none; min-width: 0; }
1360
+ /* 5.74 (Chamber-OS 193): nothing but the status shown (Pay now hidden after paying): no strip, and no bar padding below. */
1361
+ .aura-page-header--actions-bar-below-sm[data-aura-bar="empty"] > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm[data-aura-bar="empty"] > .aura-page-header__actions > .aura-page-header__bar { display: none; }
1362
+ /* …and before hydration, from the markup alone (actionsBar's strip whose element children but the status are all `hidden` or visually hidden): it already goes; the page padding follows once the client has looked. */
1363
+ .aura-page-header--actions-bar-below-sm:not([data-aura-bar="shown"]) > .aura-page-header__actions > .aura-page-header__bar:not(:has(> :not(.aura-page-header__status, [hidden], .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text))):has(> *) { display: none; }
1360
1364
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar) { 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); }
1361
1365
  /* 5.54 (Chamber-OS 166): the bar's buttons are 44px whatever the density, as ActionBar's on a phone. */
1362
1366
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar) { --aura-button-height: var(--aura-touch-target); --aura-button-height-sm: var(--aura-touch-target); }
@@ -1372,13 +1376,17 @@ summary.aura-link::-webkit-details-marker { display: none; }
1372
1376
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar):has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; }
1373
1377
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar):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); }
1374
1378
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar):not(:has(> .aura-btn, > * > .aura-btn)) > .aura-page-header__status { flex: 1 1 0; align-self: center; }
1375
- :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); }
1376
- :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)); }
1377
- :root:has(.aura-page-header--actions-bar-below-sm) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
1378
- :root:has(.aura-page-header--actions-bar-below-sm):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
1379
+ :root:has(.aura-page-header--actions-bar-below-sm:not([data-aura-bar="empty"])) { --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); }
1380
+ :root:has(.aura-page-header--actions-bar-below-sm.aura-page-header--actions-bar-floating:not([data-aura-bar="empty"])) { --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)); }
1381
+ :root:has(.aura-page-header--actions-bar-below-sm:not([data-aura-bar="empty"])) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
1382
+ :root:has(.aura-page-header--actions-bar-below-sm:not([data-aura-bar="empty"])):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
1379
1383
  }
1380
1384
  @media (max-width: 767.98px) and (min-height: 30.00125rem) {
1381
1385
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar { display: flex; flex: none; min-width: 0; }
1386
+ /* 5.74 (Chamber-OS 193): nothing but the status shown (Pay now hidden after paying): no strip, and no bar padding below. */
1387
+ .aura-page-header--actions-bar-below-md[data-aura-bar="empty"] > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md[data-aura-bar="empty"] > .aura-page-header__actions > .aura-page-header__bar { display: none; }
1388
+ /* …and before hydration, from the markup alone (actionsBar's strip whose element children but the status are all `hidden` or visually hidden): it already goes; the page padding follows once the client has looked. */
1389
+ .aura-page-header--actions-bar-below-md:not([data-aura-bar="shown"]) > .aura-page-header__actions > .aura-page-header__bar:not(:has(> :not(.aura-page-header__status, [hidden], .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text))):has(> *) { display: none; }
1382
1390
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar) { 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); }
1383
1391
  /* 5.54 (Chamber-OS 166): the bar's buttons are 44px whatever the density, as ActionBar's on a phone. */
1384
1392
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar) { --aura-button-height: var(--aura-touch-target); --aura-button-height-sm: var(--aura-touch-target); }
@@ -1394,10 +1402,10 @@ summary.aura-link::-webkit-details-marker { display: none; }
1394
1402
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar):has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; }
1395
1403
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar):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); }
1396
1404
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar):not(:has(> .aura-btn, > * > .aura-btn)) > .aura-page-header__status { flex: 1 1 0; align-self: center; }
1397
- :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); }
1398
- :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)); }
1399
- :root:has(.aura-page-header--actions-bar-below-md) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
1400
- :root:has(.aura-page-header--actions-bar-below-md):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
1405
+ :root:has(.aura-page-header--actions-bar-below-md:not([data-aura-bar="empty"])) { --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); }
1406
+ :root:has(.aura-page-header--actions-bar-below-md.aura-page-header--actions-bar-floating:not([data-aura-bar="empty"])) { --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)); }
1407
+ :root:has(.aura-page-header--actions-bar-below-md:not([data-aura-bar="empty"])) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
1408
+ :root:has(.aura-page-header--actions-bar-below-md:not([data-aura-bar="empty"])):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
1401
1409
  }
1402
1410
  /* 5.71: as specific as the bar rules (and after them), and on actionsBar's box too, so reduced motion stops the slide. */
1403
1411
  @media (prefers-reduced-motion: reduce) { .aura-page-header.aura-page-header > .aura-page-header__actions, .aura-page-header.aura-page-header > .aura-page-header__actions > .aura-page-header__bar { transition: none; } }
@@ -1359,6 +1359,10 @@ summary.aura-link::-webkit-details-marker { display: none; }
1359
1359
  .aura-page-header__actions.is-split:not(:has(> :not(.aura-page-header__bar))) { display: contents; }
1360
1360
  @media (max-width: 639.98px) and (min-height: 30.00125rem) {
1361
1361
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar { display: flex; flex: none; min-width: 0; }
1362
+ /* 5.74 (Chamber-OS 193): nothing but the status shown (Pay now hidden after paying): no strip, and no bar padding below. */
1363
+ .aura-page-header--actions-bar-below-sm[data-aura-bar="empty"] > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm[data-aura-bar="empty"] > .aura-page-header__actions > .aura-page-header__bar { display: none; }
1364
+ /* …and before hydration, from the markup alone (actionsBar's strip whose element children but the status are all `hidden` or visually hidden): it already goes; the page padding follows once the client has looked. */
1365
+ .aura-page-header--actions-bar-below-sm:not([data-aura-bar="shown"]) > .aura-page-header__actions > .aura-page-header__bar:not(:has(> :not(.aura-page-header__status, [hidden], .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text))):has(> *) { display: none; }
1362
1366
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar) { 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); }
1363
1367
  /* 5.54 (Chamber-OS 166): the bar's buttons are 44px whatever the density, as ActionBar's on a phone. */
1364
1368
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar) { --aura-button-height: var(--aura-touch-target); --aura-button-height-sm: var(--aura-touch-target); }
@@ -1374,13 +1378,17 @@ summary.aura-link::-webkit-details-marker { display: none; }
1374
1378
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar):has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; }
1375
1379
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar):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); }
1376
1380
  :is(.aura-page-header--actions-bar-below-sm > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__bar):not(:has(> .aura-btn, > * > .aura-btn)) > .aura-page-header__status { flex: 1 1 0; align-self: center; }
1377
- :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); }
1378
- :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)); }
1379
- :root:has(.aura-page-header--actions-bar-below-sm) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
1380
- :root:has(.aura-page-header--actions-bar-below-sm):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
1381
+ :root:has(.aura-page-header--actions-bar-below-sm:not([data-aura-bar="empty"])) { --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); }
1382
+ :root:has(.aura-page-header--actions-bar-below-sm.aura-page-header--actions-bar-floating:not([data-aura-bar="empty"])) { --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)); }
1383
+ :root:has(.aura-page-header--actions-bar-below-sm:not([data-aura-bar="empty"])) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
1384
+ :root:has(.aura-page-header--actions-bar-below-sm:not([data-aura-bar="empty"])):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
1381
1385
  }
1382
1386
  @media (max-width: 767.98px) and (min-height: 30.00125rem) {
1383
1387
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar { display: flex; flex: none; min-width: 0; }
1388
+ /* 5.74 (Chamber-OS 193): nothing but the status shown (Pay now hidden after paying): no strip, and no bar padding below. */
1389
+ .aura-page-header--actions-bar-below-md[data-aura-bar="empty"] > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md[data-aura-bar="empty"] > .aura-page-header__actions > .aura-page-header__bar { display: none; }
1390
+ /* …and before hydration, from the markup alone (actionsBar's strip whose element children but the status are all `hidden` or visually hidden): it already goes; the page padding follows once the client has looked. */
1391
+ .aura-page-header--actions-bar-below-md:not([data-aura-bar="shown"]) > .aura-page-header__actions > .aura-page-header__bar:not(:has(> :not(.aura-page-header__status, [hidden], .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text))):has(> *) { display: none; }
1384
1392
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar) { 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); }
1385
1393
  /* 5.54 (Chamber-OS 166): the bar's buttons are 44px whatever the density, as ActionBar's on a phone. */
1386
1394
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar) { --aura-button-height: var(--aura-touch-target); --aura-button-height-sm: var(--aura-touch-target); }
@@ -1396,10 +1404,10 @@ summary.aura-link::-webkit-details-marker { display: none; }
1396
1404
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar):has(> .aura-icon-btn, > * > .aura-icon-btn) > :is(.aura-icon-btn, :has(> .aura-icon-btn)) { align-self: center; }
1397
1405
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar):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); }
1398
1406
  :is(.aura-page-header--actions-bar-below-md > .aura-page-header__actions:not(.is-split), .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__bar):not(:has(> .aura-btn, > * > .aura-btn)) > .aura-page-header__status { flex: 1 1 0; align-self: center; }
1399
- :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); }
1400
- :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)); }
1401
- :root:has(.aura-page-header--actions-bar-below-md) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
1402
- :root:has(.aura-page-header--actions-bar-below-md):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
1407
+ :root:has(.aura-page-header--actions-bar-below-md:not([data-aura-bar="empty"])) { --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); }
1408
+ :root:has(.aura-page-header--actions-bar-below-md.aura-page-header--actions-bar-floating:not([data-aura-bar="empty"])) { --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)); }
1409
+ :root:has(.aura-page-header--actions-bar-below-md:not([data-aura-bar="empty"])) .aura-shell__content { padding-bottom: calc(var(--aura-space-6) + var(--aura-page-actions-space)); }
1410
+ :root:has(.aura-page-header--actions-bar-below-md:not([data-aura-bar="empty"])):not(:has(.aura-shell__content)) body { padding-bottom: var(--aura-page-actions-space); }
1403
1411
  }
1404
1412
  /* 5.71: as specific as the bar rules (and after them), and on actionsBar's box too, so reduced motion stops the slide. */
1405
1413
  @media (prefers-reduced-motion: reduce) { .aura-page-header.aura-page-header > .aura-page-header__actions, .aura-page-header.aura-page-header > .aura-page-header__actions > .aura-page-header__bar { transition: none; } }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.73.0",
3
+ "version": "5.74.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",