@jirawatpyk/aura-react 5.37.0 → 5.39.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 +12 -0
- package/dist/aura.bundle.js +53 -19
- package/dist/cjs/index.cjs +53 -19
- 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/FilterDateRange.js +8 -2
- package/dist/esm/NumberField.js +2 -2
- package/dist/esm/Select.js +25 -12
- package/dist/esm/Tabs.js +2 -2
- package/dist/esm/TimePicker.js +2 -2
- package/dist/index.d.cts +34 -0
- package/dist/index.d.ts +34 -0
- package/dist/styles.css +37 -0
- package/dist/styles.layer.css +37 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -186,6 +186,18 @@ 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.39 — Chamber-OS addendum 46
|
|
190
|
+
|
|
191
|
+
- **Tabs `touchHeight`** (#143): 44px tabs — buttons or links, underline or segmented — with `true` below 640px or on a coarse pointer (Button's rule), or `'always'` at every width. The count badge and icon stay centred on the label (above the 2px underline). The height is set on the tabs themselves, so fields in the panels keep their own size. Without it nothing changes.
|
|
192
|
+
- **Link tabs are as tall as button tabs.** A link tab (`href`) was 2px taller than a button tab — its 2px underline sat outside the height (38px instead of 36px in compact density, 46px instead of 44px on touch screens). Tests that measure link tabs will see 2px less.
|
|
193
|
+
- **FilterDateRange `touchHeight`**: a 44px face on its own, as FilterSelect's. A FilterBar with `touchHeight` already reaches it (checked for Chamber-OS's audit log filter row).
|
|
194
|
+
|
|
195
|
+
## 5.38 — Chamber-OS addenda 43–45
|
|
196
|
+
|
|
197
|
+
- **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.
|
|
198
|
+
- **`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).
|
|
199
|
+
- **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.
|
|
200
|
+
|
|
189
201
|
## 5.37 — DxT Monitor requests 17–18
|
|
190
202
|
|
|
191
203
|
- **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.
|
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,
|
|
@@ -3673,7 +3686,13 @@ window.Aura = (() => {
|
|
|
3673
3686
|
"div",
|
|
3674
3687
|
{
|
|
3675
3688
|
ref: boxRef,
|
|
3676
|
-
className: cx(
|
|
3689
|
+
className: cx(
|
|
3690
|
+
"aura-filterselect",
|
|
3691
|
+
pop.open && "is-open",
|
|
3692
|
+
props.disabled && "is-disabled",
|
|
3693
|
+
touchClass(props.touchHeight),
|
|
3694
|
+
props.className
|
|
3695
|
+
)
|
|
3677
3696
|
},
|
|
3678
3697
|
/* @__PURE__ */ React19.createElement(
|
|
3679
3698
|
"button",
|
|
@@ -4117,7 +4136,7 @@ window.Aura = (() => {
|
|
|
4117
4136
|
required: props.required,
|
|
4118
4137
|
optional: props.optional,
|
|
4119
4138
|
disabled: props.disabled,
|
|
4120
|
-
className: props.className
|
|
4139
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
4121
4140
|
},
|
|
4122
4141
|
/* @__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
4142
|
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 +4981,7 @@ window.Aura = (() => {
|
|
|
4962
4981
|
props.searchGrow && "aura-filterbar--grow",
|
|
4963
4982
|
props.controlsLayout === "fill" && "aura-filterbar--fill",
|
|
4964
4983
|
props.stackBelow === "lg" && "aura-filterbar--stack-lg",
|
|
4984
|
+
touchClass(props.touchHeight),
|
|
4965
4985
|
props.className
|
|
4966
4986
|
)
|
|
4967
4987
|
},
|
|
@@ -5529,6 +5549,19 @@ window.Aura = (() => {
|
|
|
5529
5549
|
// src/DataTable.tsx
|
|
5530
5550
|
var React33 = __toESM(require_react(), 1);
|
|
5531
5551
|
var import_react_dom10 = __toESM(require_react_dom(), 1);
|
|
5552
|
+
function ownRowAttrs(p) {
|
|
5553
|
+
if (!p) return null;
|
|
5554
|
+
const out = {};
|
|
5555
|
+
Object.keys(p).forEach(function(k) {
|
|
5556
|
+
if (k === "id" || /^data-/.test(k) && k !== "data-rc") out[k] = p[k];
|
|
5557
|
+
else
|
|
5558
|
+
devWarnOnce(
|
|
5559
|
+
"datatable-rowprops-" + k,
|
|
5560
|
+
'DataTable rowProps: "' + k + '" is ignored; only data-* (not data-rc) and id are set on a row.'
|
|
5561
|
+
);
|
|
5562
|
+
});
|
|
5563
|
+
return out;
|
|
5564
|
+
}
|
|
5532
5565
|
var BP = { sm: 640, md: 768, lg: 1024, xl: 1280 };
|
|
5533
5566
|
var DEFAULT_COLUMNS = [
|
|
5534
5567
|
{ key: "id", label: "ID", width: 96, mono: true },
|
|
@@ -6740,6 +6773,7 @@ window.Aura = (() => {
|
|
|
6740
6773
|
(props.onRowActivate || rowHref) && "is-actionable"
|
|
6741
6774
|
),
|
|
6742
6775
|
style: rowStyle,
|
|
6776
|
+
...ownRowAttrs(props.rowProps ? props.rowProps(r2) : null),
|
|
6743
6777
|
onClick: function(e) {
|
|
6744
6778
|
const el = e.target;
|
|
6745
6779
|
if (el.closest && el.closest(".aura-check, button, a, input")) return;
|
|
@@ -7049,7 +7083,7 @@ window.Aura = (() => {
|
|
|
7049
7083
|
const tabCls = function(on, extra) {
|
|
7050
7084
|
return cx("aura-tab", on && "is-active", seg && "aura-segmented__option", seg && on && "is-selected", extra);
|
|
7051
7085
|
};
|
|
7052
|
-
const rootCls = cx("aura-tabs", seg && "aura-tabs--segmented");
|
|
7086
|
+
const rootCls = cx("aura-tabs", seg && "aura-tabs--segmented", touchClass(props.touchHeight));
|
|
7053
7087
|
const [focusId, setFocusId] = React35.useState(null);
|
|
7054
7088
|
items2.forEach(function(t) {
|
|
7055
7089
|
const al = t.tabProps && t.tabProps["aria-label"];
|
|
@@ -8832,7 +8866,7 @@ window.Aura = (() => {
|
|
|
8832
8866
|
required: props.required,
|
|
8833
8867
|
optional: props.optional,
|
|
8834
8868
|
disabled: props.disabled,
|
|
8835
|
-
className: props.className
|
|
8869
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
8836
8870
|
},
|
|
8837
8871
|
/* @__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(
|
|
8838
8872
|
"input",
|
|
@@ -10034,7 +10068,7 @@ window.Aura = (() => {
|
|
|
10034
10068
|
required: props.required,
|
|
10035
10069
|
optional: props.optional,
|
|
10036
10070
|
disabled: props.disabled,
|
|
10037
|
-
className: props.className
|
|
10071
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
10038
10072
|
},
|
|
10039
10073
|
/* @__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(
|
|
10040
10074
|
"input",
|
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,
|
|
@@ -3655,7 +3668,13 @@ var FilterDateRange = React19.forwardRef(
|
|
|
3655
3668
|
"div",
|
|
3656
3669
|
{
|
|
3657
3670
|
ref: boxRef,
|
|
3658
|
-
className: cx(
|
|
3671
|
+
className: cx(
|
|
3672
|
+
"aura-filterselect",
|
|
3673
|
+
pop.open && "is-open",
|
|
3674
|
+
props.disabled && "is-disabled",
|
|
3675
|
+
touchClass(props.touchHeight),
|
|
3676
|
+
props.className
|
|
3677
|
+
)
|
|
3659
3678
|
},
|
|
3660
3679
|
/* @__PURE__ */ React19.createElement(
|
|
3661
3680
|
"button",
|
|
@@ -4099,7 +4118,7 @@ var Combobox = React22.forwardRef(
|
|
|
4099
4118
|
required: props.required,
|
|
4100
4119
|
optional: props.optional,
|
|
4101
4120
|
disabled: props.disabled,
|
|
4102
|
-
className: props.className
|
|
4121
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
4103
4122
|
},
|
|
4104
4123
|
/* @__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
4124
|
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 +4963,7 @@ var FilterBar = React29.forwardRef(function FilterBar2(props, ref) {
|
|
|
4944
4963
|
props.searchGrow && "aura-filterbar--grow",
|
|
4945
4964
|
props.controlsLayout === "fill" && "aura-filterbar--fill",
|
|
4946
4965
|
props.stackBelow === "lg" && "aura-filterbar--stack-lg",
|
|
4966
|
+
touchClass(props.touchHeight),
|
|
4947
4967
|
props.className
|
|
4948
4968
|
)
|
|
4949
4969
|
},
|
|
@@ -5511,6 +5531,19 @@ var Drawer = React32.forwardRef(function Drawer2(props, ref) {
|
|
|
5511
5531
|
// src/DataTable.tsx
|
|
5512
5532
|
var React33 = __toESM(require("react"), 1);
|
|
5513
5533
|
var import_react_dom10 = require("react-dom");
|
|
5534
|
+
function ownRowAttrs(p) {
|
|
5535
|
+
if (!p) return null;
|
|
5536
|
+
const out = {};
|
|
5537
|
+
Object.keys(p).forEach(function(k) {
|
|
5538
|
+
if (k === "id" || /^data-/.test(k) && k !== "data-rc") out[k] = p[k];
|
|
5539
|
+
else
|
|
5540
|
+
devWarnOnce(
|
|
5541
|
+
"datatable-rowprops-" + k,
|
|
5542
|
+
'DataTable rowProps: "' + k + '" is ignored; only data-* (not data-rc) and id are set on a row.'
|
|
5543
|
+
);
|
|
5544
|
+
});
|
|
5545
|
+
return out;
|
|
5546
|
+
}
|
|
5514
5547
|
var BP = { sm: 640, md: 768, lg: 1024, xl: 1280 };
|
|
5515
5548
|
var DEFAULT_COLUMNS = [
|
|
5516
5549
|
{ key: "id", label: "ID", width: 96, mono: true },
|
|
@@ -6722,6 +6755,7 @@ var DataTableImpl = React33.forwardRef(function DataTable(props, ref) {
|
|
|
6722
6755
|
(props.onRowActivate || rowHref) && "is-actionable"
|
|
6723
6756
|
),
|
|
6724
6757
|
style: rowStyle,
|
|
6758
|
+
...ownRowAttrs(props.rowProps ? props.rowProps(r2) : null),
|
|
6725
6759
|
onClick: function(e) {
|
|
6726
6760
|
const el = e.target;
|
|
6727
6761
|
if (el.closest && el.closest(".aura-check, button, a, input")) return;
|
|
@@ -7031,7 +7065,7 @@ var Tabs = React35.forwardRef(function Tabs2(props, ref) {
|
|
|
7031
7065
|
const tabCls = function(on, extra) {
|
|
7032
7066
|
return cx("aura-tab", on && "is-active", seg && "aura-segmented__option", seg && on && "is-selected", extra);
|
|
7033
7067
|
};
|
|
7034
|
-
const rootCls = cx("aura-tabs", seg && "aura-tabs--segmented");
|
|
7068
|
+
const rootCls = cx("aura-tabs", seg && "aura-tabs--segmented", touchClass(props.touchHeight));
|
|
7035
7069
|
const [focusId, setFocusId] = React35.useState(null);
|
|
7036
7070
|
items2.forEach(function(t) {
|
|
7037
7071
|
const al = t.tabProps && t.tabProps["aria-label"];
|
|
@@ -8814,7 +8848,7 @@ var TimePicker = React54.forwardRef(function TimePicker2(props, ref) {
|
|
|
8814
8848
|
required: props.required,
|
|
8815
8849
|
optional: props.optional,
|
|
8816
8850
|
disabled: props.disabled,
|
|
8817
|
-
className: props.className
|
|
8851
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
8818
8852
|
},
|
|
8819
8853
|
/* @__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(
|
|
8820
8854
|
"input",
|
|
@@ -10016,7 +10050,7 @@ var NumberField = React65.forwardRef(function NumberField2(props, ref) {
|
|
|
10016
10050
|
required: props.required,
|
|
10017
10051
|
optional: props.optional,
|
|
10018
10052
|
disabled: props.disabled,
|
|
10019
|
-
className: props.className
|
|
10053
|
+
className: cx(touchClass(props.touchHeight), props.className)
|
|
10020
10054
|
},
|
|
10021
10055
|
/* @__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(
|
|
10022
10056
|
"input",
|
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
|
},
|
|
@@ -5,7 +5,7 @@ import { Calendar, allowedDate, useCalendarPopover } from "./DatePicker.js";
|
|
|
5
5
|
import { Button } from "./Button.js";
|
|
6
6
|
import { Icon } from "./Icon.js";
|
|
7
7
|
import { IconChevronDown } from "./icons.js";
|
|
8
|
-
import { cx, trapTab, uid, useMaybeControlled, useMergedRef } from "./internal.js";
|
|
8
|
+
import { cx, touchClass, trapTab, uid, useMaybeControlled, useMergedRef } from "./internal.js";
|
|
9
9
|
import { useAuraLocale } from "./locale.js";
|
|
10
10
|
import { dateText, defaultCalendar, formatDateRange } from "./dates.js";
|
|
11
11
|
const NONE = { start: null, end: null };
|
|
@@ -126,7 +126,13 @@ const FilterDateRange = React.forwardRef(
|
|
|
126
126
|
"div",
|
|
127
127
|
{
|
|
128
128
|
ref: boxRef,
|
|
129
|
-
className: cx(
|
|
129
|
+
className: cx(
|
|
130
|
+
"aura-filterselect",
|
|
131
|
+
pop.open && "is-open",
|
|
132
|
+
props.disabled && "is-disabled",
|
|
133
|
+
touchClass(props.touchHeight),
|
|
134
|
+
props.className
|
|
135
|
+
)
|
|
130
136
|
},
|
|
131
137
|
/* @__PURE__ */ React.createElement(
|
|
132
138
|
"button",
|
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/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/Tabs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { Icon } from "./Icon.js";
|
|
4
|
-
import { cx, devWarnOnce, omit, uid, useMaybeControlled } from "./internal.js";
|
|
4
|
+
import { cx, devWarnOnce, omit, touchClass, uid, useMaybeControlled } from "./internal.js";
|
|
5
5
|
import { useLinkComponent } from "./locale.js";
|
|
6
6
|
const Tabs = React.forwardRef(function Tabs2(props, ref) {
|
|
7
7
|
const items = props.tabs || [], base = uid();
|
|
@@ -34,7 +34,7 @@ const Tabs = React.forwardRef(function Tabs2(props, ref) {
|
|
|
34
34
|
const tabCls = function(on, extra) {
|
|
35
35
|
return cx("aura-tab", on && "is-active", seg && "aura-segmented__option", seg && on && "is-selected", extra);
|
|
36
36
|
};
|
|
37
|
-
const rootCls = cx("aura-tabs", seg && "aura-tabs--segmented");
|
|
37
|
+
const rootCls = cx("aura-tabs", seg && "aura-tabs--segmented", touchClass(props.touchHeight));
|
|
38
38
|
const [focusId, setFocusId] = React.useState(null);
|
|
39
39
|
items.forEach(function(t) {
|
|
40
40
|
const al = t.tabProps && t.tabProps["aria-label"];
|
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). */
|
|
@@ -800,6 +812,10 @@ export interface TabsProps {
|
|
|
800
812
|
/** Link tabs: what the current link is (5.14). `page` (default) for routes; `location` for links to sections of
|
|
801
813
|
* this page (`#contacts`). */
|
|
802
814
|
current?: "page" | "location" | undefined;
|
|
815
|
+
/** 5.39 (Chamber-OS 143): 44px tabs, button or link form, either variant — `true` below 640px or on a coarse
|
|
816
|
+
* pointer, as Button's `touchHeight`; `'always'` at every width. Without it: the density's input height (44px on a
|
|
817
|
+
* coarse pointer). Panels are not affected. */
|
|
818
|
+
touchHeight?: TouchHeight | undefined;
|
|
803
819
|
}
|
|
804
820
|
export interface NavItem {
|
|
805
821
|
id: string;
|
|
@@ -927,6 +943,9 @@ export interface ComboboxMultipleProps extends Omit<ComboboxProps, "value" | "de
|
|
|
927
943
|
max?: number | undefined;
|
|
928
944
|
}
|
|
929
945
|
export interface ComboboxProps extends FieldProps {
|
|
946
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
947
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
948
|
+
touchHeight?: TouchHeight | undefined;
|
|
930
949
|
/** The options. Optional with `groups` (5.16). */
|
|
931
950
|
options?: Array<ComboboxOption | string> | undefined;
|
|
932
951
|
/** Selected option value (controlled). */
|
|
@@ -966,6 +985,9 @@ export interface ComboboxProps extends FieldProps {
|
|
|
966
985
|
}
|
|
967
986
|
/** Number input: thousands separators, +/− buttons, arrow keys, min/max/step, prefix/suffix (฿, %). */
|
|
968
987
|
export interface NumberFieldProps extends FieldProps {
|
|
988
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
989
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
990
|
+
touchHeight?: TouchHeight | undefined;
|
|
969
991
|
/** The number (controlled). `null` = empty. */
|
|
970
992
|
value?: number | null | undefined;
|
|
971
993
|
defaultValue?: number | null | undefined;
|
|
@@ -1077,6 +1099,9 @@ export interface CalendarProps extends DateDisplayOptions {
|
|
|
1077
1099
|
autoFocus?: boolean | undefined;
|
|
1078
1100
|
}
|
|
1079
1101
|
export interface DateFieldProps extends FieldProps, DateDisplayOptions {
|
|
1102
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
1103
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
1104
|
+
touchHeight?: TouchHeight | undefined;
|
|
1080
1105
|
id?: string | undefined;
|
|
1081
1106
|
name?: string | undefined;
|
|
1082
1107
|
placeholder?: string | undefined;
|
|
@@ -1136,6 +1161,8 @@ export interface FilterDateRangeProps extends DateDisplayOptions, Pick<React$1.H
|
|
|
1136
1161
|
disabled?: boolean | undefined;
|
|
1137
1162
|
id?: string | undefined;
|
|
1138
1163
|
className?: string | undefined;
|
|
1164
|
+
/** 5.39: a 44px face, as FilterSelect's `touchHeight` (FilterBar's `touchHeight` already reaches it). */
|
|
1165
|
+
touchHeight?: TouchHeight | undefined;
|
|
1139
1166
|
}
|
|
1140
1167
|
export interface DateRangePickerProps extends DateFieldProps {
|
|
1141
1168
|
value?: DateRange | undefined;
|
|
@@ -1146,6 +1173,10 @@ export interface DateRangePickerProps extends DateFieldProps {
|
|
|
1146
1173
|
export type DataAttributes = {
|
|
1147
1174
|
[key: `data-${string}`]: string | number | boolean | undefined;
|
|
1148
1175
|
};
|
|
1176
|
+
/** What DataTable's `rowProps` may set on a row (5.38): `data-*` attributes and an `id`. */
|
|
1177
|
+
export type DataTableRowProps = DataAttributes & {
|
|
1178
|
+
id?: string | undefined;
|
|
1179
|
+
};
|
|
1149
1180
|
/** Attributes for a button AURA renders for you (a Drawer's close button, a tab): `data-testid`, `aria-*`, `id`… */
|
|
1150
1181
|
export type ButtonAttributes = React$1.ButtonHTMLAttributes<HTMLButtonElement> & DataAttributes;
|
|
1151
1182
|
/** `id`, `data-*`, `aria-*`, `style`, `lang` and `dir` go on the `.aura-drawer` panel (5.9, Chamber-OS 70). */
|
|
@@ -1421,6 +1452,9 @@ export interface StatProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id
|
|
|
1421
1452
|
className?: string | undefined;
|
|
1422
1453
|
}
|
|
1423
1454
|
export interface TimePickerProps extends FieldProps {
|
|
1455
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
1456
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
1457
|
+
touchHeight?: TouchHeight | undefined;
|
|
1424
1458
|
/** "HH:mm", 24-hour. */
|
|
1425
1459
|
value?: string | null | undefined;
|
|
1426
1460
|
defaultValue?: string | null | undefined;
|
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). */
|
|
@@ -800,6 +812,10 @@ export interface TabsProps {
|
|
|
800
812
|
/** Link tabs: what the current link is (5.14). `page` (default) for routes; `location` for links to sections of
|
|
801
813
|
* this page (`#contacts`). */
|
|
802
814
|
current?: "page" | "location" | undefined;
|
|
815
|
+
/** 5.39 (Chamber-OS 143): 44px tabs, button or link form, either variant — `true` below 640px or on a coarse
|
|
816
|
+
* pointer, as Button's `touchHeight`; `'always'` at every width. Without it: the density's input height (44px on a
|
|
817
|
+
* coarse pointer). Panels are not affected. */
|
|
818
|
+
touchHeight?: TouchHeight | undefined;
|
|
803
819
|
}
|
|
804
820
|
export interface NavItem {
|
|
805
821
|
id: string;
|
|
@@ -927,6 +943,9 @@ export interface ComboboxMultipleProps extends Omit<ComboboxProps, "value" | "de
|
|
|
927
943
|
max?: number | undefined;
|
|
928
944
|
}
|
|
929
945
|
export interface ComboboxProps extends FieldProps {
|
|
946
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
947
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
948
|
+
touchHeight?: TouchHeight | undefined;
|
|
930
949
|
/** The options. Optional with `groups` (5.16). */
|
|
931
950
|
options?: Array<ComboboxOption | string> | undefined;
|
|
932
951
|
/** Selected option value (controlled). */
|
|
@@ -966,6 +985,9 @@ export interface ComboboxProps extends FieldProps {
|
|
|
966
985
|
}
|
|
967
986
|
/** Number input: thousands separators, +/− buttons, arrow keys, min/max/step, prefix/suffix (฿, %). */
|
|
968
987
|
export interface NumberFieldProps extends FieldProps {
|
|
988
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
989
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
990
|
+
touchHeight?: TouchHeight | undefined;
|
|
969
991
|
/** The number (controlled). `null` = empty. */
|
|
970
992
|
value?: number | null | undefined;
|
|
971
993
|
defaultValue?: number | null | undefined;
|
|
@@ -1077,6 +1099,9 @@ export interface CalendarProps extends DateDisplayOptions {
|
|
|
1077
1099
|
autoFocus?: boolean | undefined;
|
|
1078
1100
|
}
|
|
1079
1101
|
export interface DateFieldProps extends FieldProps, DateDisplayOptions {
|
|
1102
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
1103
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
1104
|
+
touchHeight?: TouchHeight | undefined;
|
|
1080
1105
|
id?: string | undefined;
|
|
1081
1106
|
name?: string | undefined;
|
|
1082
1107
|
placeholder?: string | undefined;
|
|
@@ -1136,6 +1161,8 @@ export interface FilterDateRangeProps extends DateDisplayOptions, Pick<React$1.H
|
|
|
1136
1161
|
disabled?: boolean | undefined;
|
|
1137
1162
|
id?: string | undefined;
|
|
1138
1163
|
className?: string | undefined;
|
|
1164
|
+
/** 5.39: a 44px face, as FilterSelect's `touchHeight` (FilterBar's `touchHeight` already reaches it). */
|
|
1165
|
+
touchHeight?: TouchHeight | undefined;
|
|
1139
1166
|
}
|
|
1140
1167
|
export interface DateRangePickerProps extends DateFieldProps {
|
|
1141
1168
|
value?: DateRange | undefined;
|
|
@@ -1146,6 +1173,10 @@ export interface DateRangePickerProps extends DateFieldProps {
|
|
|
1146
1173
|
export type DataAttributes = {
|
|
1147
1174
|
[key: `data-${string}`]: string | number | boolean | undefined;
|
|
1148
1175
|
};
|
|
1176
|
+
/** What DataTable's `rowProps` may set on a row (5.38): `data-*` attributes and an `id`. */
|
|
1177
|
+
export type DataTableRowProps = DataAttributes & {
|
|
1178
|
+
id?: string | undefined;
|
|
1179
|
+
};
|
|
1149
1180
|
/** Attributes for a button AURA renders for you (a Drawer's close button, a tab): `data-testid`, `aria-*`, `id`… */
|
|
1150
1181
|
export type ButtonAttributes = React$1.ButtonHTMLAttributes<HTMLButtonElement> & DataAttributes;
|
|
1151
1182
|
/** `id`, `data-*`, `aria-*`, `style`, `lang` and `dir` go on the `.aura-drawer` panel (5.9, Chamber-OS 70). */
|
|
@@ -1421,6 +1452,9 @@ export interface StatProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id
|
|
|
1421
1452
|
className?: string | undefined;
|
|
1422
1453
|
}
|
|
1423
1454
|
export interface TimePickerProps extends FieldProps {
|
|
1455
|
+
/** 5.38 (Chamber-OS 141): a 44px box, its buttons 44px wide — `true` below 640px or on a coarse pointer, as
|
|
1456
|
+
* TextField's `touchHeight`; `'always'` at every width. Default: the density's input height. */
|
|
1457
|
+
touchHeight?: TouchHeight | undefined;
|
|
1424
1458
|
/** "HH:mm", 24-hour. */
|
|
1425
1459
|
value?: string | null | undefined;
|
|
1426
1460
|
defaultValue?: string | null | undefined;
|
package/dist/styles.css
CHANGED
|
@@ -756,6 +756,7 @@ a.aura-icon-btn { text-decoration: none; }
|
|
|
756
756
|
.aura-tabs__list { display: flex; gap: var(--aura-space-6); box-shadow: inset 0 -1px 0 var(--aura-border-default); overflow-x: auto; scrollbar-width: none; }
|
|
757
757
|
.aura-tab {
|
|
758
758
|
position: relative; display: inline-flex; align-items: center; gap: var(--aura-space-2); flex: none;
|
|
759
|
+
box-sizing: border-box; /* 5.39: a link tab (<a>) was 2px taller than a button tab — its underline sat outside the height */
|
|
759
760
|
height: var(--aura-input-height); padding: 0;
|
|
760
761
|
border: 0; border-bottom: 2px solid transparent; background: transparent;
|
|
761
762
|
color: var(--aura-fg-secondary); font: inherit; font-size: 13px; font-weight: 500; cursor: pointer;
|
|
@@ -772,6 +773,10 @@ a.aura-tab { text-decoration: none; }
|
|
|
772
773
|
font-size: 11px; line-height: 18px; text-align: center; font-variant-numeric: tabular-nums;
|
|
773
774
|
}
|
|
774
775
|
.aura-tabs__panel { padding-top: var(--aura-space-6); outline: none; }
|
|
776
|
+
/* 5.39 (Chamber-OS 143): touchHeight — 44px tabs (underline or segmented, buttons or links) below 640px or on a coarse
|
|
777
|
+
* pointer (is-touch), or always. The height is set on the tabs, not through --aura-input-height, so panels keep theirs. */
|
|
778
|
+
.aura-tabs.is-touch-always .aura-tab { height: var(--aura-touch-target); }
|
|
779
|
+
@media (max-width: 639.98px), (pointer: coarse) { .aura-tabs.is-touch .aura-tab { height: var(--aura-touch-target); } }
|
|
775
780
|
.aura-tabs__panel[hidden] { display: none; }
|
|
776
781
|
.aura-tabs__panel:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; border-radius: var(--aura-radius-sm); }
|
|
777
782
|
|
|
@@ -1617,6 +1622,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1617
1622
|
}
|
|
1618
1623
|
.aura-tag__remove { position: relative; }
|
|
1619
1624
|
.aura-combo.is-multi .aura-combo__clear, .aura-combo.is-multi .aura-combo__toggle { top: calc((var(--aura-input-height) - 2px - 40px) / 2); }
|
|
1625
|
+
.aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); } /* 5.38: room for both 44px buttons */
|
|
1620
1626
|
}
|
|
1621
1627
|
|
|
1622
1628
|
/* ---------- Small screens (< 640px) ---------- */
|
|
@@ -1665,6 +1671,25 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1665
1671
|
.aura-check--labelled.is-touch-always .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
|
|
1666
1672
|
.aura-radio-group.is-touch-always .aura-radio-group__list { gap: 0; }
|
|
1667
1673
|
.aura-radio-group.is-touch-always .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
|
|
1674
|
+
/* 5.38 (Chamber-OS 141): Combobox, DatePicker, TimePicker and NumberField take touchHeight too; their buttons inside
|
|
1675
|
+
* the box get the touch-screen sizes (44px wide, side by side) with the 44px box, so neither is a 32px target. A
|
|
1676
|
+
* FilterBar with touchHeight (Chamber-OS 140) does the same for those fields in it. */
|
|
1677
|
+
: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; }
|
|
1678
|
+
:is(.aura-field, .aura-filterbar).is-touch-always :is(.aura-combo__toggle, .aura-date__toggle) { right: 0; }
|
|
1679
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo__clear { right: var(--aura-touch-target); }
|
|
1680
|
+
: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)); }
|
|
1681
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1682
|
+
: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); }
|
|
1683
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-number__step { width: var(--aura-touch-target); }
|
|
1684
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1685
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo__clear, .aura-combo__toggle, .aura-date__toggle) { width: var(--aura-touch-target); height: 40px; }
|
|
1686
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo__toggle, .aura-date__toggle) { right: 0; }
|
|
1687
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo__clear { right: var(--aura-touch-target); }
|
|
1688
|
+
: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)); }
|
|
1689
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1690
|
+
: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); }
|
|
1691
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-number__step { width: var(--aura-touch-target); }
|
|
1692
|
+
}
|
|
1668
1693
|
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1669
1694
|
.aura-field.is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1670
1695
|
.aura-radio-group.is-touch .aura-choice, .aura-check--labelled.is-touch {
|
|
@@ -1788,6 +1813,18 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1788
1813
|
.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; }
|
|
1789
1814
|
.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; }
|
|
1790
1815
|
.aura-filterselect.is-disabled .aura-filterselect__native { cursor: not-allowed; }
|
|
1816
|
+
/* 5.38 (Chamber-OS 140): touchHeight on FilterBar (its search and field-height controls) or on one FilterSelect —
|
|
1817
|
+
* 44px below 640px or on a coarse pointer (is-touch), or always. */
|
|
1818
|
+
:is(.aura-filterbar, .aura-filterselect).is-touch-always { --aura-input-height: var(--aura-touch-target); }
|
|
1819
|
+
.aura-filterbar.is-touch-always .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1820
|
+
.aura-filterbar.is-touch-always .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1821
|
+
.aura-filterbar.is-touch-always .aura-filterbar__clear-search { width: var(--aura-touch-target); height: 40px; margin-right: 0; }
|
|
1822
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1823
|
+
:is(.aura-filterbar, .aura-filterselect).is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1824
|
+
.aura-filterbar.is-touch .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1825
|
+
.aura-filterbar.is-touch .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1826
|
+
.aura-filterbar.is-touch .aura-filterbar__clear-search { width: var(--aura-touch-target); height: 40px; margin-right: 0; }
|
|
1827
|
+
}
|
|
1791
1828
|
@media (forced-colors: active) { .aura-filterselect__face { border-color: ButtonText; } }
|
|
1792
1829
|
/* 5.26 (Chamber-OS 128) FilterDateRange: presets beside the range calendar; above it on phones. */
|
|
1793
1830
|
.aura-filterdate__pop { display: flex; gap: var(--aura-space-3); overflow-y: auto; }
|
package/dist/styles.layer.css
CHANGED
|
@@ -758,6 +758,7 @@ a.aura-icon-btn { text-decoration: none; }
|
|
|
758
758
|
.aura-tabs__list { display: flex; gap: var(--aura-space-6); box-shadow: inset 0 -1px 0 var(--aura-border-default); overflow-x: auto; scrollbar-width: none; }
|
|
759
759
|
.aura-tab {
|
|
760
760
|
position: relative; display: inline-flex; align-items: center; gap: var(--aura-space-2); flex: none;
|
|
761
|
+
box-sizing: border-box; /* 5.39: a link tab (<a>) was 2px taller than a button tab — its underline sat outside the height */
|
|
761
762
|
height: var(--aura-input-height); padding: 0;
|
|
762
763
|
border: 0; border-bottom: 2px solid transparent; background: transparent;
|
|
763
764
|
color: var(--aura-fg-secondary); font: inherit; font-size: 13px; font-weight: 500; cursor: pointer;
|
|
@@ -774,6 +775,10 @@ a.aura-tab { text-decoration: none; }
|
|
|
774
775
|
font-size: 11px; line-height: 18px; text-align: center; font-variant-numeric: tabular-nums;
|
|
775
776
|
}
|
|
776
777
|
.aura-tabs__panel { padding-top: var(--aura-space-6); outline: none; }
|
|
778
|
+
/* 5.39 (Chamber-OS 143): touchHeight — 44px tabs (underline or segmented, buttons or links) below 640px or on a coarse
|
|
779
|
+
* pointer (is-touch), or always. The height is set on the tabs, not through --aura-input-height, so panels keep theirs. */
|
|
780
|
+
.aura-tabs.is-touch-always .aura-tab { height: var(--aura-touch-target); }
|
|
781
|
+
@media (max-width: 639.98px), (pointer: coarse) { .aura-tabs.is-touch .aura-tab { height: var(--aura-touch-target); } }
|
|
777
782
|
.aura-tabs__panel[hidden] { display: none; }
|
|
778
783
|
.aura-tabs__panel:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; border-radius: var(--aura-radius-sm); }
|
|
779
784
|
|
|
@@ -1619,6 +1624,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1619
1624
|
}
|
|
1620
1625
|
.aura-tag__remove { position: relative; }
|
|
1621
1626
|
.aura-combo.is-multi .aura-combo__clear, .aura-combo.is-multi .aura-combo__toggle { top: calc((var(--aura-input-height) - 2px - 40px) / 2); }
|
|
1627
|
+
.aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); } /* 5.38: room for both 44px buttons */
|
|
1622
1628
|
}
|
|
1623
1629
|
|
|
1624
1630
|
/* ---------- Small screens (< 640px) ---------- */
|
|
@@ -1667,6 +1673,25 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1667
1673
|
.aura-check--labelled.is-touch-always .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
|
|
1668
1674
|
.aura-radio-group.is-touch-always .aura-radio-group__list { gap: 0; }
|
|
1669
1675
|
.aura-radio-group.is-touch-always .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
|
|
1676
|
+
/* 5.38 (Chamber-OS 141): Combobox, DatePicker, TimePicker and NumberField take touchHeight too; their buttons inside
|
|
1677
|
+
* the box get the touch-screen sizes (44px wide, side by side) with the 44px box, so neither is a 32px target. A
|
|
1678
|
+
* FilterBar with touchHeight (Chamber-OS 140) does the same for those fields in it. */
|
|
1679
|
+
: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; }
|
|
1680
|
+
:is(.aura-field, .aura-filterbar).is-touch-always :is(.aura-combo__toggle, .aura-date__toggle) { right: 0; }
|
|
1681
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo__clear { right: var(--aura-touch-target); }
|
|
1682
|
+
: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)); }
|
|
1683
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1684
|
+
: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); }
|
|
1685
|
+
:is(.aura-field, .aura-filterbar).is-touch-always .aura-number__step { width: var(--aura-touch-target); }
|
|
1686
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1687
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo__clear, .aura-combo__toggle, .aura-date__toggle) { width: var(--aura-touch-target); height: 40px; }
|
|
1688
|
+
:is(.aura-field, .aura-filterbar).is-touch :is(.aura-combo__toggle, .aura-date__toggle) { right: 0; }
|
|
1689
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo__clear { right: var(--aura-touch-target); }
|
|
1690
|
+
: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)); }
|
|
1691
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-combo.is-multi { padding-right: calc(var(--aura-space-1) + 2 * var(--aura-touch-target)); }
|
|
1692
|
+
: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); }
|
|
1693
|
+
:is(.aura-field, .aura-filterbar).is-touch .aura-number__step { width: var(--aura-touch-target); }
|
|
1694
|
+
}
|
|
1670
1695
|
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1671
1696
|
.aura-field.is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1672
1697
|
.aura-radio-group.is-touch .aura-choice, .aura-check--labelled.is-touch {
|
|
@@ -1790,6 +1815,18 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
|
|
|
1790
1815
|
.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; }
|
|
1791
1816
|
.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; }
|
|
1792
1817
|
.aura-filterselect.is-disabled .aura-filterselect__native { cursor: not-allowed; }
|
|
1818
|
+
/* 5.38 (Chamber-OS 140): touchHeight on FilterBar (its search and field-height controls) or on one FilterSelect —
|
|
1819
|
+
* 44px below 640px or on a coarse pointer (is-touch), or always. */
|
|
1820
|
+
:is(.aura-filterbar, .aura-filterselect).is-touch-always { --aura-input-height: var(--aura-touch-target); }
|
|
1821
|
+
.aura-filterbar.is-touch-always .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1822
|
+
.aura-filterbar.is-touch-always .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1823
|
+
.aura-filterbar.is-touch-always .aura-filterbar__clear-search { width: var(--aura-touch-target); height: 40px; margin-right: 0; }
|
|
1824
|
+
@media (max-width: 639.98px), (pointer: coarse) {
|
|
1825
|
+
:is(.aura-filterbar, .aura-filterselect).is-touch { --aura-input-height: var(--aura-touch-target); }
|
|
1826
|
+
.aura-filterbar.is-touch .aura-segmented__option { height: var(--aura-touch-target); }
|
|
1827
|
+
.aura-filterbar.is-touch .aura-segmented__option.is-icon { width: var(--aura-touch-target); }
|
|
1828
|
+
.aura-filterbar.is-touch .aura-filterbar__clear-search { width: var(--aura-touch-target); height: 40px; margin-right: 0; }
|
|
1829
|
+
}
|
|
1793
1830
|
@media (forced-colors: active) { .aura-filterselect__face { border-color: ButtonText; } }
|
|
1794
1831
|
/* 5.26 (Chamber-OS 128) FilterDateRange: presets beside the range calendar; above it on phones. */
|
|
1795
1832
|
.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.39.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",
|