@uni-design-system/uni-mcp 11.8.0 → 11.10.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.10.0",
11
+ builtAt: "2026-10-22T16:40:50.352Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
- components: 89,
17
- tokens: 512,
16
+ components: 90,
17
+ tokens: 518,
18
18
  themes: 2,
19
- examples: 261,
20
- utilities: 122
19
+ examples: 265,
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.10.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.10.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.10.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.10.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.10.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.10.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.10.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.10.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.10.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.10.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.10.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.10.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.10.0",
1475
1475
  bindings: {
1476
1476
  angular: {
1477
1477
  importPath: "@uni-design-system/uni-angular",
@@ -1688,15 +1688,53 @@ var uni_index_default = {
1688
1688
  id: "card",
1689
1689
  name: "Card",
1690
1690
  status: "stable",
1691
- summary: "",
1692
- description: "",
1691
+ summary: "Content container with a themed frame \u2014 and, when asked, a state.",
1692
+ description: "Content container with a themed frame \u2014 and, when asked, a state. `selected` and `interactive` add the `card-selected` and `card-interactive` classes to the frame, which the theme paints (the same contract `uni-tag` has had since 11.1): `selectedBorder`, `selectedColor`, `selectedElevation` and `hoverColor` cover the common case, and a variant's `&.card-selected` rule reaches it for anything else. Inside a `uni-card-group`, a card with a `value` is one of the group's options: a `role=\"radio\"` whose selection and tab stop the group drives. The frame is an Emotion class, not an inline style, because an inline style outranks every class and so no theme rule could ever express a state.",
1693
1693
  category: "layout",
1694
- version: "11.8.0",
1694
+ version: "11.10.0",
1695
1695
  bindings: {
1696
1696
  angular: {
1697
1697
  importPath: "@uni-design-system/uni-angular",
1698
1698
  selectorOrTag: "uni-card",
1699
1699
  api: [
1700
+ {
1701
+ name: "selected",
1702
+ kind: "input",
1703
+ type: "boolean | undefined",
1704
+ required: false,
1705
+ default: "undefined",
1706
+ description: "Paint the selected state. Inside a group it is derived from the group's value and this input is ignored."
1707
+ },
1708
+ {
1709
+ name: "interactive",
1710
+ kind: "input",
1711
+ type: "unknown",
1712
+ required: false,
1713
+ default: "false, { transform: booleanAttribute }",
1714
+ description: "A card the user acts on: a pointer cursor, the theme's hover wash, and `activated` on click, Space or Enter. Always on for an option in a group."
1715
+ },
1716
+ {
1717
+ name: "value",
1718
+ kind: "input",
1719
+ type: "T",
1720
+ required: false,
1721
+ description: "What this card stands for inside a `uni-card-group`."
1722
+ },
1723
+ {
1724
+ name: "disabled",
1725
+ kind: "input",
1726
+ type: "unknown",
1727
+ required: false,
1728
+ default: "false, { transform: booleanAttribute }",
1729
+ description: ""
1730
+ },
1731
+ {
1732
+ name: "activated",
1733
+ kind: "output",
1734
+ type: "void",
1735
+ required: false,
1736
+ description: "An interactive card was clicked or activated from the keyboard."
1737
+ },
1700
1738
  {
1701
1739
  name: "variant",
1702
1740
  kind: "input",
@@ -1734,16 +1772,46 @@ var uni_index_default = {
1734
1772
  ngContent: 'Card content.',
1735
1773
  }
1736
1774
  -->`
1775
+ },
1776
+ {
1777
+ title: "States",
1778
+ framework: "angular",
1779
+ code: '<!-- Storybook story: States -->\n<div stack-layout gap="md" [maxWidth]="320">\n<uni-card [interactive]="true" [selected]="picked" (activated)="picked = !picked">\n <uni-card-content>\n <span uni-text="title-small" display="block">Click to pick</span>\n <span uni-text="body-2-long">Selected: {{ picked }}</span>\n </uni-card-content>\n</uni-card>\n<uni-card [selected]="true">\n <uni-card-content><span uni-text="title-small">Always selected</span></uni-card-content>\n</uni-card>\n</div>'
1780
+ },
1781
+ {
1782
+ title: "Pick One",
1783
+ framework: "angular",
1784
+ code: `<!-- Storybook story: Pick One -->
1785
+ <h3 id="kind-heading" uni-text="title-small">Kind of work</h3>
1786
+ <uni-card-group ariaLabelledBy="kind-heading" [(value)]="kind">
1787
+ @for (option of kinds; track option.value) {
1788
+ <uni-card [value]="option.value" [disabled]="option.disabled ?? false">
1789
+ <div box-layout padding="md">
1790
+ <span uni-text="title-small" display="block">{{ option.title }}</span>
1791
+ <span uni-text="body-2-long" color="on-surface-variant">{{ option.blurb }}</span>
1792
+ </div>
1793
+ </uni-card>
1794
+ }
1795
+ </uni-card-group>
1796
+ <p uni-text="body-2">Value: {{ kind ?? 'none' }}</p>`
1737
1797
  }
1738
1798
  ],
1739
1799
  guidelines: {
1740
1800
  whenToUse: "Content container with a themed frame: the border resolves from the **border\nprimitive named by its variant** (`borders.primary` \u2026 `borders.success`), the corner\nradius from the `card` theme options, and an optional elevation shadow. Compose with\nCard Header and Card Content for the standard anatomy \u2014 or point `options.border` at\na custom primitive to restyle every card in the theme at once.",
1741
1801
  dos: [],
1742
1802
  donts: [],
1743
- accessibility: []
1803
+ accessibility: [
1804
+ "A plain card is content: no role, no tab stop.",
1805
+ 'An option in a group is `role="radio"` with `aria-checked`; the group is `role="radiogroup"`, named by `ariaLabel` or `ariaLabelledBy`, with `aria-required` and an `aria-invalid` gated on touched or dirty.',
1806
+ "One tab stop for the group; the arrow keys both move and select (the APG radio group), so a selection is never a two-step.",
1807
+ "A disabled card is `aria-disabled`, skipped by the arrows and never selected.",
1808
+ "The group is touched once focus leaves it, not while it moves within."
1809
+ ]
1744
1810
  },
1745
1811
  relatedTokens: [
1746
- "card.behavior.borderRadius"
1812
+ "card.behavior.borderRadius",
1813
+ "card.behavior.selectedBorder",
1814
+ "card.behavior.selectedColor"
1747
1815
  ]
1748
1816
  },
1749
1817
  {
@@ -1753,7 +1821,7 @@ var uni_index_default = {
1753
1821
  summary: "",
1754
1822
  description: "",
1755
1823
  category: "layout",
1756
- version: "11.8.0",
1824
+ version: "11.10.0",
1757
1825
  bindings: {
1758
1826
  angular: {
1759
1827
  importPath: "@uni-design-system/uni-angular",
@@ -1787,6 +1855,144 @@ var uni_index_default = {
1787
1855
  },
1788
1856
  relatedTokens: []
1789
1857
  },
1858
+ {
1859
+ id: "card-group",
1860
+ name: "CardGroup",
1861
+ status: "stable",
1862
+ summary: "Pick-one group of cards: a grid of `uni-card`s with radio semantics.",
1863
+ description: "Pick-one group of cards: a grid of `uni-card`s with radio semantics. The cards are projected, not rendered: a card's content is the point of a card, and a group that rendered its own would need a slot for every line. Each projected `uni-card` with a `value` registers as an option; the group owns which one is selected and which one holds the tab stop, and the card draws both. Keyboard model is the APG radio group: one tab stop for the group, the arrow keys move focus *and* select (wrapping at the ends), Home and End go to the first and last enabled card, Space or Enter selects the focused one. `FormValueControl<T | null>`, so `[formField]` binds it like every other control; `touched` is set when focus leaves the group.",
1864
+ category: "layout",
1865
+ version: "11.10.0",
1866
+ bindings: {
1867
+ angular: {
1868
+ importPath: "@uni-design-system/uni-angular",
1869
+ selectorOrTag: "uni-card-group",
1870
+ api: [
1871
+ {
1872
+ name: "value",
1873
+ kind: "model",
1874
+ type: "T | null",
1875
+ required: false,
1876
+ default: "null",
1877
+ description: ""
1878
+ },
1879
+ {
1880
+ name: "disabled",
1881
+ kind: "input",
1882
+ type: "boolean",
1883
+ required: false,
1884
+ default: "false",
1885
+ description: ""
1886
+ },
1887
+ {
1888
+ name: "touched",
1889
+ kind: "model",
1890
+ type: "boolean",
1891
+ required: false,
1892
+ default: "false",
1893
+ description: ""
1894
+ },
1895
+ {
1896
+ name: "touch",
1897
+ kind: "output",
1898
+ type: "void",
1899
+ required: false,
1900
+ description: "Angular 22 marks the bound field touched through this output."
1901
+ },
1902
+ {
1903
+ name: "invalid",
1904
+ kind: "input",
1905
+ type: "boolean",
1906
+ required: false,
1907
+ default: "false",
1908
+ description: ""
1909
+ },
1910
+ {
1911
+ name: "dirty",
1912
+ kind: "input",
1913
+ type: "boolean",
1914
+ required: false,
1915
+ default: "false",
1916
+ description: ""
1917
+ },
1918
+ {
1919
+ name: "required",
1920
+ kind: "input",
1921
+ type: "boolean",
1922
+ required: false,
1923
+ default: "false",
1924
+ description: ""
1925
+ },
1926
+ {
1927
+ name: "ariaDescribedBy",
1928
+ kind: "input",
1929
+ type: "string",
1930
+ required: false,
1931
+ description: ""
1932
+ },
1933
+ {
1934
+ name: "ariaLabel",
1935
+ kind: "input",
1936
+ type: "string",
1937
+ required: false,
1938
+ description: 'Accessible name of the group, e.g. "Kind of work".'
1939
+ },
1940
+ {
1941
+ name: "ariaLabelledBy",
1942
+ kind: "input",
1943
+ type: "string",
1944
+ required: false,
1945
+ description: "Id of the element naming the group, when a visible heading does."
1946
+ },
1947
+ {
1948
+ name: "templateColumns",
1949
+ kind: "input",
1950
+ type: "string",
1951
+ required: false,
1952
+ description: "`grid-template-columns`, overriding the theme option per instance."
1953
+ },
1954
+ {
1955
+ name: "gap",
1956
+ kind: "input",
1957
+ type: "NullableSize",
1958
+ required: false,
1959
+ description: "Space between cards, overriding the theme option per instance."
1960
+ },
1961
+ {
1962
+ name: "activated",
1963
+ kind: "output",
1964
+ type: "T",
1965
+ required: false,
1966
+ description: "The card the user just picked."
1967
+ },
1968
+ {
1969
+ name: "variant",
1970
+ kind: "input",
1971
+ type: "Variant",
1972
+ required: false,
1973
+ default: "'primary'",
1974
+ description: "Style archetype from the theme. Inherited from BaseComponent."
1975
+ },
1976
+ {
1977
+ name: "size",
1978
+ kind: "input",
1979
+ type: "Size",
1980
+ required: false,
1981
+ default: "'lg'",
1982
+ description: "Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block."
1983
+ }
1984
+ ]
1985
+ }
1986
+ },
1987
+ examples: [],
1988
+ guidelines: {
1989
+ whenToUse: "",
1990
+ dos: [],
1991
+ donts: [],
1992
+ accessibility: []
1993
+ },
1994
+ relatedTokens: []
1995
+ },
1790
1996
  {
1791
1997
  id: "card-header",
1792
1998
  name: "CardHeader",
@@ -1794,7 +2000,7 @@ var uni_index_default = {
1794
2000
  summary: "",
1795
2001
  description: "",
1796
2002
  category: "layout",
1797
- version: "11.8.0",
2003
+ version: "11.10.0",
1798
2004
  bindings: {
1799
2005
  angular: {
1800
2006
  importPath: "@uni-design-system/uni-angular",
@@ -1851,7 +2057,7 @@ var uni_index_default = {
1851
2057
  summary: "",
1852
2058
  description: "",
1853
2059
  category: "layout",
1854
- version: "11.8.0",
2060
+ version: "11.10.0",
1855
2061
  bindings: {
1856
2062
  angular: {
1857
2063
  importPath: "@uni-design-system/uni-angular",
@@ -1906,7 +2112,7 @@ var uni_index_default = {
1906
2112
  summary: "",
1907
2113
  description: "",
1908
2114
  category: "forms",
1909
- version: "11.8.0",
2115
+ version: "11.10.0",
1910
2116
  bindings: {
1911
2117
  angular: {
1912
2118
  importPath: "@uni-design-system/uni-angular",
@@ -2128,7 +2334,7 @@ var uni_index_default = {
2128
2334
  summary: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select.",
2129
2335
  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
2336
  category: "forms",
2131
- version: "11.8.0",
2337
+ version: "11.10.0",
2132
2338
  bindings: {
2133
2339
  angular: {
2134
2340
  importPath: "@uni-design-system/uni-angular",
@@ -2430,7 +2636,7 @@ emptyText="No countries found"
2430
2636
  summary: "",
2431
2637
  description: "",
2432
2638
  category: "feedback",
2433
- version: "11.8.0",
2639
+ version: "11.10.0",
2434
2640
  bindings: {
2435
2641
  angular: {
2436
2642
  importPath: "@uni-design-system/uni-angular",
@@ -2477,7 +2683,7 @@ emptyText="No countries found"
2477
2683
  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
2684
  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
2685
  category: "forms",
2480
- version: "11.8.0",
2686
+ version: "11.10.0",
2481
2687
  bindings: {
2482
2688
  angular: {
2483
2689
  importPath: "@uni-design-system/uni-angular",
@@ -2762,7 +2968,7 @@ emptyText="No countries found"
2762
2968
  summary: "",
2763
2969
  description: "",
2764
2970
  category: "forms",
2765
- version: "11.8.0",
2971
+ version: "11.10.0",
2766
2972
  bindings: {
2767
2973
  angular: {
2768
2974
  importPath: "@uni-design-system/uni-angular",
@@ -2858,10 +3064,10 @@ emptyText="No countries found"
2858
3064
  id: "data-table",
2859
3065
  name: "DataTable",
2860
3066
  status: "stable",
2861
- summary: "",
2862
- description: "",
3067
+ summary: "Data grid over a `UniDatasource`: sortable headers, a leading selection column, and an expandable detail row per record.",
3068
+ 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
3069
  category: "data",
2864
- version: "11.8.0",
3070
+ version: "11.10.0",
2865
3071
  bindings: {
2866
3072
  angular: {
2867
3073
  importPath: "@uni-design-system/uni-angular",
@@ -2881,13 +3087,36 @@ emptyText="No countries found"
2881
3087
  required: true,
2882
3088
  description: ""
2883
3089
  },
3090
+ {
3091
+ name: "expanded",
3092
+ kind: "model",
3093
+ type: "RowKey | null",
3094
+ required: false,
3095
+ default: "null",
3096
+ 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."
3097
+ },
2884
3098
  {
2885
3099
  name: "useMultiSelect",
2886
3100
  kind: "input",
2887
3101
  type: "boolean",
2888
3102
  required: false,
2889
3103
  default: "false",
2890
- description: ""
3104
+ 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."
3105
+ },
3106
+ {
3107
+ name: "selectAllLabel",
3108
+ kind: "input",
3109
+ type: "string",
3110
+ required: false,
3111
+ default: "'Select all rows'",
3112
+ description: "Accessible name of the header checkbox."
3113
+ },
3114
+ {
3115
+ name: "selectionChange",
3116
+ kind: "output",
3117
+ type: "T[]",
3118
+ required: false,
3119
+ description: "The datasource's selection after a checkbox changed it \u2014 the same array `selections()` holds."
2891
3120
  },
2892
3121
  {
2893
3122
  name: "useRowClick",
@@ -3097,6 +3326,44 @@ emptyText="No countries found"
3097
3326
  base[1]
3098
3327
  ]"
3099
3328
  />`
3329
+ },
3330
+ {
3331
+ title: "Selection",
3332
+ framework: "angular",
3333
+ code: `<!-- Storybook story: Selection -->
3334
+ <uni-data-table
3335
+ [datasource]="datasource"
3336
+ [columns]="columns"
3337
+ [useMultiSelect]="true"
3338
+ [selectableWhen]="selectable"
3339
+ [useRowClick]="false"
3340
+ [selectLabel]="selectLabelOf"
3341
+ (selectionChange)="selected = $event"
3342
+ />
3343
+ <p uni-text="body-2">Selected: {{ selected.length ? (selected | json) : 'nothing' }}</p>`
3344
+ },
3345
+ {
3346
+ title: "Expanded Row",
3347
+ framework: "angular",
3348
+ code: `<!-- Storybook story: Expanded Row -->
3349
+ <div row-layout gap="sm" alignItems="center" paddingBottom="sm">
3350
+ <button text-button size="sm" variant="secondary" (click)="expanded = 'po-104'">Open po-104</button>
3351
+ <button text-button size="sm" variant="ghost" (click)="expanded = null">Collapse</button>
3352
+ <span uni-text="body-2">Expanded: {{ expanded ?? 'none' }}</span>
3353
+ </div>
3354
+ <uni-data-table
3355
+ [datasource]="datasource"
3356
+ [columns]="columns"
3357
+ [detailRowTemplate]="detail"
3358
+ [(expanded)]="expanded"
3359
+ [expandableWhen]="expandable"
3360
+ [rowClass]="dim"
3361
+ />
3362
+ <ng-template #detail let-row>
3363
+ <div box-layout padding="md" uni-text="body-2-long">
3364
+ {{ row.item }} from {{ row.vendor }} \u2014 tracking and notes would go here.
3365
+ </div>
3366
+ </ng-template>`
3100
3367
  }
3101
3368
  ],
3102
3369
  guidelines: {
@@ -3106,7 +3373,8 @@ emptyText="No countries found"
3106
3373
  accessibility: [
3107
3374
  '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
3375
  '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."
3376
+ "Collapsed detail rows are `inert`, out of the accessibility tree until expanded; a row with a detail carries `aria-expanded`.",
3377
+ '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
3378
  ]
3111
3379
  },
3112
3380
  relatedTokens: []
@@ -3118,7 +3386,7 @@ emptyText="No countries found"
3118
3386
  summary: "Date field with free-typed parsing and a popup calendar.",
3119
3387
  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
3388
  category: "forms",
3121
- version: "11.8.0",
3389
+ version: "11.10.0",
3122
3390
  bindings: {
3123
3391
  angular: {
3124
3392
  importPath: "@uni-design-system/uni-angular",
@@ -3349,7 +3617,7 @@ emptyText="No countries found"
3349
3617
  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
3618
  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
3619
  category: "forms",
3352
- version: "11.8.0",
3620
+ version: "11.10.0",
3353
3621
  bindings: {
3354
3622
  angular: {
3355
3623
  importPath: "@uni-design-system/uni-angular",
@@ -3542,7 +3810,7 @@ emptyText="No countries found"
3542
3810
  summary: "Text input that emits `change` only after the user pauses typing.",
3543
3811
  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
3812
  category: "forms",
3545
- version: "11.8.0",
3813
+ version: "11.10.0",
3546
3814
  bindings: {
3547
3815
  angular: {
3548
3816
  importPath: "@uni-design-system/uni-angular",
@@ -3690,7 +3958,7 @@ emptyText="No countries found"
3690
3958
  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
3959
  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
3960
  category: "feedback",
3693
- version: "11.8.0",
3961
+ version: "11.10.0",
3694
3962
  bindings: {
3695
3963
  angular: {
3696
3964
  importPath: "@uni-design-system/uni-angular",
@@ -3860,7 +4128,7 @@ uni-dialog
3860
4128
  summary: "The dialog's pinned footer action row.",
3861
4129
  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
4130
  category: "feedback",
3863
- version: "11.8.0",
4131
+ version: "11.10.0",
3864
4132
  bindings: {
3865
4133
  angular: {
3866
4134
  importPath: "@uni-design-system/uni-angular",
@@ -3978,9 +4246,9 @@ uni-dialog
3978
4246
  name: "DialogHeader",
3979
4247
  status: "stable",
3980
4248
  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
- 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.",
4249
+ 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. The close button follows the dialog's `defaultCloseButton`: a sheet that closes from its footer says `[defaultCloseButton]=\"false\"` once and gets no X here either.",
3982
4250
  category: "feedback",
3983
- version: "11.8.0",
4251
+ version: "11.10.0",
3984
4252
  bindings: {
3985
4253
  angular: {
3986
4254
  importPath: "@uni-design-system/uni-angular",
@@ -4027,9 +4295,9 @@ uni-dialog
4027
4295
  name: "DialogTitle",
4028
4296
  status: "stable",
4029
4297
  summary: "Marks the element that names the dialog inside a rich `[dialog-header]`.",
4030
- 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.",
4298
+ 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 the dialog's `aria-labelledby` points at it \u2014 through the id it already has, or the dialog's title id when it has none. Projected through a wrapper component the directive cannot reach the dialog; the header then finds the marked element in the DOM instead.",
4031
4299
  category: "feedback",
4032
- version: "11.8.0",
4300
+ version: "11.10.0",
4033
4301
  bindings: {
4034
4302
  angular: {
4035
4303
  importPath: "@uni-design-system/uni-angular",
@@ -4053,7 +4321,7 @@ uni-dialog
4053
4321
  summary: "",
4054
4322
  description: "",
4055
4323
  category: "layout",
4056
- version: "11.8.0",
4324
+ version: "11.10.0",
4057
4325
  bindings: {
4058
4326
  angular: {
4059
4327
  importPath: "@uni-design-system/uni-angular",
@@ -4109,7 +4377,7 @@ uni-dialog
4109
4377
  summary: "",
4110
4378
  description: "",
4111
4379
  category: "directives",
4112
- version: "11.8.0",
4380
+ version: "11.10.0",
4113
4381
  bindings: {
4114
4382
  angular: {
4115
4383
  importPath: "@uni-design-system/uni-angular",
@@ -4141,7 +4409,7 @@ uni-dialog
4141
4409
  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
4410
  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
4411
  category: "components",
4144
- version: "11.8.0",
4412
+ version: "11.10.0",
4145
4413
  bindings: {
4146
4414
  angular: {
4147
4415
  importPath: "@uni-design-system/uni-angular",
@@ -4371,7 +4639,7 @@ initialFocus="input"
4371
4639
  summary: "The drawer's pinned footer action row \u2014 the save bar of an editor panel.",
4372
4640
  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
4641
  category: "primitives",
4374
- version: "11.8.0",
4642
+ version: "11.10.0",
4375
4643
  bindings: {
4376
4644
  angular: {
4377
4645
  importPath: "@uni-design-system/uni-angular",
@@ -4476,7 +4744,7 @@ initialFocus="input"
4476
4744
  summary: "The drawer's pinned header row: a title, and optionally a close button.",
4477
4745
  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
4746
  category: "components",
4479
- version: "11.8.0",
4747
+ version: "11.10.0",
4480
4748
  bindings: {
4481
4749
  angular: {
4482
4750
  importPath: "@uni-design-system/uni-angular",
@@ -4524,7 +4792,7 @@ initialFocus="input"
4524
4792
  summary: "",
4525
4793
  description: "",
4526
4794
  category: "components",
4527
- version: "11.8.0",
4795
+ version: "11.10.0",
4528
4796
  bindings: {
4529
4797
  angular: {
4530
4798
  importPath: "@uni-design-system/uni-angular",
@@ -4658,7 +4926,7 @@ initialFocus="input"
4658
4926
  summary: "",
4659
4927
  description: "",
4660
4928
  category: "layout",
4661
- version: "11.8.0",
4929
+ version: "11.10.0",
4662
4930
  bindings: {
4663
4931
  angular: {
4664
4932
  importPath: "@uni-design-system/uni-angular",
@@ -4765,7 +5033,7 @@ initialFocus="input"
4765
5033
  summary: "",
4766
5034
  description: "",
4767
5035
  category: "layout",
4768
- version: "11.8.0",
5036
+ version: "11.10.0",
4769
5037
  bindings: {
4770
5038
  angular: {
4771
5039
  importPath: "@uni-design-system/uni-angular",
@@ -4836,7 +5104,7 @@ initialFocus="input"
4836
5104
  summary: "Trigger for a {@link UniExpandComponent} region.",
4837
5105
  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
5106
  category: "layout",
4839
- version: "11.8.0",
5107
+ version: "11.10.0",
4840
5108
  bindings: {
4841
5109
  angular: {
4842
5110
  importPath: "@uni-design-system/uni-angular",
@@ -4921,7 +5189,7 @@ initialFocus="input"
4921
5189
  summary: "",
4922
5190
  description: "",
4923
5191
  category: "forms",
4924
- version: "11.8.0",
5192
+ version: "11.10.0",
4925
5193
  bindings: {
4926
5194
  angular: {
4927
5195
  importPath: "@uni-design-system/uni-angular",
@@ -5079,7 +5347,7 @@ initialFocus="input"
5079
5347
  summary: "",
5080
5348
  description: "",
5081
5349
  category: "layout",
5082
- version: "11.8.0",
5350
+ version: "11.10.0",
5083
5351
  bindings: {
5084
5352
  angular: {
5085
5353
  importPath: "@uni-design-system/uni-angular",
@@ -5176,7 +5444,7 @@ initialFocus="input"
5176
5444
  summary: "",
5177
5445
  description: "",
5178
5446
  category: "layout",
5179
- version: "11.8.0",
5447
+ version: "11.10.0",
5180
5448
  bindings: {
5181
5449
  angular: {
5182
5450
  importPath: "@uni-design-system/uni-angular",
@@ -5208,7 +5476,7 @@ initialFocus="input"
5208
5476
  summary: "",
5209
5477
  description: "",
5210
5478
  category: "primitives",
5211
- version: "11.8.0",
5479
+ version: "11.10.0",
5212
5480
  bindings: {
5213
5481
  angular: {
5214
5482
  importPath: "@uni-design-system/uni-angular",
@@ -5268,7 +5536,7 @@ initialFocus="input"
5268
5536
  summary: "",
5269
5537
  description: "",
5270
5538
  category: "primitives",
5271
- version: "11.8.0",
5539
+ version: "11.10.0",
5272
5540
  bindings: {
5273
5541
  angular: {
5274
5542
  importPath: "@uni-design-system/uni-angular",
@@ -5381,7 +5649,7 @@ initialFocus="input"
5381
5649
  summary: "A button that lives inside a sentence.",
5382
5650
  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
5651
  category: "primitives",
5384
- version: "11.8.0",
5652
+ version: "11.10.0",
5385
5653
  bindings: {
5386
5654
  angular: {
5387
5655
  importPath: "@uni-design-system/uni-angular",
@@ -5496,7 +5764,7 @@ initialFocus="input"
5496
5764
  summary: "",
5497
5765
  description: "",
5498
5766
  category: "forms",
5499
- version: "11.8.0",
5767
+ version: "11.10.0",
5500
5768
  bindings: {
5501
5769
  angular: {
5502
5770
  importPath: "@uni-design-system/uni-angular",
@@ -5796,7 +6064,7 @@ initialFocus="input"
5796
6064
  summary: "",
5797
6065
  description: "",
5798
6066
  category: "forms",
5799
- version: "11.8.0",
6067
+ version: "11.10.0",
5800
6068
  bindings: {
5801
6069
  angular: {
5802
6070
  importPath: "@uni-design-system/uni-angular",
@@ -5925,7 +6193,7 @@ initialFocus="input"
5925
6193
  summary: "",
5926
6194
  description: "",
5927
6195
  category: "components",
5928
- version: "11.8.0",
6196
+ version: "11.10.0",
5929
6197
  bindings: {
5930
6198
  angular: {
5931
6199
  importPath: "@uni-design-system/uni-angular",
@@ -5995,7 +6263,7 @@ initialFocus="input"
5995
6263
  summary: "",
5996
6264
  description: "",
5997
6265
  category: "layout",
5998
- version: "11.8.0",
6266
+ version: "11.10.0",
5999
6267
  bindings: {
6000
6268
  angular: {
6001
6269
  importPath: "@uni-design-system/uni-angular",
@@ -6099,7 +6367,7 @@ initialFocus="input"
6099
6367
  summary: "",
6100
6368
  description: "",
6101
6369
  category: "layout",
6102
- version: "11.8.0",
6370
+ version: "11.10.0",
6103
6371
  bindings: {
6104
6372
  angular: {
6105
6373
  importPath: "@uni-design-system/uni-angular",
@@ -6181,7 +6449,7 @@ initialFocus="input"
6181
6449
  summary: "",
6182
6450
  description: "",
6183
6451
  category: "forms",
6184
- version: "11.8.0",
6452
+ version: "11.10.0",
6185
6453
  bindings: {
6186
6454
  angular: {
6187
6455
  importPath: "@uni-design-system/uni-angular",
@@ -6275,7 +6543,7 @@ initialFocus="input"
6275
6543
  summary: "",
6276
6544
  description: "",
6277
6545
  category: "forms",
6278
- version: "11.8.0",
6546
+ version: "11.10.0",
6279
6547
  bindings: {
6280
6548
  angular: {
6281
6549
  importPath: "@uni-design-system/uni-angular",
@@ -6454,7 +6722,7 @@ initialFocus="input"
6454
6722
  summary: "",
6455
6723
  description: "",
6456
6724
  category: "feedback",
6457
- version: "11.8.0",
6725
+ version: "11.10.0",
6458
6726
  bindings: {
6459
6727
  angular: {
6460
6728
  importPath: "@uni-design-system/uni-angular",
@@ -6714,7 +6982,7 @@ initialFocus="input"
6714
6982
  summary: "",
6715
6983
  description: "",
6716
6984
  category: "feedback",
6717
- version: "11.8.0",
6985
+ version: "11.10.0",
6718
6986
  bindings: {
6719
6987
  angular: {
6720
6988
  importPath: "@uni-design-system/uni-angular",
@@ -6738,7 +7006,7 @@ initialFocus="input"
6738
7006
  summary: "Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.",
6739
7007
  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
7008
  category: "forms",
6741
- version: "11.8.0",
7009
+ version: "11.10.0",
6742
7010
  bindings: {
6743
7011
  angular: {
6744
7012
  importPath: "@uni-design-system/uni-angular",
@@ -7172,7 +7440,7 @@ initialFocus="input"
7172
7440
  summary: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances.",
7173
7441
  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
7442
  category: "forms",
7175
- version: "11.8.0",
7443
+ version: "11.10.0",
7176
7444
  bindings: {
7177
7445
  angular: {
7178
7446
  importPath: "@uni-design-system/uni-angular",
@@ -7463,7 +7731,7 @@ initialFocus="input"
7463
7731
  summary: "",
7464
7732
  description: "",
7465
7733
  category: "data",
7466
- version: "11.8.0",
7734
+ version: "11.10.0",
7467
7735
  bindings: {
7468
7736
  angular: {
7469
7737
  importPath: "@uni-design-system/uni-angular",
@@ -7564,7 +7832,7 @@ initialFocus="input"
7564
7832
  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
7833
  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
7834
  category: "layout",
7567
- version: "11.8.0",
7835
+ version: "11.10.0",
7568
7836
  bindings: {
7569
7837
  angular: {
7570
7838
  importPath: "@uni-design-system/uni-angular",
@@ -7756,7 +8024,7 @@ initialFocus="input"
7756
8024
  summary: "",
7757
8025
  description: "",
7758
8026
  category: "feedback",
7759
- version: "11.8.0",
8027
+ version: "11.10.0",
7760
8028
  bindings: {
7761
8029
  angular: {
7762
8030
  importPath: "@uni-design-system/uni-angular",
@@ -7820,7 +8088,7 @@ initialFocus="input"
7820
8088
  summary: "",
7821
8089
  description: "",
7822
8090
  category: "feedback",
7823
- version: "11.8.0",
8091
+ version: "11.10.0",
7824
8092
  bindings: {
7825
8093
  angular: {
7826
8094
  importPath: "@uni-design-system/uni-angular",
@@ -7892,7 +8160,7 @@ initialFocus="input"
7892
8160
  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
8161
  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
8162
  category: "forms",
7895
- version: "11.8.0",
8163
+ version: "11.10.0",
7896
8164
  bindings: {
7897
8165
  angular: {
7898
8166
  importPath: "@uni-design-system/uni-angular",
@@ -8095,7 +8363,7 @@ initialFocus="input"
8095
8363
  summary: "",
8096
8364
  description: "",
8097
8365
  category: "forms",
8098
- version: "11.8.0",
8366
+ version: "11.10.0",
8099
8367
  bindings: {
8100
8368
  angular: {
8101
8369
  importPath: "@uni-design-system/uni-angular",
@@ -8324,7 +8592,7 @@ initialFocus="input"
8324
8592
  summary: "Content for each of a radio group's options, in place of the plain label string.",
8325
8593
  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
8594
  category: "forms",
8327
- version: "11.8.0",
8595
+ version: "11.10.0",
8328
8596
  bindings: {
8329
8597
  angular: {
8330
8598
  importPath: "@uni-design-system/uni-angular",
@@ -8348,7 +8616,7 @@ initialFocus="input"
8348
8616
  summary: "",
8349
8617
  description: "",
8350
8618
  category: "directives",
8351
- version: "11.8.0",
8619
+ version: "11.10.0",
8352
8620
  bindings: {
8353
8621
  angular: {
8354
8622
  importPath: "@uni-design-system/uni-angular",
@@ -8372,7 +8640,7 @@ initialFocus="input"
8372
8640
  summary: "",
8373
8641
  description: "",
8374
8642
  category: "layout",
8375
- version: "11.8.0",
8643
+ version: "11.10.0",
8376
8644
  bindings: {
8377
8645
  angular: {
8378
8646
  importPath: "@uni-design-system/uni-angular",
@@ -8427,7 +8695,7 @@ initialFocus="input"
8427
8695
  summary: "Native scroll area with theme-driven scrollbar styling.",
8428
8696
  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
8697
  category: "layout",
8430
- version: "11.8.0",
8698
+ version: "11.10.0",
8431
8699
  bindings: {
8432
8700
  angular: {
8433
8701
  importPath: "@uni-design-system/uni-angular",
@@ -8594,7 +8862,7 @@ initialFocus="input"
8594
8862
  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
8863
  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
8864
  category: "forms",
8597
- version: "11.8.0",
8865
+ version: "11.10.0",
8598
8866
  bindings: {
8599
8867
  angular: {
8600
8868
  importPath: "@uni-design-system/uni-angular",
@@ -8729,7 +8997,7 @@ initialFocus="input"
8729
8997
  summary: "",
8730
8998
  description: "",
8731
8999
  category: "forms",
8732
- version: "11.8.0",
9000
+ version: "11.10.0",
8733
9001
  bindings: {
8734
9002
  angular: {
8735
9003
  importPath: "@uni-design-system/uni-angular",
@@ -8901,7 +9169,7 @@ initialFocus="input"
8901
9169
  summary: "Loading placeholder painted with surface tokens.",
8902
9170
  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
9171
  category: "components",
8904
- version: "11.8.0",
9172
+ version: "11.10.0",
8905
9173
  bindings: {
8906
9174
  angular: {
8907
9175
  importPath: "@uni-design-system/uni-angular",
@@ -9052,7 +9320,7 @@ initialFocus="input"
9052
9320
  summary: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.",
9053
9321
  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
9322
  category: "forms",
9055
- version: "11.8.0",
9323
+ version: "11.10.0",
9056
9324
  bindings: {
9057
9325
  angular: {
9058
9326
  importPath: "@uni-design-system/uni-angular",
@@ -9329,7 +9597,7 @@ initialFocus="input"
9329
9597
  summary: "",
9330
9598
  description: "",
9331
9599
  category: "feedback",
9332
- version: "11.8.0",
9600
+ version: "11.10.0",
9333
9601
  bindings: {
9334
9602
  angular: {
9335
9603
  importPath: "@uni-design-system/uni-angular",
@@ -9441,7 +9709,7 @@ initialFocus="input"
9441
9709
  summary: "",
9442
9710
  description: "",
9443
9711
  category: "data",
9444
- version: "11.8.0",
9712
+ version: "11.10.0",
9445
9713
  bindings: {
9446
9714
  angular: {
9447
9715
  importPath: "@uni-design-system/uni-angular",
@@ -9515,7 +9783,7 @@ initialFocus="input"
9515
9783
  summary: "",
9516
9784
  description: "",
9517
9785
  category: "layout",
9518
- version: "11.8.0",
9786
+ version: "11.10.0",
9519
9787
  bindings: {
9520
9788
  angular: {
9521
9789
  importPath: "@uni-design-system/uni-angular",
@@ -9570,7 +9838,7 @@ initialFocus="input"
9570
9838
  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
9839
  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
9840
  category: "components",
9573
- version: "11.8.0",
9841
+ version: "11.10.0",
9574
9842
  bindings: {
9575
9843
  angular: {
9576
9844
  importPath: "@uni-design-system/uni-angular",
@@ -9688,7 +9956,7 @@ initialFocus="input"
9688
9956
  summary: "",
9689
9957
  description: "",
9690
9958
  category: "primitives",
9691
- version: "11.8.0",
9959
+ version: "11.10.0",
9692
9960
  bindings: {
9693
9961
  angular: {
9694
9962
  importPath: "@uni-design-system/uni-angular",
@@ -9777,7 +10045,7 @@ initialFocus="input"
9777
10045
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
9778
10046
  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
10047
  category: "components",
9780
- version: "11.8.0",
10048
+ version: "11.10.0",
9781
10049
  bindings: {
9782
10050
  angular: {
9783
10051
  importPath: "@uni-design-system/uni-angular",
@@ -9817,7 +10085,7 @@ initialFocus="input"
9817
10085
  summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
9818
10086
  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
10087
  category: "components",
9820
- version: "11.8.0",
10088
+ version: "11.10.0",
9821
10089
  bindings: {
9822
10090
  angular: {
9823
10091
  importPath: "@uni-design-system/uni-angular",
@@ -9905,7 +10173,7 @@ initialFocus="input"
9905
10173
  summary: "Compact chip for categories, states, filters and tokens.",
9906
10174
  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
10175
  category: "data",
9908
- version: "11.8.0",
10176
+ version: "11.10.0",
9909
10177
  bindings: {
9910
10178
  angular: {
9911
10179
  importPath: "@uni-design-system/uni-angular",
@@ -10283,7 +10551,7 @@ initialFocus="input"
10283
10551
  summary: "A row of chips the user picks from: filters, facets, a set of labels.",
10284
10552
  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
10553
  category: "data",
10286
- version: "11.8.0",
10554
+ version: "11.10.0",
10287
10555
  bindings: {
10288
10556
  angular: {
10289
10557
  importPath: "@uni-design-system/uni-angular",
@@ -10481,7 +10749,7 @@ initialFocus="input"
10481
10749
  summary: "",
10482
10750
  description: "",
10483
10751
  category: "forms",
10484
- version: "11.8.0",
10752
+ version: "11.10.0",
10485
10753
  bindings: {
10486
10754
  angular: {
10487
10755
  importPath: "@uni-design-system/uni-angular",
@@ -10932,7 +11200,7 @@ placeholder="Name or address\u2026"
10932
11200
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
10933
11201
  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
11202
  category: "primitives",
10935
- version: "11.8.0",
11203
+ version: "11.10.0",
10936
11204
  bindings: {
10937
11205
  angular: {
10938
11206
  importPath: "@uni-design-system/uni-angular",
@@ -11042,7 +11310,7 @@ placeholder="Name or address\u2026"
11042
11310
  summary: "",
11043
11311
  description: "",
11044
11312
  category: "forms",
11045
- version: "11.8.0",
11313
+ version: "11.10.0",
11046
11314
  bindings: {
11047
11315
  angular: {
11048
11316
  importPath: "@uni-design-system/uni-angular",
@@ -11257,7 +11525,7 @@ placeholder="Name or address\u2026"
11257
11525
  summary: "",
11258
11526
  description: "",
11259
11527
  category: "primitives",
11260
- version: "11.8.0",
11528
+ version: "11.10.0",
11261
11529
  bindings: {
11262
11530
  angular: {
11263
11531
  importPath: "@uni-design-system/uni-angular",
@@ -11287,7 +11555,7 @@ placeholder="Name or address\u2026"
11287
11555
  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
11556
  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
11557
  category: "components",
11290
- version: "11.8.0",
11558
+ version: "11.10.0",
11291
11559
  bindings: {
11292
11560
  angular: {
11293
11561
  importPath: "@uni-design-system/uni-angular",
@@ -11345,7 +11613,7 @@ placeholder="Name or address\u2026"
11345
11613
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
11346
11614
  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
11615
  category: "forms",
11348
- version: "11.8.0",
11616
+ version: "11.10.0",
11349
11617
  bindings: {
11350
11618
  angular: {
11351
11619
  importPath: "@uni-design-system/uni-angular",
@@ -11560,7 +11828,7 @@ placeholder="Name or address\u2026"
11560
11828
  summary: "",
11561
11829
  description: "",
11562
11830
  category: "forms",
11563
- version: "11.8.0",
11831
+ version: "11.10.0",
11564
11832
  bindings: {
11565
11833
  angular: {
11566
11834
  importPath: "@uni-design-system/uni-angular",
@@ -11822,7 +12090,7 @@ placeholder="Name or address\u2026"
11822
12090
  summary: "",
11823
12091
  description: "",
11824
12092
  category: "feedback",
11825
- version: "11.8.0",
12093
+ version: "11.10.0",
11826
12094
  bindings: {
11827
12095
  angular: {
11828
12096
  importPath: "@uni-design-system/uni-angular",
@@ -11910,7 +12178,7 @@ placeholder="Name or address\u2026"
11910
12178
  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
12179
  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
12180
  category: "components",
11913
- version: "11.8.0",
12181
+ version: "11.10.0",
11914
12182
  bindings: {
11915
12183
  angular: {
11916
12184
  importPath: "@uni-design-system/uni-angular",
@@ -12044,7 +12312,7 @@ placeholder="Name or address\u2026"
12044
12312
  summary: "",
12045
12313
  description: "",
12046
12314
  category: "layout",
12047
- version: "11.8.0",
12315
+ version: "11.10.0",
12048
12316
  bindings: {
12049
12317
  angular: {
12050
12318
  importPath: "@uni-design-system/uni-angular",
@@ -16806,6 +17074,54 @@ placeholder="Name or address\u2026"
16806
17074
  DarkTheme: "xs"
16807
17075
  }
16808
17076
  },
17077
+ {
17078
+ id: "card.behavior.selectedBorder",
17079
+ value: "primary",
17080
+ type: "string",
17081
+ kind: "behavioral",
17082
+ target: "component-prop",
17083
+ appliesTo: "card",
17084
+ themeValues: {
17085
+ LightTheme: "primary",
17086
+ DarkTheme: "primary"
17087
+ }
17088
+ },
17089
+ {
17090
+ id: "card.behavior.selectedColor",
17091
+ value: "primary-container",
17092
+ type: "string",
17093
+ kind: "behavioral",
17094
+ target: "component-prop",
17095
+ appliesTo: "card",
17096
+ themeValues: {
17097
+ LightTheme: "primary-container",
17098
+ DarkTheme: "primary-container"
17099
+ }
17100
+ },
17101
+ {
17102
+ id: "cardGroup.behavior.gap",
17103
+ value: "md",
17104
+ type: "string",
17105
+ kind: "behavioral",
17106
+ target: "component-prop",
17107
+ appliesTo: "cardGroup",
17108
+ themeValues: {
17109
+ LightTheme: "md",
17110
+ DarkTheme: "md"
17111
+ }
17112
+ },
17113
+ {
17114
+ id: "cardGroup.behavior.templateColumns",
17115
+ value: "repeat(auto-fit, minmax(160px, 1fr))",
17116
+ type: "string",
17117
+ kind: "behavioral",
17118
+ target: "component-prop",
17119
+ appliesTo: "cardGroup",
17120
+ themeValues: {
17121
+ LightTheme: "repeat(auto-fit, minmax(160px, 1fr))",
17122
+ DarkTheme: "repeat(auto-fit, minmax(160px, 1fr))"
17123
+ }
17124
+ },
16809
17125
  {
16810
17126
  id: "dataSearch.behavior.border",
16811
17127
  value: "light",
@@ -17118,6 +17434,30 @@ placeholder="Name or address\u2026"
17118
17434
  DarkTheme: 40
17119
17435
  }
17120
17436
  },
17437
+ {
17438
+ id: "dataTable.behavior.selectionColumnWidth",
17439
+ value: 40,
17440
+ type: "number",
17441
+ kind: "behavioral",
17442
+ target: "component-prop",
17443
+ appliesTo: "dataTable",
17444
+ themeValues: {
17445
+ LightTheme: 40,
17446
+ DarkTheme: 40
17447
+ }
17448
+ },
17449
+ {
17450
+ id: "dataTable.behavior.selectionCheckboxSize",
17451
+ value: "sm",
17452
+ type: "string",
17453
+ kind: "behavioral",
17454
+ target: "component-prop",
17455
+ appliesTo: "dataTable",
17456
+ themeValues: {
17457
+ LightTheme: "sm",
17458
+ DarkTheme: "sm"
17459
+ }
17460
+ },
17121
17461
  {
17122
17462
  id: "notificationBadge.behavior.borderRadius",
17123
17463
  value: "sm",
@@ -18588,7 +18928,13 @@ placeholder="Name or address\u2026"
18588
18928
  gap: "xxs"
18589
18929
  },
18590
18930
  card: {
18591
- borderRadius: "xs"
18931
+ borderRadius: "xs",
18932
+ selectedBorder: "primary",
18933
+ selectedColor: "primary-container"
18934
+ },
18935
+ cardGroup: {
18936
+ gap: "md",
18937
+ templateColumns: "repeat(auto-fit, minmax(160px, 1fr))"
18592
18938
  },
18593
18939
  dataSearch: {
18594
18940
  border: "light",
@@ -18618,7 +18964,9 @@ placeholder="Name or address\u2026"
18618
18964
  rowHoverColor: "primary-container",
18619
18965
  loadingOverlayColor: "scrim",
18620
18966
  loadingSpinnerColor: "primary",
18621
- loadingSpinnerSize: 40
18967
+ loadingSpinnerSize: 40,
18968
+ selectionColumnWidth: 40,
18969
+ selectionCheckboxSize: "sm"
18622
18970
  },
18623
18971
  notificationBadge: {
18624
18972
  borderRadius: "sm",
@@ -19222,7 +19570,13 @@ placeholder="Name or address\u2026"
19222
19570
  gap: "xxs"
19223
19571
  },
19224
19572
  card: {
19225
- borderRadius: "xs"
19573
+ borderRadius: "xs",
19574
+ selectedBorder: "primary",
19575
+ selectedColor: "primary-container"
19576
+ },
19577
+ cardGroup: {
19578
+ gap: "md",
19579
+ templateColumns: "repeat(auto-fit, minmax(160px, 1fr))"
19226
19580
  },
19227
19581
  dataSearch: {
19228
19582
  border: "light",
@@ -19252,7 +19606,9 @@ placeholder="Name or address\u2026"
19252
19606
  rowHoverColor: "primary-container",
19253
19607
  loadingOverlayColor: "scrim",
19254
19608
  loadingSpinnerColor: "primary",
19255
- loadingSpinnerSize: 40
19609
+ loadingSpinnerSize: 40,
19610
+ selectionColumnWidth: 40,
19611
+ selectionCheckboxSize: "sm"
19256
19612
  },
19257
19613
  notificationBadge: {
19258
19614
  borderRadius: "sm",
@@ -19365,6 +19721,30 @@ placeholder="Name or address\u2026"
19365
19721
  {
19366
19722
  package: "@uni-design-system/uni-angular",
19367
19723
  releases: [
19724
+ {
19725
+ version: "11.10.0",
19726
+ entries: [
19727
+ {
19728
+ bump: "minor",
19729
+ title: "`uni-card` gains states a theme can paint, and `uni-card-group` makes a pick-one grid of them.",
19730
+ body: "- **The frame is an Emotion class**, no longer an inline `[style]`. An inline style outranks every class, so no theme rule could express a state. One thing to know: a consumer stylesheet that was silently losing to the card's inline frame will start winning. Nothing in the base or storybook themes moves.\n- **`selected`** and **`interactive`** inputs add `card-selected` and `card-interactive` to the frame \u2014 the contract `uni-tag` has had since 11.1 \u2014 and the `card` theme entry gains `selectedBorder` (`primary` by default), `selectedColor` (`primary-container` by default \u2014 every card already wears the primary frame under the base theme, so the fill is what makes a pick visible), `selectedElevation`, `hoverColor` and `focusRingColor` for the common case; a variant's own `&.card-selected` rule reaches it for anything else. An interactive card emits `activated` on click, Space or Enter, and leaves clicks on its own content's controls alone. `disabled` is read.\n- **`[dialog-header]` follow-ups** (`dialog-rich-head-followups-2026-10-22.md`): a `rich` head finds its `[dialog-title]` in the DOM, so a title projected _through_ a wrapper component's template \u2014 invisible to a content query, and unable to inject the dialog \u2014 still names the dialog alone; and with no marked title it defers to the dialog's own `ariaLabel` rather than naming a wrapped sheet by its whole head. The header's close button, in both shapes, follows the dialog's `defaultCloseButton`, as the drawer header's follows the drawer's \u2014 a sheet that closes from its footer says `[defaultCloseButton]=\"false\"` once. **`[dialog-buttons]`, `[drawer-buttons]`**: an `alignItems` theme option, default `center`, so a one-line footnote sits on the buttons' centre line instead of stretched to the row's top edge; the pair renders as before.\n- **`uni-card-group`** (new): a `role=\"radiogroup\"` over the `uni-card`s projected into it. Each card with a `value` becomes a `role=\"radio\"` whose selection and tab stop the group drives; a card without one is plain content. `FormValueControl<T | null>` (`value`, `disabled`, `touched`/`touch`, `invalid`, `dirty`, `required`, `ariaDescribedBy`), named by `ariaLabel` or `ariaLabelledBy`, `activated` on a pick. APG radio keyboard model: one tab stop, arrows move and select (wrapping), Home/End, Space or Enter. Laid out as a grid from `templateColumns` and `gap`, with defaults in the new `cardGroup` theme entry. Single-select; `multiple` is deliberately not here until a case asks for it.",
19731
+ commit: "c5ba475"
19732
+ }
19733
+ ],
19734
+ dependencyBumps: []
19735
+ },
19736
+ {
19737
+ version: "11.9.0",
19738
+ entries: [
19739
+ {
19740
+ bump: "minor",
19741
+ title: "`uni-data-table` gains a real selection column and an id-keyed, bindable detail row; the datasources gain a row identity.",
19742
+ 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.",
19743
+ commit: "cfddc14"
19744
+ }
19745
+ ],
19746
+ dependencyBumps: []
19747
+ },
19368
19748
  {
19369
19749
  version: "11.8.0",
19370
19750
  entries: [
@@ -20353,6 +20733,30 @@ placeholder="Name or address\u2026"
20353
20733
  {
20354
20734
  package: "@uni-design-system/uni-core",
20355
20735
  releases: [
20736
+ {
20737
+ version: "11.10.0",
20738
+ entries: [
20739
+ {
20740
+ bump: "minor",
20741
+ title: "`uni-card` gains states a theme can paint, and `uni-card-group` makes a pick-one grid of them.",
20742
+ body: "- **The frame is an Emotion class**, no longer an inline `[style]`. An inline style outranks every class, so no theme rule could express a state. One thing to know: a consumer stylesheet that was silently losing to the card's inline frame will start winning. Nothing in the base or storybook themes moves.\n- **`selected`** and **`interactive`** inputs add `card-selected` and `card-interactive` to the frame \u2014 the contract `uni-tag` has had since 11.1 \u2014 and the `card` theme entry gains `selectedBorder` (`primary` by default), `selectedColor` (`primary-container` by default \u2014 every card already wears the primary frame under the base theme, so the fill is what makes a pick visible), `selectedElevation`, `hoverColor` and `focusRingColor` for the common case; a variant's own `&.card-selected` rule reaches it for anything else. An interactive card emits `activated` on click, Space or Enter, and leaves clicks on its own content's controls alone. `disabled` is read.\n- **`[dialog-header]` follow-ups** (`dialog-rich-head-followups-2026-10-22.md`): a `rich` head finds its `[dialog-title]` in the DOM, so a title projected _through_ a wrapper component's template \u2014 invisible to a content query, and unable to inject the dialog \u2014 still names the dialog alone; and with no marked title it defers to the dialog's own `ariaLabel` rather than naming a wrapped sheet by its whole head. The header's close button, in both shapes, follows the dialog's `defaultCloseButton`, as the drawer header's follows the drawer's \u2014 a sheet that closes from its footer says `[defaultCloseButton]=\"false\"` once. **`[dialog-buttons]`, `[drawer-buttons]`**: an `alignItems` theme option, default `center`, so a one-line footnote sits on the buttons' centre line instead of stretched to the row's top edge; the pair renders as before.\n- **`uni-card-group`** (new): a `role=\"radiogroup\"` over the `uni-card`s projected into it. Each card with a `value` becomes a `role=\"radio\"` whose selection and tab stop the group drives; a card without one is plain content. `FormValueControl<T | null>` (`value`, `disabled`, `touched`/`touch`, `invalid`, `dirty`, `required`, `ariaDescribedBy`), named by `ariaLabel` or `ariaLabelledBy`, `activated` on a pick. APG radio keyboard model: one tab stop, arrows move and select (wrapping), Home/End, Space or Enter. Laid out as a grid from `templateColumns` and `gap`, with defaults in the new `cardGroup` theme entry. Single-select; `multiple` is deliberately not here until a case asks for it.",
20743
+ commit: "c5ba475"
20744
+ }
20745
+ ],
20746
+ dependencyBumps: []
20747
+ },
20748
+ {
20749
+ version: "11.9.0",
20750
+ entries: [
20751
+ {
20752
+ bump: "minor",
20753
+ title: "`uni-data-table` gains a real selection column and an id-keyed, bindable detail row; the datasources gain a row identity.",
20754
+ 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.",
20755
+ commit: "cfddc14"
20756
+ }
20757
+ ],
20758
+ dependencyBumps: []
20759
+ },
20356
20760
  {
20357
20761
  version: "11.8.0",
20358
20762
  entries: [
@@ -21066,6 +21470,16 @@ placeholder="Name or address\u2026"
21066
21470
  {
21067
21471
  package: "@uni-design-system/uni-react",
21068
21472
  releases: [
21473
+ {
21474
+ version: "11.10.0",
21475
+ entries: [],
21476
+ dependencyBumps: []
21477
+ },
21478
+ {
21479
+ version: "11.9.0",
21480
+ entries: [],
21481
+ dependencyBumps: []
21482
+ },
21069
21483
  {
21070
21484
  version: "11.8.0",
21071
21485
  entries: [],
@@ -21387,6 +21801,16 @@ placeholder="Name or address\u2026"
21387
21801
  {
21388
21802
  package: "@uni-design-system/uni-mcp",
21389
21803
  releases: [
21804
+ {
21805
+ version: "11.10.0",
21806
+ entries: [],
21807
+ dependencyBumps: []
21808
+ },
21809
+ {
21810
+ version: "11.9.0",
21811
+ entries: [],
21812
+ dependencyBumps: []
21813
+ },
21390
21814
  {
21391
21815
  version: "11.8.0",
21392
21816
  entries: [],
@@ -21666,7 +22090,7 @@ placeholder="Name or address\u2026"
21666
22090
  summary: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
21667
22091
  description: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
21668
22092
  members: [],
21669
- version: "11.8.0"
22093
+ version: "11.10.0"
21670
22094
  },
21671
22095
  {
21672
22096
  id: "focusable-selector",
@@ -21678,7 +22102,7 @@ placeholder="Name or address\u2026"
21678
22102
  summary: "Selector matching natively focusable elements.",
21679
22103
  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
22104
  members: [],
21681
- version: "11.8.0"
22105
+ version: "11.10.0"
21682
22106
  },
21683
22107
  {
21684
22108
  id: "resolve-focus-target",
@@ -21690,7 +22114,7 @@ placeholder="Name or address\u2026"
21690
22114
  summary: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
21691
22115
  description: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
21692
22116
  members: [],
21693
- version: "11.8.0"
22117
+ version: "11.10.0"
21694
22118
  },
21695
22119
  {
21696
22120
  id: "visually-hidden",
@@ -21702,7 +22126,7 @@ placeholder="Name or address\u2026"
21702
22126
  summary: "Visually hides content while keeping it available to screen readers.",
21703
22127
  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
22128
  members: [],
21705
- version: "11.8.0"
22129
+ version: "11.10.0"
21706
22130
  },
21707
22131
  {
21708
22132
  id: "motion-safe",
@@ -21714,7 +22138,7 @@ placeholder="Name or address\u2026"
21714
22138
  summary: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
21715
22139
  description: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
21716
22140
  members: [],
21717
- version: "11.8.0"
22141
+ version: "11.10.0"
21718
22142
  },
21719
22143
  {
21720
22144
  id: "announcer",
@@ -21739,7 +22163,7 @@ placeholder="Name or address\u2026"
21739
22163
  description: "Announce `text`, even when it repeats what was just announced."
21740
22164
  }
21741
22165
  ],
21742
- version: "11.8.0"
22166
+ version: "11.10.0"
21743
22167
  },
21744
22168
  {
21745
22169
  id: "create-announcer",
@@ -21751,7 +22175,7 @@ placeholder="Name or address\u2026"
21751
22175
  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
22176
  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
22177
  members: [],
21754
- version: "11.8.0"
22178
+ version: "11.10.0"
21755
22179
  },
21756
22180
  {
21757
22181
  id: "uni-date",
@@ -21763,7 +22187,7 @@ placeholder="Name or address\u2026"
21763
22187
  summary: "A calendar date, `'YYYY-MM-DD'`.",
21764
22188
  description: "A calendar date, `'YYYY-MM-DD'`.",
21765
22189
  members: [],
21766
- version: "11.8.0"
22190
+ version: "11.10.0"
21767
22191
  },
21768
22192
  {
21769
22193
  id: "uni-time",
@@ -21775,7 +22199,7 @@ placeholder="Name or address\u2026"
21775
22199
  summary: "A wall-clock time, `'HH:mm'` (24-hour).",
21776
22200
  description: "A wall-clock time, `'HH:mm'` (24-hour). Display format is separate.",
21777
22201
  members: [],
21778
- version: "11.8.0"
22202
+ version: "11.10.0"
21779
22203
  },
21780
22204
  {
21781
22205
  id: "uni-date-time",
@@ -21787,7 +22211,7 @@ placeholder="Name or address\u2026"
21787
22211
  summary: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
21788
22212
  description: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
21789
22213
  members: [],
21790
- version: "11.8.0"
22214
+ version: "11.10.0"
21791
22215
  },
21792
22216
  {
21793
22217
  id: "uni-date-range",
@@ -21812,7 +22236,7 @@ placeholder="Name or address\u2026"
21812
22236
  description: ""
21813
22237
  }
21814
22238
  ],
21815
- version: "11.8.0"
22239
+ version: "11.10.0"
21816
22240
  },
21817
22241
  {
21818
22242
  id: "iso-date",
@@ -21824,7 +22248,7 @@ placeholder="Name or address\u2026"
21824
22248
  summary: "`(2026, 8, 5)` \u2192 `'2026-08-05'`.",
21825
22249
  description: "`(2026, 8, 5)` \u2192 `'2026-08-05'`. Does not validate \u2014 see `isValidDate`.",
21826
22250
  members: [],
21827
- version: "11.8.0"
22251
+ version: "11.10.0"
21828
22252
  },
21829
22253
  {
21830
22254
  id: "is-valid-date",
@@ -21836,7 +22260,7 @@ placeholder="Name or address\u2026"
21836
22260
  summary: "The ISO date when the parts form a real calendar day, else `null`.",
21837
22261
  description: "The ISO date when the parts form a real calendar day, else `null`.",
21838
22262
  members: [],
21839
- version: "11.8.0"
22263
+ version: "11.10.0"
21840
22264
  },
21841
22265
  {
21842
22266
  id: "days-in-month",
@@ -21848,7 +22272,7 @@ placeholder="Name or address\u2026"
21848
22272
  summary: "Days in a month, leap-year aware.",
21849
22273
  description: "Days in a month, leap-year aware.",
21850
22274
  members: [],
21851
- version: "11.8.0"
22275
+ version: "11.10.0"
21852
22276
  },
21853
22277
  {
21854
22278
  id: "add-days",
@@ -21860,7 +22284,7 @@ placeholder="Name or address\u2026"
21860
22284
  summary: "",
21861
22285
  description: "",
21862
22286
  members: [],
21863
- version: "11.8.0"
22287
+ version: "11.10.0"
21864
22288
  },
21865
22289
  {
21866
22290
  id: "add-months",
@@ -21872,7 +22296,7 @@ placeholder="Name or address\u2026"
21872
22296
  summary: "Same day \xB1 n months, clamping the day to the target month's length.",
21873
22297
  description: "Same day \xB1 n months, clamping the day to the target month's length.",
21874
22298
  members: [],
21875
- version: "11.8.0"
22299
+ version: "11.10.0"
21876
22300
  },
21877
22301
  {
21878
22302
  id: "day-of-week",
@@ -21884,7 +22308,7 @@ placeholder="Name or address\u2026"
21884
22308
  summary: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
21885
22309
  description: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
21886
22310
  members: [],
21887
- version: "11.8.0"
22311
+ version: "11.10.0"
21888
22312
  },
21889
22313
  {
21890
22314
  id: "month-of",
@@ -21896,7 +22320,7 @@ placeholder="Name or address\u2026"
21896
22320
  summary: "`'2026-08-20'` \u2192 `'2026-08'`.",
21897
22321
  description: "`'2026-08-20'` \u2192 `'2026-08'`.",
21898
22322
  members: [],
21899
- version: "11.8.0"
22323
+ version: "11.10.0"
21900
22324
  },
21901
22325
  {
21902
22326
  id: "today-iso",
@@ -21908,7 +22332,7 @@ placeholder="Name or address\u2026"
21908
22332
  summary: "Today as a local-wall-clock ISO date (the one place local time matters).",
21909
22333
  description: "Today as a local-wall-clock ISO date (the one place local time matters).",
21910
22334
  members: [],
21911
- version: "11.8.0"
22335
+ version: "11.10.0"
21912
22336
  },
21913
22337
  {
21914
22338
  id: "inclusive-day-count",
@@ -21920,7 +22344,7 @@ placeholder="Name or address\u2026"
21920
22344
  summary: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
21921
22345
  description: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
21922
22346
  members: [],
21923
- version: "11.8.0"
22347
+ version: "11.10.0"
21924
22348
  },
21925
22349
  {
21926
22350
  id: "uni-month-grid-cell",
@@ -21945,7 +22369,7 @@ placeholder="Name or address\u2026"
21945
22369
  description: "True for leading/trailing cells that belong to the adjacent months."
21946
22370
  }
21947
22371
  ],
21948
- version: "11.8.0"
22372
+ version: "11.10.0"
21949
22373
  },
21950
22374
  {
21951
22375
  id: "build-month-grid",
@@ -21957,7 +22381,7 @@ placeholder="Name or address\u2026"
21957
22381
  summary: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday).",
21958
22382
  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
22383
  members: [],
21960
- version: "11.8.0"
22384
+ version: "11.10.0"
21961
22385
  },
21962
22386
  {
21963
22387
  id: "format-date",
@@ -21969,7 +22393,7 @@ placeholder="Name or address\u2026"
21969
22393
  summary: "",
21970
22394
  description: "",
21971
22395
  members: [],
21972
- version: "11.8.0"
22396
+ version: "11.10.0"
21973
22397
  },
21974
22398
  {
21975
22399
  id: "format-month-heading",
@@ -21981,7 +22405,7 @@ placeholder="Name or address\u2026"
21981
22405
  summary: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
21982
22406
  description: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
21983
22407
  members: [],
21984
- version: "11.8.0"
22408
+ version: "11.10.0"
21985
22409
  },
21986
22410
  {
21987
22411
  id: "uni-weekday-name",
@@ -22006,7 +22430,7 @@ placeholder="Name or address\u2026"
22006
22430
  description: "Full weekday name, for the columnheader's `abbr`."
22007
22431
  }
22008
22432
  ],
22009
- version: "11.8.0"
22433
+ version: "11.10.0"
22010
22434
  },
22011
22435
  {
22012
22436
  id: "weekday-names",
@@ -22018,7 +22442,7 @@ placeholder="Name or address\u2026"
22018
22442
  summary: "Weekday header labels starting at `weekStart` (0 = Sunday).",
22019
22443
  description: "Weekday header labels starting at `weekStart` (0 = Sunday).",
22020
22444
  members: [],
22021
- version: "11.8.0"
22445
+ version: "11.10.0"
22022
22446
  },
22023
22447
  {
22024
22448
  id: "format-time",
@@ -22030,7 +22454,7 @@ placeholder="Name or address\u2026"
22030
22454
  summary: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
22031
22455
  description: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
22032
22456
  members: [],
22033
- version: "11.8.0"
22457
+ version: "11.10.0"
22034
22458
  },
22035
22459
  {
22036
22460
  id: "locale-week-start",
@@ -22042,7 +22466,7 @@ placeholder="Name or address\u2026"
22042
22466
  summary: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday.",
22043
22467
  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
22468
  members: [],
22045
- version: "11.8.0"
22469
+ version: "11.10.0"
22046
22470
  },
22047
22471
  {
22048
22472
  id: "locale-default-hour12",
@@ -22054,7 +22478,7 @@ placeholder="Name or address\u2026"
22054
22478
  summary: "Whether the locale's default clock is 12-hour.",
22055
22479
  description: "Whether the locale's default clock is 12-hour.",
22056
22480
  members: [],
22057
- version: "11.8.0"
22481
+ version: "11.10.0"
22058
22482
  },
22059
22483
  {
22060
22484
  id: "locale-field-order",
@@ -22066,7 +22490,7 @@ placeholder="Name or address\u2026"
22066
22490
  summary: "The locale's numeric-date field order, e.g.",
22067
22491
  description: "The locale's numeric-date field order, e.g. en-US \u2192 month, day, year.",
22068
22492
  members: [],
22069
- version: "11.8.0"
22493
+ version: "11.10.0"
22070
22494
  },
22071
22495
  {
22072
22496
  id: "locale-month-names",
@@ -22078,7 +22502,7 @@ placeholder="Name or address\u2026"
22078
22502
  summary: "Long + short month names \u2192 month number, lowercased, dots stripped.",
22079
22503
  description: "Long + short month names \u2192 month number, lowercased, dots stripped.",
22080
22504
  members: [],
22081
- version: "11.8.0"
22505
+ version: "11.10.0"
22082
22506
  },
22083
22507
  {
22084
22508
  id: "locale-date-placeholder",
@@ -22090,7 +22514,7 @@ placeholder="Name or address\u2026"
22090
22514
  summary: "The locale's digit pattern as a placeholder, e.g.",
22091
22515
  description: "The locale's digit pattern as a placeholder, e.g. `'MM/DD/YYYY'`.",
22092
22516
  members: [],
22093
- version: "11.8.0"
22517
+ version: "11.10.0"
22094
22518
  },
22095
22519
  {
22096
22520
  id: "parse-date-text",
@@ -22102,7 +22526,7 @@ placeholder="Name or address\u2026"
22102
22526
  summary: "Free-typed date text \u2192 ISO date, or `null` when unreadable.",
22103
22527
  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
22528
  members: [],
22105
- version: "11.8.0"
22529
+ version: "11.10.0"
22106
22530
  },
22107
22531
  {
22108
22532
  id: "parse-time-text",
@@ -22114,7 +22538,7 @@ placeholder="Name or address\u2026"
22114
22538
  summary: "Free-typed time text \u2192 `'HH:mm'`, or `null`.",
22115
22539
  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
22540
  members: [],
22117
- version: "11.8.0"
22541
+ version: "11.10.0"
22118
22542
  },
22119
22543
  {
22120
22544
  id: "time-slots",
@@ -22126,7 +22550,7 @@ placeholder="Name or address\u2026"
22126
22550
  summary: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
22127
22551
  description: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
22128
22552
  members: [],
22129
- version: "11.8.0"
22553
+ version: "11.10.0"
22130
22554
  },
22131
22555
  {
22132
22556
  id: "split-date-time",
@@ -22138,7 +22562,7 @@ placeholder="Name or address\u2026"
22138
22562
  summary: "",
22139
22563
  description: "",
22140
22564
  members: [],
22141
- version: "11.8.0"
22565
+ version: "11.10.0"
22142
22566
  },
22143
22567
  {
22144
22568
  id: "join-date-time",
@@ -22150,7 +22574,7 @@ placeholder="Name or address\u2026"
22150
22574
  summary: "One combined value only when both parts are present.",
22151
22575
  description: "One combined value only when both parts are present.",
22152
22576
  members: [],
22153
- version: "11.8.0"
22577
+ version: "11.10.0"
22154
22578
  },
22155
22579
  {
22156
22580
  id: "uni-number-range",
@@ -22175,7 +22599,7 @@ placeholder="Name or address\u2026"
22175
22599
  description: ""
22176
22600
  }
22177
22601
  ],
22178
- version: "11.8.0"
22602
+ version: "11.10.0"
22179
22603
  },
22180
22604
  {
22181
22605
  id: "uni-rounding-mode",
@@ -22187,7 +22611,7 @@ placeholder="Name or address\u2026"
22187
22611
  summary: "How a tie is resolved when rounding to a fraction-digit count.",
22188
22612
  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
22613
  members: [],
22190
- version: "11.8.0"
22614
+ version: "11.10.0"
22191
22615
  },
22192
22616
  {
22193
22617
  id: "uni-number-preset",
@@ -22199,7 +22623,7 @@ placeholder="Name or address\u2026"
22199
22623
  summary: "Format archetype.",
22200
22624
  description: "Format archetype. Supplies decimals, grouping, affix and `inputmode`.",
22201
22625
  members: [],
22202
- version: "11.8.0"
22626
+ version: "11.10.0"
22203
22627
  },
22204
22628
  {
22205
22629
  id: "uni-number-grouping",
@@ -22211,7 +22635,7 @@ placeholder="Name or address\u2026"
22211
22635
  summary: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`.",
22212
22636
  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
22637
  members: [],
22214
- version: "11.8.0"
22638
+ version: "11.10.0"
22215
22639
  },
22216
22640
  {
22217
22641
  id: "uni-number-reject-reason",
@@ -22223,7 +22647,7 @@ placeholder="Name or address\u2026"
22223
22647
  summary: "Why a typed commit was refused.",
22224
22648
  description: "Why a typed commit was refused. The raw text stays in the field.",
22225
22649
  members: [],
22226
- version: "11.8.0"
22650
+ version: "11.10.0"
22227
22651
  },
22228
22652
  {
22229
22653
  id: "uni-number-step-config",
@@ -22266,7 +22690,7 @@ placeholder="Name or address\u2026"
22266
22690
  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
22691
  }
22268
22692
  ],
22269
- version: "11.8.0"
22693
+ version: "11.10.0"
22270
22694
  },
22271
22695
  {
22272
22696
  id: "uni-number-clamp",
@@ -22291,7 +22715,7 @@ placeholder="Name or address\u2026"
22291
22715
  description: "Which fence was hit, or `null` when the value was already in range."
22292
22716
  }
22293
22717
  ],
22294
- version: "11.8.0"
22718
+ version: "11.10.0"
22295
22719
  },
22296
22720
  {
22297
22721
  id: "uni-locale-number-parts",
@@ -22334,7 +22758,7 @@ placeholder="Name or address\u2026"
22334
22758
  description: "Fraction digits `Intl` uses for the currency \u2014 JPY 0, USD 2."
22335
22759
  }
22336
22760
  ],
22337
- version: "11.8.0"
22761
+ version: "11.10.0"
22338
22762
  },
22339
22763
  {
22340
22764
  id: "uni-number-format-config",
@@ -22419,7 +22843,7 @@ placeholder="Name or address\u2026"
22419
22843
  description: "Spoken long form of an abbreviated suffix, for `aria-valuetext`."
22420
22844
  }
22421
22845
  ],
22422
- version: "11.8.0"
22846
+ version: "11.10.0"
22423
22847
  },
22424
22848
  {
22425
22849
  id: "uni-resolved-number-format",
@@ -22510,7 +22934,7 @@ placeholder="Name or address\u2026"
22510
22934
  description: ""
22511
22935
  }
22512
22936
  ],
22513
- version: "11.8.0"
22937
+ version: "11.10.0"
22514
22938
  },
22515
22939
  {
22516
22940
  id: "uni-number-parse-result",
@@ -22522,7 +22946,7 @@ placeholder="Name or address\u2026"
22522
22946
  summary: "The outcome of reading a user's text.",
22523
22947
  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
22948
  members: [],
22525
- version: "11.8.0"
22949
+ version: "11.10.0"
22526
22950
  },
22527
22951
  {
22528
22952
  id: "is-canonical-decimal",
@@ -22534,7 +22958,7 @@ placeholder="Name or address\u2026"
22534
22958
  summary: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
22535
22959
  description: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
22536
22960
  members: [],
22537
- version: "11.8.0"
22961
+ version: "11.10.0"
22538
22962
  },
22539
22963
  {
22540
22964
  id: "decimal-scale",
@@ -22546,7 +22970,7 @@ placeholder="Name or address\u2026"
22546
22970
  summary: "Fraction-digit count.",
22547
22971
  description: "Fraction-digit count. `'1.250'` \u2192 3, `'12'` \u2192 0, `'5.'` \u2192 0.",
22548
22972
  members: [],
22549
- version: "11.8.0"
22973
+ version: "11.10.0"
22550
22974
  },
22551
22975
  {
22552
22976
  id: "to-scaled",
@@ -22558,7 +22982,7 @@ placeholder="Name or address\u2026"
22558
22982
  summary: "Canonical decimal \u2192 integer scaled by `10^scale`.",
22559
22983
  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
22984
  members: [],
22561
- version: "11.8.0"
22985
+ version: "11.10.0"
22562
22986
  },
22563
22987
  {
22564
22988
  id: "from-scaled",
@@ -22570,7 +22994,7 @@ placeholder="Name or address\u2026"
22570
22994
  summary: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
22571
22995
  description: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
22572
22996
  members: [],
22573
- version: "11.8.0"
22997
+ version: "11.10.0"
22574
22998
  },
22575
22999
  {
22576
23000
  id: "normalize-decimal",
@@ -22582,7 +23006,7 @@ placeholder="Name or address\u2026"
22582
23006
  summary: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`.",
22583
23007
  description: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`. Requires a canonical decimal; guard with `isCanonicalDecimal`.",
22584
23008
  members: [],
22585
- version: "11.8.0"
23009
+ version: "11.10.0"
22586
23010
  },
22587
23011
  {
22588
23012
  id: "to-decimal",
@@ -22594,7 +23018,7 @@ placeholder="Name or address\u2026"
22594
23018
  summary: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21.",
22595
23019
  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
23020
  members: [],
22597
- version: "11.8.0"
23021
+ version: "11.10.0"
22598
23022
  },
22599
23023
  {
22600
23024
  id: "compare-decimal",
@@ -22606,7 +23030,7 @@ placeholder="Name or address\u2026"
22606
23030
  summary: "`-1` when `a < b`, `1` when `a > b`, `0` when equal.",
22607
23031
  description: "`-1` when `a < b`, `1` when `a > b`, `0` when equal. `'1.50'` equals `'1.5'`.",
22608
23032
  members: [],
22609
- version: "11.8.0"
23033
+ version: "11.10.0"
22610
23034
  },
22611
23035
  {
22612
23036
  id: "round-decimal",
@@ -22618,7 +23042,7 @@ placeholder="Name or address\u2026"
22618
23042
  summary: "Round to `fractionDigits`, breaking ties per `mode`.",
22619
23043
  description: "Round to `fractionDigits`, breaking ties per `mode`. Exact where `Number.prototype.toFixed` is not \u2014 see the file header.",
22620
23044
  members: [],
22621
- version: "11.8.0"
23045
+ version: "11.10.0"
22622
23046
  },
22623
23047
  {
22624
23048
  id: "shift-decimal",
@@ -22630,7 +23054,7 @@ placeholder="Name or address\u2026"
22630
23054
  summary: "Multiply by `10^places`, exactly.",
22631
23055
  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
23056
  members: [],
22633
- version: "11.8.0"
23057
+ version: "11.10.0"
22634
23058
  },
22635
23059
  {
22636
23060
  id: "clamp-decimal",
@@ -22642,7 +23066,7 @@ placeholder="Name or address\u2026"
22642
23066
  summary: "Hold a value inside its fences, reporting which one it hit so the caller can announce it.",
22643
23067
  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
23068
  members: [],
22645
- version: "11.8.0"
23069
+ version: "11.10.0"
22646
23070
  },
22647
23071
  {
22648
23072
  id: "step-decimal",
@@ -22654,7 +23078,7 @@ placeholder="Name or address\u2026"
22654
23078
  summary: "One step from `current`, in `direction` (`1` up, `-1` down).",
22655
23079
  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
23080
  members: [],
22657
- version: "11.8.0"
23081
+ version: "11.10.0"
22658
23082
  },
22659
23083
  {
22660
23084
  id: "locale-number-parts",
@@ -22666,7 +23090,7 @@ placeholder="Name or address\u2026"
22666
23090
  summary: "Locale separators plus, when a currency is given, its symbol, side and fraction digits.",
22667
23091
  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
23092
  members: [],
22669
- version: "11.8.0"
23093
+ version: "11.10.0"
22670
23094
  },
22671
23095
  {
22672
23096
  id: "to-ascii-digits",
@@ -22678,7 +23102,7 @@ placeholder="Name or address\u2026"
22678
23102
  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
23103
  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
23104
  members: [],
22681
- version: "11.8.0"
23105
+ version: "11.10.0"
22682
23106
  },
22683
23107
  {
22684
23108
  id: "evaluate-expression",
@@ -22690,7 +23114,7 @@ placeholder="Name or address\u2026"
22690
23114
  summary: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**.",
22691
23115
  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
23116
  members: [],
22693
- version: "11.8.0"
23117
+ version: "11.10.0"
22694
23118
  },
22695
23119
  {
22696
23120
  id: "resolve-number-format",
@@ -22702,7 +23126,7 @@ placeholder="Name or address\u2026"
22702
23126
  summary: "Fill in every preset, locale and currency default.",
22703
23127
  description: "Fill in every preset, locale and currency default.",
22704
23128
  members: [],
22705
- version: "11.8.0"
23129
+ version: "11.10.0"
22706
23130
  },
22707
23131
  {
22708
23132
  id: "parse-number",
@@ -22714,7 +23138,7 @@ placeholder="Name or address\u2026"
22714
23138
  summary: "Read a user's text into a canonical decimal in **model units**.",
22715
23139
  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
23140
  members: [],
22717
- version: "11.8.0"
23141
+ version: "11.10.0"
22718
23142
  },
22719
23143
  {
22720
23144
  id: "format-number",
@@ -22726,7 +23150,7 @@ placeholder="Name or address\u2026"
22726
23150
  summary: "Canonical decimal (model units) \u2192 the display number, without affixes.",
22727
23151
  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
23152
  members: [],
22729
- version: "11.8.0"
23153
+ version: "11.10.0"
22730
23154
  },
22731
23155
  {
22732
23156
  id: "raw-number-text",
@@ -22738,7 +23162,7 @@ placeholder="Name or address\u2026"
22738
23162
  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
23163
  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
23164
  members: [],
22741
- version: "11.8.0"
23165
+ version: "11.10.0"
22742
23166
  },
22743
23167
  {
22744
23168
  id: "settle-number",
@@ -22750,7 +23174,7 @@ placeholder="Name or address\u2026"
22750
23174
  summary: "Round a committed value to the field's precision, in model units.",
22751
23175
  description: "Round a committed value to the field's precision, in model units.",
22752
23176
  members: [],
22753
- version: "11.8.0"
23177
+ version: "11.10.0"
22754
23178
  },
22755
23179
  {
22756
23180
  id: "speak-number",
@@ -22762,7 +23186,7 @@ placeholder="Name or address\u2026"
22762
23186
  summary: "The `aria-valuetext` string: the formatted number with its affixes spoken.",
22763
23187
  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
23188
  members: [],
22765
- version: "11.8.0"
23189
+ version: "11.10.0"
22766
23190
  },
22767
23191
  {
22768
23192
  id: "to-number",
@@ -22774,7 +23198,7 @@ placeholder="Name or address\u2026"
22774
23198
  summary: "Model-units canonical decimal \u2192 the bound `number`.",
22775
23199
  description: "Model-units canonical decimal \u2192 the bound `number`.",
22776
23200
  members: [],
22777
- version: "11.8.0"
23201
+ version: "11.10.0"
22778
23202
  },
22779
23203
  {
22780
23204
  id: "loses-precision",
@@ -22786,7 +23210,7 @@ placeholder="Name or address\u2026"
22786
23210
  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
23211
  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
23212
  members: [],
22789
- version: "11.8.0"
23213
+ version: "11.10.0"
22790
23214
  },
22791
23215
  {
22792
23216
  id: "press-repeat-timing",
@@ -22823,7 +23247,7 @@ placeholder="Name or address\u2026"
22823
23247
  description: ""
22824
23248
  }
22825
23249
  ],
22826
- version: "11.8.0"
23250
+ version: "11.10.0"
22827
23251
  },
22828
23252
  {
22829
23253
  id: "press-repeat-config",
@@ -22872,7 +23296,7 @@ placeholder="Name or address\u2026"
22872
23296
  description: ""
22873
23297
  }
22874
23298
  ],
22875
- version: "11.8.0"
23299
+ version: "11.10.0"
22876
23300
  },
22877
23301
  {
22878
23302
  id: "press-repeat",
@@ -22909,7 +23333,7 @@ placeholder="Name or address\u2026"
22909
23333
  description: "End a hold without firing `onRelease` \u2014 for `Escape` and `pointercancel`."
22910
23334
  }
22911
23335
  ],
22912
- version: "11.8.0"
23336
+ version: "11.10.0"
22913
23337
  },
22914
23338
  {
22915
23339
  id: "create-press-repeat",
@@ -22921,7 +23345,7 @@ placeholder="Name or address\u2026"
22921
23345
  summary: "",
22922
23346
  description: "",
22923
23347
  members: [],
22924
- version: "11.8.0"
23348
+ version: "11.10.0"
22925
23349
  },
22926
23350
  {
22927
23351
  id: "listbox-navigation-config",
@@ -22964,7 +23388,7 @@ placeholder="Name or address\u2026"
22964
23388
  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
23389
  }
22966
23390
  ],
22967
- version: "11.8.0"
23391
+ version: "11.10.0"
22968
23392
  },
22969
23393
  {
22970
23394
  id: "listbox-navigation",
@@ -23037,7 +23461,7 @@ placeholder="Name or address\u2026"
23037
23461
  description: "Close when focus leaves the control entirely (not on internal moves)."
23038
23462
  }
23039
23463
  ],
23040
- version: "11.8.0"
23464
+ version: "11.10.0"
23041
23465
  },
23042
23466
  {
23043
23467
  id: "create-listbox-navigation",
@@ -23049,7 +23473,7 @@ placeholder="Name or address\u2026"
23049
23473
  summary: "Factory mirroring the signal-API style used elsewhere in the CDK.",
23050
23474
  description: "Factory mirroring the signal-API style used elsewhere in the CDK.",
23051
23475
  members: [],
23052
- version: "11.8.0"
23476
+ version: "11.10.0"
23053
23477
  },
23054
23478
  {
23055
23479
  id: "placement",
@@ -23061,7 +23485,7 @@ placeholder="Name or address\u2026"
23061
23485
  summary: "Native CSS Anchor Positioning helpers (Baseline 2026).",
23062
23486
  description: "Native CSS Anchor Positioning helpers (Baseline 2026). These replace the former",
23063
23487
  members: [],
23064
- version: "11.8.0"
23488
+ version: "11.10.0"
23065
23489
  },
23066
23490
  {
23067
23491
  id: "anchor-offset",
@@ -23086,7 +23510,7 @@ placeholder="Name or address\u2026"
23086
23510
  description: "Shift along the cross axis, from the aligned edge."
23087
23511
  }
23088
23512
  ],
23089
- version: "11.8.0"
23513
+ version: "11.10.0"
23090
23514
  },
23091
23515
  {
23092
23516
  id: "new-anchor-name",
@@ -23098,7 +23522,7 @@ placeholder="Name or address\u2026"
23098
23522
  summary: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
23099
23523
  description: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
23100
23524
  members: [],
23101
- version: "11.8.0"
23525
+ version: "11.10.0"
23102
23526
  },
23103
23527
  {
23104
23528
  id: "anchor-styles",
@@ -23110,7 +23534,7 @@ placeholder="Name or address\u2026"
23110
23534
  summary: "Emotion style object anchoring a panel to `anchor` at `placement`.",
23111
23535
  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
23536
  members: [],
23113
- version: "11.8.0"
23537
+ version: "11.10.0"
23114
23538
  },
23115
23539
  {
23116
23540
  id: "anchor-arrow-styles",
@@ -23122,7 +23546,7 @@ placeholder="Name or address\u2026"
23122
23546
  summary: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor.",
23123
23547
  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
23548
  members: [],
23125
- version: "11.8.0"
23549
+ version: "11.10.0"
23126
23550
  },
23127
23551
  {
23128
23552
  id: "spotlight-options",
@@ -23153,7 +23577,7 @@ placeholder="Name or address\u2026"
23153
23577
  description: "Scrim paint; scheme-invariant by convention, like `::backdrop`."
23154
23578
  }
23155
23579
  ],
23156
- version: "11.8.0"
23580
+ version: "11.10.0"
23157
23581
  },
23158
23582
  {
23159
23583
  id: "spotlight-styles",
@@ -23184,7 +23608,7 @@ placeholder="Name or address\u2026"
23184
23608
  description: "Hole-sized click-blocker, shown when the target must not be interactive."
23185
23609
  }
23186
23610
  ],
23187
- version: "11.8.0"
23611
+ version: "11.10.0"
23188
23612
  },
23189
23613
  {
23190
23614
  id: "anchor-rect",
@@ -23233,7 +23657,7 @@ placeholder="Name or address\u2026"
23233
23657
  description: ""
23234
23658
  }
23235
23659
  ],
23236
- version: "11.8.0"
23660
+ version: "11.10.0"
23237
23661
  },
23238
23662
  {
23239
23663
  id: "transform-origin-for",
@@ -23245,7 +23669,7 @@ placeholder="Name or address\u2026"
23245
23669
  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
23670
  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
23671
  members: [],
23248
- version: "11.8.0"
23672
+ version: "11.10.0"
23249
23673
  },
23250
23674
  {
23251
23675
  id: "transform-origins",
@@ -23257,7 +23681,7 @@ placeholder="Name or address\u2026"
23257
23681
  summary: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
23258
23682
  description: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
23259
23683
  members: [],
23260
- version: "11.8.0"
23684
+ version: "11.10.0"
23261
23685
  },
23262
23686
  {
23263
23687
  id: "set-anchor-name",
@@ -23269,7 +23693,7 @@ placeholder="Name or address\u2026"
23269
23693
  summary: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
23270
23694
  description: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
23271
23695
  members: [],
23272
- version: "11.8.0"
23696
+ version: "11.10.0"
23273
23697
  },
23274
23698
  {
23275
23699
  id: "clear-anchor-name",
@@ -23281,7 +23705,7 @@ placeholder="Name or address\u2026"
23281
23705
  summary: "",
23282
23706
  description: "",
23283
23707
  members: [],
23284
- version: "11.8.0"
23708
+ version: "11.10.0"
23285
23709
  },
23286
23710
  {
23287
23711
  id: "resolve-element",
@@ -23293,7 +23717,7 @@ placeholder="Name or address\u2026"
23293
23717
  summary: "Resolve an element-or-id reference.",
23294
23718
  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
23719
  members: [],
23296
- version: "11.8.0"
23720
+ version: "11.10.0"
23297
23721
  },
23298
23722
  {
23299
23723
  id: "is-toggle-open",
@@ -23305,7 +23729,7 @@ placeholder="Name or address\u2026"
23305
23729
  summary: "True when a native `toggle` event reports the overlay opening.",
23306
23730
  description: "True when a native `toggle` event reports the overlay opening.",
23307
23731
  members: [],
23308
- version: "11.8.0"
23732
+ version: "11.10.0"
23309
23733
  },
23310
23734
  {
23311
23735
  id: "discrete-overlay-transition",
@@ -23317,7 +23741,7 @@ placeholder="Name or address\u2026"
23317
23741
  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
23742
  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
23743
  members: [],
23320
- version: "11.8.0"
23744
+ version: "11.10.0"
23321
23745
  },
23322
23746
  {
23323
23747
  id: "restore-overlay-focus",
@@ -23329,7 +23753,7 @@ placeholder="Name or address\u2026"
23329
23753
  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
23754
  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
23755
  members: [],
23332
- version: "11.8.0"
23756
+ version: "11.10.0"
23333
23757
  },
23334
23758
  {
23335
23759
  id: "focusable-elements",
@@ -23341,7 +23765,7 @@ placeholder="Name or address\u2026"
23341
23765
  summary: "The focusable elements inside `root`, in DOM order.",
23342
23766
  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
23767
  members: [],
23344
- version: "11.8.0"
23768
+ version: "11.10.0"
23345
23769
  },
23346
23770
  {
23347
23771
  id: "backdrop-dismiss",
@@ -23366,7 +23790,7 @@ placeholder="Name or address\u2026"
23366
23790
  description: "True only when both the press and the click landed on the dialog itself."
23367
23791
  }
23368
23792
  ],
23369
- version: "11.8.0"
23793
+ version: "11.10.0"
23370
23794
  },
23371
23795
  {
23372
23796
  id: "sort-direction",
@@ -23378,7 +23802,38 @@ placeholder="Name or address\u2026"
23378
23802
  summary: "",
23379
23803
  description: "",
23380
23804
  members: [],
23381
- version: "11.8.0"
23805
+ version: "11.10.0"
23806
+ },
23807
+ {
23808
+ id: "row-key",
23809
+ name: "RowKey",
23810
+ kind: "type",
23811
+ module: "datasource",
23812
+ importPath: "@uni-design-system/uni-angular",
23813
+ signature: "type RowKey = string | number",
23814
+ summary: "What `rowId` returns: a stable identity for a row across re-fetches.",
23815
+ description: "What `rowId` returns: a stable identity for a row across re-fetches.",
23816
+ members: [],
23817
+ version: "11.10.0"
23818
+ },
23819
+ {
23820
+ id: "uni-datasource-options",
23821
+ name: "UniDatasourceOptions",
23822
+ kind: "interface",
23823
+ module: "datasource",
23824
+ importPath: "@uni-design-system/uni-angular",
23825
+ signature: "interface UniDatasourceOptions<T>",
23826
+ summary: "Options shared by every datasource.",
23827
+ description: "Options shared by every datasource.",
23828
+ members: [
23829
+ {
23830
+ name: "rowId",
23831
+ kind: "property",
23832
+ signature: "rowId?: (row: T) => RowKey",
23833
+ 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."
23834
+ }
23835
+ ],
23836
+ version: "11.10.0"
23382
23837
  },
23383
23838
  {
23384
23839
  id: "sort",
@@ -23403,7 +23858,7 @@ placeholder="Name or address\u2026"
23403
23858
  description: ""
23404
23859
  }
23405
23860
  ],
23406
- version: "11.8.0"
23861
+ version: "11.10.0"
23407
23862
  },
23408
23863
  {
23409
23864
  id: "uni-base-datasource",
@@ -23433,6 +23888,18 @@ placeholder="Name or address\u2026"
23433
23888
  signature: "selections = signal<T[]>([])",
23434
23889
  description: ""
23435
23890
  },
23891
+ {
23892
+ name: "rowId",
23893
+ kind: "property",
23894
+ signature: "rowId?: (row: T) => RowKey",
23895
+ description: "See `UniDatasourceOptions.rowId`. Settable after construction."
23896
+ },
23897
+ {
23898
+ name: "rowKey",
23899
+ kind: "method",
23900
+ signature: "rowKey(row: T): RowKey | T",
23901
+ description: "The row's identity: its `rowId`, or the row itself when there is none."
23902
+ },
23436
23903
  {
23437
23904
  name: "sort",
23438
23905
  kind: "property",
@@ -23517,6 +23984,12 @@ placeholder="Name or address\u2026"
23517
23984
  signature: "toggleSelection(row: T)",
23518
23985
  description: ""
23519
23986
  },
23987
+ {
23988
+ name: "setSelected",
23989
+ kind: "method",
23990
+ signature: "setSelected(rows: T[], selected: boolean)",
23991
+ 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."
23992
+ },
23520
23993
  {
23521
23994
  name: "clearSelections",
23522
23995
  kind: "method",
@@ -23572,7 +24045,7 @@ placeholder="Name or address\u2026"
23572
24045
  description: ""
23573
24046
  }
23574
24047
  ],
23575
- version: "11.8.0"
24048
+ version: "11.10.0"
23576
24049
  },
23577
24050
  {
23578
24051
  id: "page-request",
@@ -23615,7 +24088,7 @@ placeholder="Name or address\u2026"
23615
24088
  description: ""
23616
24089
  }
23617
24090
  ],
23618
- version: "11.8.0"
24091
+ version: "11.10.0"
23619
24092
  },
23620
24093
  {
23621
24094
  id: "page-response",
@@ -23652,7 +24125,7 @@ placeholder="Name or address\u2026"
23652
24125
  description: ""
23653
24126
  }
23654
24127
  ],
23655
- version: "11.8.0"
24128
+ version: "11.10.0"
23656
24129
  },
23657
24130
  {
23658
24131
  id: "data-loader",
@@ -23664,7 +24137,7 @@ placeholder="Name or address\u2026"
23664
24137
  summary: "",
23665
24138
  description: "",
23666
24139
  members: [],
23667
- version: "11.8.0"
24140
+ version: "11.10.0"
23668
24141
  },
23669
24142
  {
23670
24143
  id: "uni-server-side-datasource",
@@ -23803,7 +24276,7 @@ placeholder="Name or address\u2026"
23803
24276
  description: ""
23804
24277
  }
23805
24278
  ],
23806
- version: "11.8.0"
24279
+ version: "11.10.0"
23807
24280
  },
23808
24281
  {
23809
24282
  id: "uni-datasource",
@@ -23815,7 +24288,7 @@ placeholder="Name or address\u2026"
23815
24288
  summary: "",
23816
24289
  description: "",
23817
24290
  members: [],
23818
- version: "11.8.0"
24291
+ version: "11.10.0"
23819
24292
  },
23820
24293
  {
23821
24294
  id: "uni-record-datasource",
@@ -23924,7 +24397,7 @@ placeholder="Name or address\u2026"
23924
24397
  description: ""
23925
24398
  }
23926
24399
  ],
23927
- version: "11.8.0"
24400
+ version: "11.10.0"
23928
24401
  },
23929
24402
  {
23930
24403
  id: "local-storage-service",
@@ -23979,7 +24452,7 @@ placeholder="Name or address\u2026"
23979
24452
  description: ""
23980
24453
  }
23981
24454
  ],
23982
- version: "11.8.0"
24455
+ version: "11.10.0"
23983
24456
  },
23984
24457
  {
23985
24458
  id: "alert",
@@ -24034,7 +24507,7 @@ placeholder="Name or address\u2026"
24034
24507
  description: ""
24035
24508
  }
24036
24509
  ],
24037
- version: "11.8.0"
24510
+ version: "11.10.0"
24038
24511
  },
24039
24512
  {
24040
24513
  id: "snackbar",
@@ -24089,7 +24562,7 @@ placeholder="Name or address\u2026"
24089
24562
  description: ""
24090
24563
  }
24091
24564
  ],
24092
- version: "11.8.0"
24565
+ version: "11.10.0"
24093
24566
  },
24094
24567
  {
24095
24568
  id: "confirmation",
@@ -24138,7 +24611,7 @@ placeholder="Name or address\u2026"
24138
24611
  description: ""
24139
24612
  }
24140
24613
  ],
24141
- version: "11.8.0"
24614
+ version: "11.10.0"
24142
24615
  },
24143
24616
  {
24144
24617
  id: "notification-service",
@@ -24205,7 +24678,7 @@ placeholder="Name or address\u2026"
24205
24678
  description: ""
24206
24679
  }
24207
24680
  ],
24208
- version: "11.8.0"
24681
+ version: "11.10.0"
24209
24682
  },
24210
24683
  {
24211
24684
  id: "option",
@@ -24242,7 +24715,7 @@ placeholder="Name or address\u2026"
24242
24715
  description: "Visible and announced, but not committable; listbox navigation skips it."
24243
24716
  }
24244
24717
  ],
24245
- version: "11.8.0"
24718
+ version: "11.10.0"
24246
24719
  },
24247
24720
  {
24248
24721
  id: "options",
@@ -24254,7 +24727,7 @@ placeholder="Name or address\u2026"
24254
24727
  summary: "",
24255
24728
  description: "",
24256
24729
  members: [],
24257
- version: "11.8.0"
24730
+ version: "11.10.0"
24258
24731
  },
24259
24732
  {
24260
24733
  id: "use-timer",
@@ -24266,7 +24739,7 @@ placeholder="Name or address\u2026"
24266
24739
  summary: "",
24267
24740
  description: "",
24268
24741
  members: [],
24269
- version: "11.8.0"
24742
+ version: "11.10.0"
24270
24743
  },
24271
24744
  {
24272
24745
  id: "acceptable-file",
@@ -24278,7 +24751,7 @@ placeholder="Name or address\u2026"
24278
24751
  summary: "",
24279
24752
  description: "",
24280
24753
  members: [],
24281
- version: "11.8.0"
24754
+ version: "11.10.0"
24282
24755
  },
24283
24756
  {
24284
24757
  id: "get-file-extension",
@@ -24290,7 +24763,7 @@ placeholder="Name or address\u2026"
24290
24763
  summary: "",
24291
24764
  description: "",
24292
24765
  members: [],
24293
- version: "11.8.0"
24766
+ version: "11.10.0"
24294
24767
  },
24295
24768
  {
24296
24769
  id: "query-permission",
@@ -24302,7 +24775,7 @@ placeholder="Name or address\u2026"
24302
24775
  summary: "The current state of a browser permission.",
24303
24776
  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
24777
  members: [],
24305
- version: "11.8.0"
24778
+ version: "11.10.0"
24306
24779
  },
24307
24780
  {
24308
24781
  id: "permission-service",
@@ -24327,7 +24800,7 @@ placeholder="Name or address\u2026"
24327
24800
  description: ""
24328
24801
  }
24329
24802
  ],
24330
- version: "11.8.0"
24803
+ version: "11.10.0"
24331
24804
  },
24332
24805
  {
24333
24806
  id: "permission",
@@ -24339,7 +24812,7 @@ placeholder="Name or address\u2026"
24339
24812
  summary: "",
24340
24813
  description: "",
24341
24814
  members: [],
24342
- version: "11.8.0"
24815
+ version: "11.10.0"
24343
24816
  },
24344
24817
  {
24345
24818
  id: "permission-state",
@@ -24351,7 +24824,7 @@ placeholder="Name or address\u2026"
24351
24824
  summary: "",
24352
24825
  description: "",
24353
24826
  members: [],
24354
- version: "11.8.0"
24827
+ version: "11.10.0"
24355
24828
  },
24356
24829
  {
24357
24830
  id: "clipboard-copy-result",
@@ -24363,7 +24836,7 @@ placeholder="Name or address\u2026"
24363
24836
  summary: "How a copy ended: - `copied` \u2014 the content is on the clipboard.",
24364
24837
  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
24838
  members: [],
24366
- version: "11.8.0"
24839
+ version: "11.10.0"
24367
24840
  },
24368
24841
  {
24369
24842
  id: "clipboard-data",
@@ -24375,7 +24848,7 @@ placeholder="Name or address\u2026"
24375
24848
  summary: "One clipboard representation; a promise lets the data arrive after the gesture.",
24376
24849
  description: "One clipboard representation; a promise lets the data arrive after the gesture.",
24377
24850
  members: [],
24378
- version: "11.8.0"
24851
+ version: "11.10.0"
24379
24852
  },
24380
24853
  {
24381
24854
  id: "clipboard-content",
@@ -24387,7 +24860,7 @@ placeholder="Name or address\u2026"
24387
24860
  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
24861
  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
24862
  members: [],
24390
- version: "11.8.0"
24863
+ version: "11.10.0"
24391
24864
  },
24392
24865
  {
24393
24866
  id: "copy-to-clipboard",
@@ -24399,14 +24872,14 @@ placeholder="Name or address\u2026"
24399
24872
  summary: "Copies text or rich content with the Async Clipboard API.",
24400
24873
  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
24874
  members: [],
24402
- version: "11.8.0"
24875
+ version: "11.10.0"
24403
24876
  }
24404
24877
  ],
24405
24878
  utilityDocs: [
24406
24879
  {
24407
24880
  module: "datasource",
24408
24881
  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._"
24882
+ 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
24883
  },
24411
24884
  {
24412
24885
  module: "local-storage",
@@ -26411,13 +26884,21 @@ var buildComponents = (c) => ({
26411
26884
  }
26412
26885
  },
26413
26886
  card: {
26414
- options: { borderRadius: "xs" },
26887
+ options: {
26888
+ borderRadius: "xs",
26889
+ selectedBorder: "primary",
26890
+ selectedColor: "primary-container"
26891
+ },
26415
26892
  fixed: {
26416
26893
  overflow: "hidden",
26417
26894
  backgroundColor: c.background,
26418
26895
  color: c["on-background"]
26419
26896
  }
26420
26897
  },
26898
+ cardGroup: { options: {
26899
+ gap: "md",
26900
+ templateColumns: "repeat(auto-fit, minmax(160px, 1fr))"
26901
+ } },
26421
26902
  cardHeader: {
26422
26903
  fixed: { padding: "12px 24px" },
26423
26904
  variants: {
@@ -26473,7 +26954,10 @@ var buildComponents = (c) => ({
26473
26954
  rowHoverColor: "primary-container",
26474
26955
  loadingOverlayColor: "scrim",
26475
26956
  loadingSpinnerColor: "primary",
26476
- loadingSpinnerSize: 40
26957
+ loadingSpinnerSize: 40,
26958
+ selectionColumnWidth: 40,
26959
+ selectionCheckboxSize: "sm",
26960
+ selectedRowColor: void 0
26477
26961
  } },
26478
26962
  notificationBadge: {
26479
26963
  options: {
@@ -28041,4 +28525,4 @@ export {
28041
28525
  buildStoredTheme,
28042
28526
  createUniServer
28043
28527
  };
28044
- //# sourceMappingURL=chunk-R4RLYWUY.js.map
28528
+ //# sourceMappingURL=chunk-G27EXV3Z.js.map