@jirawatpyk/aura-react 5.36.0 → 5.38.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 -0
- package/dist/aura.bundle.js +56 -18
- package/dist/cjs/index.cjs +56 -18
- package/dist/esm/Combobox.js +2 -2
- package/dist/esm/DataTable.js +14 -0
- package/dist/esm/DatePicker.js +12 -3
- package/dist/esm/FilterBar.js +2 -1
- package/dist/esm/NumberField.js +2 -2
- package/dist/esm/PageHeader.js +10 -1
- package/dist/esm/SegmentedControl.js +2 -0
- package/dist/esm/Select.js +25 -12
- package/dist/esm/TimePicker.js +2 -2
- package/dist/index.d.cts +37 -0
- package/dist/index.d.ts +37 -0
- package/dist/server/index.cjs +10 -1
- package/dist/server/index.d.cts +5 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.js +10 -1
- package/dist/styles.css +63 -0
- package/dist/styles.layer.css +63 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -186,6 +186,17 @@ 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.38 — Chamber-OS addenda 43–45
|
|
190
|
+
|
|
191
|
+
- **FilterBar and FilterSelect `touchHeight`** (#140): `true` makes the search (and its clear button) and every field-height control in the bar (FilterSelect, Select, Combobox, DatePicker and TimePicker with their buttons, SegmentedControl's options) 44px below 640px or on a coarse pointer — the same rule as Button's and TextField's `touchHeight` — and `'always'` at every width; `touchHeight` on one FilterSelect does the same for it alone. Without it nothing changes: the density's input height with a mouse, 44px on a coarse pointer. Buttons in `actions` take their own `touchHeight`. A SegmentedControl's track is 50px there (44px options plus its edge and padding), as with its own `touchHeight`. Opt-in rather than a new default, like every other `touchHeight`, so a narrow desktop window doesn't change size unasked.
|
|
192
|
+
- **`touchHeight` on Combobox, DatePicker, DateRangePicker, TimePicker and NumberField** (#141): the same values and rule as TextField's. The box is 44px and the buttons inside it (clear, chevron, calendar, steppers) take their touch-screen size — 44px wide, side by side, 40px tall — so none is a 32px target in a 44px box. A multiple Combobox now reserves room for both 44px buttons on touch screens too (chips used to run up to 24px under the clear button).
|
|
193
|
+
- **DataTable `rowProps`** (#142): `rowProps={(row) => ({ 'data-user-id': row.id, id: 'user-' + row.id })}` sets `data-*` attributes and an `id` on each row's element, in the grid and as a stacked card — for end-to-end hooks. Anything else it returns is ignored (a development warning names it) — `aria-*`, `role`, `className`, handlers, and `data-rc` (the table's own cell address) — so a row keeps its role, name, classes, selection and keyboard behaviour.
|
|
194
|
+
|
|
195
|
+
## 5.37 — DxT Monitor requests 17–18
|
|
196
|
+
|
|
197
|
+
- **PageHeader `actionsFullWidthBelow`** (request 17): `'sm'`, `'md'` or `'lg'` — below 640px, 768px or 1024px the actions take the whole row under the text, 12px apart, and the buttons share each line in equal widths (unless a label needs more), so they reach the page's edge: three buttons on a phone fill two rows (two halves, then one across) when their labels don't fit on one, and a single button spans the row. A button inside a DropdownMenu, Tooltip or Popover fills its share too; an IconButton (bare, or as a menu's trigger) keeps its square size — so a line with only IconButtons on it doesn't reach the edge (one that wraps alone sits at the start); put them on the first line. Labels don't wrap: a label wider than the row overflows, as before — keep phone labels short, or give that one Button `fullWidth`. For a fixed arrangement, pass your own grid as the one child — it spans the row too. Wider than the breakpoint, the actions hug their content at the end, 8px apart, as before. A class on the root, so it works from `/server` too. Apps that stretched the actions with their own selector (e.g. `max-md:[&>:last-child]:w-full`) can drop it.
|
|
198
|
+
- **SegmentedControl `touchHeight`** (request 18): 44px options — `size="sm"` too, icon-only options 44px square — with `true` below 640px or on a coarse pointer (the same rule as Button's and TextField's `touchHeight`), or `'always'` at every width. A phone-sized viewport with a mouse (or an emulated phone in end-to-end tests) now gets the touch size too. Without it nothing changes: options are as tall as a field beside them with a mouse, and 44px on a coarse pointer. DxT asked for "below md"; it follows AURA's other `touchHeight` props (below 640px) so a form's fields, buttons and choices change size together — at 390px it is the same.
|
|
199
|
+
|
|
189
200
|
## 5.36 — DxT Monitor requests 15–16
|
|
190
201
|
|
|
191
202
|
- **Focus rings in table cells** (request 15): a DataTable cell clips its text (ellipsis) but no longer the focus ring of a link or button in it. The clip has a 4px margin (`overflow: clip` + `overflow-clip-margin`), so content wider than its cell (a pill, a button) now shows up to 4px past its edge. In the first data column a focused link or button sits just above the row's sticky start gutter or pinned checkbox column (which painted over the ring's start side) — not while the table is scrolled sideways, and never above the sticky header, totals or pinned columns — and a plain `<a>` or `<button>` of yours in a cell gets AURA's ring instead of the browser's (zero specificity, so your own focus style wins). Safari has no `overflow-clip-margin`: there rings in cells are drawn just inside the control, whole. Apps that set `overflow: clip` on `.aura-table__td` themselves can drop it.
|
package/dist/aura.bundle.js
CHANGED
|
@@ -2501,18 +2501,30 @@ window.Aura = (() => {
|
|
|
2501
2501
|
const nameId = id + "-name";
|
|
2502
2502
|
const face = filter ? /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement("span", { id: nameId, className: "aura-filterselect__name", "aria-hidden": true }, filter.name), /* @__PURE__ */ React16.createElement("span", { className: "aura-filterselect__value", "aria-hidden": shown[0].label !== shown[0].full || void 0 }, shown[0].label || " "), shown[0].label !== shown[0].full ? /* @__PURE__ */ React16.createElement("span", { className: "aura-sr-only" }, shown[0].full) : null, /* @__PURE__ */ React16.createElement(Icon, { name: /* @__PURE__ */ React16.createElement(IconChevronDown, null), className: "aura-filterselect__chevron" })) : null;
|
|
2503
2503
|
if (!live && filter)
|
|
2504
|
-
return /* @__PURE__ */ React16.createElement(
|
|
2505
|
-
"
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
props.
|
|
2515
|
-
|
|
2504
|
+
return /* @__PURE__ */ React16.createElement(
|
|
2505
|
+
"div",
|
|
2506
|
+
{
|
|
2507
|
+
className: cx(
|
|
2508
|
+
"aura-filterselect",
|
|
2509
|
+
props.disabled && "is-disabled",
|
|
2510
|
+
touchClass(props.touchHeight),
|
|
2511
|
+
props.className
|
|
2512
|
+
)
|
|
2513
|
+
},
|
|
2514
|
+
/* @__PURE__ */ React16.createElement("span", { className: "aura-filterselect__face", "aria-hidden": true, style: props.style }, face),
|
|
2515
|
+
h4(
|
|
2516
|
+
"select",
|
|
2517
|
+
Object.assign(extra, omit(rest, ["style"]), {
|
|
2518
|
+
ref: selMerged,
|
|
2519
|
+
id,
|
|
2520
|
+
className: "aura-filterselect__native",
|
|
2521
|
+
"aria-label": rest["aria-label"] || (rest["aria-labelledby"] ? void 0 : filter.name),
|
|
2522
|
+
"aria-describedby": described
|
|
2523
|
+
}),
|
|
2524
|
+
opts,
|
|
2525
|
+
props.children
|
|
2526
|
+
)
|
|
2527
|
+
);
|
|
2516
2528
|
if (!live)
|
|
2517
2529
|
return field(
|
|
2518
2530
|
/* @__PURE__ */ React16.createElement("div", { className: cx("aura-input aura-select", props.icon && "has-icon", ro && "is-readonly") }, props.icon ? /* @__PURE__ */ React16.createElement(Icon, { name: props.icon, className: "aura-input__icon" }) : null, h4(
|
|
@@ -2625,6 +2637,7 @@ window.Aura = (() => {
|
|
|
2625
2637
|
ro && "is-readonly",
|
|
2626
2638
|
open && "is-open",
|
|
2627
2639
|
filter && props.disabled && "is-disabled",
|
|
2640
|
+
filter && touchClass(props.touchHeight),
|
|
2628
2641
|
filter && props.className
|
|
2629
2642
|
),
|
|
2630
2643
|
"data-invalid": props.error ? "" : void 0
|
|
@@ -3393,7 +3406,7 @@ window.Aura = (() => {
|
|
|
3393
3406
|
required: props.required,
|
|
3394
3407
|
optional: props.optional,
|
|
3395
3408
|
disabled: props.disabled,
|
|
3396
|
-
className: props.className,
|
|
3409
|
+
className: cx(touchClass(props.touchHeight), props.className),
|
|
3397
3410
|
name: props.name,
|
|
3398
3411
|
boxRef,
|
|
3399
3412
|
inputRef: inputMerged,
|
|
@@ -3527,7 +3540,7 @@ window.Aura = (() => {
|
|
|
3527
3540
|
required: props.required,
|
|
3528
3541
|
optional: props.optional,
|
|
3529
3542
|
disabled: props.disabled,
|
|
3530
|
-
className: props.className,
|
|
3543
|
+
className: cx(touchClass(props.touchHeight), props.className),
|
|
3531
3544
|
name: props.name,
|
|
3532
3545
|
boxRef,
|
|
3533
3546
|
inputRef: inputMerged,
|
|
@@ -4117,7 +4130,7 @@ window.Aura = (() => {
|
|
|
4117
4130
|
required: props.required,
|
|
4118
4131
|
optional: props.optional,
|
|
4119
4132
|
disabled: props.disabled,
|
|
4120
|
-
className: props.className
|
|
4133
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
4121
4134
|
},
|
|
4122
4135
|
/* @__PURE__ */ React22.createElement("div", { ref: boxRef, className: cx("aura-input aura-combo has-icon", open && "is-open", multi && "is-multi") }, /* @__PURE__ */ React22.createElement(Icon, { name: props.icon || /* @__PURE__ */ React22.createElement(IconSearch, null), className: "aura-input__icon" }), multi && picked.length ? /* @__PURE__ */ React22.createElement("span", { className: "aura-combo__chips" }, picked.map(function(o) {
|
|
4123
4136
|
return /* @__PURE__ */ React22.createElement("span", { key: o.value, className: "aura-combo__chip" }, /* @__PURE__ */ React22.createElement("span", { className: "aura-combo__chip-label" }, o.label), props.disabled || props.readOnly ? null : /* @__PURE__ */ React22.createElement(
|
|
@@ -4962,6 +4975,7 @@ window.Aura = (() => {
|
|
|
4962
4975
|
props.searchGrow && "aura-filterbar--grow",
|
|
4963
4976
|
props.controlsLayout === "fill" && "aura-filterbar--fill",
|
|
4964
4977
|
props.stackBelow === "lg" && "aura-filterbar--stack-lg",
|
|
4978
|
+
touchClass(props.touchHeight),
|
|
4965
4979
|
props.className
|
|
4966
4980
|
)
|
|
4967
4981
|
},
|
|
@@ -5529,6 +5543,19 @@ window.Aura = (() => {
|
|
|
5529
5543
|
// src/DataTable.tsx
|
|
5530
5544
|
var React33 = __toESM(require_react(), 1);
|
|
5531
5545
|
var import_react_dom10 = __toESM(require_react_dom(), 1);
|
|
5546
|
+
function ownRowAttrs(p) {
|
|
5547
|
+
if (!p) return null;
|
|
5548
|
+
const out = {};
|
|
5549
|
+
Object.keys(p).forEach(function(k) {
|
|
5550
|
+
if (k === "id" || /^data-/.test(k) && k !== "data-rc") out[k] = p[k];
|
|
5551
|
+
else
|
|
5552
|
+
devWarnOnce(
|
|
5553
|
+
"datatable-rowprops-" + k,
|
|
5554
|
+
'DataTable rowProps: "' + k + '" is ignored; only data-* (not data-rc) and id are set on a row.'
|
|
5555
|
+
);
|
|
5556
|
+
});
|
|
5557
|
+
return out;
|
|
5558
|
+
}
|
|
5532
5559
|
var BP = { sm: 640, md: 768, lg: 1024, xl: 1280 };
|
|
5533
5560
|
var DEFAULT_COLUMNS = [
|
|
5534
5561
|
{ key: "id", label: "ID", width: 96, mono: true },
|
|
@@ -6740,6 +6767,7 @@ window.Aura = (() => {
|
|
|
6740
6767
|
(props.onRowActivate || rowHref) && "is-actionable"
|
|
6741
6768
|
),
|
|
6742
6769
|
style: rowStyle,
|
|
6770
|
+
...ownRowAttrs(props.rowProps ? props.rowProps(r2) : null),
|
|
6743
6771
|
onClick: function(e) {
|
|
6744
6772
|
const el = e.target;
|
|
6745
6773
|
if (el.closest && el.closest(".aura-check, button, a, input")) return;
|
|
@@ -7663,9 +7691,18 @@ window.Aura = (() => {
|
|
|
7663
7691
|
attrs2[k] = props[k];
|
|
7664
7692
|
});
|
|
7665
7693
|
const level = props.headingLevel || 1;
|
|
7694
|
+
const below2 = props.actionsFullWidthBelow;
|
|
7666
7695
|
return h8(
|
|
7667
7696
|
"div",
|
|
7668
|
-
Object.assign(attrs2, {
|
|
7697
|
+
Object.assign(attrs2, {
|
|
7698
|
+
ref,
|
|
7699
|
+
className: cx(
|
|
7700
|
+
"aura-page-header",
|
|
7701
|
+
(below2 === "sm" || below2 === "md" || below2 === "lg") && "aura-page-header--actions-full-below-" + below2,
|
|
7702
|
+
props.className
|
|
7703
|
+
),
|
|
7704
|
+
style: props.style
|
|
7705
|
+
}),
|
|
7669
7706
|
h8(
|
|
7670
7707
|
"div",
|
|
7671
7708
|
{ className: "aura-page-header__text" },
|
|
@@ -8823,7 +8860,7 @@ window.Aura = (() => {
|
|
|
8823
8860
|
required: props.required,
|
|
8824
8861
|
optional: props.optional,
|
|
8825
8862
|
disabled: props.disabled,
|
|
8826
|
-
className: props.className
|
|
8863
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
8827
8864
|
},
|
|
8828
8865
|
/* @__PURE__ */ React54.createElement("div", { ref: boxRef, className: cx("aura-input aura-combo aura-time has-icon", open && "is-open") }, /* @__PURE__ */ React54.createElement(Icon, { name: /* @__PURE__ */ React54.createElement(IconClock, null), className: "aura-input__icon" }), /* @__PURE__ */ React54.createElement(
|
|
8829
8866
|
"input",
|
|
@@ -10025,7 +10062,7 @@ window.Aura = (() => {
|
|
|
10025
10062
|
required: props.required,
|
|
10026
10063
|
optional: props.optional,
|
|
10027
10064
|
disabled: props.disabled,
|
|
10028
|
-
className: props.className
|
|
10065
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
10029
10066
|
},
|
|
10030
10067
|
/* @__PURE__ */ React65.createElement("div", { className: cx("aura-input aura-number", stepper && "has-stepper") }, props.prefix != null ? /* @__PURE__ */ React65.createElement("span", { className: "aura-number__affix", "aria-hidden": true }, props.prefix) : null, /* @__PURE__ */ React65.createElement(
|
|
10031
10068
|
"input",
|
|
@@ -10239,6 +10276,7 @@ window.Aura = (() => {
|
|
|
10239
10276
|
"aura-segmented",
|
|
10240
10277
|
props.size === "sm" && "aura-segmented--sm",
|
|
10241
10278
|
props.fullWidth && "is-full",
|
|
10279
|
+
touchClass(props.touchHeight),
|
|
10242
10280
|
props.disabled && "is-disabled",
|
|
10243
10281
|
props.className
|
|
10244
10282
|
)
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -2483,18 +2483,30 @@ var Select = React16.forwardRef(function Select2(props, ref) {
|
|
|
2483
2483
|
const nameId = id + "-name";
|
|
2484
2484
|
const face = filter ? /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement("span", { id: nameId, className: "aura-filterselect__name", "aria-hidden": true }, filter.name), /* @__PURE__ */ React16.createElement("span", { className: "aura-filterselect__value", "aria-hidden": shown[0].label !== shown[0].full || void 0 }, shown[0].label || " "), shown[0].label !== shown[0].full ? /* @__PURE__ */ React16.createElement("span", { className: "aura-sr-only" }, shown[0].full) : null, /* @__PURE__ */ React16.createElement(Icon, { name: /* @__PURE__ */ React16.createElement(IconChevronDown, null), className: "aura-filterselect__chevron" })) : null;
|
|
2485
2485
|
if (!live && filter)
|
|
2486
|
-
return /* @__PURE__ */ React16.createElement(
|
|
2487
|
-
"
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
props.
|
|
2497
|
-
|
|
2486
|
+
return /* @__PURE__ */ React16.createElement(
|
|
2487
|
+
"div",
|
|
2488
|
+
{
|
|
2489
|
+
className: cx(
|
|
2490
|
+
"aura-filterselect",
|
|
2491
|
+
props.disabled && "is-disabled",
|
|
2492
|
+
touchClass(props.touchHeight),
|
|
2493
|
+
props.className
|
|
2494
|
+
)
|
|
2495
|
+
},
|
|
2496
|
+
/* @__PURE__ */ React16.createElement("span", { className: "aura-filterselect__face", "aria-hidden": true, style: props.style }, face),
|
|
2497
|
+
h4(
|
|
2498
|
+
"select",
|
|
2499
|
+
Object.assign(extra, omit(rest, ["style"]), {
|
|
2500
|
+
ref: selMerged,
|
|
2501
|
+
id,
|
|
2502
|
+
className: "aura-filterselect__native",
|
|
2503
|
+
"aria-label": rest["aria-label"] || (rest["aria-labelledby"] ? void 0 : filter.name),
|
|
2504
|
+
"aria-describedby": described
|
|
2505
|
+
}),
|
|
2506
|
+
opts,
|
|
2507
|
+
props.children
|
|
2508
|
+
)
|
|
2509
|
+
);
|
|
2498
2510
|
if (!live)
|
|
2499
2511
|
return field(
|
|
2500
2512
|
/* @__PURE__ */ React16.createElement("div", { className: cx("aura-input aura-select", props.icon && "has-icon", ro && "is-readonly") }, props.icon ? /* @__PURE__ */ React16.createElement(Icon, { name: props.icon, className: "aura-input__icon" }) : null, h4(
|
|
@@ -2607,6 +2619,7 @@ var Select = React16.forwardRef(function Select2(props, ref) {
|
|
|
2607
2619
|
ro && "is-readonly",
|
|
2608
2620
|
open && "is-open",
|
|
2609
2621
|
filter && props.disabled && "is-disabled",
|
|
2622
|
+
filter && touchClass(props.touchHeight),
|
|
2610
2623
|
filter && props.className
|
|
2611
2624
|
),
|
|
2612
2625
|
"data-invalid": props.error ? "" : void 0
|
|
@@ -3375,7 +3388,7 @@ var DatePicker = React18.forwardRef(function DatePicker2(props, ref) {
|
|
|
3375
3388
|
required: props.required,
|
|
3376
3389
|
optional: props.optional,
|
|
3377
3390
|
disabled: props.disabled,
|
|
3378
|
-
className: props.className,
|
|
3391
|
+
className: cx(touchClass(props.touchHeight), props.className),
|
|
3379
3392
|
name: props.name,
|
|
3380
3393
|
boxRef,
|
|
3381
3394
|
inputRef: inputMerged,
|
|
@@ -3509,7 +3522,7 @@ var DateRangePicker = React18.forwardRef(
|
|
|
3509
3522
|
required: props.required,
|
|
3510
3523
|
optional: props.optional,
|
|
3511
3524
|
disabled: props.disabled,
|
|
3512
|
-
className: props.className,
|
|
3525
|
+
className: cx(touchClass(props.touchHeight), props.className),
|
|
3513
3526
|
name: props.name,
|
|
3514
3527
|
boxRef,
|
|
3515
3528
|
inputRef: inputMerged,
|
|
@@ -4099,7 +4112,7 @@ var Combobox = React22.forwardRef(
|
|
|
4099
4112
|
required: props.required,
|
|
4100
4113
|
optional: props.optional,
|
|
4101
4114
|
disabled: props.disabled,
|
|
4102
|
-
className: props.className
|
|
4115
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
4103
4116
|
},
|
|
4104
4117
|
/* @__PURE__ */ React22.createElement("div", { ref: boxRef, className: cx("aura-input aura-combo has-icon", open && "is-open", multi && "is-multi") }, /* @__PURE__ */ React22.createElement(Icon, { name: props.icon || /* @__PURE__ */ React22.createElement(IconSearch, null), className: "aura-input__icon" }), multi && picked.length ? /* @__PURE__ */ React22.createElement("span", { className: "aura-combo__chips" }, picked.map(function(o) {
|
|
4105
4118
|
return /* @__PURE__ */ React22.createElement("span", { key: o.value, className: "aura-combo__chip" }, /* @__PURE__ */ React22.createElement("span", { className: "aura-combo__chip-label" }, o.label), props.disabled || props.readOnly ? null : /* @__PURE__ */ React22.createElement(
|
|
@@ -4944,6 +4957,7 @@ var FilterBar = React29.forwardRef(function FilterBar2(props, ref) {
|
|
|
4944
4957
|
props.searchGrow && "aura-filterbar--grow",
|
|
4945
4958
|
props.controlsLayout === "fill" && "aura-filterbar--fill",
|
|
4946
4959
|
props.stackBelow === "lg" && "aura-filterbar--stack-lg",
|
|
4960
|
+
touchClass(props.touchHeight),
|
|
4947
4961
|
props.className
|
|
4948
4962
|
)
|
|
4949
4963
|
},
|
|
@@ -5511,6 +5525,19 @@ var Drawer = React32.forwardRef(function Drawer2(props, ref) {
|
|
|
5511
5525
|
// src/DataTable.tsx
|
|
5512
5526
|
var React33 = __toESM(require("react"), 1);
|
|
5513
5527
|
var import_react_dom10 = require("react-dom");
|
|
5528
|
+
function ownRowAttrs(p) {
|
|
5529
|
+
if (!p) return null;
|
|
5530
|
+
const out = {};
|
|
5531
|
+
Object.keys(p).forEach(function(k) {
|
|
5532
|
+
if (k === "id" || /^data-/.test(k) && k !== "data-rc") out[k] = p[k];
|
|
5533
|
+
else
|
|
5534
|
+
devWarnOnce(
|
|
5535
|
+
"datatable-rowprops-" + k,
|
|
5536
|
+
'DataTable rowProps: "' + k + '" is ignored; only data-* (not data-rc) and id are set on a row.'
|
|
5537
|
+
);
|
|
5538
|
+
});
|
|
5539
|
+
return out;
|
|
5540
|
+
}
|
|
5514
5541
|
var BP = { sm: 640, md: 768, lg: 1024, xl: 1280 };
|
|
5515
5542
|
var DEFAULT_COLUMNS = [
|
|
5516
5543
|
{ key: "id", label: "ID", width: 96, mono: true },
|
|
@@ -6722,6 +6749,7 @@ var DataTableImpl = React33.forwardRef(function DataTable(props, ref) {
|
|
|
6722
6749
|
(props.onRowActivate || rowHref) && "is-actionable"
|
|
6723
6750
|
),
|
|
6724
6751
|
style: rowStyle,
|
|
6752
|
+
...ownRowAttrs(props.rowProps ? props.rowProps(r2) : null),
|
|
6725
6753
|
onClick: function(e) {
|
|
6726
6754
|
const el = e.target;
|
|
6727
6755
|
if (el.closest && el.closest(".aura-check, button, a, input")) return;
|
|
@@ -7645,9 +7673,18 @@ var PageHeader = React43.forwardRef(function PageHeader2(props, ref) {
|
|
|
7645
7673
|
attrs2[k] = props[k];
|
|
7646
7674
|
});
|
|
7647
7675
|
const level = props.headingLevel || 1;
|
|
7676
|
+
const below2 = props.actionsFullWidthBelow;
|
|
7648
7677
|
return h8(
|
|
7649
7678
|
"div",
|
|
7650
|
-
Object.assign(attrs2, {
|
|
7679
|
+
Object.assign(attrs2, {
|
|
7680
|
+
ref,
|
|
7681
|
+
className: cx(
|
|
7682
|
+
"aura-page-header",
|
|
7683
|
+
(below2 === "sm" || below2 === "md" || below2 === "lg") && "aura-page-header--actions-full-below-" + below2,
|
|
7684
|
+
props.className
|
|
7685
|
+
),
|
|
7686
|
+
style: props.style
|
|
7687
|
+
}),
|
|
7651
7688
|
h8(
|
|
7652
7689
|
"div",
|
|
7653
7690
|
{ className: "aura-page-header__text" },
|
|
@@ -8805,7 +8842,7 @@ var TimePicker = React54.forwardRef(function TimePicker2(props, ref) {
|
|
|
8805
8842
|
required: props.required,
|
|
8806
8843
|
optional: props.optional,
|
|
8807
8844
|
disabled: props.disabled,
|
|
8808
|
-
className: props.className
|
|
8845
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
8809
8846
|
},
|
|
8810
8847
|
/* @__PURE__ */ React54.createElement("div", { ref: boxRef, className: cx("aura-input aura-combo aura-time has-icon", open && "is-open") }, /* @__PURE__ */ React54.createElement(Icon, { name: /* @__PURE__ */ React54.createElement(IconClock, null), className: "aura-input__icon" }), /* @__PURE__ */ React54.createElement(
|
|
8811
8848
|
"input",
|
|
@@ -10007,7 +10044,7 @@ var NumberField = React65.forwardRef(function NumberField2(props, ref) {
|
|
|
10007
10044
|
required: props.required,
|
|
10008
10045
|
optional: props.optional,
|
|
10009
10046
|
disabled: props.disabled,
|
|
10010
|
-
className: props.className
|
|
10047
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
10011
10048
|
},
|
|
10012
10049
|
/* @__PURE__ */ React65.createElement("div", { className: cx("aura-input aura-number", stepper && "has-stepper") }, props.prefix != null ? /* @__PURE__ */ React65.createElement("span", { className: "aura-number__affix", "aria-hidden": true }, props.prefix) : null, /* @__PURE__ */ React65.createElement(
|
|
10013
10050
|
"input",
|
|
@@ -10221,6 +10258,7 @@ var SegmentedControl = React67.forwardRef(
|
|
|
10221
10258
|
"aura-segmented",
|
|
10222
10259
|
props.size === "sm" && "aura-segmented--sm",
|
|
10223
10260
|
props.fullWidth && "is-full",
|
|
10261
|
+
touchClass(props.touchHeight),
|
|
10224
10262
|
props.disabled && "is-disabled",
|
|
10225
10263
|
props.className
|
|
10226
10264
|
)
|
package/dist/esm/Combobox.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { useStrings, useDensity } from "./locale.js";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
5
|
-
import { cx, uid, useMaybeControlled, useMounted, useIsoLayoutEffect, useMergedRef } from "./internal.js";
|
|
5
|
+
import { cx, uid, useMaybeControlled, useMounted, useIsoLayoutEffect, useMergedRef, touchClass } from "./internal.js";
|
|
6
6
|
import { Icon } from "./Icon.js";
|
|
7
7
|
import { Field } from "./Field.js";
|
|
8
8
|
import { IconCheck, IconChevronDown, IconLoaderCircle, IconSearch, IconX } from "./icons.js";
|
|
@@ -313,7 +313,7 @@ const Combobox = React.forwardRef(
|
|
|
313
313
|
required: props.required,
|
|
314
314
|
optional: props.optional,
|
|
315
315
|
disabled: props.disabled,
|
|
316
|
-
className: props.className
|
|
316
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
317
317
|
},
|
|
318
318
|
/* @__PURE__ */ React.createElement("div", { ref: boxRef, className: cx("aura-input aura-combo has-icon", open && "is-open", multi && "is-multi") }, /* @__PURE__ */ React.createElement(Icon, { name: props.icon || /* @__PURE__ */ React.createElement(IconSearch, null), className: "aura-input__icon" }), multi && picked.length ? /* @__PURE__ */ React.createElement("span", { className: "aura-combo__chips" }, picked.map(function(o) {
|
|
319
319
|
return /* @__PURE__ */ React.createElement("span", { key: o.value, className: "aura-combo__chip" }, /* @__PURE__ */ React.createElement("span", { className: "aura-combo__chip-label" }, o.label), props.disabled || props.readOnly ? null : /* @__PURE__ */ React.createElement(
|
package/dist/esm/DataTable.js
CHANGED
|
@@ -24,6 +24,19 @@ import {
|
|
|
24
24
|
IconPinOff,
|
|
25
25
|
IconRotateCcw
|
|
26
26
|
} from "./icons.js";
|
|
27
|
+
function ownRowAttrs(p) {
|
|
28
|
+
if (!p) return null;
|
|
29
|
+
const out = {};
|
|
30
|
+
Object.keys(p).forEach(function(k) {
|
|
31
|
+
if (k === "id" || /^data-/.test(k) && k !== "data-rc") out[k] = p[k];
|
|
32
|
+
else
|
|
33
|
+
devWarnOnce(
|
|
34
|
+
"datatable-rowprops-" + k,
|
|
35
|
+
'DataTable rowProps: "' + k + '" is ignored; only data-* (not data-rc) and id are set on a row.'
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
27
40
|
const BP = { sm: 640, md: 768, lg: 1024, xl: 1280 };
|
|
28
41
|
const DEFAULT_COLUMNS = [
|
|
29
42
|
{ key: "id", label: "ID", width: 96, mono: true },
|
|
@@ -1233,6 +1246,7 @@ const DataTableImpl = React.forwardRef(function DataTable(props, ref) {
|
|
|
1233
1246
|
(props.onRowActivate || rowHref) && "is-actionable"
|
|
1234
1247
|
),
|
|
1235
1248
|
style: rowStyle,
|
|
1249
|
+
...ownRowAttrs(props.rowProps ? props.rowProps(r) : null),
|
|
1236
1250
|
onClick: function(e) {
|
|
1237
1251
|
const el = e.target;
|
|
1238
1252
|
if (el.closest && el.closest(".aura-check, button, a, input")) return;
|
package/dist/esm/DatePicker.js
CHANGED
|
@@ -2,7 +2,16 @@
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { useAuraLocale } from "./locale.js";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
cx,
|
|
7
|
+
uid,
|
|
8
|
+
useMaybeControlled,
|
|
9
|
+
useMounted,
|
|
10
|
+
useIsoLayoutEffect,
|
|
11
|
+
trapTab,
|
|
12
|
+
useMergedRef,
|
|
13
|
+
touchClass
|
|
14
|
+
} from "./internal.js";
|
|
6
15
|
import { Icon } from "./Icon.js";
|
|
7
16
|
import { IconButton } from "./IconButton.js";
|
|
8
17
|
import { Field } from "./Field.js";
|
|
@@ -499,7 +508,7 @@ const DatePicker = React.forwardRef(function DatePicker2(props, ref) {
|
|
|
499
508
|
required: props.required,
|
|
500
509
|
optional: props.optional,
|
|
501
510
|
disabled: props.disabled,
|
|
502
|
-
className: props.className,
|
|
511
|
+
className: cx(touchClass(props.touchHeight), props.className),
|
|
503
512
|
name: props.name,
|
|
504
513
|
boxRef,
|
|
505
514
|
inputRef: inputMerged,
|
|
@@ -633,7 +642,7 @@ const DateRangePicker = React.forwardRef(
|
|
|
633
642
|
required: props.required,
|
|
634
643
|
optional: props.optional,
|
|
635
644
|
disabled: props.disabled,
|
|
636
|
-
className: props.className,
|
|
645
|
+
className: cx(touchClass(props.touchHeight), props.className),
|
|
637
646
|
name: props.name,
|
|
638
647
|
boxRef,
|
|
639
648
|
inputRef: inputMerged,
|
package/dist/esm/FilterBar.js
CHANGED
|
@@ -3,7 +3,7 @@ import * as React from "react";
|
|
|
3
3
|
import { Icon } from "./Icon.js";
|
|
4
4
|
import { IconButton } from "./IconButton.js";
|
|
5
5
|
import { Tag } from "./Tag.js";
|
|
6
|
-
import { cx, uid } from "./internal.js";
|
|
6
|
+
import { cx, touchClass, uid } from "./internal.js";
|
|
7
7
|
import { useStrings } from "./locale.js";
|
|
8
8
|
import { IconSearch, IconX } from "./icons.js";
|
|
9
9
|
const FilterBar = React.forwardRef(function FilterBar2(props, ref) {
|
|
@@ -60,6 +60,7 @@ const FilterBar = React.forwardRef(function FilterBar2(props, ref) {
|
|
|
60
60
|
props.searchGrow && "aura-filterbar--grow",
|
|
61
61
|
props.controlsLayout === "fill" && "aura-filterbar--fill",
|
|
62
62
|
props.stackBelow === "lg" && "aura-filterbar--stack-lg",
|
|
63
|
+
touchClass(props.touchHeight),
|
|
63
64
|
props.className
|
|
64
65
|
)
|
|
65
66
|
},
|
package/dist/esm/NumberField.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { Field, describedBy } from "./Field.js";
|
|
4
4
|
import { Icon } from "./Icon.js";
|
|
5
|
-
import { cx, uid, useMaybeControlled } from "./internal.js";
|
|
5
|
+
import { cx, uid, useMaybeControlled, touchClass } from "./internal.js";
|
|
6
6
|
import { useStrings } from "./locale.js";
|
|
7
7
|
import { IconMinus, IconPlus } from "./icons.js";
|
|
8
8
|
function decimalsOf(n) {
|
|
@@ -87,7 +87,7 @@ const NumberField = React.forwardRef(function NumberField2(props, ref) {
|
|
|
87
87
|
required: props.required,
|
|
88
88
|
optional: props.optional,
|
|
89
89
|
disabled: props.disabled,
|
|
90
|
-
className: props.className
|
|
90
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
91
91
|
},
|
|
92
92
|
/* @__PURE__ */ React.createElement("div", { className: cx("aura-input aura-number", stepper && "has-stepper") }, props.prefix != null ? /* @__PURE__ */ React.createElement("span", { className: "aura-number__affix", "aria-hidden": true }, props.prefix) : null, /* @__PURE__ */ React.createElement(
|
|
93
93
|
"input",
|
package/dist/esm/PageHeader.js
CHANGED
|
@@ -9,9 +9,18 @@ const PageHeader = React.forwardRef(function PageHeader2(props, ref) {
|
|
|
9
9
|
attrs[k] = props[k];
|
|
10
10
|
});
|
|
11
11
|
const level = props.headingLevel || 1;
|
|
12
|
+
const below = props.actionsFullWidthBelow;
|
|
12
13
|
return h(
|
|
13
14
|
"div",
|
|
14
|
-
Object.assign(attrs, {
|
|
15
|
+
Object.assign(attrs, {
|
|
16
|
+
ref,
|
|
17
|
+
className: cx(
|
|
18
|
+
"aura-page-header",
|
|
19
|
+
(below === "sm" || below === "md" || below === "lg") && "aura-page-header--actions-full-below-" + below,
|
|
20
|
+
props.className
|
|
21
|
+
),
|
|
22
|
+
style: props.style
|
|
23
|
+
}),
|
|
15
24
|
h(
|
|
16
25
|
"div",
|
|
17
26
|
{ className: "aura-page-header__text" },
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { Icon } from "./Icon.js";
|
|
4
4
|
import { cx, uid, useMaybeControlled } from "./internal.js";
|
|
5
|
+
import { touchClass } from "./classes.js";
|
|
5
6
|
import { useAutoTip } from "./autoTip.js";
|
|
6
7
|
function toOpt(o) {
|
|
7
8
|
return typeof o === "object" ? o : { value: o, label: o };
|
|
@@ -65,6 +66,7 @@ const SegmentedControl = React.forwardRef(
|
|
|
65
66
|
"aura-segmented",
|
|
66
67
|
props.size === "sm" && "aura-segmented--sm",
|
|
67
68
|
props.fullWidth && "is-full",
|
|
69
|
+
touchClass(props.touchHeight),
|
|
68
70
|
props.disabled && "is-disabled",
|
|
69
71
|
props.className
|
|
70
72
|
)
|
package/dist/esm/Select.js
CHANGED
|
@@ -425,18 +425,30 @@ const Select = React.forwardRef(function Select2(props, ref) {
|
|
|
425
425
|
const nameId = id + "-name";
|
|
426
426
|
const face = filter ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { id: nameId, className: "aura-filterselect__name", "aria-hidden": true }, filter.name), /* @__PURE__ */ React.createElement("span", { className: "aura-filterselect__value", "aria-hidden": shown[0].label !== shown[0].full || void 0 }, shown[0].label || " "), shown[0].label !== shown[0].full ? /* @__PURE__ */ React.createElement("span", { className: "aura-sr-only" }, shown[0].full) : null, /* @__PURE__ */ React.createElement(Icon, { name: /* @__PURE__ */ React.createElement(IconChevronDown, null), className: "aura-filterselect__chevron" })) : null;
|
|
427
427
|
if (!live && filter)
|
|
428
|
-
return /* @__PURE__ */ React.createElement(
|
|
429
|
-
"
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
props.
|
|
439
|
-
|
|
428
|
+
return /* @__PURE__ */ React.createElement(
|
|
429
|
+
"div",
|
|
430
|
+
{
|
|
431
|
+
className: cx(
|
|
432
|
+
"aura-filterselect",
|
|
433
|
+
props.disabled && "is-disabled",
|
|
434
|
+
touchClass(props.touchHeight),
|
|
435
|
+
props.className
|
|
436
|
+
)
|
|
437
|
+
},
|
|
438
|
+
/* @__PURE__ */ React.createElement("span", { className: "aura-filterselect__face", "aria-hidden": true, style: props.style }, face),
|
|
439
|
+
h(
|
|
440
|
+
"select",
|
|
441
|
+
Object.assign(extra, omit(rest, ["style"]), {
|
|
442
|
+
ref: selMerged,
|
|
443
|
+
id,
|
|
444
|
+
className: "aura-filterselect__native",
|
|
445
|
+
"aria-label": rest["aria-label"] || (rest["aria-labelledby"] ? void 0 : filter.name),
|
|
446
|
+
"aria-describedby": described
|
|
447
|
+
}),
|
|
448
|
+
opts,
|
|
449
|
+
props.children
|
|
450
|
+
)
|
|
451
|
+
);
|
|
440
452
|
if (!live)
|
|
441
453
|
return field(
|
|
442
454
|
/* @__PURE__ */ React.createElement("div", { className: cx("aura-input aura-select", props.icon && "has-icon", ro && "is-readonly") }, props.icon ? /* @__PURE__ */ React.createElement(Icon, { name: props.icon, className: "aura-input__icon" }) : null, h(
|
|
@@ -549,6 +561,7 @@ const Select = React.forwardRef(function Select2(props, ref) {
|
|
|
549
561
|
ro && "is-readonly",
|
|
550
562
|
open && "is-open",
|
|
551
563
|
filter && props.disabled && "is-disabled",
|
|
564
|
+
filter && touchClass(props.touchHeight),
|
|
552
565
|
filter && props.className
|
|
553
566
|
),
|
|
554
567
|
"data-invalid": props.error ? "" : void 0
|
package/dist/esm/TimePicker.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
|
-
import { cx, uid, useMaybeControlled, useMounted, useIsoLayoutEffect, useMergedRef } from "./internal.js";
|
|
4
|
+
import { cx, uid, useMaybeControlled, useMounted, useIsoLayoutEffect, useMergedRef, touchClass } from "./internal.js";
|
|
5
5
|
import { useStrings } from "./locale.js";
|
|
6
6
|
import { Icon } from "./Icon.js";
|
|
7
7
|
import { Field } from "./Field.js";
|
|
@@ -236,7 +236,7 @@ const TimePicker = React.forwardRef(function TimePicker2(props, ref) {
|
|
|
236
236
|
required: props.required,
|
|
237
237
|
optional: props.optional,
|
|
238
238
|
disabled: props.disabled,
|
|
239
|
-
className: props.className
|
|
239
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
240
240
|
},
|
|
241
241
|
/* @__PURE__ */ React.createElement("div", { ref: boxRef, className: cx("aura-input aura-combo aura-time has-icon", open && "is-open") }, /* @__PURE__ */ React.createElement(Icon, { name: /* @__PURE__ */ React.createElement(IconClock, null), className: "aura-input__icon" }), /* @__PURE__ */ React.createElement(
|
|
242
242
|
"input",
|
package/dist/index.d.cts
CHANGED
|
@@ -216,6 +216,10 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
|
|
|
216
216
|
linkComponent?: React$1.ElementType | undefined;
|
|
217
217
|
/** Skeleton row count when there is no pageSize. Default 5. */
|
|
218
218
|
skeletonRows?: number | undefined;
|
|
219
|
+
/** 5.38 (Chamber-OS 142): attributes of your own on each row's element — `data-*` (a test hook such as
|
|
220
|
+
* `data-user-id`) and `id` — in the table layout and as a stacked card. Anything else is ignored, so a row keeps
|
|
221
|
+
* its own role, classes and handlers. */
|
|
222
|
+
rowProps?: RowCallback<DataTableRowProps | null | undefined, Row> | undefined;
|
|
219
223
|
/** Called on row click or Enter. */
|
|
220
224
|
onRowActivate?: RowCallback<void, Row> | undefined;
|
|
221
225
|
/** Fixed height in px: sticky header, and only the rows in view are rendered. */
|
|
@@ -496,6 +500,11 @@ export interface FilterBarProps {
|
|
|
496
500
|
/** `fill`: the filter controls share their row in equal columns (at least 120px each, wrapping when they can't),
|
|
497
501
|
* and the count and actions keep to the end (5.15, Chamber-OS 92). Default `auto`: each at its own width. */
|
|
498
502
|
controlsLayout?: "auto" | "fill" | undefined;
|
|
503
|
+
/** 5.38 (Chamber-OS 140): 44px search and field-height controls in the bar (FilterSelect, Select, SegmentedControl…)
|
|
504
|
+
* — `true` below 640px or on a coarse pointer, as Button's and TextField's `touchHeight`; `'always'` at every
|
|
505
|
+
* width. Without it they follow the density's input height (44px on a coarse pointer). Buttons in `actions` take
|
|
506
|
+
* their own `touchHeight`. */
|
|
507
|
+
touchHeight?: TouchHeight | undefined;
|
|
499
508
|
/** Below this width (the viewport's) the search takes a row of its own above the controls. Default `md` (768px);
|
|
500
509
|
* `lg` (1024px) for bars with several filters (5.15, Chamber-OS 92). */
|
|
501
510
|
stackBelow?: "md" | "lg" | undefined;
|
|
@@ -597,6 +606,9 @@ export interface FilterSelectProps extends Omit<React$1.SelectHTMLAttributes<HTM
|
|
|
597
606
|
/** A shorter word the face shows while the first option is chosen ("All" for "All statuses"). The list and screen
|
|
598
607
|
* readers keep the option's own text. */
|
|
599
608
|
allLabel?: string | undefined;
|
|
609
|
+
/** 5.38 (Chamber-OS 140): a 44px face — `true` below 640px or on a coarse pointer (as Button's and TextField's
|
|
610
|
+
* `touchHeight`), `'always'` at every width. Without it: the density's input height, 44px on a coarse pointer. */
|
|
611
|
+
touchHeight?: TouchHeight | undefined;
|
|
600
612
|
}
|
|
601
613
|
/** A RadioGroup option. `description` is a second line under the label; since 5.26 the radio is named by `label`
|
|
602
614
|
* alone and the description is read after it (`aria-describedby`), also when the option is disabled (Chamber-OS 125). */
|
|
@@ -927,6 +939,9 @@ export interface ComboboxMultipleProps extends Omit<ComboboxProps, "value" | "de
|
|
|
927
939
|
max?: number | undefined;
|
|
928
940
|
}
|
|
929
941
|
export interface ComboboxProps extends FieldProps {
|
|
942
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
943
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
944
|
+
touchHeight?: TouchHeight | undefined;
|
|
930
945
|
/** The options. Optional with `groups` (5.16). */
|
|
931
946
|
options?: Array<ComboboxOption | string> | undefined;
|
|
932
947
|
/** Selected option value (controlled). */
|
|
@@ -966,6 +981,9 @@ export interface ComboboxProps extends FieldProps {
|
|
|
966
981
|
}
|
|
967
982
|
/** Number input: thousands separators, +/− buttons, arrow keys, min/max/step, prefix/suffix (฿, %). */
|
|
968
983
|
export interface NumberFieldProps extends FieldProps {
|
|
984
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
985
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
986
|
+
touchHeight?: TouchHeight | undefined;
|
|
969
987
|
/** The number (controlled). `null` = empty. */
|
|
970
988
|
value?: number | null | undefined;
|
|
971
989
|
defaultValue?: number | null | undefined;
|
|
@@ -1036,6 +1054,10 @@ export interface SegmentedControlProps {
|
|
|
1036
1054
|
size?: "sm" | "md" | undefined;
|
|
1037
1055
|
/** Stretch across the container, segments equal width. */
|
|
1038
1056
|
fullWidth?: boolean | undefined;
|
|
1057
|
+
/** 5.37 (DxT Monitor #18): 44px options (`sm` too; icon-only options 44px square). `true`: below 640px or on a
|
|
1058
|
+
* coarse pointer, as Button's and TextField's `touchHeight`; `'always'`: at every width. Without it, options are
|
|
1059
|
+
* 44px on a coarse pointer only. */
|
|
1060
|
+
touchHeight?: TouchHeight | undefined;
|
|
1039
1061
|
disabled?: boolean | undefined;
|
|
1040
1062
|
id?: string | undefined;
|
|
1041
1063
|
className?: string | undefined;
|
|
@@ -1073,6 +1095,9 @@ export interface CalendarProps extends DateDisplayOptions {
|
|
|
1073
1095
|
autoFocus?: boolean | undefined;
|
|
1074
1096
|
}
|
|
1075
1097
|
export interface DateFieldProps extends FieldProps, DateDisplayOptions {
|
|
1098
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
1099
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
1100
|
+
touchHeight?: TouchHeight | undefined;
|
|
1076
1101
|
id?: string | undefined;
|
|
1077
1102
|
name?: string | undefined;
|
|
1078
1103
|
placeholder?: string | undefined;
|
|
@@ -1142,6 +1167,10 @@ export interface DateRangePickerProps extends DateFieldProps {
|
|
|
1142
1167
|
export type DataAttributes = {
|
|
1143
1168
|
[key: `data-${string}`]: string | number | boolean | undefined;
|
|
1144
1169
|
};
|
|
1170
|
+
/** What DataTable's `rowProps` may set on a row (5.38): `data-*` attributes and an `id`. */
|
|
1171
|
+
export type DataTableRowProps = DataAttributes & {
|
|
1172
|
+
id?: string | undefined;
|
|
1173
|
+
};
|
|
1145
1174
|
/** Attributes for a button AURA renders for you (a Drawer's close button, a tab): `data-testid`, `aria-*`, `id`… */
|
|
1146
1175
|
export type ButtonAttributes = React$1.ButtonHTMLAttributes<HTMLButtonElement> & DataAttributes;
|
|
1147
1176
|
/** `id`, `data-*`, `aria-*`, `style`, `lang` and `dir` go on the `.aura-drawer` panel (5.9, Chamber-OS 70). */
|
|
@@ -1417,6 +1446,9 @@ export interface StatProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id
|
|
|
1417
1446
|
className?: string | undefined;
|
|
1418
1447
|
}
|
|
1419
1448
|
export interface TimePickerProps extends FieldProps {
|
|
1449
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
1450
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
1451
|
+
touchHeight?: TouchHeight | undefined;
|
|
1420
1452
|
/** "HH:mm", 24-hour. */
|
|
1421
1453
|
value?: string | null | undefined;
|
|
1422
1454
|
defaultValue?: string | null | undefined;
|
|
@@ -1893,6 +1925,11 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
1893
1925
|
meta?: React$1.ReactNode | undefined;
|
|
1894
1926
|
/** Buttons for the page, bottom-aligned at the end; they wrap below the text on a narrow screen. */
|
|
1895
1927
|
actions?: React$1.ReactNode | undefined;
|
|
1928
|
+
/** 5.37 (DxT Monitor #17): below this breakpoint (`sm` 640px, `md` 768px, `lg` 1024px) the actions take the whole
|
|
1929
|
+
* row under the text, 12px apart, and its buttons share each line in equal widths unless a label needs more (a trigger inside a DropdownMenu,
|
|
1930
|
+
* Tooltip or Popover too; IconButtons keep their size) — a single Button or your own grid spans the row. Wider
|
|
1931
|
+
* than that, the actions hug their content at the end as before. */
|
|
1932
|
+
actionsFullWidthBelow?: "sm" | "md" | "lg" | undefined;
|
|
1896
1933
|
/** Default 1. Use 2 when the page already has an h1 (e.g. in the AppShell bar). */
|
|
1897
1934
|
headingLevel?: 1 | 2 | 3 | undefined;
|
|
1898
1935
|
/** The heading's id, for `aria-labelledby` on the page's region. */
|
package/dist/index.d.ts
CHANGED
|
@@ -216,6 +216,10 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
|
|
|
216
216
|
linkComponent?: React$1.ElementType | undefined;
|
|
217
217
|
/** Skeleton row count when there is no pageSize. Default 5. */
|
|
218
218
|
skeletonRows?: number | undefined;
|
|
219
|
+
/** 5.38 (Chamber-OS 142): attributes of your own on each row's element — `data-*` (a test hook such as
|
|
220
|
+
* `data-user-id`) and `id` — in the table layout and as a stacked card. Anything else is ignored, so a row keeps
|
|
221
|
+
* its own role, classes and handlers. */
|
|
222
|
+
rowProps?: RowCallback<DataTableRowProps | null | undefined, Row> | undefined;
|
|
219
223
|
/** Called on row click or Enter. */
|
|
220
224
|
onRowActivate?: RowCallback<void, Row> | undefined;
|
|
221
225
|
/** Fixed height in px: sticky header, and only the rows in view are rendered. */
|
|
@@ -496,6 +500,11 @@ export interface FilterBarProps {
|
|
|
496
500
|
/** `fill`: the filter controls share their row in equal columns (at least 120px each, wrapping when they can't),
|
|
497
501
|
* and the count and actions keep to the end (5.15, Chamber-OS 92). Default `auto`: each at its own width. */
|
|
498
502
|
controlsLayout?: "auto" | "fill" | undefined;
|
|
503
|
+
/** 5.38 (Chamber-OS 140): 44px search and field-height controls in the bar (FilterSelect, Select, SegmentedControl…)
|
|
504
|
+
* — `true` below 640px or on a coarse pointer, as Button's and TextField's `touchHeight`; `'always'` at every
|
|
505
|
+
* width. Without it they follow the density's input height (44px on a coarse pointer). Buttons in `actions` take
|
|
506
|
+
* their own `touchHeight`. */
|
|
507
|
+
touchHeight?: TouchHeight | undefined;
|
|
499
508
|
/** Below this width (the viewport's) the search takes a row of its own above the controls. Default `md` (768px);
|
|
500
509
|
* `lg` (1024px) for bars with several filters (5.15, Chamber-OS 92). */
|
|
501
510
|
stackBelow?: "md" | "lg" | undefined;
|
|
@@ -597,6 +606,9 @@ export interface FilterSelectProps extends Omit<React$1.SelectHTMLAttributes<HTM
|
|
|
597
606
|
/** A shorter word the face shows while the first option is chosen ("All" for "All statuses"). The list and screen
|
|
598
607
|
* readers keep the option's own text. */
|
|
599
608
|
allLabel?: string | undefined;
|
|
609
|
+
/** 5.38 (Chamber-OS 140): a 44px face — `true` below 640px or on a coarse pointer (as Button's and TextField's
|
|
610
|
+
* `touchHeight`), `'always'` at every width. Without it: the density's input height, 44px on a coarse pointer. */
|
|
611
|
+
touchHeight?: TouchHeight | undefined;
|
|
600
612
|
}
|
|
601
613
|
/** A RadioGroup option. `description` is a second line under the label; since 5.26 the radio is named by `label`
|
|
602
614
|
* alone and the description is read after it (`aria-describedby`), also when the option is disabled (Chamber-OS 125). */
|
|
@@ -927,6 +939,9 @@ export interface ComboboxMultipleProps extends Omit<ComboboxProps, "value" | "de
|
|
|
927
939
|
max?: number | undefined;
|
|
928
940
|
}
|
|
929
941
|
export interface ComboboxProps extends FieldProps {
|
|
942
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
943
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
944
|
+
touchHeight?: TouchHeight | undefined;
|
|
930
945
|
/** The options. Optional with `groups` (5.16). */
|
|
931
946
|
options?: Array<ComboboxOption | string> | undefined;
|
|
932
947
|
/** Selected option value (controlled). */
|
|
@@ -966,6 +981,9 @@ export interface ComboboxProps extends FieldProps {
|
|
|
966
981
|
}
|
|
967
982
|
/** Number input: thousands separators, +/− buttons, arrow keys, min/max/step, prefix/suffix (฿, %). */
|
|
968
983
|
export interface NumberFieldProps extends FieldProps {
|
|
984
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
985
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
986
|
+
touchHeight?: TouchHeight | undefined;
|
|
969
987
|
/** The number (controlled). `null` = empty. */
|
|
970
988
|
value?: number | null | undefined;
|
|
971
989
|
defaultValue?: number | null | undefined;
|
|
@@ -1036,6 +1054,10 @@ export interface SegmentedControlProps {
|
|
|
1036
1054
|
size?: "sm" | "md" | undefined;
|
|
1037
1055
|
/** Stretch across the container, segments equal width. */
|
|
1038
1056
|
fullWidth?: boolean | undefined;
|
|
1057
|
+
/** 5.37 (DxT Monitor #18): 44px options (`sm` too; icon-only options 44px square). `true`: below 640px or on a
|
|
1058
|
+
* coarse pointer, as Button's and TextField's `touchHeight`; `'always'`: at every width. Without it, options are
|
|
1059
|
+
* 44px on a coarse pointer only. */
|
|
1060
|
+
touchHeight?: TouchHeight | undefined;
|
|
1039
1061
|
disabled?: boolean | undefined;
|
|
1040
1062
|
id?: string | undefined;
|
|
1041
1063
|
className?: string | undefined;
|
|
@@ -1073,6 +1095,9 @@ export interface CalendarProps extends DateDisplayOptions {
|
|
|
1073
1095
|
autoFocus?: boolean | undefined;
|
|
1074
1096
|
}
|
|
1075
1097
|
export interface DateFieldProps extends FieldProps, DateDisplayOptions {
|
|
1098
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
1099
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
1100
|
+
touchHeight?: TouchHeight | undefined;
|
|
1076
1101
|
id?: string | undefined;
|
|
1077
1102
|
name?: string | undefined;
|
|
1078
1103
|
placeholder?: string | undefined;
|
|
@@ -1142,6 +1167,10 @@ export interface DateRangePickerProps extends DateFieldProps {
|
|
|
1142
1167
|
export type DataAttributes = {
|
|
1143
1168
|
[key: `data-${string}`]: string | number | boolean | undefined;
|
|
1144
1169
|
};
|
|
1170
|
+
/** What DataTable's `rowProps` may set on a row (5.38): `data-*` attributes and an `id`. */
|
|
1171
|
+
export type DataTableRowProps = DataAttributes & {
|
|
1172
|
+
id?: string | undefined;
|
|
1173
|
+
};
|
|
1145
1174
|
/** Attributes for a button AURA renders for you (a Drawer's close button, a tab): `data-testid`, `aria-*`, `id`… */
|
|
1146
1175
|
export type ButtonAttributes = React$1.ButtonHTMLAttributes<HTMLButtonElement> & DataAttributes;
|
|
1147
1176
|
/** `id`, `data-*`, `aria-*`, `style`, `lang` and `dir` go on the `.aura-drawer` panel (5.9, Chamber-OS 70). */
|
|
@@ -1417,6 +1446,9 @@ export interface StatProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id
|
|
|
1417
1446
|
className?: string | undefined;
|
|
1418
1447
|
}
|
|
1419
1448
|
export interface TimePickerProps extends FieldProps {
|
|
1449
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
1450
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
1451
|
+
touchHeight?: TouchHeight | undefined;
|
|
1420
1452
|
/** "HH:mm", 24-hour. */
|
|
1421
1453
|
value?: string | null | undefined;
|
|
1422
1454
|
defaultValue?: string | null | undefined;
|
|
@@ -1893,6 +1925,11 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
1893
1925
|
meta?: React$1.ReactNode | undefined;
|
|
1894
1926
|
/** Buttons for the page, bottom-aligned at the end; they wrap below the text on a narrow screen. */
|
|
1895
1927
|
actions?: React$1.ReactNode | undefined;
|
|
1928
|
+
/** 5.37 (DxT Monitor #17): below this breakpoint (`sm` 640px, `md` 768px, `lg` 1024px) the actions take the whole
|
|
1929
|
+
* row under the text, 12px apart, and its buttons share each line in equal widths unless a label needs more (a trigger inside a DropdownMenu,
|
|
1930
|
+
* Tooltip or Popover too; IconButtons keep their size) — a single Button or your own grid spans the row. Wider
|
|
1931
|
+
* than that, the actions hug their content at the end as before. */
|
|
1932
|
+
actionsFullWidthBelow?: "sm" | "md" | "lg" | undefined;
|
|
1896
1933
|
/** Default 1. Use 2 when the page already has an h1 (e.g. in the AppShell bar). */
|
|
1897
1934
|
headingLevel?: 1 | 2 | 3 | undefined;
|
|
1898
1935
|
/** The heading's id, for `aria-labelledby` on the page's region. */
|
package/dist/server/index.cjs
CHANGED
|
@@ -1425,9 +1425,18 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
|
|
|
1425
1425
|
attrs2[k] = props[k];
|
|
1426
1426
|
});
|
|
1427
1427
|
const level = props.headingLevel || 1;
|
|
1428
|
+
const below = props.actionsFullWidthBelow;
|
|
1428
1429
|
return h4(
|
|
1429
1430
|
"div",
|
|
1430
|
-
Object.assign(attrs2, {
|
|
1431
|
+
Object.assign(attrs2, {
|
|
1432
|
+
ref,
|
|
1433
|
+
className: cx(
|
|
1434
|
+
"aura-page-header",
|
|
1435
|
+
(below === "sm" || below === "md" || below === "lg") && "aura-page-header--actions-full-below-" + below,
|
|
1436
|
+
props.className
|
|
1437
|
+
),
|
|
1438
|
+
style: props.style
|
|
1439
|
+
}),
|
|
1431
1440
|
h4(
|
|
1432
1441
|
"div",
|
|
1433
1442
|
{ className: "aura-page-header__text" },
|
package/dist/server/index.d.cts
CHANGED
|
@@ -496,6 +496,11 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
496
496
|
meta?: React$1.ReactNode | undefined;
|
|
497
497
|
/** Buttons for the page, bottom-aligned at the end; they wrap below the text on a narrow screen. */
|
|
498
498
|
actions?: React$1.ReactNode | undefined;
|
|
499
|
+
/** 5.37 (DxT Monitor #17): below this breakpoint (`sm` 640px, `md` 768px, `lg` 1024px) the actions take the whole
|
|
500
|
+
* row under the text, 12px apart, and its buttons share each line in equal widths unless a label needs more (a trigger inside a DropdownMenu,
|
|
501
|
+
* Tooltip or Popover too; IconButtons keep their size) — a single Button or your own grid spans the row. Wider
|
|
502
|
+
* than that, the actions hug their content at the end as before. */
|
|
503
|
+
actionsFullWidthBelow?: "sm" | "md" | "lg" | undefined;
|
|
499
504
|
/** Default 1. Use 2 when the page already has an h1 (e.g. in the AppShell bar). */
|
|
500
505
|
headingLevel?: 1 | 2 | 3 | undefined;
|
|
501
506
|
/** The heading's id, for `aria-labelledby` on the page's region. */
|
package/dist/server/index.d.ts
CHANGED
|
@@ -496,6 +496,11 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
|
|
|
496
496
|
meta?: React$1.ReactNode | undefined;
|
|
497
497
|
/** Buttons for the page, bottom-aligned at the end; they wrap below the text on a narrow screen. */
|
|
498
498
|
actions?: React$1.ReactNode | undefined;
|
|
499
|
+
/** 5.37 (DxT Monitor #17): below this breakpoint (`sm` 640px, `md` 768px, `lg` 1024px) the actions take the whole
|
|
500
|
+
* row under the text, 12px apart, and its buttons share each line in equal widths unless a label needs more (a trigger inside a DropdownMenu,
|
|
501
|
+
* Tooltip or Popover too; IconButtons keep their size) — a single Button or your own grid spans the row. Wider
|
|
502
|
+
* than that, the actions hug their content at the end as before. */
|
|
503
|
+
actionsFullWidthBelow?: "sm" | "md" | "lg" | undefined;
|
|
499
504
|
/** Default 1. Use 2 when the page already has an h1 (e.g. in the AppShell bar). */
|
|
500
505
|
headingLevel?: 1 | 2 | 3 | undefined;
|
|
501
506
|
/** The heading's id, for `aria-labelledby` on the page's region. */
|
package/dist/server/index.js
CHANGED
|
@@ -1361,9 +1361,18 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
|
|
|
1361
1361
|
attrs2[k] = props[k];
|
|
1362
1362
|
});
|
|
1363
1363
|
const level = props.headingLevel || 1;
|
|
1364
|
+
const below = props.actionsFullWidthBelow;
|
|
1364
1365
|
return h4(
|
|
1365
1366
|
"div",
|
|
1366
|
-
Object.assign(attrs2, {
|
|
1367
|
+
Object.assign(attrs2, {
|
|
1368
|
+
ref,
|
|
1369
|
+
className: cx(
|
|
1370
|
+
"aura-page-header",
|
|
1371
|
+
(below === "sm" || below === "md" || below === "lg") && "aura-page-header--actions-full-below-" + below,
|
|
1372
|
+
props.className
|
|
1373
|
+
),
|
|
1374
|
+
style: props.style
|
|
1375
|
+
}),
|
|
1367
1376
|
h4(
|
|
1368
1377
|
"div",
|
|
1369
1378
|
{ className: "aura-page-header__text" },
|
package/dist/styles.css
CHANGED
|
@@ -1138,6 +1138,30 @@ a.aura-tab { text-decoration: none; }
|
|
|
1138
1138
|
.aura-page-header__breadcrumb { min-width: 0; } /* 5.33 (DxT Monitor #7): Breadcrumb keeps its own type */
|
|
1139
1139
|
.aura-page-header__meta { min-width: 0; font-size: 13px; line-height: 1.5; color: var(--aura-fg-secondary); overflow-wrap: anywhere; }
|
|
1140
1140
|
.aura-page-header__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); }
|
|
1141
|
+
/* 5.37 (DxT Monitor #17): actionsFullWidthBelow — the actions take the row under the text; their children share
|
|
1142
|
+
* each line equally (wrapping when a label won't fit), a trigger inside a DropdownMenu, Tooltip or Popover wrapper
|
|
1143
|
+
* fills it, and icon buttons keep their size. The :has rule is alone so older browsers drop only it. */
|
|
1144
|
+
@media (max-width: 639.98px) {
|
|
1145
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
|
|
1146
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
|
|
1147
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
1148
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
|
|
1149
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
|
|
1150
|
+
}
|
|
1151
|
+
@media (max-width: 767.98px) {
|
|
1152
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
|
|
1153
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
|
|
1154
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
1155
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
|
|
1156
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
|
|
1157
|
+
}
|
|
1158
|
+
@media (max-width: 1023.98px) {
|
|
1159
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
|
|
1160
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
|
|
1161
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
1162
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions > .aura-icon-btn { flex: none; }
|
|
1163
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
|
|
1164
|
+
}
|
|
1141
1165
|
@media (min-width: 640px) { .aura-page-header__title { font-size: 36px; } }
|
|
1142
1166
|
/* Thai marks need the room a 1.15 line takes away. */
|
|
1143
1167
|
.aura-page-header__title:lang(th) { line-height: 1.4; letter-spacing: 0; }
|
|
@@ -1530,6 +1554,13 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1530
1554
|
.aura-segmented--sm .aura-segmented__option { height: 24px; padding: 0 var(--aura-space-3); font-size: 12px; }
|
|
1531
1555
|
.aura-segmented--sm .aura-segmented__option.is-icon { width: 28px; padding: 0; }
|
|
1532
1556
|
.aura-segmented.is-disabled { opacity: var(--aura-disabled-opacity); }
|
|
1557
|
+
/* 5.37 (DxT Monitor #18): touchHeight — 44px options below 640px or on a coarse pointer (is-touch), or always. */
|
|
1558
|
+
.aura-segmented.is-touch-always .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1559
|
+
.aura-segmented.is-touch-always .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1560
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1561
|
+
.aura-segmented.is-touch .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1562
|
+
.aura-segmented.is-touch .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1563
|
+
}
|
|
1533
1564
|
/* 5.10 (Chamber-OS 72): Tabs variant="segmented" — the tablist wears SegmentedControl's track and pills. The focus
|
|
1534
1565
|
* ring is drawn inside the pill, so neither the scrolling list (many tabs on a phone) nor the next pill can cover it;
|
|
1535
1566
|
* full-width tabs share the track but never shrink below their label (the track scrolls instead). The phone rule's
|
|
@@ -1586,6 +1617,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1586
1617
|
}
|
|
1587
1618
|
.aura-tag__remove { position: relative; }
|
|
1588
1619
|
.aura-combo.is-multi .aura-combo__clear, .aura-combo.is-multi .aura-combo__toggle { top: calc((var(--aura-input-height) - 2px - 40px) / 2); }
|
|
1620
|
+
.aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); } /* 5.38: room for both 44px buttons */
|
|
1589
1621
|
}
|
|
1590
1622
|
|
|
1591
1623
|
/* ---------- Small screens (< 640px) ---------- */
|
|
@@ -1634,6 +1666,25 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1634
1666
|
.aura-check--labelled.is-touch-always .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
|
|
1635
1667
|
.aura-radio-group.is-touch-always .aura-radio-group__list { gap: 0; }
|
|
1636
1668
|
.aura-radio-group.is-touch-always .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
|
|
1669
|
+
/* 5.38 (Chamber-OS 141): Combobox, DatePicker, TimePicker and NumberField take touchHeight too; their buttons inside
|
|
1670
|
+
* the box get the touch-screen sizes (44px wide, side by side) with the 44px box, so neither is a 32px target. A
|
|
1671
|
+
* FilterBar with touchHeight (Chamber-OS 140) does the same for those fields in it. */
|
|
1672
|
+
:is(.aura-field, .aura-filterbar).is-touch-always :is(.aura-combo__clear, .aura-combo__toggle, .aura-date__toggle) { width: var(--aura-touch-target); height: 40px; }
|
|
1673
|
+
:is(.aura-field, .aura-filterbar).is-touch-always :is(.aura-combo__toggle, .aura-date__toggle) { right: 0; }
|
|
1674
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo__clear { right: var(--aura-touch-target); }
|
|
1675
|
+
:is(.aura-field, .aura-filterbar).is-touch-always :is(.aura-combo, .aura-date) .aura-input__control { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1676
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1677
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo.is-multi :is(.aura-combo__clear, .aura-combo__toggle) { top: calc((var(--aura-input-height) - 2px - 40px) / 2); }
|
|
1678
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-number__step { width: var(--aura-touch-target); }
|
|
1679
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1680
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo__clear, .aura-combo__toggle, .aura-date__toggle) { width: var(--aura-touch-target); height: 40px; }
|
|
1681
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo__toggle, .aura-date__toggle) { right: 0; }
|
|
1682
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo__clear { right: var(--aura-touch-target); }
|
|
1683
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo, .aura-date) .aura-input__control { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1684
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1685
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo.is-multi :is(.aura-combo__clear, .aura-combo__toggle) { top: calc((var(--aura-input-height) - 2px - 40px) / 2); }
|
|
1686
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-number__step { width: var(--aura-touch-target); }
|
|
1687
|
+
}
|
|
1637
1688
|
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1638
1689
|
.aura-field.is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1639
1690
|
.aura-radio-group.is-touch .aura-choice, .aura-check--labelled.is-touch {
|
|
@@ -1757,6 +1808,18 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1757
1808
|
.aura-filterselect__native { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0; border: 0; opacity: 0; font-size: 16px; cursor: pointer; appearance: none; }
|
|
1758
1809
|
.aura-filterselect.is-disabled .aura-filterselect__face { background: var(--aura-bg-input-disabled); color: var(--aura-fg-secondary); border-color: var(--aura-border-default); cursor: not-allowed; }
|
|
1759
1810
|
.aura-filterselect.is-disabled .aura-filterselect__native { cursor: not-allowed; }
|
|
1811
|
+
/* 5.38 (Chamber-OS 140): touchHeight on FilterBar (its search and field-height controls) or on one FilterSelect —
|
|
1812
|
+
* 44px below 640px or on a coarse pointer (is-touch), or always. */
|
|
1813
|
+
:is(.aura-filterbar, .aura-filterselect).is-touch-always { --aura-input-height: var(--aura-touch-target); }
|
|
1814
|
+
.aura-filterbar.is-touch-always .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1815
|
+
.aura-filterbar.is-touch-always .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1816
|
+
.aura-filterbar.is-touch-always .aura-filterbar__clear-search { width: var(--aura-touch-target); height: 40px; margin-right: 0; }
|
|
1817
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1818
|
+
:is(.aura-filterbar, .aura-filterselect).is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1819
|
+
.aura-filterbar.is-touch .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1820
|
+
.aura-filterbar.is-touch .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1821
|
+
.aura-filterbar.is-touch .aura-filterbar__clear-search { width: var(--aura-touch-target); height: 40px; margin-right: 0; }
|
|
1822
|
+
}
|
|
1760
1823
|
@media (forced-colors: active) { .aura-filterselect__face { border-color: ButtonText; } }
|
|
1761
1824
|
/* 5.26 (Chamber-OS 128) FilterDateRange: presets beside the range calendar; above it on phones. */
|
|
1762
1825
|
.aura-filterdate__pop { display: flex; gap: var(--aura-space-3); overflow-y: auto; }
|
package/dist/styles.layer.css
CHANGED
|
@@ -1140,6 +1140,30 @@ a.aura-tab { text-decoration: none; }
|
|
|
1140
1140
|
.aura-page-header__breadcrumb { min-width: 0; } /* 5.33 (DxT Monitor #7): Breadcrumb keeps its own type */
|
|
1141
1141
|
.aura-page-header__meta { min-width: 0; font-size: 13px; line-height: 1.5; color: var(--aura-fg-secondary); overflow-wrap: anywhere; }
|
|
1142
1142
|
.aura-page-header__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); }
|
|
1143
|
+
/* 5.37 (DxT Monitor #17): actionsFullWidthBelow — the actions take the row under the text; their children share
|
|
1144
|
+
* each line equally (wrapping when a label won't fit), a trigger inside a DropdownMenu, Tooltip or Popover wrapper
|
|
1145
|
+
* fills it, and icon buttons keep their size. The :has rule is alone so older browsers drop only it. */
|
|
1146
|
+
@media (max-width: 639.98px) {
|
|
1147
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
|
|
1148
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
|
|
1149
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
1150
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
|
|
1151
|
+
.aura-page-header--actions-full-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
|
|
1152
|
+
}
|
|
1153
|
+
@media (max-width: 767.98px) {
|
|
1154
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
|
|
1155
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
|
|
1156
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
1157
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
|
|
1158
|
+
.aura-page-header--actions-full-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
|
|
1159
|
+
}
|
|
1160
|
+
@media (max-width: 1023.98px) {
|
|
1161
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
|
|
1162
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
|
|
1163
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
|
|
1164
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions > .aura-icon-btn { flex: none; }
|
|
1165
|
+
.aura-page-header--actions-full-below-lg > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
|
|
1166
|
+
}
|
|
1143
1167
|
@media (min-width: 640px) { .aura-page-header__title { font-size: 36px; } }
|
|
1144
1168
|
/* Thai marks need the room a 1.15 line takes away. */
|
|
1145
1169
|
.aura-page-header__title:lang(th) { line-height: 1.4; letter-spacing: 0; }
|
|
@@ -1532,6 +1556,13 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1532
1556
|
.aura-segmented--sm .aura-segmented__option { height: 24px; padding: 0 var(--aura-space-3); font-size: 12px; }
|
|
1533
1557
|
.aura-segmented--sm .aura-segmented__option.is-icon { width: 28px; padding: 0; }
|
|
1534
1558
|
.aura-segmented.is-disabled { opacity: var(--aura-disabled-opacity); }
|
|
1559
|
+
/* 5.37 (DxT Monitor #18): touchHeight — 44px options below 640px or on a coarse pointer (is-touch), or always. */
|
|
1560
|
+
.aura-segmented.is-touch-always .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1561
|
+
.aura-segmented.is-touch-always .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1562
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1563
|
+
.aura-segmented.is-touch .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1564
|
+
.aura-segmented.is-touch .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1565
|
+
}
|
|
1535
1566
|
/* 5.10 (Chamber-OS 72): Tabs variant="segmented" — the tablist wears SegmentedControl's track and pills. The focus
|
|
1536
1567
|
* ring is drawn inside the pill, so neither the scrolling list (many tabs on a phone) nor the next pill can cover it;
|
|
1537
1568
|
* full-width tabs share the track but never shrink below their label (the track scrolls instead). The phone rule's
|
|
@@ -1588,6 +1619,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1588
1619
|
}
|
|
1589
1620
|
.aura-tag__remove { position: relative; }
|
|
1590
1621
|
.aura-combo.is-multi .aura-combo__clear, .aura-combo.is-multi .aura-combo__toggle { top: calc((var(--aura-input-height) - 2px - 40px) / 2); }
|
|
1622
|
+
.aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); } /* 5.38: room for both 44px buttons */
|
|
1591
1623
|
}
|
|
1592
1624
|
|
|
1593
1625
|
/* ---------- Small screens (< 640px) ---------- */
|
|
@@ -1636,6 +1668,25 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1636
1668
|
.aura-check--labelled.is-touch-always .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
|
|
1637
1669
|
.aura-radio-group.is-touch-always .aura-radio-group__list { gap: 0; }
|
|
1638
1670
|
.aura-radio-group.is-touch-always .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
|
|
1671
|
+
/* 5.38 (Chamber-OS 141): Combobox, DatePicker, TimePicker and NumberField take touchHeight too; their buttons inside
|
|
1672
|
+
* the box get the touch-screen sizes (44px wide, side by side) with the 44px box, so neither is a 32px target. A
|
|
1673
|
+
* FilterBar with touchHeight (Chamber-OS 140) does the same for those fields in it. */
|
|
1674
|
+
:is(.aura-field, .aura-filterbar).is-touch-always :is(.aura-combo__clear, .aura-combo__toggle, .aura-date__toggle) { width: var(--aura-touch-target); height: 40px; }
|
|
1675
|
+
:is(.aura-field, .aura-filterbar).is-touch-always :is(.aura-combo__toggle, .aura-date__toggle) { right: 0; }
|
|
1676
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo__clear { right: var(--aura-touch-target); }
|
|
1677
|
+
:is(.aura-field, .aura-filterbar).is-touch-always :is(.aura-combo, .aura-date) .aura-input__control { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1678
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1679
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo.is-multi :is(.aura-combo__clear, .aura-combo__toggle) { top: calc((var(--aura-input-height) - 2px - 40px) / 2); }
|
|
1680
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-number__step { width: var(--aura-touch-target); }
|
|
1681
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1682
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo__clear, .aura-combo__toggle, .aura-date__toggle) { width: var(--aura-touch-target); height: 40px; }
|
|
1683
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo__toggle, .aura-date__toggle) { right: 0; }
|
|
1684
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo__clear { right: var(--aura-touch-target); }
|
|
1685
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo, .aura-date) .aura-input__control { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1686
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1687
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo.is-multi :is(.aura-combo__clear, .aura-combo__toggle) { top: calc((var(--aura-input-height) - 2px - 40px) / 2); }
|
|
1688
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-number__step { width: var(--aura-touch-target); }
|
|
1689
|
+
}
|
|
1639
1690
|
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1640
1691
|
.aura-field.is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1641
1692
|
.aura-radio-group.is-touch .aura-choice, .aura-check--labelled.is-touch {
|
|
@@ -1759,6 +1810,18 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1759
1810
|
.aura-filterselect__native { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0; border: 0; opacity: 0; font-size: 16px; cursor: pointer; appearance: none; }
|
|
1760
1811
|
.aura-filterselect.is-disabled .aura-filterselect__face { background: var(--aura-bg-input-disabled); color: var(--aura-fg-secondary); border-color: var(--aura-border-default); cursor: not-allowed; }
|
|
1761
1812
|
.aura-filterselect.is-disabled .aura-filterselect__native { cursor: not-allowed; }
|
|
1813
|
+
/* 5.38 (Chamber-OS 140): touchHeight on FilterBar (its search and field-height controls) or on one FilterSelect —
|
|
1814
|
+
* 44px below 640px or on a coarse pointer (is-touch), or always. */
|
|
1815
|
+
:is(.aura-filterbar, .aura-filterselect).is-touch-always { --aura-input-height: var(--aura-touch-target); }
|
|
1816
|
+
.aura-filterbar.is-touch-always .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1817
|
+
.aura-filterbar.is-touch-always .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1818
|
+
.aura-filterbar.is-touch-always .aura-filterbar__clear-search { width: var(--aura-touch-target); height: 40px; margin-right: 0; }
|
|
1819
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1820
|
+
:is(.aura-filterbar, .aura-filterselect).is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1821
|
+
.aura-filterbar.is-touch .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1822
|
+
.aura-filterbar.is-touch .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1823
|
+
.aura-filterbar.is-touch .aura-filterbar__clear-search { width: var(--aura-touch-target); height: 40px; margin-right: 0; }
|
|
1824
|
+
}
|
|
1762
1825
|
@media (forced-colors: active) { .aura-filterselect__face { border-color: ButtonText; } }
|
|
1763
1826
|
/* 5.26 (Chamber-OS 128) FilterDateRange: presets beside the range calendar; above it on phones. */
|
|
1764
1827
|
.aura-filterdate__pop { display: flex; gap: var(--aura-space-3); overflow-y: auto; }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jirawatpyk/aura-react",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.38.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",
|