@jirawatpyk/aura-react 5.14.0 → 5.15.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,19 @@ 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.15 — Chamber-OS addenda 14–16, layout
190
+
191
+ - **Table `stackStyle="cards"`** (item 85): below `stackBelow` each row is its own framed card (DataTable's card radius, border, padding and 8px gap), with no frame around them; above it the table is unchanged. The table then sits in one more `div` (`.aura-tbl-cards`), which carries the width query. Table roles, labels and the `card` slots behave as before.
192
+ - **Card `header`** (item 87): free head content in place of `title` and `description` — skeleton bars while the card loads, a status pill above a title you mark up yourself. No heading is added and `title` / `titleId` are ignored; `actions` still sit top-right. Card `header` works from `/server` too.
193
+ - **Progress `secondaryValue`** (item 89): a reserved amount drawn after `value` in the same tone, striped (so it reads without colour), clamped to the end of the track. Screen readers hear "2 of 6 used, 1 reserved" (Thai and Swedish included) unless you pass `valueLabel`.
194
+ - **Tabs `fullWidth` for underline tabs** (item 90): `fullWidth` now works on the default look too, tabs sharing the row equally; `fullWidth="below-sm" | "below-md" | "below-lg"` does it only below that width (either look). Tabs never shrink below their label; too many scroll as before. Underline tabs that already passed `fullWidth` (ignored until now) now fill their row.
195
+ - **FilterBar `controlsLayout="fill"` and `stackBelow="lg"`** (item 92): `fill` gives the filters equal columns across their row (at least 120px each, wrapping when they can't fit) with the count and actions at the end; `stackBelow="lg"` puts the search on its own row up to 1024px (default `md`, 768px).
196
+ - **Card `flushBelow`** (item 93): `'sm' | 'md' | 'lg'` — below that width the card drops its border, surface and shadow (padding kept), for a list whose rows become cards of their own.
197
+ - **Breadcrumb `collapseBelow` and item attributes** (item 94): `collapseBelow="sm" | "md"` shows the first item, "…" and the last below that width, in CSS (the server's HTML is already right); "…" is a button ("Show the full path") that shows the rest and moves focus to the first item it revealed; a new trail (the next page, with the Breadcrumb kept mounted) starts collapsed again. "…" is a 24px target, 44px on touch screens. Each item takes `itemProps` (its `<li>`) and `linkProps` (its link, button or text) — `data-slot`, `data-testid`.
198
+ - **Checkbox `hitArea`** (item 99): `'target'` (24×24, WCAG 2.5.8) or `{ x, y }` px on each side — `{ x: 12, y: 8 }` is 40×32 — for a box without visible text; the box looks the same. A labelled checkbox's whole label is already its target.
199
+ - **`touchHeight` on Button and IconButton** (item 100): 44px tall (IconButton 44×44) below 640px, the size asked for above; the label stays centred. A Drawer's close button takes it through `closeProps={{ touchHeight: true }}`. `buttonClass({ touchHeight: true })` from `/server` gives the same class. Off by default.
200
+ - New strings `progressReserved` and `breadcrumbMore` in every locale; a pack you wrote yourself should add them (the built-in ones for the locale are used otherwise). The CSS budget is 25 kB (was 24).
201
+
189
202
  ## 5.14 — Chamber-OS addenda 15–16, the small items
190
203
 
191
204
  - **EmptyState `headingLevel={false}`** (item 86): the title is a `<p>`, so an empty state inside a card or list adds nothing to the page's heading outline. EmptyState has no live-region role unless you pass `role`.
@@ -622,8 +622,11 @@ window.Aura = (() => {
622
622
  "interactive",
623
623
  "as",
624
624
  "className",
625
- "titleId"
625
+ "titleId",
626
+ "header",
627
+ "flushBelow"
626
628
  ]);
629
+ const head = props.header !== void 0 && props.header !== null && props.header !== false;
627
630
  return h2(
628
631
  props.as || "section",
629
632
  Object.assign({}, rest, {
@@ -632,12 +635,13 @@ window.Aura = (() => {
632
635
  "aura-card",
633
636
  creative && "aura-card--creative",
634
637
  props.interactive && "is-interactive",
638
+ props.flushBelow && "aura-card--flush-below-" + props.flushBelow,
635
639
  props.className
636
640
  ),
637
641
  /* A titled card is labelled by its title; otherwise the caller's aria-labelledby stays (5.8). */
638
- "aria-labelledby": props.title && props.titleId ? props.titleId : props["aria-labelledby"]
642
+ "aria-labelledby": !head && props.title && props.titleId ? props.titleId : props["aria-labelledby"]
639
643
  }),
640
- props.title || props.actions ? /* @__PURE__ */ React4.createElement("div", { className: "aura-card__head" }, /* @__PURE__ */ React4.createElement("div", { className: "aura-card__heading" }, props.title ? h2("h" + (props.headingLevel || 3), { className: "aura-card__title", id: props.titleId }, props.title) : null, props.description ? /* @__PURE__ */ React4.createElement("p", { className: "aura-card__desc" }, props.description) : null), props.actions ? /* @__PURE__ */ React4.createElement("div", { className: "aura-card__actions" }, props.actions) : null) : null,
644
+ head || props.title || props.actions ? /* @__PURE__ */ React4.createElement("div", { className: "aura-card__head" }, /* @__PURE__ */ React4.createElement("div", { className: "aura-card__heading" }, head ? props.header : null, !head && props.title ? h2("h" + (props.headingLevel || 3), { className: "aura-card__title", id: props.titleId }, props.title) : null, !head && props.description ? /* @__PURE__ */ React4.createElement("p", { className: "aura-card__desc" }, props.description) : null), props.actions ? /* @__PURE__ */ React4.createElement("div", { className: "aura-card__actions" }, props.actions) : null) : null,
641
645
  props.children ? /* @__PURE__ */ React4.createElement("div", { className: "aura-card__body" }, props.children) : null,
642
646
  props.footer ? /* @__PURE__ */ React4.createElement("div", { className: "aura-card__foot" }, props.footer) : null
643
647
  );
@@ -772,6 +776,7 @@ window.Aura = (() => {
772
776
  "aura-btn--" + (opts.variant || "primary"),
773
777
  opts.size === "sm" && "aura-btn--sm",
774
778
  opts.fullWidth && "aura-btn--full",
779
+ opts.touchHeight && "aura-btn--touch",
775
780
  opts.loading && "is-loading",
776
781
  opts.className
777
782
  );
@@ -901,6 +906,10 @@ window.Aura = (() => {
901
906
  pageN: function(p) {
902
907
  return "\u0E2B\u0E19\u0E49\u0E32 " + p;
903
908
  },
909
+ progressReserved: function(v, r, max) {
910
+ return "\u0E43\u0E0A\u0E49\u0E41\u0E25\u0E49\u0E27 " + n(v) + " \u0E08\u0E32\u0E01 " + n(max) + " \u0E08\u0E2D\u0E07\u0E44\u0E27\u0E49 " + n(r);
911
+ },
912
+ breadcrumbMore: "\u0E41\u0E2A\u0E14\u0E07\u0E40\u0E2A\u0E49\u0E19\u0E17\u0E32\u0E07\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14",
904
913
  accepts: function(list, max) {
905
914
  return [list, max && "\u0E44\u0E21\u0E48\u0E40\u0E01\u0E34\u0E19 " + max + " \u0E15\u0E48\u0E2D\u0E44\u0E1F\u0E25\u0E4C"].filter(Boolean).join(" \xB7 ");
906
915
  }
@@ -1027,6 +1036,10 @@ window.Aura = (() => {
1027
1036
  pageN: function(p) {
1028
1037
  return "Sida " + p;
1029
1038
  },
1039
+ progressReserved: function(v, r, max) {
1040
+ return nsv(v) + " av " + nsv(max) + " anv\xE4nda, " + nsv(r) + " reserverade";
1041
+ },
1042
+ breadcrumbMore: "Visa hela s\xF6kv\xE4gen",
1030
1043
  accepts: function(list, max) {
1031
1044
  return [list, max && "h\xF6gst " + max + " per fil"].filter(Boolean).join(", ");
1032
1045
  }
@@ -1154,6 +1167,10 @@ window.Aura = (() => {
1154
1167
  pageN: function(p) {
1155
1168
  return "Page " + p;
1156
1169
  },
1170
+ progressReserved: function(v, r, max) {
1171
+ return n2(v) + " of " + n2(max) + " used, " + n2(r) + " reserved";
1172
+ },
1173
+ breadcrumbMore: "Show the full path",
1157
1174
  accepts: function(list, max) {
1158
1175
  return [list, max && "up to " + max + " each"].filter(Boolean).join(", ");
1159
1176
  }
@@ -1220,7 +1237,8 @@ window.Aura = (() => {
1220
1237
  "linkComponent",
1221
1238
  "href",
1222
1239
  "fullWidth",
1223
- "size"
1240
+ "size",
1241
+ "touchHeight"
1224
1242
  ]);
1225
1243
  const Tag3 = disabled ? "a" : Link;
1226
1244
  return /* @__PURE__ */ React6.createElement(
@@ -1236,6 +1254,7 @@ window.Aura = (() => {
1236
1254
  variant,
1237
1255
  size: props.size,
1238
1256
  fullWidth: props.fullWidth,
1257
+ touchHeight: props.touchHeight,
1239
1258
  className: props.className
1240
1259
  }),
1241
1260
  onClick: disabled ? void 0 : props.onClick
@@ -1266,7 +1285,8 @@ window.Aura = (() => {
1266
1285
  "loading",
1267
1286
  "onClick",
1268
1287
  "fullWidth",
1269
- "size"
1288
+ "size",
1289
+ "touchHeight"
1270
1290
  ]);
1271
1291
  return /* @__PURE__ */ React6.createElement(
1272
1292
  "button",
@@ -1278,6 +1298,7 @@ window.Aura = (() => {
1278
1298
  variant,
1279
1299
  size: props.size,
1280
1300
  fullWidth: props.fullWidth,
1301
+ touchHeight: props.touchHeight,
1281
1302
  loading,
1282
1303
  className: props.className
1283
1304
  }),
@@ -1297,7 +1318,7 @@ window.Aura = (() => {
1297
1318
  // src/IconButton.tsx
1298
1319
  var React7 = __toESM(require_react(), 1);
1299
1320
  var IconButton = React7.forwardRef(function IconButton2(props, ref) {
1300
- const rest = omit(props, ["icon", "label", "className", "size", "tone"]);
1321
+ const rest = omit(props, ["icon", "label", "className", "size", "tone", "touchHeight"]);
1301
1322
  return /* @__PURE__ */ React7.createElement(
1302
1323
  "button",
1303
1324
  {
@@ -1306,7 +1327,12 @@ window.Aura = (() => {
1306
1327
  type: props.type || "button",
1307
1328
  "aria-label": props.label,
1308
1329
  title: props.label,
1309
- className: cx("aura-icon-btn", props.tone === "danger" && "aura-icon-btn--danger", props.className)
1330
+ className: cx(
1331
+ "aura-icon-btn",
1332
+ props.tone === "danger" && "aura-icon-btn--danger",
1333
+ props.touchHeight && "aura-icon-btn--touch",
1334
+ props.className
1335
+ )
1310
1336
  },
1311
1337
  /* @__PURE__ */ React7.createElement(Icon, { name: props.icon, size: props.size || "sm" })
1312
1338
  );
@@ -1578,7 +1604,8 @@ window.Aura = (() => {
1578
1604
  "description",
1579
1605
  "className",
1580
1606
  "tabIndex",
1581
- "disabled"
1607
+ "disabled",
1608
+ "hitArea"
1582
1609
  ]);
1583
1610
  const text2 = props.children;
1584
1611
  const labelled = text2 != null && text2 !== "";
@@ -1588,10 +1615,19 @@ window.Aura = (() => {
1588
1615
  "Checkbox `label` is only the accessible name: it is not shown. In 6.0 it will be shown beside the box, like Switch and TextField. For visible text now pass it as children; for a bare box (a table row) add `hideLabel`."
1589
1616
  );
1590
1617
  const descId = props.description ? (props.id || auto) + "-desc" : void 0;
1618
+ const ha = props.hitArea;
1619
+ const hit = !labelled && ha && ha !== "box" ? ha === "target" ? { x: 4, y: 4 } : ha : null;
1591
1620
  return /* @__PURE__ */ React10.createElement(
1592
1621
  "label",
1593
1622
  {
1594
- className: cx("aura-check", labelled && "aura-check--labelled", props.disabled && "is-disabled", props.className),
1623
+ className: cx(
1624
+ "aura-check",
1625
+ labelled && "aura-check--labelled",
1626
+ hit && "has-hit",
1627
+ props.disabled && "is-disabled",
1628
+ props.className
1629
+ ),
1630
+ style: hit ? { "--aura-check-hit-x": hit.x + "px", "--aura-check-hit-y": hit.y + "px" } : void 0,
1595
1631
  onClick: function(e) {
1596
1632
  e.stopPropagation();
1597
1633
  }
@@ -4140,7 +4176,13 @@ window.Aura = (() => {
4140
4176
  ref,
4141
4177
  role: "region",
4142
4178
  "aria-label": props.label || t.filters,
4143
- className: cx("aura-filterbar", props.searchGrow && "aura-filterbar--grow", props.className)
4179
+ className: cx(
4180
+ "aura-filterbar",
4181
+ props.searchGrow && "aura-filterbar--grow",
4182
+ props.controlsLayout === "fill" && "aura-filterbar--fill",
4183
+ props.stackBelow === "lg" && "aura-filterbar--stack-lg",
4184
+ props.className
4185
+ )
4144
4186
  },
4145
4187
  /* @__PURE__ */ React26.createElement("div", { className: "aura-filterbar__row" }, hasSearch ? /* @__PURE__ */ React26.createElement("div", { className: "aura-input has-icon aura-filterbar__search" }, /* @__PURE__ */ React26.createElement(Icon, { name: /* @__PURE__ */ React26.createElement(IconSearch, null), className: "aura-input__icon" }), /* @__PURE__ */ React26.createElement(
4146
4188
  "input",
@@ -6142,7 +6184,13 @@ window.Aura = (() => {
6142
6184
  const Link = useLinkComponent(props.linkComponent);
6143
6185
  const manual = props.activation === "manual";
6144
6186
  const seg = props.variant === "segmented";
6145
- const listCls = cx("aura-tabs__list", seg && "aura-segmented", seg && props.fullWidth && "is-full");
6187
+ const fw = props.fullWidth;
6188
+ const listCls = cx(
6189
+ "aura-tabs__list",
6190
+ seg && "aura-segmented",
6191
+ fw === true && (seg ? "is-full" : "is-fill"),
6192
+ typeof fw === "string" && (seg ? "is-full-" : "is-fill-") + fw
6193
+ );
6146
6194
  const tabCls = function(on, extra) {
6147
6195
  return cx("aura-tab", on && "is-active", seg && "aura-segmented__option", seg && on && "is-selected", extra);
6148
6196
  };
@@ -6535,13 +6583,83 @@ window.Aura = (() => {
6535
6583
  const t = useStrings();
6536
6584
  const Link = useLinkComponent(props.linkComponent);
6537
6585
  const items2 = props.items || [];
6538
- return /* @__PURE__ */ React35.createElement("nav", { ref, "aria-label": props.label || t.breadcrumb, className: cx("aura-crumbs", props.className) }, /* @__PURE__ */ React35.createElement("ol", null, items2.map(function(it, i) {
6586
+ const collapsible = !!props.collapseBelow && items2.length > 2;
6587
+ const trail = items2.map(function(it) {
6588
+ return it.label + "" + (it.href || "");
6589
+ }).join("");
6590
+ const st = React35.useState(null), expanded = st[0] === trail, setExpanded = function() {
6591
+ st[1](trail);
6592
+ };
6593
+ const listRef = React35.useRef(null);
6594
+ const focusNext = React35.useRef(false);
6595
+ React35.useEffect(
6596
+ function() {
6597
+ if (!expanded || !focusNext.current) return;
6598
+ focusNext.current = false;
6599
+ const ol = listRef.current;
6600
+ if (!ol) return;
6601
+ let target = ol.querySelector(".aura-crumbs__middle a, .aura-crumbs__middle button");
6602
+ if (!target) {
6603
+ target = ol.querySelector(".aura-crumbs__middle > *");
6604
+ if (target) target.tabIndex = -1;
6605
+ }
6606
+ if (target) target.focus();
6607
+ },
6608
+ [expanded]
6609
+ );
6610
+ const sep = /* @__PURE__ */ React35.createElement(Icon, { name: /* @__PURE__ */ React35.createElement(IconChevronRight, null), size: 12, className: "aura-crumbs__sep" });
6611
+ const more = collapsible && !expanded ? /* @__PURE__ */ React35.createElement("li", { key: "more", className: "aura-crumbs__more" }, /* @__PURE__ */ React35.createElement(
6612
+ "button",
6613
+ {
6614
+ type: "button",
6615
+ "aria-label": t.breadcrumbMore,
6616
+ onClick: function() {
6617
+ focusNext.current = true;
6618
+ setExpanded();
6619
+ }
6620
+ },
6621
+ "\u2026"
6622
+ ), sep) : null;
6623
+ const out = [];
6624
+ items2.forEach(function(it, i) {
6539
6625
  const last = i === items2.length - 1;
6540
- return /* @__PURE__ */ React35.createElement("li", { key: i }, last ? /* @__PURE__ */ React35.createElement("span", { "aria-current": "page", className: "aura-crumbs__current" }, it.label) : it.href ? /* @__PURE__ */ React35.createElement(Link, { href: it.href, onClick: it.onClick }, it.label) : it.onClick ? /* @__PURE__ */ React35.createElement("button", { type: "button", onClick: it.onClick }, it.label) : (
6541
- /* 5.7: a segment with no page and no action is text, not a button that does nothing. */
6542
- /* @__PURE__ */ React35.createElement("span", { className: "aura-crumbs__text" }, it.label)
6543
- ), last ? null : /* @__PURE__ */ React35.createElement(Icon, { name: /* @__PURE__ */ React35.createElement(IconChevronRight, null), size: 12, className: "aura-crumbs__sep" }));
6544
- })));
6626
+ const lp = it.linkProps || {};
6627
+ const plain = lp;
6628
+ const own = lp.onClick;
6629
+ const click = own || it.onClick ? function(e) {
6630
+ if (own) own(e);
6631
+ if (it.onClick) it.onClick();
6632
+ } : void 0;
6633
+ out.push(
6634
+ /* @__PURE__ */ React35.createElement(
6635
+ "li",
6636
+ {
6637
+ key: i,
6638
+ ...it.itemProps,
6639
+ className: cx(it.itemProps && it.itemProps.className, collapsible && !last && i > 0 && "aura-crumbs__middle") || void 0
6640
+ },
6641
+ last ? /* @__PURE__ */ React35.createElement("span", { ...plain, "aria-current": "page", className: cx("aura-crumbs__current", lp.className) }, it.label) : it.href ? /* @__PURE__ */ React35.createElement(Link, { ...lp, href: it.href, onClick: click }, it.label) : it.onClick ? /* @__PURE__ */ React35.createElement("button", { ...lp, type: "button", onClick: click }, it.label) : (
6642
+ /* 5.7: a segment with no page and no action is text, not a button that does nothing. */
6643
+ /* @__PURE__ */ React35.createElement("span", { ...plain, className: cx("aura-crumbs__text", lp.className) }, it.label)
6644
+ ),
6645
+ last ? null : sep
6646
+ )
6647
+ );
6648
+ if (i === 0 && more) out.push(more);
6649
+ });
6650
+ return /* @__PURE__ */ React35.createElement(
6651
+ "nav",
6652
+ {
6653
+ ref,
6654
+ "aria-label": props.label || t.breadcrumb,
6655
+ className: cx(
6656
+ "aura-crumbs",
6657
+ collapsible && !expanded && "aura-crumbs--collapse-" + props.collapseBelow,
6658
+ props.className
6659
+ )
6660
+ },
6661
+ /* @__PURE__ */ React35.createElement("ol", { ref: listRef }, out)
6662
+ );
6545
6663
  });
6546
6664
 
6547
6665
  // src/Avatar.tsx
@@ -6862,7 +6980,8 @@ window.Aura = (() => {
6862
6980
  return out;
6863
6981
  }
6864
6982
  var Table = React44.forwardRef(function Table2(props, ref) {
6865
- const { caption, captionHidden, density, stackBelow, align, bordered, className, children, ...rest } = props;
6983
+ const { caption, captionHidden, density, stackBelow, align, bordered, stackStyle, className, children, ...rest } = props;
6984
+ const cards = !!stackBelow && stackStyle === "cards";
6866
6985
  const labels = stackBelow ? headerLabels(children) : null;
6867
6986
  if (labels && !labels.length)
6868
6987
  devWarnOnce(
@@ -6886,7 +7005,7 @@ window.Aura = (() => {
6886
7005
  ro.disconnect();
6887
7006
  };
6888
7007
  }, []);
6889
- return /* @__PURE__ */ React44.createElement(
7008
+ const table = /* @__PURE__ */ React44.createElement(
6890
7009
  "div",
6891
7010
  {
6892
7011
  ref: wrap,
@@ -6905,6 +7024,7 @@ window.Aura = (() => {
6905
7024
  "aura-tbl",
6906
7025
  stackBelow && "aura-tbl--stack-" + stackBelow,
6907
7026
  align === "middle" && "aura-tbl--middle",
7027
+ cards && "aura-tbl--cards",
6908
7028
  className
6909
7029
  ),
6910
7030
  role: stackBelow ? "table" : void 0,
@@ -6914,6 +7034,7 @@ window.Aura = (() => {
6914
7034
  labels ? /* @__PURE__ */ React44.createElement(StackLabels.Provider, { value: labels }, children) : outer ? /* @__PURE__ */ React44.createElement(StackLabels.Provider, { value: null }, children) : children
6915
7035
  )
6916
7036
  );
7037
+ return cards ? /* @__PURE__ */ React44.createElement("div", { className: "aura-tbl-cards aura-tbl-cards--" + stackBelow }, table) : table;
6917
7038
  });
6918
7039
  function section(tag, cls) {
6919
7040
  const C = React44.forwardRef(function TableSection(props, ref) {
@@ -8015,9 +8136,13 @@ window.Aura = (() => {
8015
8136
  // src/Progress.tsx
8016
8137
  var React53 = __toESM(require_react(), 1);
8017
8138
  var Progress = React53.forwardRef(function Progress2(props, ref) {
8139
+ const t = useStrings();
8018
8140
  const auto = uid(), id = props.id || auto;
8019
8141
  const max = props.max || 100, det = props.value != null;
8020
8142
  const pct = det ? Math.max(0, Math.min(100, props.value / max * 100)) : 0;
8143
+ const sec = det && props.secondaryValue != null && props.secondaryValue > 0 ? props.secondaryValue : 0;
8144
+ const spct = sec ? Math.max(0, Math.min(100 - pct, sec / max * 100)) : 0;
8145
+ const valueText = props.valueLabel != null ? String(props.valueLabel) : sec ? t.progressReserved(props.value, sec, max) : void 0;
8021
8146
  const shown = props.valueLabel != null ? props.valueLabel : det ? Math.round(pct) + "%" : null;
8022
8147
  return /* @__PURE__ */ React53.createElement(
8023
8148
  "div",
@@ -8041,9 +8166,16 @@ window.Aura = (() => {
8041
8166
  "aria-valuemin": det ? 0 : void 0,
8042
8167
  "aria-valuemax": det ? max : void 0,
8043
8168
  "aria-valuenow": det ? props.value : void 0,
8044
- "aria-valuetext": det && props.valueLabel != null ? String(props.valueLabel) : void 0
8169
+ "aria-valuetext": det ? valueText : void 0
8045
8170
  },
8046
- /* @__PURE__ */ React53.createElement("span", { className: "aura-progress__bar", style: det ? { width: pct + "%" } : void 0 })
8171
+ /* @__PURE__ */ React53.createElement("span", { className: "aura-progress__bar", style: det ? { width: pct + "%" } : void 0 }),
8172
+ sec ? /* @__PURE__ */ React53.createElement(
8173
+ "span",
8174
+ {
8175
+ className: "aura-progress__bar aura-progress__bar--reserved",
8176
+ style: { left: pct + "%", width: spct + "%" }
8177
+ }
8178
+ ) : null
8047
8179
  ),
8048
8180
  props.hint ? /* @__PURE__ */ React53.createElement("p", { className: "aura-progress__hint" }, props.hint) : null
8049
8181
  );