@uni-design-system/uni-mcp 11.8.0 → 11.9.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.
@@ -7,17 +7,17 @@ import { z } from "zod";
7
7
  // src/data/uni-index.json
8
8
  var uni_index_default = {
9
9
  meta: {
10
- version: "11.8.0",
11
- builtAt: "2026-10-22T14:39:12.220Z",
10
+ version: "11.9.0",
11
+ builtAt: "2026-10-22T15:35:59.427Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
16
  components: 89,
17
- tokens: 512,
17
+ tokens: 514,
18
18
  themes: 2,
19
- examples: 261,
20
- utilities: 122
19
+ examples: 263,
20
+ utilities: 124
21
21
  }
22
22
  },
23
23
  components: [
@@ -28,7 +28,7 @@ var uni_index_default = {
28
28
  summary: "",
29
29
  description: "",
30
30
  category: "feedback",
31
- version: "11.8.0",
31
+ version: "11.9.0",
32
32
  bindings: {
33
33
  angular: {
34
34
  importPath: "@uni-design-system/uni-angular",
@@ -118,7 +118,7 @@ var uni_index_default = {
118
118
  summary: "Horizontal application bar: project leading controls (menu button, logo) with the `leading` attribute, actions with `trailing` (pushed to the far edge), and either pass `title` or project custom center content.",
119
119
  description: "Horizontal application bar: project leading controls (menu button, logo) with the `leading` attribute, actions with `trailing` (pushed to the far edge), and either pass `title` or project custom center content. Surface, divider, height, typography and spacing all resolve from `appBar` tokens. Place it inside your page's `<header>` landmark.",
120
120
  category: "components",
121
- version: "11.8.0",
121
+ version: "11.9.0",
122
122
  bindings: {
123
123
  angular: {
124
124
  importPath: "@uni-design-system/uni-angular",
@@ -191,7 +191,7 @@ var uni_index_default = {
191
191
  summary: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol.",
192
192
  description: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol. Coloring, radius, typeface and sizes all resolve from `avatar` theme tokens; `variant` picks the container palette.",
193
193
  category: "components",
194
- version: "11.8.0",
194
+ version: "11.9.0",
195
195
  bindings: {
196
196
  angular: {
197
197
  importPath: "@uni-design-system/uni-angular",
@@ -286,7 +286,7 @@ var uni_index_default = {
286
286
  summary: "Overlapping stack of avatars.",
287
287
  description: "Overlapping stack of avatars. `max` collapses the overflow into a themed \u201C+N\u201D chip (itself a `uni-avatar`). Overlap and separator ring resolve from `avatarGroup` theme tokens.",
288
288
  category: "components",
289
- version: "11.8.0",
289
+ version: "11.9.0",
290
290
  bindings: {
291
291
  angular: {
292
292
  importPath: "@uni-design-system/uni-angular",
@@ -335,7 +335,7 @@ var uni_index_default = {
335
335
  summary: "",
336
336
  description: "",
337
337
  category: "primitives",
338
- version: "11.8.0",
338
+ version: "11.9.0",
339
339
  bindings: {
340
340
  angular: {
341
341
  importPath: "@uni-design-system/uni-angular",
@@ -416,7 +416,7 @@ var uni_index_default = {
416
416
  summary: "",
417
417
  description: "",
418
418
  category: "feedback",
419
- version: "11.8.0",
419
+ version: "11.9.0",
420
420
  bindings: {
421
421
  angular: {
422
422
  importPath: "@uni-design-system/uni-angular",
@@ -513,7 +513,7 @@ var uni_index_default = {
513
513
  summary: "",
514
514
  description: "",
515
515
  category: "directives",
516
- version: "11.8.0",
516
+ version: "11.9.0",
517
517
  bindings: {
518
518
  angular: {
519
519
  importPath: "@uni-design-system/uni-angular",
@@ -537,7 +537,7 @@ var uni_index_default = {
537
537
  summary: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`.',
538
538
  description: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`. It is a directive, so it composes freely \u2014 with another layout attribute (`<div stack-layout uni-text="body-1-long">`) and with a component\'s own host element (`<uni-card box-layout padding="lg">`); Angular merges the host `class` bindings rather than letting one win. Sizing convention (height/width/min/max/inset): a **number is px and needs a binding** \u2014 `[height]="420"`; a **plain attribute is a CSS length string** \u2014 `height="420px"`. Spacing/radius/color inputs take theme tokens.',
539
539
  category: "layout",
540
- version: "11.8.0",
540
+ version: "11.9.0",
541
541
  bindings: {
542
542
  angular: {
543
543
  importPath: "@uni-design-system/uni-angular",
@@ -945,7 +945,7 @@ var uni_index_default = {
945
945
  summary: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative.',
946
946
  description: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative. Items with `href` render as real links; without one they render as link-styled buttons emitting `itemClicked` \u2014 wire that to your router.',
947
947
  category: "components",
948
- version: "11.8.0",
948
+ version: "11.9.0",
949
949
  bindings: {
950
950
  angular: {
951
951
  importPath: "@uni-design-system/uni-angular",
@@ -1030,7 +1030,7 @@ var uni_index_default = {
1030
1030
  summary: "",
1031
1031
  description: "",
1032
1032
  category: "primitives",
1033
- version: "11.8.0",
1033
+ version: "11.9.0",
1034
1034
  bindings: {
1035
1035
  angular: {
1036
1036
  importPath: "@uni-design-system/uni-angular",
@@ -1198,7 +1198,7 @@ var uni_index_default = {
1198
1198
  summary: "",
1199
1199
  description: "",
1200
1200
  category: "primitives",
1201
- version: "11.8.0",
1201
+ version: "11.9.0",
1202
1202
  bindings: {
1203
1203
  angular: {
1204
1204
  importPath: "@uni-design-system/uni-angular",
@@ -1230,7 +1230,7 @@ var uni_index_default = {
1230
1230
  summary: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates.",
1231
1231
  description: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates. One tab stop with a roving-tabindex `role=\"grid\"`; every day is a real button named with its full date. Values are plain ISO strings (`'YYYY-MM-DD'`), never `Date` objects, so bindings are timezone-free and serializable. Selection and today colours come from the theme's `primary` role pair; geometry and glyphs come from the `calendar` theme entry.",
1232
1232
  category: "forms",
1233
- version: "11.8.0",
1233
+ version: "11.9.0",
1234
1234
  bindings: {
1235
1235
  angular: {
1236
1236
  importPath: "@uni-design-system/uni-angular",
@@ -1471,7 +1471,7 @@ var uni_index_default = {
1471
1471
  summary: "Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target.",
1472
1472
  description: 'Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target. Both the scrim and the panel are `popover="manual"` elements shown in order, so they stack deterministically in the top layer above every app z-index, and every scrim piece is CSS-anchor-positioned to the target \u2014 the hole tracks scroll/resize/layout with zero listeners. The panel is a non-modal `role="dialog"` (deliberately no `aria-modal`): focus moves into it on open, Tab runs a "duet loop" over the panel\'s focusables plus the spotlit target while it stays interactive, and on close focus returns to the pre-open element \u2014 unless the user moved into the target, where it stays. Storage-free by rule: `key` and the `dismissed` output are the "don\'t show again" hooks; persistence is the app\'s business (e.g. cdk local-storage).',
1473
1473
  category: "components",
1474
- version: "11.8.0",
1474
+ version: "11.9.0",
1475
1475
  bindings: {
1476
1476
  angular: {
1477
1477
  importPath: "@uni-design-system/uni-angular",
@@ -1691,7 +1691,7 @@ var uni_index_default = {
1691
1691
  summary: "",
1692
1692
  description: "",
1693
1693
  category: "layout",
1694
- version: "11.8.0",
1694
+ version: "11.9.0",
1695
1695
  bindings: {
1696
1696
  angular: {
1697
1697
  importPath: "@uni-design-system/uni-angular",
@@ -1753,7 +1753,7 @@ var uni_index_default = {
1753
1753
  summary: "",
1754
1754
  description: "",
1755
1755
  category: "layout",
1756
- version: "11.8.0",
1756
+ version: "11.9.0",
1757
1757
  bindings: {
1758
1758
  angular: {
1759
1759
  importPath: "@uni-design-system/uni-angular",
@@ -1794,7 +1794,7 @@ var uni_index_default = {
1794
1794
  summary: "",
1795
1795
  description: "",
1796
1796
  category: "layout",
1797
- version: "11.8.0",
1797
+ version: "11.9.0",
1798
1798
  bindings: {
1799
1799
  angular: {
1800
1800
  importPath: "@uni-design-system/uni-angular",
@@ -1851,7 +1851,7 @@ var uni_index_default = {
1851
1851
  summary: "",
1852
1852
  description: "",
1853
1853
  category: "layout",
1854
- version: "11.8.0",
1854
+ version: "11.9.0",
1855
1855
  bindings: {
1856
1856
  angular: {
1857
1857
  importPath: "@uni-design-system/uni-angular",
@@ -1906,7 +1906,7 @@ var uni_index_default = {
1906
1906
  summary: "",
1907
1907
  description: "",
1908
1908
  category: "forms",
1909
- version: "11.8.0",
1909
+ version: "11.9.0",
1910
1910
  bindings: {
1911
1911
  angular: {
1912
1912
  importPath: "@uni-design-system/uni-angular",
@@ -2128,7 +2128,7 @@ var uni_index_default = {
2128
2128
  summary: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select.",
2129
2129
  description: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select. Typing produces a draft \u2014 a filter, never a value; the value changes only when an option commits, `clear()` runs, or the model is written from outside. Select semantics, not search: a real label, a chevron, no magnifier, nothing submits. For short lists with no need to type, prefer `uni-select` \u2014 the value contract is identical, so swapping is a template-only change.",
2130
2130
  category: "forms",
2131
- version: "11.8.0",
2131
+ version: "11.9.0",
2132
2132
  bindings: {
2133
2133
  angular: {
2134
2134
  importPath: "@uni-design-system/uni-angular",
@@ -2430,7 +2430,7 @@ emptyText="No countries found"
2430
2430
  summary: "",
2431
2431
  description: "",
2432
2432
  category: "feedback",
2433
- version: "11.8.0",
2433
+ version: "11.9.0",
2434
2434
  bindings: {
2435
2435
  angular: {
2436
2436
  importPath: "@uni-design-system/uni-angular",
@@ -2477,7 +2477,7 @@ emptyText="No countries found"
2477
2477
  summary: "Recipient field for picking people: removable chips, a text input, and a list of known contacts that opens on focus and narrows as the user types \u2014 each row drawn as a person (avatar, name, address, a trailing note).",
2478
2478
  description: "Recipient field for picking people: removable chips, a text input, and a list of known contacts that opens on focus and narrows as the user types \u2014 each row drawn as a person (avatar, name, address, a trailing note). A thin composition of `uni-tag-input` with a mail client's manners baked in: ArrowDown walks the matches and Enter picks the active one, Backspace in an empty field removes the last person, and text that is neither a known contact nor a valid address stays in the field to be fixed (`rejected` says why). Reach for `uni-tag-input` itself when the tokens are not people.",
2479
2479
  category: "forms",
2480
- version: "11.8.0",
2480
+ version: "11.9.0",
2481
2481
  bindings: {
2482
2482
  angular: {
2483
2483
  importPath: "@uni-design-system/uni-angular",
@@ -2762,7 +2762,7 @@ emptyText="No countries found"
2762
2762
  summary: "",
2763
2763
  description: "",
2764
2764
  category: "forms",
2765
- version: "11.8.0",
2765
+ version: "11.9.0",
2766
2766
  bindings: {
2767
2767
  angular: {
2768
2768
  importPath: "@uni-design-system/uni-angular",
@@ -2858,10 +2858,10 @@ emptyText="No countries found"
2858
2858
  id: "data-table",
2859
2859
  name: "DataTable",
2860
2860
  status: "stable",
2861
- summary: "",
2862
- description: "",
2861
+ summary: "Data grid over a `UniDatasource`: sortable headers, a leading selection column, and an expandable detail row per record.",
2862
+ description: "Data grid over a `UniDatasource`: sortable headers, a leading selection column, and an expandable detail row per record. Rows are addressed by the datasource's `rowId` where it has one \u2014 so a selection survives a re-fetch that rebuilds the records, and the expanded row follows its record through a sort \u2014 and by reference (selection) or page index (expansion) where it has none.",
2863
2863
  category: "data",
2864
- version: "11.8.0",
2864
+ version: "11.9.0",
2865
2865
  bindings: {
2866
2866
  angular: {
2867
2867
  importPath: "@uni-design-system/uni-angular",
@@ -2881,13 +2881,36 @@ emptyText="No countries found"
2881
2881
  required: true,
2882
2882
  description: ""
2883
2883
  },
2884
+ {
2885
+ name: "expanded",
2886
+ kind: "model",
2887
+ type: "RowKey | null",
2888
+ required: false,
2889
+ default: "null",
2890
+ description: "The expanded row, two-way: its `rowId` when the datasource has one, else its index on the page. `null` collapses every row. Keyed by id, a deep link can open a row before the records arrive, and a sort or a realtime reorder keeps the same record open."
2891
+ },
2884
2892
  {
2885
2893
  name: "useMultiSelect",
2886
2894
  kind: "input",
2887
2895
  type: "boolean",
2888
2896
  required: false,
2889
2897
  default: "false",
2890
- description: ""
2898
+ description: "Draw a leading checkbox column over the datasource's `selections`: a header box that selects or clears every selectable row on the page (`indeterminate` while only some are), and a box per row."
2899
+ },
2900
+ {
2901
+ name: "selectAllLabel",
2902
+ kind: "input",
2903
+ type: "string",
2904
+ required: false,
2905
+ default: "'Select all rows'",
2906
+ description: "Accessible name of the header checkbox."
2907
+ },
2908
+ {
2909
+ name: "selectionChange",
2910
+ kind: "output",
2911
+ type: "T[]",
2912
+ required: false,
2913
+ description: "The datasource's selection after a checkbox changed it \u2014 the same array `selections()` holds."
2891
2914
  },
2892
2915
  {
2893
2916
  name: "useRowClick",
@@ -3097,6 +3120,44 @@ emptyText="No countries found"
3097
3120
  base[1]
3098
3121
  ]"
3099
3122
  />`
3123
+ },
3124
+ {
3125
+ title: "Selection",
3126
+ framework: "angular",
3127
+ code: `<!-- Storybook story: Selection -->
3128
+ <uni-data-table
3129
+ [datasource]="datasource"
3130
+ [columns]="columns"
3131
+ [useMultiSelect]="true"
3132
+ [selectableWhen]="selectable"
3133
+ [useRowClick]="false"
3134
+ [selectLabel]="selectLabelOf"
3135
+ (selectionChange)="selected = $event"
3136
+ />
3137
+ <p uni-text="body-2">Selected: {{ selected.length ? (selected | json) : 'nothing' }}</p>`
3138
+ },
3139
+ {
3140
+ title: "Expanded Row",
3141
+ framework: "angular",
3142
+ code: `<!-- Storybook story: Expanded Row -->
3143
+ <div row-layout gap="sm" alignItems="center" paddingBottom="sm">
3144
+ <button text-button size="sm" variant="secondary" (click)="expanded = 'po-104'">Open po-104</button>
3145
+ <button text-button size="sm" variant="ghost" (click)="expanded = null">Collapse</button>
3146
+ <span uni-text="body-2">Expanded: {{ expanded ?? 'none' }}</span>
3147
+ </div>
3148
+ <uni-data-table
3149
+ [datasource]="datasource"
3150
+ [columns]="columns"
3151
+ [detailRowTemplate]="detail"
3152
+ [(expanded)]="expanded"
3153
+ [expandableWhen]="expandable"
3154
+ [rowClass]="dim"
3155
+ />
3156
+ <ng-template #detail let-row>
3157
+ <div box-layout padding="md" uni-text="body-2-long">
3158
+ {{ row.item }} from {{ row.vendor }} \u2014 tracking and notes would go here.
3159
+ </div>
3160
+ </ng-template>`
3100
3161
  }
3101
3162
  ],
3102
3163
  guidelines: {
@@ -3106,7 +3167,8 @@ emptyText="No countries found"
3106
3167
  accessibility: [
3107
3168
  'Column headers use `scope="col"`; sortable headers are real buttons with `aria-sort` on the `<th>`. A `sortable: false` column is a plain heading with neither.',
3108
3169
  'The loading overlay is a `role="status"` region and the table is `aria-busy` while loading.',
3109
- "Collapsed detail rows are `inert`, out of the accessibility tree until expanded."
3170
+ "Collapsed detail rows are `inert`, out of the accessibility tree until expanded; a row with a detail carries `aria-expanded`.",
3171
+ 'Selection boxes are real `uni-checkbox`es named without drawing \u2014 "Select row" and "Select all rows" by default, or per row through `selectLabel` \u2014 and a box is its own control: a click or Space on it is never the row\'s click.'
3110
3172
  ]
3111
3173
  },
3112
3174
  relatedTokens: []
@@ -3118,7 +3180,7 @@ emptyText="No countries found"
3118
3180
  summary: "Date field with free-typed parsing and a popup calendar.",
3119
3181
  description: "Date field with free-typed parsing and a popup calendar. Type `aug 20`, `8/20/2026` or `2026-08-20`, or pick from the grid \u2014 the form gets the same canonical `'YYYY-MM-DD'` string either way. Parsing is `Intl`-driven (locale digit order and month names, never hardcoded); unreadable text stays in the field, flagged, with a `rejected` event. The popup is a native popover hosting the same `uni-calendar` an app could render inline.",
3120
3182
  category: "forms",
3121
- version: "11.8.0",
3183
+ version: "11.9.0",
3122
3184
  bindings: {
3123
3185
  angular: {
3124
3186
  importPath: "@uni-design-system/uni-angular",
@@ -3349,7 +3411,7 @@ emptyText="No countries found"
3349
3411
  summary: "One field for a date and a time: a thin composer seating a uni-date-input and a uni-time-input in one input-box chrome under one label, yielding one combined `'YYYY-MM-DDTHH:mm'` value.",
3350
3412
  description: "One field for a date and a time: a thin composer seating a uni-date-input and a uni-time-input in one input-box chrome under one label, yielding one combined `'YYYY-MM-DDTHH:mm'` value. The value emits only when both parts are set \u2014 a time without a day is not an answer \u2014 and clearing the date clears it. With `slotsFor`, the time part stays disabled until a day is chosen and offers exactly that day's slots: the scheduling flow in one attribute. Two honest tab stops (it is two questions); apps needing a different arrangement compose the primitives directly.",
3351
3413
  category: "forms",
3352
- version: "11.8.0",
3414
+ version: "11.9.0",
3353
3415
  bindings: {
3354
3416
  angular: {
3355
3417
  importPath: "@uni-design-system/uni-angular",
@@ -3542,7 +3604,7 @@ emptyText="No countries found"
3542
3604
  summary: "Text input that emits `change` only after the user pauses typing.",
3543
3605
  description: "Text input that emits `change` only after the user pauses typing. Wears the shared input chrome (themed color, border, typeface, focus ring) via `uni-input-box`; project adornments with the `pre-input` / `post-input` slots, matching `uni-input`'s convention. The ARIA passthrough inputs let a wrapping composite (e.g. SearchInput's combobox) annotate the real input element.",
3544
3606
  category: "forms",
3545
- version: "11.8.0",
3607
+ version: "11.9.0",
3546
3608
  bindings: {
3547
3609
  angular: {
3548
3610
  importPath: "@uni-design-system/uni-angular",
@@ -3690,7 +3752,7 @@ emptyText="No countries found"
3690
3752
  summary: "Modal dialog on the native `<dialog>` element, laid out as three rows: an optional `[dialog-header]`, the projected body, an optional `[dialog-buttons]`.",
3691
3753
  description: "Modal dialog on the native `<dialog>` element, laid out as three rows: an optional `[dialog-header]`, the projected body, an optional `[dialog-buttons]`. **The surface is never the scroll container.** It is a flex column that is `overflow: clip` on both axes; the header and buttons pin while only the body row scrolls. Unlike the drawer, which is deliberately viewport-tall, the dialog stays content-sized: it has no `height`, and grows until it hits `calc(100dvh - 2 x inset)` \u2014 the point at which the body starts to scroll. The theme's `padding` insets all three rows (which is what makes the default header read as a pill floating inside the surface); `bodyPadding` pads the scrolling row alone.",
3692
3754
  category: "feedback",
3693
- version: "11.8.0",
3755
+ version: "11.9.0",
3694
3756
  bindings: {
3695
3757
  angular: {
3696
3758
  importPath: "@uni-design-system/uni-angular",
@@ -3860,7 +3922,7 @@ uni-dialog
3860
3922
  summary: "The dialog's pinned footer action row.",
3861
3923
  description: "The dialog's pinned footer action row. Empty, it renders a Confirm/Cancel pair wired to the dialog. Project your own buttons and they replace the pair while keeping the row's chrome \u2014 padding, gap, justification, divider, `stretch` and `reverseOrder`. A `[dialog-footnote]` projects on the leading edge, pushing the actions to the trailing one.",
3862
3924
  category: "feedback",
3863
- version: "11.8.0",
3925
+ version: "11.9.0",
3864
3926
  bindings: {
3865
3927
  angular: {
3866
3928
  importPath: "@uni-design-system/uni-angular",
@@ -3980,7 +4042,7 @@ uni-dialog
3980
4042
  summary: "The dialog's pinned header row, in one of two shapes: - **Title bar** (default): one line of text, set in the theme's `textRole` and aligned by `textAlign`, beside a close button.",
3981
4043
  description: "The dialog's pinned header row, in one of two shapes: - **Title bar** (default): one line of text, set in the theme's `textRole` and aligned by `textAlign`, beside a close button. - **Rich** (`rich`): the projection is rendered as a block \u2014 an eyebrow, a headline, a blurb \u2014 beside the close button, in its own `richColor` and `richPadding`. Mark the headline `[dialog-title]` so it alone names the dialog.",
3982
4044
  category: "feedback",
3983
- version: "11.8.0",
4045
+ version: "11.9.0",
3984
4046
  bindings: {
3985
4047
  angular: {
3986
4048
  importPath: "@uni-design-system/uni-angular",
@@ -4029,7 +4091,7 @@ uni-dialog
4029
4091
  summary: "Marks the element that names the dialog inside a rich `[dialog-header]`.",
4030
4092
  description: "Marks the element that names the dialog inside a rich `[dialog-header]`. A rich head projects an eyebrow, a headline and a blurb; the dialog should be labelled by the headline alone, not read all three as its name. Put this on the headline and it carries the id the dialog's `aria-labelledby` points at. Without one, the whole projected block is the label.",
4031
4093
  category: "feedback",
4032
- version: "11.8.0",
4094
+ version: "11.9.0",
4033
4095
  bindings: {
4034
4096
  angular: {
4035
4097
  importPath: "@uni-design-system/uni-angular",
@@ -4053,7 +4115,7 @@ uni-dialog
4053
4115
  summary: "",
4054
4116
  description: "",
4055
4117
  category: "layout",
4056
- version: "11.8.0",
4118
+ version: "11.9.0",
4057
4119
  bindings: {
4058
4120
  angular: {
4059
4121
  importPath: "@uni-design-system/uni-angular",
@@ -4109,7 +4171,7 @@ uni-dialog
4109
4171
  summary: "",
4110
4172
  description: "",
4111
4173
  category: "directives",
4112
- version: "11.8.0",
4174
+ version: "11.9.0",
4113
4175
  bindings: {
4114
4176
  angular: {
4115
4177
  importPath: "@uni-design-system/uni-angular",
@@ -4141,7 +4203,7 @@ uni-dialog
4141
4203
  summary: "Drawer with two modes sharing one three-row layout: - `side` \u2014 an in-flow `<aside>` that pushes content (dashboard sidenav); opening/closing animates its width, and the divider border primitive separates it from the page.",
4142
4204
  description: 'Drawer with two modes sharing one three-row layout: - `side` \u2014 an in-flow `<aside>` that pushes content (dashboard sidenav); opening/closing animates its width, and the divider border primitive separates it from the page. - `over` \u2014 a native `<dialog>` in the top layer: focus trap, Escape and scrim backdrop come from the platform (same machinery as `uni-dialog`), sliding in from its edge. With `modal` off it is shown as a `popover="manual"` instead: still the top layer, but no focus trap, no inert page and no backdrop \u2014 a workbench beside a live document. **The panel is never the scroll container.** It is a flex column of three rows \u2014 an optional `[uni-drawer-header]`, the projected body, an optional `[uni-drawer-buttons]` \u2014 and only the body scrolls. The panel itself is `overflow: clip` on both axes. That is what lets a header and a save bar pin while a long form scrolls between them, and it is why the theme\'s `padding` option lands on the body row rather than the panel: padding on a scrolling box scrolls away with its content. Surface, width, divider, elevation, padding, backdrop, scrim and background all resolve from `drawer` theme tokens.',
4143
4205
  category: "components",
4144
- version: "11.8.0",
4206
+ version: "11.9.0",
4145
4207
  bindings: {
4146
4208
  angular: {
4147
4209
  importPath: "@uni-design-system/uni-angular",
@@ -4371,7 +4433,7 @@ initialFocus="input"
4371
4433
  summary: "The drawer's pinned footer action row \u2014 the save bar of an editor panel.",
4372
4434
  description: "The drawer's pinned footer action row \u2014 the save bar of an editor panel. Sits outside the scrolling body, so the actions stay reachable however long the form is. Mirrors `[dialog-buttons]`; the difference is posture, which lives in the `drawerButtons` theme options rather than here. Empty, it renders a Cancel/Save pair wired to the drawer. Project your own buttons and they replace the pair while keeping the row's chrome; a `[drawer-footnote]` projects on the leading edge.",
4373
4435
  category: "primitives",
4374
- version: "11.8.0",
4436
+ version: "11.9.0",
4375
4437
  bindings: {
4376
4438
  angular: {
4377
4439
  importPath: "@uni-design-system/uni-angular",
@@ -4476,7 +4538,7 @@ initialFocus="input"
4476
4538
  summary: "The drawer's pinned header row: a title, and optionally a close button.",
4477
4539
  description: "The drawer's pinned header row: a title, and optionally a close button. Sits outside the scrolling body, so it stays put while the form beneath it moves. Reached either by projecting it \u2014 `<div uni-drawer-header>` \u2014 or implicitly, by giving `uni-drawer` a `headline`, in which case the drawer renders one of these itself.",
4478
4540
  category: "components",
4479
- version: "11.8.0",
4541
+ version: "11.9.0",
4480
4542
  bindings: {
4481
4543
  angular: {
4482
4544
  importPath: "@uni-design-system/uni-angular",
@@ -4524,7 +4586,7 @@ initialFocus="input"
4524
4586
  summary: "",
4525
4587
  description: "",
4526
4588
  category: "components",
4527
- version: "11.8.0",
4589
+ version: "11.9.0",
4528
4590
  bindings: {
4529
4591
  angular: {
4530
4592
  importPath: "@uni-design-system/uni-angular",
@@ -4658,7 +4720,7 @@ initialFocus="input"
4658
4720
  summary: "",
4659
4721
  description: "",
4660
4722
  category: "layout",
4661
- version: "11.8.0",
4723
+ version: "11.9.0",
4662
4724
  bindings: {
4663
4725
  angular: {
4664
4726
  importPath: "@uni-design-system/uni-angular",
@@ -4765,7 +4827,7 @@ initialFocus="input"
4765
4827
  summary: "",
4766
4828
  description: "",
4767
4829
  category: "layout",
4768
- version: "11.8.0",
4830
+ version: "11.9.0",
4769
4831
  bindings: {
4770
4832
  angular: {
4771
4833
  importPath: "@uni-design-system/uni-angular",
@@ -4836,7 +4898,7 @@ initialFocus="input"
4836
4898
  summary: "Trigger for a {@link UniExpandComponent} region.",
4837
4899
  description: "Trigger for a {@link UniExpandComponent} region. Two shapes, chosen by whether `label` is set: - **Icon only** (default) \u2014 the bare chevron, sized for a Card Header. - **Labelled** \u2014 chevron plus a label and optional muted sublabel, as a single full-width button. Most real disclosures need a name for the section, and building that row by hand is the thing this saves; it also makes the label the button's accessible name rather than adjacent text.",
4838
4900
  category: "layout",
4839
- version: "11.8.0",
4901
+ version: "11.9.0",
4840
4902
  bindings: {
4841
4903
  angular: {
4842
4904
  importPath: "@uni-design-system/uni-angular",
@@ -4921,7 +4983,7 @@ initialFocus="input"
4921
4983
  summary: "",
4922
4984
  description: "",
4923
4985
  category: "forms",
4924
- version: "11.8.0",
4986
+ version: "11.9.0",
4925
4987
  bindings: {
4926
4988
  angular: {
4927
4989
  importPath: "@uni-design-system/uni-angular",
@@ -5079,7 +5141,7 @@ initialFocus="input"
5079
5141
  summary: "",
5080
5142
  description: "",
5081
5143
  category: "layout",
5082
- version: "11.8.0",
5144
+ version: "11.9.0",
5083
5145
  bindings: {
5084
5146
  angular: {
5085
5147
  importPath: "@uni-design-system/uni-angular",
@@ -5176,7 +5238,7 @@ initialFocus="input"
5176
5238
  summary: "",
5177
5239
  description: "",
5178
5240
  category: "layout",
5179
- version: "11.8.0",
5241
+ version: "11.9.0",
5180
5242
  bindings: {
5181
5243
  angular: {
5182
5244
  importPath: "@uni-design-system/uni-angular",
@@ -5208,7 +5270,7 @@ initialFocus="input"
5208
5270
  summary: "",
5209
5271
  description: "",
5210
5272
  category: "primitives",
5211
- version: "11.8.0",
5273
+ version: "11.9.0",
5212
5274
  bindings: {
5213
5275
  angular: {
5214
5276
  importPath: "@uni-design-system/uni-angular",
@@ -5268,7 +5330,7 @@ initialFocus="input"
5268
5330
  summary: "",
5269
5331
  description: "",
5270
5332
  category: "primitives",
5271
- version: "11.8.0",
5333
+ version: "11.9.0",
5272
5334
  bindings: {
5273
5335
  angular: {
5274
5336
  importPath: "@uni-design-system/uni-angular",
@@ -5381,7 +5443,7 @@ initialFocus="input"
5381
5443
  summary: "A button that lives inside a sentence.",
5382
5444
  description: "A button that lives inside a sentence. Every other button in the library owns a box. Even `ghost` is a flex box with a hit area, horizontal padding and a type scale of its own, so dropping one into a sentence takes it out of the run of text entirely. This one inherits that type \u2014 family, size, weight, line height and colour \u2014 and adds no padding, so a paragraph reads as one continuous run with an action in the middle of it. It is always a real `<button>`: it can *look* like a link (`underline`, `link`) without claiming to be navigation, so Enter and Space activate it and assistive tech announces a button rather than an unfollowable link. A glyph may sit alongside the label without disturbing that: it is sized in `em`, so it scales with the type it lands in rather than pinning a px size into someone else's paragraph. One limit comes from the element itself. Browsers blockify a `<button>` to `inline-block` whatever `display` it asks for, so the control is an atomic inline box: its own label wraps inside it, but the run cannot split across a line break the way the words around it do. `display: contents` would buy that at the cost of the button being focusable at all, which is not a trade worth making \u2014 keep labels to a few words, which is what an inline action wants anyway.",
5383
5445
  category: "primitives",
5384
- version: "11.8.0",
5446
+ version: "11.9.0",
5385
5447
  bindings: {
5386
5448
  angular: {
5387
5449
  importPath: "@uni-design-system/uni-angular",
@@ -5496,7 +5558,7 @@ initialFocus="input"
5496
5558
  summary: "",
5497
5559
  description: "",
5498
5560
  category: "forms",
5499
- version: "11.8.0",
5561
+ version: "11.9.0",
5500
5562
  bindings: {
5501
5563
  angular: {
5502
5564
  importPath: "@uni-design-system/uni-angular",
@@ -5796,7 +5858,7 @@ initialFocus="input"
5796
5858
  summary: "",
5797
5859
  description: "",
5798
5860
  category: "forms",
5799
- version: "11.8.0",
5861
+ version: "11.9.0",
5800
5862
  bindings: {
5801
5863
  angular: {
5802
5864
  importPath: "@uni-design-system/uni-angular",
@@ -5925,7 +5987,7 @@ initialFocus="input"
5925
5987
  summary: "",
5926
5988
  description: "",
5927
5989
  category: "components",
5928
- version: "11.8.0",
5990
+ version: "11.9.0",
5929
5991
  bindings: {
5930
5992
  angular: {
5931
5993
  importPath: "@uni-design-system/uni-angular",
@@ -5995,7 +6057,7 @@ initialFocus="input"
5995
6057
  summary: "",
5996
6058
  description: "",
5997
6059
  category: "layout",
5998
- version: "11.8.0",
6060
+ version: "11.9.0",
5999
6061
  bindings: {
6000
6062
  angular: {
6001
6063
  importPath: "@uni-design-system/uni-angular",
@@ -6099,7 +6161,7 @@ initialFocus="input"
6099
6161
  summary: "",
6100
6162
  description: "",
6101
6163
  category: "layout",
6102
- version: "11.8.0",
6164
+ version: "11.9.0",
6103
6165
  bindings: {
6104
6166
  angular: {
6105
6167
  importPath: "@uni-design-system/uni-angular",
@@ -6181,7 +6243,7 @@ initialFocus="input"
6181
6243
  summary: "",
6182
6244
  description: "",
6183
6245
  category: "forms",
6184
- version: "11.8.0",
6246
+ version: "11.9.0",
6185
6247
  bindings: {
6186
6248
  angular: {
6187
6249
  importPath: "@uni-design-system/uni-angular",
@@ -6275,7 +6337,7 @@ initialFocus="input"
6275
6337
  summary: "",
6276
6338
  description: "",
6277
6339
  category: "forms",
6278
- version: "11.8.0",
6340
+ version: "11.9.0",
6279
6341
  bindings: {
6280
6342
  angular: {
6281
6343
  importPath: "@uni-design-system/uni-angular",
@@ -6454,7 +6516,7 @@ initialFocus="input"
6454
6516
  summary: "",
6455
6517
  description: "",
6456
6518
  category: "feedback",
6457
- version: "11.8.0",
6519
+ version: "11.9.0",
6458
6520
  bindings: {
6459
6521
  angular: {
6460
6522
  importPath: "@uni-design-system/uni-angular",
@@ -6714,7 +6776,7 @@ initialFocus="input"
6714
6776
  summary: "",
6715
6777
  description: "",
6716
6778
  category: "feedback",
6717
- version: "11.8.0",
6779
+ version: "11.9.0",
6718
6780
  bindings: {
6719
6781
  angular: {
6720
6782
  importPath: "@uni-design-system/uni-angular",
@@ -6738,7 +6800,7 @@ initialFocus="input"
6738
6800
  summary: "Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.",
6739
6801
  description: 'Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat. Not `<input type="number">`, and the first reason is a data-loss bug: per the HTML value sanitization algorithm, a number input whose text is not a valid floating-point number reports `value === \'\'`. Type `12,50` as most of Europe does, or paste `1,234.56` from a spreadsheet, and the app reads an empty field. This is `type="text"` with `role="spinbutton"`, which is the only way to keep the user\'s malformed text on screen and tell them about it. Chrome comes from `uni-input-box`, so error, disabled and focus states match every other field. All arithmetic runs on the cdk\'s exact decimal helpers.',
6740
6802
  category: "forms",
6741
- version: "11.8.0",
6803
+ version: "11.9.0",
6742
6804
  bindings: {
6743
6805
  angular: {
6744
6806
  importPath: "@uni-design-system/uni-angular",
@@ -7172,7 +7234,7 @@ initialFocus="input"
7172
7234
  summary: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances.",
7173
7235
  description: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances. `start`/`end` deliberately match `UniDateRange`, so the library has one range vocabulary, and they avoid colliding with the `min`/`max` **inputs**, which mean the fence rather than the value. It owns its commit path rather than nesting two `uni-number-input`s, because the two behaviours the spec asks for need *different* bounds: a stepper must be fenced at the other end, while a typed commit must reach the parent un-clamped so a backwards range can be swapped instead of destroyed. A child field applies one bound pair to both. The arithmetic, parsing and formatting are still the cdk's, shared with every other numeric control.",
7174
7236
  category: "forms",
7175
- version: "11.8.0",
7237
+ version: "11.9.0",
7176
7238
  bindings: {
7177
7239
  angular: {
7178
7240
  importPath: "@uni-design-system/uni-angular",
@@ -7463,7 +7525,7 @@ initialFocus="input"
7463
7525
  summary: "",
7464
7526
  description: "",
7465
7527
  category: "data",
7466
- version: "11.8.0",
7528
+ version: "11.9.0",
7467
7529
  bindings: {
7468
7530
  angular: {
7469
7531
  importPath: "@uni-design-system/uni-angular",
@@ -7564,7 +7626,7 @@ initialFocus="input"
7564
7626
  summary: "Anchored, top-layer panel on the native `popover` element \u2014 the browser owns positioning (CSS anchor positioning), stacking, and, in rich mode, light dismissal.",
7565
7627
  description: 'Anchored, top-layer panel on the native `popover` element \u2014 the browser owns positioning (CSS anchor positioning), stacking, and, in rich mode, light dismissal. Two modes share one implementation: - `rich` (default): a click-toggled disclosure. The projected `[trigger]` carries `aria-expanded`/`aria-controls`; with no trigger content the app drives `open` and no element claims controller ARIA. Focus stays on the trigger (APG disclosure) unless the panel marks an `[autofocus]` field, and returns to the trigger on close. - `tooltip`: hover/focus-triggered, `role="tooltip"` + `aria-describedby`, WCAG 1.4.13 dismissable/hoverable/persistent. Content must not contain focusable elements. Anchoring and control are separate: `anchor` re-anchors the panel to any element (or id) while the trigger keeps the disclosure semantics.',
7566
7628
  category: "layout",
7567
- version: "11.8.0",
7629
+ version: "11.9.0",
7568
7630
  bindings: {
7569
7631
  angular: {
7570
7632
  importPath: "@uni-design-system/uni-angular",
@@ -7756,7 +7818,7 @@ initialFocus="input"
7756
7818
  summary: "",
7757
7819
  description: "",
7758
7820
  category: "feedback",
7759
- version: "11.8.0",
7821
+ version: "11.9.0",
7760
7822
  bindings: {
7761
7823
  angular: {
7762
7824
  importPath: "@uni-design-system/uni-angular",
@@ -7820,7 +7882,7 @@ initialFocus="input"
7820
7882
  summary: "",
7821
7883
  description: "",
7822
7884
  category: "feedback",
7823
- version: "11.8.0",
7885
+ version: "11.9.0",
7824
7886
  bindings: {
7825
7887
  angular: {
7826
7888
  importPath: "@uni-design-system/uni-angular",
@@ -7892,7 +7954,7 @@ initialFocus="input"
7892
7954
  summary: "`\u2212 3 +` for cart lines, table cells and seat counts: the numeric core with no field chrome, no label and no room for either.",
7893
7955
  description: '`\u2212 3 +` for cart lines, table cells and seat counts: the numeric core with no field chrome, no label and no room for either. A separate component rather than a `chrome="bare"` flag on `uni-number-input`, because this control is defined by what it does *not* have \u2014 presets, affixes, expressions, four stepper layouts \u2014 and eight inputs are easier to write correctly than forty with a list of which ones to leave alone. The arithmetic, parsing and hold-to-repeat are the cdk\'s, shared with the field, so `1,200` and the keyboard map behave identically in both. The middle stays a real input by default: typing `12` beats tapping `+` eleven times. `editable=false` is for read-mostly tables.',
7894
7956
  category: "forms",
7895
- version: "11.8.0",
7957
+ version: "11.9.0",
7896
7958
  bindings: {
7897
7959
  angular: {
7898
7960
  importPath: "@uni-design-system/uni-angular",
@@ -8095,7 +8157,7 @@ initialFocus="input"
8095
8157
  summary: "",
8096
8158
  description: "",
8097
8159
  category: "forms",
8098
- version: "11.8.0",
8160
+ version: "11.9.0",
8099
8161
  bindings: {
8100
8162
  angular: {
8101
8163
  importPath: "@uni-design-system/uni-angular",
@@ -8324,7 +8386,7 @@ initialFocus="input"
8324
8386
  summary: "Content for each of a radio group's options, in place of the plain label string.",
8325
8387
  description: 'Content for each of a radio group\'s options, in place of the plain label string. A group renders N labels from an `options` array, so it cannot take `<ng-content />` the way `uni-checkbox` and `uni-toggle` do \u2014 there is no single slot to project into. A template is the shape that survives the repetition: it is instantiated once per option and handed that option, so a row can carry a description, a price or a badge and still be part of the `<label>` that drives the input. ```html <uni-radio [options]="plans"> <ng-template uniRadioOption let-option> <span uni-text="body-2-long">{{ option.label }}</span> </ng-template> </uni-radio> ```',
8326
8388
  category: "forms",
8327
- version: "11.8.0",
8389
+ version: "11.9.0",
8328
8390
  bindings: {
8329
8391
  angular: {
8330
8392
  importPath: "@uni-design-system/uni-angular",
@@ -8348,7 +8410,7 @@ initialFocus="input"
8348
8410
  summary: "",
8349
8411
  description: "",
8350
8412
  category: "directives",
8351
- version: "11.8.0",
8413
+ version: "11.9.0",
8352
8414
  bindings: {
8353
8415
  angular: {
8354
8416
  importPath: "@uni-design-system/uni-angular",
@@ -8372,7 +8434,7 @@ initialFocus="input"
8372
8434
  summary: "",
8373
8435
  description: "",
8374
8436
  category: "layout",
8375
- version: "11.8.0",
8437
+ version: "11.9.0",
8376
8438
  bindings: {
8377
8439
  angular: {
8378
8440
  importPath: "@uni-design-system/uni-angular",
@@ -8427,7 +8489,7 @@ initialFocus="input"
8427
8489
  summary: "Native scroll area with theme-driven scrollbar styling.",
8428
8490
  description: "Native scroll area with theme-driven scrollbar styling. Scrollbars are styled entirely through Emotion-generated CSS: `::-webkit-scrollbar` rules cover Chromium/Safari, with a `scrollbar-width`/`scrollbar-color` fallback for Firefox.",
8429
8491
  category: "layout",
8430
- version: "11.8.0",
8492
+ version: "11.9.0",
8431
8493
  bindings: {
8432
8494
  angular: {
8433
8495
  importPath: "@uni-design-system/uni-angular",
@@ -8594,7 +8656,7 @@ initialFocus="input"
8594
8656
  summary: "Generic search field: shared input chrome with a leading magnifier, a clear button while there's a query, Enter to submit, and optional type-ahead \u2014 pass `suggestions` (refresh them from `change`) and the field becomes an ARIA combobox with a keyboard-navigable listbox.",
8595
8657
  description: "Generic search field: shared input chrome with a leading magnifier, a clear button while there's a query, Enter to submit, and optional type-ahead \u2014 pass `suggestions` (refresh them from `change`) and the field becomes an ARIA combobox with a keyboard-navigable listbox. Escape closes the list first, then clears the query.",
8596
8658
  category: "forms",
8597
- version: "11.8.0",
8659
+ version: "11.9.0",
8598
8660
  bindings: {
8599
8661
  angular: {
8600
8662
  importPath: "@uni-design-system/uni-angular",
@@ -8729,7 +8791,7 @@ initialFocus="input"
8729
8791
  summary: "",
8730
8792
  description: "",
8731
8793
  category: "forms",
8732
- version: "11.8.0",
8794
+ version: "11.9.0",
8733
8795
  bindings: {
8734
8796
  angular: {
8735
8797
  importPath: "@uni-design-system/uni-angular",
@@ -8901,7 +8963,7 @@ initialFocus="input"
8901
8963
  summary: "Loading placeholder painted with surface tokens.",
8902
8964
  description: "Loading placeholder painted with surface tokens. `text` renders one or more lines (the last line shortened, as real text would be), `rect` and `circle` render fixed shapes. The shimmer only animates when the user allows motion; it degrades to static blocks under `prefers-reduced-motion`. Color and radius are theme options with per-instance overrides, because one app routinely needs several: skeletons on a card and on the page background want different tints, and a pill placeholder wants a different corner than the text bars beside it.",
8903
8965
  category: "components",
8904
- version: "11.8.0",
8966
+ version: "11.9.0",
8905
8967
  bindings: {
8906
8968
  angular: {
8907
8969
  importPath: "@uni-design-system/uni-angular",
@@ -9052,7 +9114,7 @@ initialFocus="input"
9052
9114
  summary: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.",
9053
9115
  description: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters. Custom thumbs rather than `<input type=\"range\">`, which the previous version used: one native range input cannot carry two thumbs, marks or a tooltip, and a second component for the range case would mean two keyboard maps to keep in step. The step model and the keyboard map are the cdk's, shared with the numeric fields, so nothing new is learned moving between them. All arithmetic on values runs through the cdk's exact decimal helpers \u2014 stepping `0.1` never yields `0.30000000000000004`. Only pointer *positions* use floats, and they are snapped to the grid before becoming a value.",
9054
9116
  category: "forms",
9055
- version: "11.8.0",
9117
+ version: "11.9.0",
9056
9118
  bindings: {
9057
9119
  angular: {
9058
9120
  importPath: "@uni-design-system/uni-angular",
@@ -9329,7 +9391,7 @@ initialFocus="input"
9329
9391
  summary: "",
9330
9392
  description: "",
9331
9393
  category: "feedback",
9332
- version: "11.8.0",
9394
+ version: "11.9.0",
9333
9395
  bindings: {
9334
9396
  angular: {
9335
9397
  importPath: "@uni-design-system/uni-angular",
@@ -9441,7 +9503,7 @@ initialFocus="input"
9441
9503
  summary: "",
9442
9504
  description: "",
9443
9505
  category: "data",
9444
- version: "11.8.0",
9506
+ version: "11.9.0",
9445
9507
  bindings: {
9446
9508
  angular: {
9447
9509
  importPath: "@uni-design-system/uni-angular",
@@ -9515,7 +9577,7 @@ initialFocus="input"
9515
9577
  summary: "",
9516
9578
  description: "",
9517
9579
  category: "layout",
9518
- version: "11.8.0",
9580
+ version: "11.9.0",
9519
9581
  bindings: {
9520
9582
  angular: {
9521
9583
  importPath: "@uni-design-system/uni-angular",
@@ -9570,7 +9632,7 @@ initialFocus="input"
9570
9632
  summary: 'KPI stat tile: muted label, large value (numbers auto-compact: 48234 \u2192 "48.2K"), an optional delta whose ink is decided by *direction \xD7 whether up is good* (never direction alone \u2014 churn going down is good news), and an optional decorative sparkline.',
9571
9633
  description: 'KPI stat tile: muted label, large value (numbers auto-compact: 48234 \u2192 "48.2K"), an optional delta whose ink is decided by *direction \xD7 whether up is good* (never direction alone \u2014 churn going down is good news), and an optional decorative sparkline. Frame, typography and inks are all `stat` theme tokens.',
9572
9634
  category: "components",
9573
- version: "11.8.0",
9635
+ version: "11.9.0",
9574
9636
  bindings: {
9575
9637
  angular: {
9576
9638
  importPath: "@uni-design-system/uni-angular",
@@ -9688,7 +9750,7 @@ initialFocus="input"
9688
9750
  summary: "",
9689
9751
  description: "",
9690
9752
  category: "primitives",
9691
- version: "11.8.0",
9753
+ version: "11.9.0",
9692
9754
  bindings: {
9693
9755
  angular: {
9694
9756
  importPath: "@uni-design-system/uni-angular",
@@ -9777,7 +9839,7 @@ initialFocus="input"
9777
9839
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
9778
9840
  description: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content. Content is captured in a template and only instantiated while the tab is selected, so inactive panels cost nothing.",
9779
9841
  category: "components",
9780
- version: "11.8.0",
9842
+ version: "11.9.0",
9781
9843
  bindings: {
9782
9844
  angular: {
9783
9845
  importPath: "@uni-design-system/uni-angular",
@@ -9817,7 +9879,7 @@ initialFocus="input"
9817
9879
  summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
9818
9880
  description: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped. Only the selected panel is instantiated. All styling resolves from `tabs` theme option tokens. A tab switch is softened by the `panelMotion` option: the incoming content fades in while the panel animates from the outgoing content's height to its own. The new content is live from the first frame \u2014 nothing waits on the animation.",
9819
9881
  category: "components",
9820
- version: "11.8.0",
9882
+ version: "11.9.0",
9821
9883
  bindings: {
9822
9884
  angular: {
9823
9885
  importPath: "@uni-design-system/uni-angular",
@@ -9905,7 +9967,7 @@ initialFocus="input"
9905
9967
  summary: "Compact chip for categories, states, filters and tokens.",
9906
9968
  description: "Compact chip for categories, states, filters and tokens. Two orthogonal style axes: `variant` picks the colour role and `tone` picks the archetype (soft / solid / outline). Both live in the theme's `tag` entry, so a theme restyles every chip in the app without touching markup. Two state classes ride alongside the tone class for the same reason: `tag-selected` and `tag-interactive` let the theme paint selection and hover beside the colours they belong to, instead of an app swapping `tone` by hand on every chip. Structurally a chip is **body + trailing action as siblings**, never nested buttons: an interactive chip whose body is a `<button>` cannot contain the remove `<button>` (invalid HTML, and the inner control becomes unreachable for keyboard users). Both stay independently operable.",
9907
9969
  category: "data",
9908
- version: "11.8.0",
9970
+ version: "11.9.0",
9909
9971
  bindings: {
9910
9972
  angular: {
9911
9973
  importPath: "@uni-design-system/uni-angular",
@@ -10283,7 +10345,7 @@ initialFocus="input"
10283
10345
  summary: "A row of chips the user picks from: filters, facets, a set of labels.",
10284
10346
  description: "A row of chips the user picks from: filters, facets, a set of labels. The group **renders its own chips** from `items` rather than projecting them. That is what lets it own the things an app was otherwise wiring per chip \u2014 which one is selected, which one holds the tab stop \u2014 since a parent cannot write a projected child's inputs. `uni-tag` is unchanged by this component; `controlTabIndex` was already its hook for a composite that manages focus. Keyboard model is the toolbar pattern: one tab stop for the whole group, and the arrow keys move within it. Twelve filter chips should cost one Tab to pass, not twelve.",
10285
10347
  category: "data",
10286
- version: "11.8.0",
10348
+ version: "11.9.0",
10287
10349
  bindings: {
10288
10350
  angular: {
10289
10351
  importPath: "@uni-design-system/uni-angular",
@@ -10481,7 +10543,7 @@ initialFocus="input"
10481
10543
  summary: "",
10482
10544
  description: "",
10483
10545
  category: "forms",
10484
- version: "11.8.0",
10546
+ version: "11.9.0",
10485
10547
  bindings: {
10486
10548
  angular: {
10487
10549
  importPath: "@uni-design-system/uni-angular",
@@ -10932,7 +10994,7 @@ placeholder="Name or address\u2026"
10932
10994
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
10933
10995
  description: 'The typography primitive, applied as an attribute to any element so semantics stay yours. The attribute value is the typeface: `<h1 uni-text="display-small">`, `<span uni-text="caption">`, dynamic via `[uni-text]="role()"`. With no value, the typeface is inferred from the host element (h1 \u2192 headline-large, p \u2192 body-1-long, \u2026), falling back to `title-small`; the `typeface` input remains as an explicit override. It is a directive, so it stacks with anything else on the element \u2014 a layout attribute (`<div stack-layout uni-text="title-small">`) or a component\'s own host \u2014 rather than colliding with it.',
10934
10996
  category: "primitives",
10935
- version: "11.8.0",
10997
+ version: "11.9.0",
10936
10998
  bindings: {
10937
10999
  angular: {
10938
11000
  importPath: "@uni-design-system/uni-angular",
@@ -11042,7 +11104,7 @@ placeholder="Name or address\u2026"
11042
11104
  summary: "",
11043
11105
  description: "",
11044
11106
  category: "forms",
11045
- version: "11.8.0",
11107
+ version: "11.9.0",
11046
11108
  bindings: {
11047
11109
  angular: {
11048
11110
  importPath: "@uni-design-system/uni-angular",
@@ -11257,7 +11319,7 @@ placeholder="Name or address\u2026"
11257
11319
  summary: "",
11258
11320
  description: "",
11259
11321
  category: "primitives",
11260
- version: "11.8.0",
11322
+ version: "11.9.0",
11261
11323
  bindings: {
11262
11324
  angular: {
11263
11325
  importPath: "@uni-design-system/uni-angular",
@@ -11287,7 +11349,7 @@ placeholder="Name or address\u2026"
11287
11349
  summary: "Drop-in switcher for the themes registered via `UNI_THEMES`: a select over `ThemeService.themeOptions` that applies the choice through `selectTheme` (so it persists across reloads like any other theme selection).",
11288
11350
  description: "Drop-in switcher for the themes registered via `UNI_THEMES`: a select over `ThemeService.themeOptions` that applies the choice through `selectTheme` (so it persists across reloads like any other theme selection).",
11289
11351
  category: "components",
11290
- version: "11.8.0",
11352
+ version: "11.9.0",
11291
11353
  bindings: {
11292
11354
  angular: {
11293
11355
  importPath: "@uni-design-system/uni-angular",
@@ -11345,7 +11407,7 @@ placeholder="Name or address\u2026"
11345
11407
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
11346
11408
  description: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input. Type `3p`, `930` or `15:00`, or pick `3:00 PM` from the list; the form always gets 24-hour `'HH:mm'` (`hour12` affects display only). The list is assistive, not exhaustive: any parseable time commits, unless `slots` pins the choices (a slot picker) \u2014 then a typed time must match one. Unreadable or unavailable text stays in the field, flagged, with a `rejected` event.",
11347
11409
  category: "forms",
11348
- version: "11.8.0",
11410
+ version: "11.9.0",
11349
11411
  bindings: {
11350
11412
  angular: {
11351
11413
  importPath: "@uni-design-system/uni-angular",
@@ -11560,7 +11622,7 @@ placeholder="Name or address\u2026"
11560
11622
  summary: "",
11561
11623
  description: "",
11562
11624
  category: "forms",
11563
- version: "11.8.0",
11625
+ version: "11.9.0",
11564
11626
  bindings: {
11565
11627
  angular: {
11566
11628
  importPath: "@uni-design-system/uni-angular",
@@ -11822,7 +11884,7 @@ placeholder="Name or address\u2026"
11822
11884
  summary: "",
11823
11885
  description: "",
11824
11886
  category: "feedback",
11825
- version: "11.8.0",
11887
+ version: "11.9.0",
11826
11888
  bindings: {
11827
11889
  angular: {
11828
11890
  importPath: "@uni-design-system/uni-angular",
@@ -11910,7 +11972,7 @@ placeholder="Name or address\u2026"
11910
11972
  summary: 'A thin sequencer over one `uni-callout`: steps spotlight their targets, a footer walks Next/Back with dots-or-fraction progress, and `advanceOn` gates a step behind an interaction with its target (auto-advancing for clicks, unlocking Next otherwise \u2014 announced through one `role="status"` region).',
11911
11973
  description: 'A thin sequencer over one `uni-callout`: steps spotlight their targets, a footer walks Next/Back with dots-or-fraction progress, and `advanceOn` gates a step behind an interaction with its target (auto-advancing for clicks, unlocking Next otherwise \u2014 announced through one `role="status"` region). Escape or the close button skips the tour and reports the step. `active` is a two-way model, so a tour is deep-linkable and inspectable; steps whose declared target cannot be resolved are skipped (with a dev warning) in the direction of travel rather than erroring.',
11912
11974
  category: "components",
11913
- version: "11.8.0",
11975
+ version: "11.9.0",
11914
11976
  bindings: {
11915
11977
  angular: {
11916
11978
  importPath: "@uni-design-system/uni-angular",
@@ -12044,7 +12106,7 @@ placeholder="Name or address\u2026"
12044
12106
  summary: "",
12045
12107
  description: "",
12046
12108
  category: "layout",
12047
- version: "11.8.0",
12109
+ version: "11.9.0",
12048
12110
  bindings: {
12049
12111
  angular: {
12050
12112
  importPath: "@uni-design-system/uni-angular",
@@ -17118,6 +17180,30 @@ placeholder="Name or address\u2026"
17118
17180
  DarkTheme: 40
17119
17181
  }
17120
17182
  },
17183
+ {
17184
+ id: "dataTable.behavior.selectionColumnWidth",
17185
+ value: 40,
17186
+ type: "number",
17187
+ kind: "behavioral",
17188
+ target: "component-prop",
17189
+ appliesTo: "dataTable",
17190
+ themeValues: {
17191
+ LightTheme: 40,
17192
+ DarkTheme: 40
17193
+ }
17194
+ },
17195
+ {
17196
+ id: "dataTable.behavior.selectionCheckboxSize",
17197
+ value: "sm",
17198
+ type: "string",
17199
+ kind: "behavioral",
17200
+ target: "component-prop",
17201
+ appliesTo: "dataTable",
17202
+ themeValues: {
17203
+ LightTheme: "sm",
17204
+ DarkTheme: "sm"
17205
+ }
17206
+ },
17121
17207
  {
17122
17208
  id: "notificationBadge.behavior.borderRadius",
17123
17209
  value: "sm",
@@ -18618,7 +18704,9 @@ placeholder="Name or address\u2026"
18618
18704
  rowHoverColor: "primary-container",
18619
18705
  loadingOverlayColor: "scrim",
18620
18706
  loadingSpinnerColor: "primary",
18621
- loadingSpinnerSize: 40
18707
+ loadingSpinnerSize: 40,
18708
+ selectionColumnWidth: 40,
18709
+ selectionCheckboxSize: "sm"
18622
18710
  },
18623
18711
  notificationBadge: {
18624
18712
  borderRadius: "sm",
@@ -19252,7 +19340,9 @@ placeholder="Name or address\u2026"
19252
19340
  rowHoverColor: "primary-container",
19253
19341
  loadingOverlayColor: "scrim",
19254
19342
  loadingSpinnerColor: "primary",
19255
- loadingSpinnerSize: 40
19343
+ loadingSpinnerSize: 40,
19344
+ selectionColumnWidth: 40,
19345
+ selectionCheckboxSize: "sm"
19256
19346
  },
19257
19347
  notificationBadge: {
19258
19348
  borderRadius: "sm",
@@ -19365,6 +19455,18 @@ placeholder="Name or address\u2026"
19365
19455
  {
19366
19456
  package: "@uni-design-system/uni-angular",
19367
19457
  releases: [
19458
+ {
19459
+ version: "11.9.0",
19460
+ entries: [
19461
+ {
19462
+ bump: "minor",
19463
+ title: "`uni-data-table` gains a real selection column and an id-keyed, bindable detail row; the datasources gain a row identity.",
19464
+ body: "- **`rowId` on the datasources** (`new UniRecordDatasource(rows, { rowId: (row) => row.id })`, also a third argument on `UniServerSideDatasource`, and settable afterwards): a stable identity for a row. Without one, rows are compared by reference, which never matches a row rebuilt from a fresh fetch \u2014 a realtime update that replaced the records emptied the selection. With one, `isSelected`, `toggleSelection` and the new `setSelected(rows, selected)` key by it, and so do the table's expanded row and its row tracking.\n- **`useMultiSelect`** is read now (it was declared and wired to nothing): a leading checkbox column over the datasource's own `selections` \u2014 a header box that selects or clears every selectable row on the page, `indeterminate` while only some are, and a box per row. `selectableWhen` keeps rows out of it (a disabled box, skipped by select-all); `selectLabel` and `selectAllLabel` name the boxes; `selectionChange` reports the datasource's selection after a box changed it. A box is its own control: a click on it is never the row's click. Theme options `selectionColumnWidth` (40), `selectionCheckboxSize` (`sm`) and `selectedRowColor` (unset: no tint).\n- **`expanded`**, a two-way model: the expanded row's `rowId`, or its page index when the datasource has none; `null` collapses all. A deep link can open a row before the records arrive, and a sort or re-fetch that reorders them keeps the same record open. **`expandableWhen`** names the rows that have a detail \u2014 the rest take no hover affordance and no `aria-expanded`, and a click on them only emits `rowClick`. **`rowClass`** adds a class per row. Rows with a detail carry `aria-expanded`.\n- `expandedIndex` is now a read-only computed of the open row's page index, **deprecated** in favour of `expanded`; `toggleRow(index)` still works. Removed in 12.0.",
19465
+ commit: "cfddc14"
19466
+ }
19467
+ ],
19468
+ dependencyBumps: []
19469
+ },
19368
19470
  {
19369
19471
  version: "11.8.0",
19370
19472
  entries: [
@@ -20353,6 +20455,18 @@ placeholder="Name or address\u2026"
20353
20455
  {
20354
20456
  package: "@uni-design-system/uni-core",
20355
20457
  releases: [
20458
+ {
20459
+ version: "11.9.0",
20460
+ entries: [
20461
+ {
20462
+ bump: "minor",
20463
+ title: "`uni-data-table` gains a real selection column and an id-keyed, bindable detail row; the datasources gain a row identity.",
20464
+ body: "- **`rowId` on the datasources** (`new UniRecordDatasource(rows, { rowId: (row) => row.id })`, also a third argument on `UniServerSideDatasource`, and settable afterwards): a stable identity for a row. Without one, rows are compared by reference, which never matches a row rebuilt from a fresh fetch \u2014 a realtime update that replaced the records emptied the selection. With one, `isSelected`, `toggleSelection` and the new `setSelected(rows, selected)` key by it, and so do the table's expanded row and its row tracking.\n- **`useMultiSelect`** is read now (it was declared and wired to nothing): a leading checkbox column over the datasource's own `selections` \u2014 a header box that selects or clears every selectable row on the page, `indeterminate` while only some are, and a box per row. `selectableWhen` keeps rows out of it (a disabled box, skipped by select-all); `selectLabel` and `selectAllLabel` name the boxes; `selectionChange` reports the datasource's selection after a box changed it. A box is its own control: a click on it is never the row's click. Theme options `selectionColumnWidth` (40), `selectionCheckboxSize` (`sm`) and `selectedRowColor` (unset: no tint).\n- **`expanded`**, a two-way model: the expanded row's `rowId`, or its page index when the datasource has none; `null` collapses all. A deep link can open a row before the records arrive, and a sort or re-fetch that reorders them keeps the same record open. **`expandableWhen`** names the rows that have a detail \u2014 the rest take no hover affordance and no `aria-expanded`, and a click on them only emits `rowClick`. **`rowClass`** adds a class per row. Rows with a detail carry `aria-expanded`.\n- `expandedIndex` is now a read-only computed of the open row's page index, **deprecated** in favour of `expanded`; `toggleRow(index)` still works. Removed in 12.0.",
20465
+ commit: "cfddc14"
20466
+ }
20467
+ ],
20468
+ dependencyBumps: []
20469
+ },
20356
20470
  {
20357
20471
  version: "11.8.0",
20358
20472
  entries: [
@@ -21066,6 +21180,11 @@ placeholder="Name or address\u2026"
21066
21180
  {
21067
21181
  package: "@uni-design-system/uni-react",
21068
21182
  releases: [
21183
+ {
21184
+ version: "11.9.0",
21185
+ entries: [],
21186
+ dependencyBumps: []
21187
+ },
21069
21188
  {
21070
21189
  version: "11.8.0",
21071
21190
  entries: [],
@@ -21387,6 +21506,11 @@ placeholder="Name or address\u2026"
21387
21506
  {
21388
21507
  package: "@uni-design-system/uni-mcp",
21389
21508
  releases: [
21509
+ {
21510
+ version: "11.9.0",
21511
+ entries: [],
21512
+ dependencyBumps: []
21513
+ },
21390
21514
  {
21391
21515
  version: "11.8.0",
21392
21516
  entries: [],
@@ -21666,7 +21790,7 @@ placeholder="Name or address\u2026"
21666
21790
  summary: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
21667
21791
  description: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
21668
21792
  members: [],
21669
- version: "11.8.0"
21793
+ version: "11.9.0"
21670
21794
  },
21671
21795
  {
21672
21796
  id: "focusable-selector",
@@ -21678,7 +21802,7 @@ placeholder="Name or address\u2026"
21678
21802
  summary: "Selector matching natively focusable elements.",
21679
21803
  description: "Selector matching natively focusable elements. Used to locate the interactive element inside a projected trigger so ARIA attributes land on the element that actually receives focus.",
21680
21804
  members: [],
21681
- version: "11.8.0"
21805
+ version: "11.9.0"
21682
21806
  },
21683
21807
  {
21684
21808
  id: "resolve-focus-target",
@@ -21690,7 +21814,7 @@ placeholder="Name or address\u2026"
21690
21814
  summary: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
21691
21815
  description: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
21692
21816
  members: [],
21693
- version: "11.8.0"
21817
+ version: "11.9.0"
21694
21818
  },
21695
21819
  {
21696
21820
  id: "visually-hidden",
@@ -21702,7 +21826,7 @@ placeholder="Name or address\u2026"
21702
21826
  summary: "Visually hides content while keeping it available to screen readers.",
21703
21827
  description: "Visually hides content while keeping it available to screen readers. Use for text alternatives (e.g. badge counts, icon-only affordances). `fixed`, not `absolute`, and that is load-bearing. An absolutely positioned box resolves its containing block to the nearest *positioned* ancestor \u2014 which, since the controls emitting these spans are `position: static`, is whatever positioned box happens to be above them in the consumer's layout, often several scroll containers up. The span then skips every intervening `overflow: auto` and lands in that distant ancestor's scrollable overflow, turning 1x1 of invisible text into real scrollable distance in a box that never opted into scrolling. A fixed box's containing block is the viewport, so it joins no ancestor's scrollable overflow at all. Caveat: inside a `transform`ed (or `filter`ed/`contain`ed) ancestor a fixed box re-anchors to that ancestor. Harmless here \u2014 the element is 1x1 and clipped to nothing, so where it lands never matters, only what it overflows.",
21704
21828
  members: [],
21705
- version: "11.8.0"
21829
+ version: "11.9.0"
21706
21830
  },
21707
21831
  {
21708
21832
  id: "motion-safe",
@@ -21714,7 +21838,7 @@ placeholder="Name or address\u2026"
21714
21838
  summary: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
21715
21839
  description: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
21716
21840
  members: [],
21717
- version: "11.8.0"
21841
+ version: "11.9.0"
21718
21842
  },
21719
21843
  {
21720
21844
  id: "announcer",
@@ -21739,7 +21863,7 @@ placeholder="Name or address\u2026"
21739
21863
  description: "Announce `text`, even when it repeats what was just announced."
21740
21864
  }
21741
21865
  ],
21742
- version: "11.8.0"
21866
+ version: "11.9.0"
21743
21867
  },
21744
21868
  {
21745
21869
  id: "create-announcer",
@@ -21751,7 +21875,7 @@ placeholder="Name or address\u2026"
21751
21875
  summary: "A polite live region's text, for the running commentary a form control owes a screen reader: commits, clears, refused entries, result counts \u2014 changes a sighted user sees but that are otherwise silent.",
21752
21876
  description: "A polite live region's text, for the running commentary a form control owes a screen reader: commits, clears, refused entries, result counts \u2014 changes a sighted user sees but that are otherwise silent. Extracted because five controls (`uni-combobox`, `uni-tag-input`, `uni-time-input`, `uni-date-input`, `uni-calendar`) carried byte-identical copies, including the repeat trick below \u2014 the kind of subtlety that is quietly dropped when the sixth control hand-rolls its own. Announcing the same text twice must still be heard: assistive tech reads a live region when its content *changes*, so setting an identical string is a no-op and the second \"No match.\" would be silent. A trailing space breaks the equality without changing a word of what is read. Successive repeats alternate between the padded and unpadded form, so nothing accumulates. Deliberately holds no DOM and no styling: the region belongs to the component's own template, where its placement and visually-hidden class are already the component's business.",
21753
21877
  members: [],
21754
- version: "11.8.0"
21878
+ version: "11.9.0"
21755
21879
  },
21756
21880
  {
21757
21881
  id: "uni-date",
@@ -21763,7 +21887,7 @@ placeholder="Name or address\u2026"
21763
21887
  summary: "A calendar date, `'YYYY-MM-DD'`.",
21764
21888
  description: "A calendar date, `'YYYY-MM-DD'`.",
21765
21889
  members: [],
21766
- version: "11.8.0"
21890
+ version: "11.9.0"
21767
21891
  },
21768
21892
  {
21769
21893
  id: "uni-time",
@@ -21775,7 +21899,7 @@ placeholder="Name or address\u2026"
21775
21899
  summary: "A wall-clock time, `'HH:mm'` (24-hour).",
21776
21900
  description: "A wall-clock time, `'HH:mm'` (24-hour). Display format is separate.",
21777
21901
  members: [],
21778
- version: "11.8.0"
21902
+ version: "11.9.0"
21779
21903
  },
21780
21904
  {
21781
21905
  id: "uni-date-time",
@@ -21787,7 +21911,7 @@ placeholder="Name or address\u2026"
21787
21911
  summary: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
21788
21912
  description: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
21789
21913
  members: [],
21790
- version: "11.8.0"
21914
+ version: "11.9.0"
21791
21915
  },
21792
21916
  {
21793
21917
  id: "uni-date-range",
@@ -21812,7 +21936,7 @@ placeholder="Name or address\u2026"
21812
21936
  description: ""
21813
21937
  }
21814
21938
  ],
21815
- version: "11.8.0"
21939
+ version: "11.9.0"
21816
21940
  },
21817
21941
  {
21818
21942
  id: "iso-date",
@@ -21824,7 +21948,7 @@ placeholder="Name or address\u2026"
21824
21948
  summary: "`(2026, 8, 5)` \u2192 `'2026-08-05'`.",
21825
21949
  description: "`(2026, 8, 5)` \u2192 `'2026-08-05'`. Does not validate \u2014 see `isValidDate`.",
21826
21950
  members: [],
21827
- version: "11.8.0"
21951
+ version: "11.9.0"
21828
21952
  },
21829
21953
  {
21830
21954
  id: "is-valid-date",
@@ -21836,7 +21960,7 @@ placeholder="Name or address\u2026"
21836
21960
  summary: "The ISO date when the parts form a real calendar day, else `null`.",
21837
21961
  description: "The ISO date when the parts form a real calendar day, else `null`.",
21838
21962
  members: [],
21839
- version: "11.8.0"
21963
+ version: "11.9.0"
21840
21964
  },
21841
21965
  {
21842
21966
  id: "days-in-month",
@@ -21848,7 +21972,7 @@ placeholder="Name or address\u2026"
21848
21972
  summary: "Days in a month, leap-year aware.",
21849
21973
  description: "Days in a month, leap-year aware.",
21850
21974
  members: [],
21851
- version: "11.8.0"
21975
+ version: "11.9.0"
21852
21976
  },
21853
21977
  {
21854
21978
  id: "add-days",
@@ -21860,7 +21984,7 @@ placeholder="Name or address\u2026"
21860
21984
  summary: "",
21861
21985
  description: "",
21862
21986
  members: [],
21863
- version: "11.8.0"
21987
+ version: "11.9.0"
21864
21988
  },
21865
21989
  {
21866
21990
  id: "add-months",
@@ -21872,7 +21996,7 @@ placeholder="Name or address\u2026"
21872
21996
  summary: "Same day \xB1 n months, clamping the day to the target month's length.",
21873
21997
  description: "Same day \xB1 n months, clamping the day to the target month's length.",
21874
21998
  members: [],
21875
- version: "11.8.0"
21999
+ version: "11.9.0"
21876
22000
  },
21877
22001
  {
21878
22002
  id: "day-of-week",
@@ -21884,7 +22008,7 @@ placeholder="Name or address\u2026"
21884
22008
  summary: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
21885
22009
  description: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
21886
22010
  members: [],
21887
- version: "11.8.0"
22011
+ version: "11.9.0"
21888
22012
  },
21889
22013
  {
21890
22014
  id: "month-of",
@@ -21896,7 +22020,7 @@ placeholder="Name or address\u2026"
21896
22020
  summary: "`'2026-08-20'` \u2192 `'2026-08'`.",
21897
22021
  description: "`'2026-08-20'` \u2192 `'2026-08'`.",
21898
22022
  members: [],
21899
- version: "11.8.0"
22023
+ version: "11.9.0"
21900
22024
  },
21901
22025
  {
21902
22026
  id: "today-iso",
@@ -21908,7 +22032,7 @@ placeholder="Name or address\u2026"
21908
22032
  summary: "Today as a local-wall-clock ISO date (the one place local time matters).",
21909
22033
  description: "Today as a local-wall-clock ISO date (the one place local time matters).",
21910
22034
  members: [],
21911
- version: "11.8.0"
22035
+ version: "11.9.0"
21912
22036
  },
21913
22037
  {
21914
22038
  id: "inclusive-day-count",
@@ -21920,7 +22044,7 @@ placeholder="Name or address\u2026"
21920
22044
  summary: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
21921
22045
  description: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
21922
22046
  members: [],
21923
- version: "11.8.0"
22047
+ version: "11.9.0"
21924
22048
  },
21925
22049
  {
21926
22050
  id: "uni-month-grid-cell",
@@ -21945,7 +22069,7 @@ placeholder="Name or address\u2026"
21945
22069
  description: "True for leading/trailing cells that belong to the adjacent months."
21946
22070
  }
21947
22071
  ],
21948
- version: "11.8.0"
22072
+ version: "11.9.0"
21949
22073
  },
21950
22074
  {
21951
22075
  id: "build-month-grid",
@@ -21957,7 +22081,7 @@ placeholder="Name or address\u2026"
21957
22081
  summary: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday).",
21958
22082
  description: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday). Outside cells are always present so showing or hiding them is a pure render decision.",
21959
22083
  members: [],
21960
- version: "11.8.0"
22084
+ version: "11.9.0"
21961
22085
  },
21962
22086
  {
21963
22087
  id: "format-date",
@@ -21969,7 +22093,7 @@ placeholder="Name or address\u2026"
21969
22093
  summary: "",
21970
22094
  description: "",
21971
22095
  members: [],
21972
- version: "11.8.0"
22096
+ version: "11.9.0"
21973
22097
  },
21974
22098
  {
21975
22099
  id: "format-month-heading",
@@ -21981,7 +22105,7 @@ placeholder="Name or address\u2026"
21981
22105
  summary: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
21982
22106
  description: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
21983
22107
  members: [],
21984
- version: "11.8.0"
22108
+ version: "11.9.0"
21985
22109
  },
21986
22110
  {
21987
22111
  id: "uni-weekday-name",
@@ -22006,7 +22130,7 @@ placeholder="Name or address\u2026"
22006
22130
  description: "Full weekday name, for the columnheader's `abbr`."
22007
22131
  }
22008
22132
  ],
22009
- version: "11.8.0"
22133
+ version: "11.9.0"
22010
22134
  },
22011
22135
  {
22012
22136
  id: "weekday-names",
@@ -22018,7 +22142,7 @@ placeholder="Name or address\u2026"
22018
22142
  summary: "Weekday header labels starting at `weekStart` (0 = Sunday).",
22019
22143
  description: "Weekday header labels starting at `weekStart` (0 = Sunday).",
22020
22144
  members: [],
22021
- version: "11.8.0"
22145
+ version: "11.9.0"
22022
22146
  },
22023
22147
  {
22024
22148
  id: "format-time",
@@ -22030,7 +22154,7 @@ placeholder="Name or address\u2026"
22030
22154
  summary: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
22031
22155
  description: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
22032
22156
  members: [],
22033
- version: "11.8.0"
22157
+ version: "11.9.0"
22034
22158
  },
22035
22159
  {
22036
22160
  id: "locale-week-start",
@@ -22042,7 +22166,7 @@ placeholder="Name or address\u2026"
22042
22166
  summary: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday.",
22043
22167
  description: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday. Falls back to Sunday where `Intl.Locale` week info is unavailable.",
22044
22168
  members: [],
22045
- version: "11.8.0"
22169
+ version: "11.9.0"
22046
22170
  },
22047
22171
  {
22048
22172
  id: "locale-default-hour12",
@@ -22054,7 +22178,7 @@ placeholder="Name or address\u2026"
22054
22178
  summary: "Whether the locale's default clock is 12-hour.",
22055
22179
  description: "Whether the locale's default clock is 12-hour.",
22056
22180
  members: [],
22057
- version: "11.8.0"
22181
+ version: "11.9.0"
22058
22182
  },
22059
22183
  {
22060
22184
  id: "locale-field-order",
@@ -22066,7 +22190,7 @@ placeholder="Name or address\u2026"
22066
22190
  summary: "The locale's numeric-date field order, e.g.",
22067
22191
  description: "The locale's numeric-date field order, e.g. en-US \u2192 month, day, year.",
22068
22192
  members: [],
22069
- version: "11.8.0"
22193
+ version: "11.9.0"
22070
22194
  },
22071
22195
  {
22072
22196
  id: "locale-month-names",
@@ -22078,7 +22202,7 @@ placeholder="Name or address\u2026"
22078
22202
  summary: "Long + short month names \u2192 month number, lowercased, dots stripped.",
22079
22203
  description: "Long + short month names \u2192 month number, lowercased, dots stripped.",
22080
22204
  members: [],
22081
- version: "11.8.0"
22205
+ version: "11.9.0"
22082
22206
  },
22083
22207
  {
22084
22208
  id: "locale-date-placeholder",
@@ -22090,7 +22214,7 @@ placeholder="Name or address\u2026"
22090
22214
  summary: "The locale's digit pattern as a placeholder, e.g.",
22091
22215
  description: "The locale's digit pattern as a placeholder, e.g. `'MM/DD/YYYY'`.",
22092
22216
  members: [],
22093
- version: "11.8.0"
22217
+ version: "11.9.0"
22094
22218
  },
22095
22219
  {
22096
22220
  id: "parse-date-text",
@@ -22102,7 +22226,7 @@ placeholder="Name or address\u2026"
22102
22226
  summary: "Free-typed date text \u2192 ISO date, or `null` when unreadable.",
22103
22227
  description: "Free-typed date text \u2192 ISO date, or `null` when unreadable. Accepts, in order: ISO (`2026-08-20`), a month name from the locale's own long/short lists (`aug 20`, `20 aug 2026`, `August 20th`), and locale-numeric text (`8/20/2026`, `20.8.2026`, `08-20`) with the digit order taken from `Intl.DateTimeFormat(locale).formatToParts()`. A missing year resolves to the next occurrence; two-digit years are refused rather than guessed.",
22104
22228
  members: [],
22105
- version: "11.8.0"
22229
+ version: "11.9.0"
22106
22230
  },
22107
22231
  {
22108
22232
  id: "parse-time-text",
@@ -22114,7 +22238,7 @@ placeholder="Name or address\u2026"
22114
22238
  summary: "Free-typed time text \u2192 `'HH:mm'`, or `null`.",
22115
22239
  description: "Free-typed time text \u2192 `'HH:mm'`, or `null`. Accepts `9`, `930`, `9:30`, `9.30`, `9 30`, `3p`, `3pm`, `3 PM`, `15:00`. Bare hours 1\u20137 with no meridiem lean PM when `hour12` \u2014 typing `3` into an appointment field means 15:00, not 03:00.",
22116
22240
  members: [],
22117
- version: "11.8.0"
22241
+ version: "11.9.0"
22118
22242
  },
22119
22243
  {
22120
22244
  id: "time-slots",
@@ -22126,7 +22250,7 @@ placeholder="Name or address\u2026"
22126
22250
  summary: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
22127
22251
  description: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
22128
22252
  members: [],
22129
- version: "11.8.0"
22253
+ version: "11.9.0"
22130
22254
  },
22131
22255
  {
22132
22256
  id: "split-date-time",
@@ -22138,7 +22262,7 @@ placeholder="Name or address\u2026"
22138
22262
  summary: "",
22139
22263
  description: "",
22140
22264
  members: [],
22141
- version: "11.8.0"
22265
+ version: "11.9.0"
22142
22266
  },
22143
22267
  {
22144
22268
  id: "join-date-time",
@@ -22150,7 +22274,7 @@ placeholder="Name or address\u2026"
22150
22274
  summary: "One combined value only when both parts are present.",
22151
22275
  description: "One combined value only when both parts are present.",
22152
22276
  members: [],
22153
- version: "11.8.0"
22277
+ version: "11.9.0"
22154
22278
  },
22155
22279
  {
22156
22280
  id: "uni-number-range",
@@ -22175,7 +22299,7 @@ placeholder="Name or address\u2026"
22175
22299
  description: ""
22176
22300
  }
22177
22301
  ],
22178
- version: "11.8.0"
22302
+ version: "11.9.0"
22179
22303
  },
22180
22304
  {
22181
22305
  id: "uni-rounding-mode",
@@ -22187,7 +22311,7 @@ placeholder="Name or address\u2026"
22187
22311
  summary: "How a tie is resolved when rounding to a fraction-digit count.",
22188
22312
  description: "How a tie is resolved when rounding to a fraction-digit count. `half-up` is the invoice default (ties away from zero: `1.15` \u2192 `1.2`); `half-even` is banker's rounding, which removes the upward bias across a column of figures (`1.25` \u2192 `1.2`, `1.35` \u2192 `1.4`).",
22189
22313
  members: [],
22190
- version: "11.8.0"
22314
+ version: "11.9.0"
22191
22315
  },
22192
22316
  {
22193
22317
  id: "uni-number-preset",
@@ -22199,7 +22323,7 @@ placeholder="Name or address\u2026"
22199
22323
  summary: "Format archetype.",
22200
22324
  description: "Format archetype. Supplies decimals, grouping, affix and `inputmode`.",
22201
22325
  members: [],
22202
- version: "11.8.0"
22326
+ version: "11.9.0"
22203
22327
  },
22204
22328
  {
22205
22329
  id: "uni-number-grouping",
@@ -22211,7 +22335,7 @@ placeholder="Name or address\u2026"
22211
22335
  summary: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`.",
22212
22336
  description: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`. `min2` \u2014 the default \u2014 groups only from five integer digits, so a year renders `2026` rather than `2,026` while a price still renders `10,000`.",
22213
22337
  members: [],
22214
- version: "11.8.0"
22338
+ version: "11.9.0"
22215
22339
  },
22216
22340
  {
22217
22341
  id: "uni-number-reject-reason",
@@ -22223,7 +22347,7 @@ placeholder="Name or address\u2026"
22223
22347
  summary: "Why a typed commit was refused.",
22224
22348
  description: "Why a typed commit was refused. The raw text stays in the field.",
22225
22349
  members: [],
22226
- version: "11.8.0"
22350
+ version: "11.9.0"
22227
22351
  },
22228
22352
  {
22229
22353
  id: "uni-number-step-config",
@@ -22266,7 +22390,7 @@ placeholder="Name or address\u2026"
22266
22390
  description: "Cycle past a fence instead of stopping at it \u2014 for genuinely cyclic fields only (23 \u2192 0 hours, 359 \u2192 0 degrees). Needs both `min` and `max`."
22267
22391
  }
22268
22392
  ],
22269
- version: "11.8.0"
22393
+ version: "11.9.0"
22270
22394
  },
22271
22395
  {
22272
22396
  id: "uni-number-clamp",
@@ -22291,7 +22415,7 @@ placeholder="Name or address\u2026"
22291
22415
  description: "Which fence was hit, or `null` when the value was already in range."
22292
22416
  }
22293
22417
  ],
22294
- version: "11.8.0"
22418
+ version: "11.9.0"
22295
22419
  },
22296
22420
  {
22297
22421
  id: "uni-locale-number-parts",
@@ -22334,7 +22458,7 @@ placeholder="Name or address\u2026"
22334
22458
  description: "Fraction digits `Intl` uses for the currency \u2014 JPY 0, USD 2."
22335
22459
  }
22336
22460
  ],
22337
- version: "11.8.0"
22461
+ version: "11.9.0"
22338
22462
  },
22339
22463
  {
22340
22464
  id: "uni-number-format-config",
@@ -22419,7 +22543,7 @@ placeholder="Name or address\u2026"
22419
22543
  description: "Spoken long form of an abbreviated suffix, for `aria-valuetext`."
22420
22544
  }
22421
22545
  ],
22422
- version: "11.8.0"
22546
+ version: "11.9.0"
22423
22547
  },
22424
22548
  {
22425
22549
  id: "uni-resolved-number-format",
@@ -22510,7 +22634,7 @@ placeholder="Name or address\u2026"
22510
22634
  description: ""
22511
22635
  }
22512
22636
  ],
22513
- version: "11.8.0"
22637
+ version: "11.9.0"
22514
22638
  },
22515
22639
  {
22516
22640
  id: "uni-number-parse-result",
@@ -22522,7 +22646,7 @@ placeholder="Name or address\u2026"
22522
22646
  summary: "The outcome of reading a user's text.",
22523
22647
  description: "The outcome of reading a user's text. Refused text is never swallowed: the caller keeps it in the field and flags it, so nobody loses their work to a silently emptied box.",
22524
22648
  members: [],
22525
- version: "11.8.0"
22649
+ version: "11.9.0"
22526
22650
  },
22527
22651
  {
22528
22652
  id: "is-canonical-decimal",
@@ -22534,7 +22658,7 @@ placeholder="Name or address\u2026"
22534
22658
  summary: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
22535
22659
  description: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
22536
22660
  members: [],
22537
- version: "11.8.0"
22661
+ version: "11.9.0"
22538
22662
  },
22539
22663
  {
22540
22664
  id: "decimal-scale",
@@ -22546,7 +22670,7 @@ placeholder="Name or address\u2026"
22546
22670
  summary: "Fraction-digit count.",
22547
22671
  description: "Fraction-digit count. `'1.250'` \u2192 3, `'12'` \u2192 0, `'5.'` \u2192 0.",
22548
22672
  members: [],
22549
- version: "11.8.0"
22673
+ version: "11.9.0"
22550
22674
  },
22551
22675
  {
22552
22676
  id: "to-scaled",
@@ -22558,7 +22682,7 @@ placeholder="Name or address\u2026"
22558
22682
  summary: "Canonical decimal \u2192 integer scaled by `10^scale`.",
22559
22683
  description: "Canonical decimal \u2192 integer scaled by `10^scale`. Fraction digits beyond `scale` are truncated, so callers that must not lose them pass a `scale` at least `decimalScale(value)`.",
22560
22684
  members: [],
22561
- version: "11.8.0"
22685
+ version: "11.9.0"
22562
22686
  },
22563
22687
  {
22564
22688
  id: "from-scaled",
@@ -22570,7 +22694,7 @@ placeholder="Name or address\u2026"
22570
22694
  summary: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
22571
22695
  description: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
22572
22696
  members: [],
22573
- version: "11.8.0"
22697
+ version: "11.9.0"
22574
22698
  },
22575
22699
  {
22576
22700
  id: "normalize-decimal",
@@ -22582,7 +22706,7 @@ placeholder="Name or address\u2026"
22582
22706
  summary: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`.",
22583
22707
  description: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`. Requires a canonical decimal; guard with `isCanonicalDecimal`.",
22584
22708
  members: [],
22585
- version: "11.8.0"
22709
+ version: "11.9.0"
22586
22710
  },
22587
22711
  {
22588
22712
  id: "to-decimal",
@@ -22594,7 +22718,7 @@ placeholder="Name or address\u2026"
22594
22718
  summary: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21.",
22595
22719
  description: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21. A `step` of `1e-7` would otherwise reach the arithmetic as the literal text `'1e-7'`. Throws on text that is not numeric at all \u2014 every caller here passes either a `number` input or text already cleared by the parser.",
22596
22720
  members: [],
22597
- version: "11.8.0"
22721
+ version: "11.9.0"
22598
22722
  },
22599
22723
  {
22600
22724
  id: "compare-decimal",
@@ -22606,7 +22730,7 @@ placeholder="Name or address\u2026"
22606
22730
  summary: "`-1` when `a < b`, `1` when `a > b`, `0` when equal.",
22607
22731
  description: "`-1` when `a < b`, `1` when `a > b`, `0` when equal. `'1.50'` equals `'1.5'`.",
22608
22732
  members: [],
22609
- version: "11.8.0"
22733
+ version: "11.9.0"
22610
22734
  },
22611
22735
  {
22612
22736
  id: "round-decimal",
@@ -22618,7 +22742,7 @@ placeholder="Name or address\u2026"
22618
22742
  summary: "Round to `fractionDigits`, breaking ties per `mode`.",
22619
22743
  description: "Round to `fractionDigits`, breaking ties per `mode`. Exact where `Number.prototype.toFixed` is not \u2014 see the file header.",
22620
22744
  members: [],
22621
- version: "11.8.0"
22745
+ version: "11.9.0"
22622
22746
  },
22623
22747
  {
22624
22748
  id: "shift-decimal",
@@ -22630,7 +22754,7 @@ placeholder="Name or address\u2026"
22630
22754
  summary: "Multiply by `10^places`, exactly.",
22631
22755
  description: "Multiply by `10^places`, exactly. Used for the percent preset's fraction \u21C4 display shift (`0.15` \u21C4 `15`) and for deriving a default large step of `step \xD7 10` without touching a float.",
22632
22756
  members: [],
22633
- version: "11.8.0"
22757
+ version: "11.9.0"
22634
22758
  },
22635
22759
  {
22636
22760
  id: "clamp-decimal",
@@ -22642,7 +22766,7 @@ placeholder="Name or address\u2026"
22642
22766
  summary: "Hold a value inside its fences, reporting which one it hit so the caller can announce it.",
22643
22767
  description: "Hold a value inside its fences, reporting which one it hit so the caller can announce it. Clamping belongs on commit, never per keystroke: a `min=10` field that clamps live can never be typed into, because the `1` becomes `10` before the `5` arrives.",
22644
22768
  members: [],
22645
- version: "11.8.0"
22769
+ version: "11.9.0"
22646
22770
  },
22647
22771
  {
22648
22772
  id: "step-decimal",
@@ -22654,7 +22778,7 @@ placeholder="Name or address\u2026"
22654
22778
  summary: "One step from `current`, in `direction` (`1` up, `-1` down).",
22655
22779
  description: "One step from `current`, in `direction` (`1` up, `-1` down). Steps land on the grid `origin + n \xB7 step`, where `origin` is `min` by default. A value that is *off* the grid snaps to the nearest grid point **in the direction of travel** rather than jumping past it: with `min=5, step=10` the grid is 5, 15, 25, and stepping up from 7 gives 15, not 17. Fences stop the value; they never wrap unless `wrap` is set and both bounds are defined. Returns `current` unchanged when `step` is zero.",
22656
22780
  members: [],
22657
- version: "11.8.0"
22781
+ version: "11.9.0"
22658
22782
  },
22659
22783
  {
22660
22784
  id: "locale-number-parts",
@@ -22666,7 +22790,7 @@ placeholder="Name or address\u2026"
22666
22790
  summary: "Locale separators plus, when a currency is given, its symbol, side and fraction digits.",
22667
22791
  description: "Locale separators plus, when a currency is given, its symbol, side and fraction digits. Memoized: constructing an `Intl.NumberFormat` is expensive and a field re-resolves this on every keystroke.",
22668
22792
  members: [],
22669
- version: "11.8.0"
22793
+ version: "11.9.0"
22670
22794
  },
22671
22795
  {
22672
22796
  id: "to-ascii-digits",
@@ -22678,7 +22802,7 @@ placeholder="Name or address\u2026"
22678
22802
  summary: "Map localized digits and Arabic separators to ASCII, so `\u0661\u0662\u0663\u0664\u066B\u0665` parses in `ar` and `\u0967\u0968\u0969\u096A.\u096B` in `hi`.",
22679
22803
  description: "Map localized digits and Arabic separators to ASCII, so `\u0661\u0662\u0663\u0664\u066B\u0665` parses in `ar` and `\u0967\u0968\u0969\u096A.\u096B` in `hi`.",
22680
22804
  members: [],
22681
- version: "11.8.0"
22805
+ version: "11.9.0"
22682
22806
  },
22683
22807
  {
22684
22808
  id: "evaluate-expression",
@@ -22690,7 +22814,7 @@ placeholder="Name or address\u2026"
22690
22814
  summary: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**.",
22691
22815
  description: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**. Returns a canonical decimal, or `null` when the text is not a well-formed expression. Floats are acceptable here in a way they are not elsewhere: this is a convenience path for spreadsheet muscle memory (`12*3`, `100/4+5`), and the result is settled to ten decimals before re-entering exact arithmetic. Division is the only operation that can produce a non-terminating decimal, and no exact representation would help there either.",
22692
22816
  members: [],
22693
- version: "11.8.0"
22817
+ version: "11.9.0"
22694
22818
  },
22695
22819
  {
22696
22820
  id: "resolve-number-format",
@@ -22702,7 +22826,7 @@ placeholder="Name or address\u2026"
22702
22826
  summary: "Fill in every preset, locale and currency default.",
22703
22827
  description: "Fill in every preset, locale and currency default.",
22704
22828
  members: [],
22705
- version: "11.8.0"
22829
+ version: "11.9.0"
22706
22830
  },
22707
22831
  {
22708
22832
  id: "parse-number",
@@ -22714,7 +22838,7 @@ placeholder="Name or address\u2026"
22714
22838
  summary: "Read a user's text into a canonical decimal in **model units**.",
22715
22839
  description: "Read a user's text into a canonical decimal in **model units**. Accepted, in order: canonical/ASCII (always, whatever the locale \u2014 it is what agents and APIs write), locale-grouped, affixed, localized digits, compact (`1.5k`), accounting negatives (`(1,234.56)` \u2192 `-1234.56`), and expressions when `allowExpressions` is set.",
22716
22840
  members: [],
22717
- version: "11.8.0"
22841
+ version: "11.9.0"
22718
22842
  },
22719
22843
  {
22720
22844
  id: "format-number",
@@ -22726,7 +22850,7 @@ placeholder="Name or address\u2026"
22726
22850
  summary: "Canonical decimal (model units) \u2192 the display number, without affixes.",
22727
22851
  description: "Canonical decimal (model units) \u2192 the display number, without affixes. `min2` grouping \u2014 the default \u2014 starts at five integer digits, so a year renders `2026` rather than `2,026` while a price still renders `10,000`.",
22728
22852
  members: [],
22729
- version: "11.8.0"
22853
+ version: "11.9.0"
22730
22854
  },
22731
22855
  {
22732
22856
  id: "raw-number-text",
@@ -22738,7 +22862,7 @@ placeholder="Name or address\u2026"
22738
22862
  summary: "The plain text the field shows while focused: the display number with no grouping and no affixes, so the caret never has to walk over a separator that appears and vanishes mid-word.",
22739
22863
  description: "The plain text the field shows while focused: the display number with no grouping and no affixes, so the caret never has to walk over a separator that appears and vanishes mid-word.",
22740
22864
  members: [],
22741
- version: "11.8.0"
22865
+ version: "11.9.0"
22742
22866
  },
22743
22867
  {
22744
22868
  id: "settle-number",
@@ -22750,7 +22874,7 @@ placeholder="Name or address\u2026"
22750
22874
  summary: "Round a committed value to the field's precision, in model units.",
22751
22875
  description: "Round a committed value to the field's precision, in model units.",
22752
22876
  members: [],
22753
- version: "11.8.0"
22877
+ version: "11.9.0"
22754
22878
  },
22755
22879
  {
22756
22880
  id: "speak-number",
@@ -22762,7 +22886,7 @@ placeholder="Name or address\u2026"
22762
22886
  summary: "The `aria-valuetext` string: the formatted number with its affixes spoken.",
22763
22887
  description: 'The `aria-valuetext` string: the formatted number with its affixes spoken. `aria-valuenow` alone announces "1234.56", which is the one thing about a money field that is not the point. An empty field says "Empty" per APG.',
22764
22888
  members: [],
22765
- version: "11.8.0"
22889
+ version: "11.9.0"
22766
22890
  },
22767
22891
  {
22768
22892
  id: "to-number",
@@ -22774,7 +22898,7 @@ placeholder="Name or address\u2026"
22774
22898
  summary: "Model-units canonical decimal \u2192 the bound `number`.",
22775
22899
  description: "Model-units canonical decimal \u2192 the bound `number`.",
22776
22900
  members: [],
22777
- version: "11.8.0"
22901
+ version: "11.9.0"
22778
22902
  },
22779
22903
  {
22780
22904
  id: "loses-precision",
@@ -22786,7 +22910,7 @@ placeholder="Name or address\u2026"
22786
22910
  summary: "True when a value cannot survive the trip through `number` \u2014 the reason the components also expose an exact `valueAsString` model, and the trigger for the dev-mode warning.",
22787
22911
  description: "True when a value cannot survive the trip through `number` \u2014 the reason the components also expose an exact `valueAsString` model, and the trigger for the dev-mode warning. Silent precision loss is the whole point of that second model, so it is worth saying out loud once. A `number` can only be checked for magnitude, since it has already lost whatever it was going to lose. A canonical string can be checked properly: `'9007199254740993'` comes back as `'9007199254740992'`.",
22788
22912
  members: [],
22789
- version: "11.8.0"
22913
+ version: "11.9.0"
22790
22914
  },
22791
22915
  {
22792
22916
  id: "press-repeat-timing",
@@ -22823,7 +22947,7 @@ placeholder="Name or address\u2026"
22823
22947
  description: ""
22824
22948
  }
22825
22949
  ],
22826
- version: "11.8.0"
22950
+ version: "11.9.0"
22827
22951
  },
22828
22952
  {
22829
22953
  id: "press-repeat-config",
@@ -22872,7 +22996,7 @@ placeholder="Name or address\u2026"
22872
22996
  description: ""
22873
22997
  }
22874
22998
  ],
22875
- version: "11.8.0"
22999
+ version: "11.9.0"
22876
23000
  },
22877
23001
  {
22878
23002
  id: "press-repeat",
@@ -22909,7 +23033,7 @@ placeholder="Name or address\u2026"
22909
23033
  description: "End a hold without firing `onRelease` \u2014 for `Escape` and `pointercancel`."
22910
23034
  }
22911
23035
  ],
22912
- version: "11.8.0"
23036
+ version: "11.9.0"
22913
23037
  },
22914
23038
  {
22915
23039
  id: "create-press-repeat",
@@ -22921,7 +23045,7 @@ placeholder="Name or address\u2026"
22921
23045
  summary: "",
22922
23046
  description: "",
22923
23047
  members: [],
22924
- version: "11.8.0"
23048
+ version: "11.9.0"
22925
23049
  },
22926
23050
  {
22927
23051
  id: "listbox-navigation-config",
@@ -22964,7 +23088,7 @@ placeholder="Name or address\u2026"
22964
23088
  description: "Let Home/End jump to the ends of the list. Default false. In an editable combobox those keys belong to the caret \u2014 APG reserves them for text editing, and a control that steals them makes the text un-navigable while its list is open. Opt in only where focus is *not* in a text field (uni-multi-select-dropdown, whose focus rides the option checkboxes). Nothing is lost by leaving it off: opening with ArrowUp already lands on the last option, ArrowDown on the first, and navigation wraps at both ends."
22965
23089
  }
22966
23090
  ],
22967
- version: "11.8.0"
23091
+ version: "11.9.0"
22968
23092
  },
22969
23093
  {
22970
23094
  id: "listbox-navigation",
@@ -23037,7 +23161,7 @@ placeholder="Name or address\u2026"
23037
23161
  description: "Close when focus leaves the control entirely (not on internal moves)."
23038
23162
  }
23039
23163
  ],
23040
- version: "11.8.0"
23164
+ version: "11.9.0"
23041
23165
  },
23042
23166
  {
23043
23167
  id: "create-listbox-navigation",
@@ -23049,7 +23173,7 @@ placeholder="Name or address\u2026"
23049
23173
  summary: "Factory mirroring the signal-API style used elsewhere in the CDK.",
23050
23174
  description: "Factory mirroring the signal-API style used elsewhere in the CDK.",
23051
23175
  members: [],
23052
- version: "11.8.0"
23176
+ version: "11.9.0"
23053
23177
  },
23054
23178
  {
23055
23179
  id: "placement",
@@ -23061,7 +23185,7 @@ placeholder="Name or address\u2026"
23061
23185
  summary: "Native CSS Anchor Positioning helpers (Baseline 2026).",
23062
23186
  description: "Native CSS Anchor Positioning helpers (Baseline 2026). These replace the former",
23063
23187
  members: [],
23064
- version: "11.8.0"
23188
+ version: "11.9.0"
23065
23189
  },
23066
23190
  {
23067
23191
  id: "anchor-offset",
@@ -23086,7 +23210,7 @@ placeholder="Name or address\u2026"
23086
23210
  description: "Shift along the cross axis, from the aligned edge."
23087
23211
  }
23088
23212
  ],
23089
- version: "11.8.0"
23213
+ version: "11.9.0"
23090
23214
  },
23091
23215
  {
23092
23216
  id: "new-anchor-name",
@@ -23098,7 +23222,7 @@ placeholder="Name or address\u2026"
23098
23222
  summary: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
23099
23223
  description: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
23100
23224
  members: [],
23101
- version: "11.8.0"
23225
+ version: "11.9.0"
23102
23226
  },
23103
23227
  {
23104
23228
  id: "anchor-styles",
@@ -23110,7 +23234,7 @@ placeholder="Name or address\u2026"
23110
23234
  summary: "Emotion style object anchoring a panel to `anchor` at `placement`.",
23111
23235
  description: "Emotion style object anchoring a panel to `anchor` at `placement`. Spread into the panel's `css()` styles. The trigger element must carry `anchor-name: <anchor>` (see `newAnchorName`).",
23112
23236
  members: [],
23113
- version: "11.8.0"
23237
+ version: "11.9.0"
23114
23238
  },
23115
23239
  {
23116
23240
  id: "anchor-arrow-styles",
@@ -23122,7 +23246,7 @@ placeholder="Name or address\u2026"
23122
23246
  summary: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor.",
23123
23247
  description: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor. Static per placement: if the browser flips the panel via position-try, the arrow stays on the configured side (cosmetic-only degradation, matching the flip-support caveat above). `overlap` (default 0 \u2014 cut exactly on the panel edge) extends the kept half into the panel; see for when that is ever wanted.",
23124
23248
  members: [],
23125
- version: "11.8.0"
23249
+ version: "11.9.0"
23126
23250
  },
23127
23251
  {
23128
23252
  id: "spotlight-options",
@@ -23153,7 +23277,7 @@ placeholder="Name or address\u2026"
23153
23277
  description: "Scrim paint; scheme-invariant by convention, like `::backdrop`."
23154
23278
  }
23155
23279
  ],
23156
- version: "11.8.0"
23280
+ version: "11.9.0"
23157
23281
  },
23158
23282
  {
23159
23283
  id: "spotlight-styles",
@@ -23184,7 +23308,7 @@ placeholder="Name or address\u2026"
23184
23308
  description: "Hole-sized click-blocker, shown when the target must not be interactive."
23185
23309
  }
23186
23310
  ],
23187
- version: "11.8.0"
23311
+ version: "11.9.0"
23188
23312
  },
23189
23313
  {
23190
23314
  id: "anchor-rect",
@@ -23233,7 +23357,7 @@ placeholder="Name or address\u2026"
23233
23357
  description: ""
23234
23358
  }
23235
23359
  ],
23236
- version: "11.8.0"
23360
+ version: "11.9.0"
23237
23361
  },
23238
23362
  {
23239
23363
  id: "transform-origin-for",
@@ -23245,7 +23369,7 @@ placeholder="Name or address\u2026"
23245
23369
  summary: "Transform origin for a panel's open/close scale animation, derived from where the panel **actually** rendered relative to its anchor \u2014 not from the requested placement.",
23246
23370
  description: "Transform origin for a panel's open/close scale animation, derived from where the panel **actually** rendered relative to its anchor \u2014 not from the requested placement. `position-try-fallbacks` lets the browser flip a panel at viewport edges, and a statically mapped origin then animates from the wrong corner (a `bottom-end` picker flipped above its field would still scale from `top right`). Measure after the popover is shown and apply the result as an inline style. Returns keyword pairs like `'top right'` / `'bottom center'`, or `null` when the panel has no box yet (e.g. `display: none`, or jsdom).",
23247
23371
  members: [],
23248
- version: "11.8.0"
23372
+ version: "11.9.0"
23249
23373
  },
23250
23374
  {
23251
23375
  id: "transform-origins",
@@ -23257,7 +23381,7 @@ placeholder="Name or address\u2026"
23257
23381
  summary: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
23258
23382
  description: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
23259
23383
  members: [],
23260
- version: "11.8.0"
23384
+ version: "11.9.0"
23261
23385
  },
23262
23386
  {
23263
23387
  id: "set-anchor-name",
@@ -23269,7 +23393,7 @@ placeholder="Name or address\u2026"
23269
23393
  summary: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
23270
23394
  description: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
23271
23395
  members: [],
23272
- version: "11.8.0"
23396
+ version: "11.9.0"
23273
23397
  },
23274
23398
  {
23275
23399
  id: "clear-anchor-name",
@@ -23281,7 +23405,7 @@ placeholder="Name or address\u2026"
23281
23405
  summary: "",
23282
23406
  description: "",
23283
23407
  members: [],
23284
- version: "11.8.0"
23408
+ version: "11.9.0"
23285
23409
  },
23286
23410
  {
23287
23411
  id: "resolve-element",
@@ -23293,7 +23417,7 @@ placeholder="Name or address\u2026"
23293
23417
  summary: "Resolve an element-or-id reference.",
23294
23418
  description: "Resolve an element-or-id reference. Id strings are looked up at call time \u2014 never cache the result across opens, the element may have been re-rendered. `''` and null-ish mean \"unset\" (falsy guard: an empty string is the only typeable empty for a string-typed input).",
23295
23419
  members: [],
23296
- version: "11.8.0"
23420
+ version: "11.9.0"
23297
23421
  },
23298
23422
  {
23299
23423
  id: "is-toggle-open",
@@ -23305,7 +23429,7 @@ placeholder="Name or address\u2026"
23305
23429
  summary: "True when a native `toggle` event reports the overlay opening.",
23306
23430
  description: "True when a native `toggle` event reports the overlay opening.",
23307
23431
  members: [],
23308
- version: "11.8.0"
23432
+ version: "11.9.0"
23309
23433
  },
23310
23434
  {
23311
23435
  id: "discrete-overlay-transition",
@@ -23317,7 +23441,7 @@ placeholder="Name or address\u2026"
23317
23441
  summary: "The discrete-transition block that animates an element into and out of the top layer: `transition-behavior: allow-discrete` over the `hidden` keys plus `display`/`overlay`, the shown state under `:popover-open`, and `@starting-style` so entry transitions run from the hidden state.",
23318
23442
  description: "The discrete-transition block that animates an element into and out of the top layer: `transition-behavior: allow-discrete` over the `hidden` keys plus `display`/`overlay`, the shown state under `:popover-open`, and `@starting-style` so entry transitions run from the hidden state. `display` and `overlay` must ride along or the element cannot animate into and out of the top layer at all \u2014 it would simply appear and vanish. `timingFunction` is omitted from the output when not given, leaving the CSS initial value (`ease`), so callers that never asked for one are unaffected.",
23319
23443
  members: [],
23320
- version: "11.8.0"
23444
+ version: "11.9.0"
23321
23445
  },
23322
23446
  {
23323
23447
  id: "restore-overlay-focus",
@@ -23329,7 +23453,7 @@ placeholder="Name or address\u2026"
23329
23453
  summary: "Returns focus to `target` when an overlay closes while focus was inside its panel (or was dropped on `<body>` by the top layer closing), so keyboard users are never stranded (WCAG 2.4.3).",
23330
23454
  description: "Returns focus to `target` when an overlay closes while focus was inside its panel (or was dropped on `<body>` by the top layer closing), so keyboard users are never stranded (WCAG 2.4.3). Focus resting anywhere else is left alone.",
23331
23455
  members: [],
23332
- version: "11.8.0"
23456
+ version: "11.9.0"
23333
23457
  },
23334
23458
  {
23335
23459
  id: "focusable-elements",
@@ -23341,7 +23465,7 @@ placeholder="Name or address\u2026"
23341
23465
  summary: "The focusable elements inside `root`, in DOM order.",
23342
23466
  description: "The focusable elements inside `root`, in DOM order. Filters disabled controls, and hidden ones where the environment can tell: jsdom reports `offsetParent` as null for every element, so the visibility filter applies only when the document actually lays out (some element has an offsetParent).",
23343
23467
  members: [],
23344
- version: "11.8.0"
23468
+ version: "11.9.0"
23345
23469
  },
23346
23470
  {
23347
23471
  id: "backdrop-dismiss",
@@ -23366,7 +23490,7 @@ placeholder="Name or address\u2026"
23366
23490
  description: "True only when both the press and the click landed on the dialog itself."
23367
23491
  }
23368
23492
  ],
23369
- version: "11.8.0"
23493
+ version: "11.9.0"
23370
23494
  },
23371
23495
  {
23372
23496
  id: "sort-direction",
@@ -23378,7 +23502,38 @@ placeholder="Name or address\u2026"
23378
23502
  summary: "",
23379
23503
  description: "",
23380
23504
  members: [],
23381
- version: "11.8.0"
23505
+ version: "11.9.0"
23506
+ },
23507
+ {
23508
+ id: "row-key",
23509
+ name: "RowKey",
23510
+ kind: "type",
23511
+ module: "datasource",
23512
+ importPath: "@uni-design-system/uni-angular",
23513
+ signature: "type RowKey = string | number",
23514
+ summary: "What `rowId` returns: a stable identity for a row across re-fetches.",
23515
+ description: "What `rowId` returns: a stable identity for a row across re-fetches.",
23516
+ members: [],
23517
+ version: "11.9.0"
23518
+ },
23519
+ {
23520
+ id: "uni-datasource-options",
23521
+ name: "UniDatasourceOptions",
23522
+ kind: "interface",
23523
+ module: "datasource",
23524
+ importPath: "@uni-design-system/uni-angular",
23525
+ signature: "interface UniDatasourceOptions<T>",
23526
+ summary: "Options shared by every datasource.",
23527
+ description: "Options shared by every datasource.",
23528
+ members: [
23529
+ {
23530
+ name: "rowId",
23531
+ kind: "property",
23532
+ signature: "rowId?: (row: T) => RowKey",
23533
+ description: "Stable identity for a row. Unset, rows are compared by reference, which never matches a row rebuilt from a fresh fetch \u2014 a realtime update that replaces the records would empty a selection and move an expanded row. Set it (`(row) => row.id`) and selection, `uni-data-table`'s expanded row and its row tracking all key by it instead."
23534
+ }
23535
+ ],
23536
+ version: "11.9.0"
23382
23537
  },
23383
23538
  {
23384
23539
  id: "sort",
@@ -23403,7 +23558,7 @@ placeholder="Name or address\u2026"
23403
23558
  description: ""
23404
23559
  }
23405
23560
  ],
23406
- version: "11.8.0"
23561
+ version: "11.9.0"
23407
23562
  },
23408
23563
  {
23409
23564
  id: "uni-base-datasource",
@@ -23433,6 +23588,18 @@ placeholder="Name or address\u2026"
23433
23588
  signature: "selections = signal<T[]>([])",
23434
23589
  description: ""
23435
23590
  },
23591
+ {
23592
+ name: "rowId",
23593
+ kind: "property",
23594
+ signature: "rowId?: (row: T) => RowKey",
23595
+ description: "See `UniDatasourceOptions.rowId`. Settable after construction."
23596
+ },
23597
+ {
23598
+ name: "rowKey",
23599
+ kind: "method",
23600
+ signature: "rowKey(row: T): RowKey | T",
23601
+ description: "The row's identity: its `rowId`, or the row itself when there is none."
23602
+ },
23436
23603
  {
23437
23604
  name: "sort",
23438
23605
  kind: "property",
@@ -23517,6 +23684,12 @@ placeholder="Name or address\u2026"
23517
23684
  signature: "toggleSelection(row: T)",
23518
23685
  description: ""
23519
23686
  },
23687
+ {
23688
+ name: "setSelected",
23689
+ kind: "method",
23690
+ signature: "setSelected(rows: T[], selected: boolean)",
23691
+ description: "Select or deselect several rows at once \u2014 a select-all over the rows that may be selected, leaving any others (another page's) as they are. Keyed by `rowId`, so a selected row re-fetched as a new object is replaced rather than duplicated."
23692
+ },
23520
23693
  {
23521
23694
  name: "clearSelections",
23522
23695
  kind: "method",
@@ -23572,7 +23745,7 @@ placeholder="Name or address\u2026"
23572
23745
  description: ""
23573
23746
  }
23574
23747
  ],
23575
- version: "11.8.0"
23748
+ version: "11.9.0"
23576
23749
  },
23577
23750
  {
23578
23751
  id: "page-request",
@@ -23615,7 +23788,7 @@ placeholder="Name or address\u2026"
23615
23788
  description: ""
23616
23789
  }
23617
23790
  ],
23618
- version: "11.8.0"
23791
+ version: "11.9.0"
23619
23792
  },
23620
23793
  {
23621
23794
  id: "page-response",
@@ -23652,7 +23825,7 @@ placeholder="Name or address\u2026"
23652
23825
  description: ""
23653
23826
  }
23654
23827
  ],
23655
- version: "11.8.0"
23828
+ version: "11.9.0"
23656
23829
  },
23657
23830
  {
23658
23831
  id: "data-loader",
@@ -23664,7 +23837,7 @@ placeholder="Name or address\u2026"
23664
23837
  summary: "",
23665
23838
  description: "",
23666
23839
  members: [],
23667
- version: "11.8.0"
23840
+ version: "11.9.0"
23668
23841
  },
23669
23842
  {
23670
23843
  id: "uni-server-side-datasource",
@@ -23803,7 +23976,7 @@ placeholder="Name or address\u2026"
23803
23976
  description: ""
23804
23977
  }
23805
23978
  ],
23806
- version: "11.8.0"
23979
+ version: "11.9.0"
23807
23980
  },
23808
23981
  {
23809
23982
  id: "uni-datasource",
@@ -23815,7 +23988,7 @@ placeholder="Name or address\u2026"
23815
23988
  summary: "",
23816
23989
  description: "",
23817
23990
  members: [],
23818
- version: "11.8.0"
23991
+ version: "11.9.0"
23819
23992
  },
23820
23993
  {
23821
23994
  id: "uni-record-datasource",
@@ -23924,7 +24097,7 @@ placeholder="Name or address\u2026"
23924
24097
  description: ""
23925
24098
  }
23926
24099
  ],
23927
- version: "11.8.0"
24100
+ version: "11.9.0"
23928
24101
  },
23929
24102
  {
23930
24103
  id: "local-storage-service",
@@ -23979,7 +24152,7 @@ placeholder="Name or address\u2026"
23979
24152
  description: ""
23980
24153
  }
23981
24154
  ],
23982
- version: "11.8.0"
24155
+ version: "11.9.0"
23983
24156
  },
23984
24157
  {
23985
24158
  id: "alert",
@@ -24034,7 +24207,7 @@ placeholder="Name or address\u2026"
24034
24207
  description: ""
24035
24208
  }
24036
24209
  ],
24037
- version: "11.8.0"
24210
+ version: "11.9.0"
24038
24211
  },
24039
24212
  {
24040
24213
  id: "snackbar",
@@ -24089,7 +24262,7 @@ placeholder="Name or address\u2026"
24089
24262
  description: ""
24090
24263
  }
24091
24264
  ],
24092
- version: "11.8.0"
24265
+ version: "11.9.0"
24093
24266
  },
24094
24267
  {
24095
24268
  id: "confirmation",
@@ -24138,7 +24311,7 @@ placeholder="Name or address\u2026"
24138
24311
  description: ""
24139
24312
  }
24140
24313
  ],
24141
- version: "11.8.0"
24314
+ version: "11.9.0"
24142
24315
  },
24143
24316
  {
24144
24317
  id: "notification-service",
@@ -24205,7 +24378,7 @@ placeholder="Name or address\u2026"
24205
24378
  description: ""
24206
24379
  }
24207
24380
  ],
24208
- version: "11.8.0"
24381
+ version: "11.9.0"
24209
24382
  },
24210
24383
  {
24211
24384
  id: "option",
@@ -24242,7 +24415,7 @@ placeholder="Name or address\u2026"
24242
24415
  description: "Visible and announced, but not committable; listbox navigation skips it."
24243
24416
  }
24244
24417
  ],
24245
- version: "11.8.0"
24418
+ version: "11.9.0"
24246
24419
  },
24247
24420
  {
24248
24421
  id: "options",
@@ -24254,7 +24427,7 @@ placeholder="Name or address\u2026"
24254
24427
  summary: "",
24255
24428
  description: "",
24256
24429
  members: [],
24257
- version: "11.8.0"
24430
+ version: "11.9.0"
24258
24431
  },
24259
24432
  {
24260
24433
  id: "use-timer",
@@ -24266,7 +24439,7 @@ placeholder="Name or address\u2026"
24266
24439
  summary: "",
24267
24440
  description: "",
24268
24441
  members: [],
24269
- version: "11.8.0"
24442
+ version: "11.9.0"
24270
24443
  },
24271
24444
  {
24272
24445
  id: "acceptable-file",
@@ -24278,7 +24451,7 @@ placeholder="Name or address\u2026"
24278
24451
  summary: "",
24279
24452
  description: "",
24280
24453
  members: [],
24281
- version: "11.8.0"
24454
+ version: "11.9.0"
24282
24455
  },
24283
24456
  {
24284
24457
  id: "get-file-extension",
@@ -24290,7 +24463,7 @@ placeholder="Name or address\u2026"
24290
24463
  summary: "",
24291
24464
  description: "",
24292
24465
  members: [],
24293
- version: "11.8.0"
24466
+ version: "11.9.0"
24294
24467
  },
24295
24468
  {
24296
24469
  id: "query-permission",
@@ -24302,7 +24475,7 @@ placeholder="Name or address\u2026"
24302
24475
  summary: "The current state of a browser permission.",
24303
24476
  description: 'The current state of a browser permission. Resolves `unsupported` \u2014 never rejects \u2014 where the Permissions API is missing or does not know the name, which is the norm rather than the exception: Firefox and Safari reject `clipboard-write`, for one. Treat `unsupported` as "can\'t tell", not "no".',
24304
24477
  members: [],
24305
- version: "11.8.0"
24478
+ version: "11.9.0"
24306
24479
  },
24307
24480
  {
24308
24481
  id: "permission-service",
@@ -24327,7 +24500,7 @@ placeholder="Name or address\u2026"
24327
24500
  description: ""
24328
24501
  }
24329
24502
  ],
24330
- version: "11.8.0"
24503
+ version: "11.9.0"
24331
24504
  },
24332
24505
  {
24333
24506
  id: "permission",
@@ -24339,7 +24512,7 @@ placeholder="Name or address\u2026"
24339
24512
  summary: "",
24340
24513
  description: "",
24341
24514
  members: [],
24342
- version: "11.8.0"
24515
+ version: "11.9.0"
24343
24516
  },
24344
24517
  {
24345
24518
  id: "permission-state",
@@ -24351,7 +24524,7 @@ placeholder="Name or address\u2026"
24351
24524
  summary: "",
24352
24525
  description: "",
24353
24526
  members: [],
24354
- version: "11.8.0"
24527
+ version: "11.9.0"
24355
24528
  },
24356
24529
  {
24357
24530
  id: "clipboard-copy-result",
@@ -24363,7 +24536,7 @@ placeholder="Name or address\u2026"
24363
24536
  summary: "How a copy ended: - `copied` \u2014 the content is on the clipboard.",
24364
24537
  description: "How a copy ended: - `copied` \u2014 the content is on the clipboard. - `denied` \u2014 the user or a policy has blocked clipboard access for this site; only a change in the browser's site settings will fix it. - `unsupported` \u2014 no Clipboard API here (an insecure context, a server render, an old browser) or the browser cannot write one of the types. - `failed` \u2014 the browser refused this attempt for another reason, most often a call made outside a user gesture or from an unfocused document.",
24365
24538
  members: [],
24366
- version: "11.8.0"
24539
+ version: "11.9.0"
24367
24540
  },
24368
24541
  {
24369
24542
  id: "clipboard-data",
@@ -24375,7 +24548,7 @@ placeholder="Name or address\u2026"
24375
24548
  summary: "One clipboard representation; a promise lets the data arrive after the gesture.",
24376
24549
  description: "One clipboard representation; a promise lets the data arrive after the gesture.",
24377
24550
  members: [],
24378
- version: "11.8.0"
24551
+ version: "11.9.0"
24379
24552
  },
24380
24553
  {
24381
24554
  id: "clipboard-content",
@@ -24387,7 +24560,7 @@ placeholder="Name or address\u2026"
24387
24560
  summary: "What to copy: a plain string, or one item in several representations keyed by MIME type \u2014 `{ 'text/plain': \u2026, 'text/html': \u2026 }`, `{ 'image/png': blob }`.",
24388
24561
  description: "What to copy: a plain string, or one item in several representations keyed by MIME type \u2014 `{ 'text/plain': \u2026, 'text/html': \u2026 }`, `{ 'image/png': blob }`.",
24389
24562
  members: [],
24390
- version: "11.8.0"
24563
+ version: "11.9.0"
24391
24564
  },
24392
24565
  {
24393
24566
  id: "copy-to-clipboard",
@@ -24399,14 +24572,14 @@ placeholder="Name or address\u2026"
24399
24572
  summary: "Copies text or rich content with the Async Clipboard API.",
24400
24573
  description: "Copies text or rich content with the Async Clipboard API. Never rejects: the result says what happened, so a caller can tell the user why. Call it directly from the click or key handler. The write starts synchronously, before anything is awaited, because browsers only honor it inside the user gesture \u2014 which is also why the `clipboard-write` permission is consulted after a refusal, to explain it, rather than before the attempt. For content that has to be fetched or rendered first, pass a promise as the value instead of awaiting it yourself.",
24401
24574
  members: [],
24402
- version: "11.8.0"
24575
+ version: "11.9.0"
24403
24576
  }
24404
24577
  ],
24405
24578
  utilityDocs: [
24406
24579
  {
24407
24580
  module: "datasource",
24408
24581
  title: "Datasource",
24409
- markdown: "# Datasource\n\nThe Datasource system provides a flexible and reactive way to manage data collections in Angular applications. It supports both client-side and server-side data operations with a unified API.\n\n## Architecture\n\nThe datasource system consists of three main classes:\n\n- **`UniBaseDatasource<T>`**: Abstract base class defining the common interface\n- **`UniRecordDatasource<T>`**: Client-side datasource for in-memory data operations\n- **`UniServerSideDatasource<T>`**: Server-side datasource using Angular's resource signal\n\n## Features\n\n- **Reactive State Management**: Built with Angular signals for efficient reactivity\n- **Unified API**: Both client-side and server-side datasources implement the same interface\n- **Sorting**: Sort data by any column in ascending or descending order\n- **Filtering**: Apply filters with appropriate handling for client vs server-side\n- **Pagination**: Navigate through data with built-in pagination controls\n- **Selection**: Track and manage selected items\n- **Loading States**: Server-side datasource provides loading and error states\n\n## Client-Side Datasource\n\nFor in-memory data operations, use `UniRecordDatasource`:\n\n```typescript\nimport { UniRecordDatasource } from '@uni-design-system/uni-angular';\n\ninterface User {\n id: number;\n name: string;\n email: string;\n age: number;\n}\n\n@Component({...})\nclass ClientSideComponent {\n // Static data for client-side operations\n users: User[] = [\n { id: 1, name: 'John Doe', email: 'john@example.com', age: 30 },\n { id: 2, name: 'Jane Smith', email: 'jane@example.com', age: 25 },\n // more users...\n ];\n\n datasource = new UniRecordDatasource<User>(this.users);\n\n constructor() {\n // Set page size for pagination\n this.datasource.setPageSize(10);\n\n // Apply a filter function (client-side filtering)\n this.datasource.setFilter(user => user.age > 18);\n\n // Sort by a column\n this.datasource.sortRecords({\n column: 'name',\n direction: 'asc'\n });\n }\n\n // Handle row selection\n onRowClick(user: User) {\n this.datasource.toggleSelection(user);\n }\n\n // Navigate to next page\n nextPage() {\n this.datasource.nextPage();\n }\n}\n```\n\n## Server-Side Datasource\n\nFor server-side operations with automatic loading states, use `UniServerSideDatasource`:\n\n```typescript\nimport { UniServerSideDatasource, PageRequest, PageResponse } from '@uni-design-system/uni-angular';\n\n@Component({...})\nclass ServerSideComponent {\n datasource = new UniServerSideDatasource<User>(\n // Data loader function\n async (request: PageRequest): Promise<PageResponse<User>> => {\n const response = await this.userService.getUsers({\n page: request.pageNumber,\n size: request.pageSize,\n sort: request.sortColumn,\n order: request.sortDirection,\n filter: request.filter\n });\n\n return {\n data: response.users,\n totalRecords: response.total,\n pageNumber: request.pageNumber,\n pageSize: request.pageSize\n };\n },\n 10 // initial page size\n );\n\n constructor() {\n // Apply server-side filter (sends filter object to server)\n this.datasource.setFilter({ department: 'Engineering', active: true });\n\n // Sort by a column (triggers server request)\n this.datasource.sortRecords({\n column: 'name',\n direction: 'asc'\n });\n }\n\n // Access loading and error states\n get isLoading() {\n return this.datasource.isLoading();\n }\n\n get hasError() {\n return this.datasource.hasError();\n }\n\n // Refresh data from server\n refreshData() {\n this.datasource.refresh();\n }\n}\n```\n\n## API Reference\n\n### Common Properties (Both Datasources)\n\n- `records`: Signal containing the current page's filtered and sorted records\n- `recordCount`: Signal with the count of filtered records\n- `selections`: Signal containing currently selected items\n- `sort`: Signal containing the current sort configuration\n- `sortColumn`: Computed signal with the current sort column\n- `sortDirection`: Computed signal with the current sort direction\n- `pageIndex`: Signal with the current page index (zero-based)\n- `pageSize`: Signal with the number of items per page\n- `pageCount`: Signal with the total number of pages\n- `pages`: Signal with array of page numbers for pagination UI\n- `truncatedPages`: Signal with truncated page numbers (includes ellipsis)\n- `disablePrevious`: Signal indicating if previous button should be disabled\n- `disableNext`: Signal indicating if next button should be disabled\n\n### Common Methods (Both Datasources)\n\n- `isSelected(row)`: Checks if a row is selected\n- `toggleSelection(row)`: Toggles selection state of a row\n- `clearSelections()`: Clears all selections\n- `selectAll()`: Selects all records on current page\n- `sortRecords(sort)`: Sets the sort configuration\n- `firstPage()`, `nextPage()`, `previousPage()`, `lastPage()`: Navigation methods\n- `jumpToPage(page)`: Jumps to a specific page\n- `setPageSize(size)`: Sets the page size and resets to first page\n\n### Record Datasource Specific\n\n**Properties:**\n\n- `initialRecords`: Signal containing the original unfiltered data\n- `filter`: Signal containing the current filter function\n\n**Methods:**\n\n- `setFilter(predicate: (item: T) => boolean)`: Sets a filter function for client-side filtering\n- `clearFilter()`: Clears the current filter (shows all records)\n\n### Server-Side Datasource Specific\n\n**Properties:**\n\n- `isLoading`: Signal indicating if data is currently being loaded\n- `error`: Signal containing any loading errors\n- `hasError`: Signal indicating if there's an error state\n\n**Methods:**\n\n- `setFilter(filterObj: Record<string, any>)`: Sets filter parameters sent to server\n- `clearFilter()`: Clears all filter parameters\n- `refresh()`: Manually triggers a data reload from server\n- `getPageRequest()`: Returns the current page request parameters\n\n### Types\n\n```typescript\ninterface PageRequest {\n pageNumber: number;\n pageSize: number;\n sortColumn?: string;\n sortDirection?: SortDirection;\n filter?: Record<string, any>;\n}\n\ninterface PageResponse<T> {\n data: T[];\n totalRecords: number;\n pageNumber: number;\n pageSize: number;\n}\n\ntype DataLoader<T> = (request: PageRequest) => Promise<PageResponse<T>>;\n\ntype SortDirection = 'asc' | 'desc' | 'indet';\n\ninterface Sort<T> {\n column?: keyof T;\n direction: SortDirection;\n}\n```\n\n## Examples\n\n_Live demo on the Storybook page._"
24582
+ markdown: "# Datasource\n\nThe Datasource system provides a flexible and reactive way to manage data collections in Angular applications. It supports both client-side and server-side data operations with a unified API.\n\n## Architecture\n\nThe datasource system consists of three main classes:\n\n- **`UniBaseDatasource<T>`**: Abstract base class defining the common interface\n- **`UniRecordDatasource<T>`**: Client-side datasource for in-memory data operations\n- **`UniServerSideDatasource<T>`**: Server-side datasource using Angular's resource signal\n\n## Features\n\n- **Reactive State Management**: Built with Angular signals for efficient reactivity\n- **Unified API**: Both client-side and server-side datasources implement the same interface\n- **Sorting**: Sort data by any column in ascending or descending order\n- **Filtering**: Apply filters with appropriate handling for client vs server-side\n- **Pagination**: Navigate through data with built-in pagination controls\n- **Selection**: Track and manage selected items\n- **Loading States**: Server-side datasource provides loading and error states\n\n## Client-Side Datasource\n\nFor in-memory data operations, use `UniRecordDatasource`:\n\n```typescript\nimport { UniRecordDatasource } from '@uni-design-system/uni-angular';\n\ninterface User {\n id: number;\n name: string;\n email: string;\n age: number;\n}\n\n@Component({...})\nclass ClientSideComponent {\n // Static data for client-side operations\n users: User[] = [\n { id: 1, name: 'John Doe', email: 'john@example.com', age: 30 },\n { id: 2, name: 'Jane Smith', email: 'jane@example.com', age: 25 },\n // more users...\n ];\n\n datasource = new UniRecordDatasource<User>(this.users);\n\n constructor() {\n // Set page size for pagination\n this.datasource.setPageSize(10);\n\n // Apply a filter function (client-side filtering)\n this.datasource.setFilter(user => user.age > 18);\n\n // Sort by a column\n this.datasource.sortRecords({\n column: 'name',\n direction: 'asc'\n });\n }\n\n // Handle row selection\n onRowClick(user: User) {\n this.datasource.toggleSelection(user);\n }\n\n // Navigate to next page\n nextPage() {\n this.datasource.nextPage();\n }\n}\n```\n\n## Server-Side Datasource\n\nFor server-side operations with automatic loading states, use `UniServerSideDatasource`:\n\n```typescript\nimport { UniServerSideDatasource, PageRequest, PageResponse } from '@uni-design-system/uni-angular';\n\n@Component({...})\nclass ServerSideComponent {\n datasource = new UniServerSideDatasource<User>(\n // Data loader function\n async (request: PageRequest): Promise<PageResponse<User>> => {\n const response = await this.userService.getUsers({\n page: request.pageNumber,\n size: request.pageSize,\n sort: request.sortColumn,\n order: request.sortDirection,\n filter: request.filter\n });\n\n return {\n data: response.users,\n totalRecords: response.total,\n pageNumber: request.pageNumber,\n pageSize: request.pageSize\n };\n },\n 10 // initial page size\n );\n\n constructor() {\n // Apply server-side filter (sends filter object to server)\n this.datasource.setFilter({ department: 'Engineering', active: true });\n\n // Sort by a column (triggers server request)\n this.datasource.sortRecords({\n column: 'name',\n direction: 'asc'\n });\n }\n\n // Access loading and error states\n get isLoading() {\n return this.datasource.isLoading();\n }\n\n get hasError() {\n return this.datasource.hasError();\n }\n\n // Refresh data from server\n refreshData() {\n this.datasource.refresh();\n }\n}\n```\n\n## API Reference\n\n### Common Properties (Both Datasources)\n\n- `records`: Signal containing the current page's filtered and sorted records\n- `recordCount`: Signal with the count of filtered records\n- `selections`: Signal containing currently selected items\n- `sort`: Signal containing the current sort configuration\n- `sortColumn`: Computed signal with the current sort column\n- `sortDirection`: Computed signal with the current sort direction\n- `pageIndex`: Signal with the current page index (zero-based)\n- `pageSize`: Signal with the number of items per page\n- `pageCount`: Signal with the total number of pages\n- `pages`: Signal with array of page numbers for pagination UI\n- `truncatedPages`: Signal with truncated page numbers (includes ellipsis)\n- `disablePrevious`: Signal indicating if previous button should be disabled\n- `disableNext`: Signal indicating if next button should be disabled\n\n### Row identity\n\nBoth constructors take an options object with `rowId`, a function returning a\nstable key for a row (`{ rowId: (row) => row.id }`); it is also settable\nafterwards (`datasource.rowId = \u2026`). Without one, rows are compared by\nreference \u2014 which never matches a row rebuilt from a fresh fetch, so a\nrealtime update that replaced the records would empty the selection. With\none, `isSelected`, `toggleSelection` and `setSelected` key by it, and so do\n`uni-data-table`'s expanded row and its row tracking.\n\n### Common Methods (Both Datasources)\n\n- `isSelected(row)`: Checks if a row is selected (by `rowId` when set)\n- `toggleSelection(row)`: Toggles selection state of a row\n- `setSelected(rows, selected)`: Selects or deselects several rows, leaving the rest as they are\n- `clearSelections()`: Clears all selections\n- `selectAll()`: Selects all records on current page\n- `sortRecords(sort)`: Sets the sort configuration\n- `firstPage()`, `nextPage()`, `previousPage()`, `lastPage()`: Navigation methods\n- `jumpToPage(page)`: Jumps to a specific page\n- `setPageSize(size)`: Sets the page size and resets to first page\n\n### Record Datasource Specific\n\n**Properties:**\n\n- `initialRecords`: Signal containing the original unfiltered data\n- `filter`: Signal containing the current filter function\n\n**Methods:**\n\n- `setFilter(predicate: (item: T) => boolean)`: Sets a filter function for client-side filtering\n- `clearFilter()`: Clears the current filter (shows all records)\n\n### Server-Side Datasource Specific\n\n**Properties:**\n\n- `isLoading`: Signal indicating if data is currently being loaded\n- `error`: Signal containing any loading errors\n- `hasError`: Signal indicating if there's an error state\n\n**Methods:**\n\n- `setFilter(filterObj: Record<string, any>)`: Sets filter parameters sent to server\n- `clearFilter()`: Clears all filter parameters\n- `refresh()`: Manually triggers a data reload from server\n- `getPageRequest()`: Returns the current page request parameters\n\n### Types\n\n```typescript\ninterface PageRequest {\n pageNumber: number;\n pageSize: number;\n sortColumn?: string;\n sortDirection?: SortDirection;\n filter?: Record<string, any>;\n}\n\ninterface PageResponse<T> {\n data: T[];\n totalRecords: number;\n pageNumber: number;\n pageSize: number;\n}\n\ntype DataLoader<T> = (request: PageRequest) => Promise<PageResponse<T>>;\n\ntype SortDirection = 'asc' | 'desc' | 'indet';\n\ninterface Sort<T> {\n column?: keyof T;\n direction: SortDirection;\n}\n```\n\n## Examples\n\n_Live demo on the Storybook page._"
24410
24583
  },
24411
24584
  {
24412
24585
  module: "local-storage",
@@ -26473,7 +26646,10 @@ var buildComponents = (c) => ({
26473
26646
  rowHoverColor: "primary-container",
26474
26647
  loadingOverlayColor: "scrim",
26475
26648
  loadingSpinnerColor: "primary",
26476
- loadingSpinnerSize: 40
26649
+ loadingSpinnerSize: 40,
26650
+ selectionColumnWidth: 40,
26651
+ selectionCheckboxSize: "sm",
26652
+ selectedRowColor: void 0
26477
26653
  } },
26478
26654
  notificationBadge: {
26479
26655
  options: {
@@ -28041,4 +28217,4 @@ export {
28041
28217
  buildStoredTheme,
28042
28218
  createUniServer
28043
28219
  };
28044
- //# sourceMappingURL=chunk-R4RLYWUY.js.map
28220
+ //# sourceMappingURL=chunk-5CI6QESE.js.map