@uni-design-system/uni-mcp 4.6.0 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +267 -0
- package/dist/{chunk-GT3T5DVX.js → chunk-JOMMURY6.js} +2936 -445
- package/dist/chunk-JOMMURY6.js.map +1 -0
- package/dist/http.js +1 -1
- package/dist/server.js +1 -1
- package/dist/stdio.js +1 -1
- package/package.json +4 -3
- package/dist/chunk-GT3T5DVX.js.map +0 -1
|
@@ -7,16 +7,16 @@ import { z } from "zod";
|
|
|
7
7
|
// src/data/uni-index.json
|
|
8
8
|
var uni_index_default = {
|
|
9
9
|
meta: {
|
|
10
|
-
version: "8.
|
|
11
|
-
builtAt: "2026-08-
|
|
10
|
+
version: "8.2.0",
|
|
11
|
+
builtAt: "2026-08-20T22:58:33.744Z",
|
|
12
12
|
frameworks: [
|
|
13
13
|
"angular"
|
|
14
14
|
],
|
|
15
15
|
counts: {
|
|
16
|
-
components:
|
|
17
|
-
tokens:
|
|
16
|
+
components: 76,
|
|
17
|
+
tokens: 353,
|
|
18
18
|
themes: 2,
|
|
19
|
-
examples:
|
|
19
|
+
examples: 168
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
components: [
|
|
@@ -27,7 +27,7 @@ var uni_index_default = {
|
|
|
27
27
|
summary: "",
|
|
28
28
|
description: "",
|
|
29
29
|
category: "feedback",
|
|
30
|
-
version: "8.
|
|
30
|
+
version: "8.2.0",
|
|
31
31
|
bindings: {
|
|
32
32
|
angular: {
|
|
33
33
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -98,10 +98,10 @@ var uni_index_default = {
|
|
|
98
98
|
id: "app-bar",
|
|
99
99
|
name: "AppBar",
|
|
100
100
|
status: "stable",
|
|
101
|
-
summary: "",
|
|
102
|
-
description: "",
|
|
101
|
+
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.",
|
|
102
|
+
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.",
|
|
103
103
|
category: "components",
|
|
104
|
-
version: "8.
|
|
104
|
+
version: "8.2.0",
|
|
105
105
|
bindings: {
|
|
106
106
|
angular: {
|
|
107
107
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -155,10 +155,10 @@ var uni_index_default = {
|
|
|
155
155
|
id: "avatar",
|
|
156
156
|
name: "Avatar",
|
|
157
157
|
status: "stable",
|
|
158
|
-
summary: "",
|
|
159
|
-
description: "",
|
|
158
|
+
summary: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol.",
|
|
159
|
+
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.",
|
|
160
160
|
category: "components",
|
|
161
|
-
version: "8.
|
|
161
|
+
version: "8.2.0",
|
|
162
162
|
bindings: {
|
|
163
163
|
angular: {
|
|
164
164
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -234,10 +234,10 @@ var uni_index_default = {
|
|
|
234
234
|
id: "avatar-group",
|
|
235
235
|
name: "AvatarGroup",
|
|
236
236
|
status: "stable",
|
|
237
|
-
summary: "",
|
|
238
|
-
description: "",
|
|
237
|
+
summary: "Overlapping stack of avatars.",
|
|
238
|
+
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.",
|
|
239
239
|
category: "components",
|
|
240
|
-
version: "8.
|
|
240
|
+
version: "8.2.0",
|
|
241
241
|
bindings: {
|
|
242
242
|
angular: {
|
|
243
243
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -270,7 +270,7 @@ var uni_index_default = {
|
|
|
270
270
|
summary: "",
|
|
271
271
|
description: "",
|
|
272
272
|
category: "primitives",
|
|
273
|
-
version: "8.
|
|
273
|
+
version: "8.2.0",
|
|
274
274
|
bindings: {
|
|
275
275
|
angular: {
|
|
276
276
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -351,7 +351,7 @@ var uni_index_default = {
|
|
|
351
351
|
summary: "",
|
|
352
352
|
description: "",
|
|
353
353
|
category: "feedback",
|
|
354
|
-
version: "8.
|
|
354
|
+
version: "8.2.0",
|
|
355
355
|
bindings: {
|
|
356
356
|
angular: {
|
|
357
357
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -432,7 +432,7 @@ var uni_index_default = {
|
|
|
432
432
|
summary: "",
|
|
433
433
|
description: "",
|
|
434
434
|
category: "directives",
|
|
435
|
-
version: "8.
|
|
435
|
+
version: "8.2.0",
|
|
436
436
|
bindings: {
|
|
437
437
|
angular: {
|
|
438
438
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -453,10 +453,10 @@ var uni_index_default = {
|
|
|
453
453
|
id: "box",
|
|
454
454
|
name: "Box",
|
|
455
455
|
status: "stable",
|
|
456
|
-
summary: "",
|
|
457
|
-
description: "",
|
|
456
|
+
summary: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`.',
|
|
457
|
+
description: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`. Exception: other components\' host elements (`<uni-card box-layout>` would put two components on one element) \u2014 wrap those in a `<div box-layout>`. 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.',
|
|
458
458
|
category: "layout",
|
|
459
|
-
version: "8.
|
|
459
|
+
version: "8.2.0",
|
|
460
460
|
bindings: {
|
|
461
461
|
angular: {
|
|
462
462
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -816,10 +816,10 @@ var uni_index_default = {
|
|
|
816
816
|
id: "breadcrumb",
|
|
817
817
|
name: "Breadcrumb",
|
|
818
818
|
status: "stable",
|
|
819
|
-
summary: "",
|
|
820
|
-
description: "",
|
|
819
|
+
summary: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative.',
|
|
820
|
+
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.',
|
|
821
821
|
category: "components",
|
|
822
|
-
version: "8.
|
|
822
|
+
version: "8.2.0",
|
|
823
823
|
bindings: {
|
|
824
824
|
angular: {
|
|
825
825
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -888,7 +888,7 @@ var uni_index_default = {
|
|
|
888
888
|
summary: "",
|
|
889
889
|
description: "",
|
|
890
890
|
category: "primitives",
|
|
891
|
-
version: "8.
|
|
891
|
+
version: "8.2.0",
|
|
892
892
|
bindings: {
|
|
893
893
|
angular: {
|
|
894
894
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1031,7 +1031,7 @@ var uni_index_default = {
|
|
|
1031
1031
|
summary: "",
|
|
1032
1032
|
description: "",
|
|
1033
1033
|
category: "primitives",
|
|
1034
|
-
version: "8.
|
|
1034
|
+
version: "8.2.0",
|
|
1035
1035
|
bindings: {
|
|
1036
1036
|
angular: {
|
|
1037
1037
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1056,6 +1056,232 @@ var uni_index_default = {
|
|
|
1056
1056
|
},
|
|
1057
1057
|
relatedTokens: []
|
|
1058
1058
|
},
|
|
1059
|
+
{
|
|
1060
|
+
id: "calendar",
|
|
1061
|
+
name: "Calendar",
|
|
1062
|
+
status: "stable",
|
|
1063
|
+
summary: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates.",
|
|
1064
|
+
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.",
|
|
1065
|
+
category: "forms",
|
|
1066
|
+
version: "8.2.0",
|
|
1067
|
+
bindings: {
|
|
1068
|
+
angular: {
|
|
1069
|
+
importPath: "@uni-design-system/uni-angular",
|
|
1070
|
+
selectorOrTag: "uni-calendar, Calendar",
|
|
1071
|
+
api: [
|
|
1072
|
+
{
|
|
1073
|
+
name: "value",
|
|
1074
|
+
kind: "model",
|
|
1075
|
+
type: "UniCalendarValue",
|
|
1076
|
+
required: false,
|
|
1077
|
+
description: ""
|
|
1078
|
+
},
|
|
1079
|
+
{
|
|
1080
|
+
name: "disabled",
|
|
1081
|
+
kind: "input",
|
|
1082
|
+
type: "boolean",
|
|
1083
|
+
required: false,
|
|
1084
|
+
default: "false",
|
|
1085
|
+
description: ""
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
name: "touched",
|
|
1089
|
+
kind: "model",
|
|
1090
|
+
type: "boolean",
|
|
1091
|
+
required: false,
|
|
1092
|
+
default: "false",
|
|
1093
|
+
description: ""
|
|
1094
|
+
},
|
|
1095
|
+
{
|
|
1096
|
+
name: "invalid",
|
|
1097
|
+
kind: "input",
|
|
1098
|
+
type: "boolean",
|
|
1099
|
+
required: false,
|
|
1100
|
+
default: "false",
|
|
1101
|
+
description: ""
|
|
1102
|
+
},
|
|
1103
|
+
{
|
|
1104
|
+
name: "dirty",
|
|
1105
|
+
kind: "input",
|
|
1106
|
+
type: "boolean",
|
|
1107
|
+
required: false,
|
|
1108
|
+
default: "false",
|
|
1109
|
+
description: ""
|
|
1110
|
+
},
|
|
1111
|
+
{
|
|
1112
|
+
name: "required",
|
|
1113
|
+
kind: "input",
|
|
1114
|
+
type: "boolean",
|
|
1115
|
+
required: false,
|
|
1116
|
+
default: "false",
|
|
1117
|
+
description: ""
|
|
1118
|
+
},
|
|
1119
|
+
{
|
|
1120
|
+
name: "ariaDescribedBy",
|
|
1121
|
+
kind: "input",
|
|
1122
|
+
type: "string",
|
|
1123
|
+
required: false,
|
|
1124
|
+
description: ""
|
|
1125
|
+
},
|
|
1126
|
+
{
|
|
1127
|
+
name: "mode",
|
|
1128
|
+
kind: "input",
|
|
1129
|
+
type: "UniCalendarMode",
|
|
1130
|
+
required: false,
|
|
1131
|
+
default: "'single'",
|
|
1132
|
+
description: "`'single'` reads/writes a `UniDate`; `'range'` a `UniDateRange`."
|
|
1133
|
+
},
|
|
1134
|
+
{
|
|
1135
|
+
name: "month",
|
|
1136
|
+
kind: "model",
|
|
1137
|
+
type: "string",
|
|
1138
|
+
required: false,
|
|
1139
|
+
description: "Shown month, `'YYYY-MM'` \u2014 two-way, so an app can drive \"jump to June\"."
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
name: "minDate",
|
|
1143
|
+
kind: "input",
|
|
1144
|
+
type: "UniDate",
|
|
1145
|
+
required: false,
|
|
1146
|
+
description: "Earliest selectable date (inclusive)."
|
|
1147
|
+
},
|
|
1148
|
+
{
|
|
1149
|
+
name: "maxDate",
|
|
1150
|
+
kind: "input",
|
|
1151
|
+
type: "UniDate",
|
|
1152
|
+
required: false,
|
|
1153
|
+
description: "Latest selectable date (inclusive)."
|
|
1154
|
+
},
|
|
1155
|
+
{
|
|
1156
|
+
name: "markers",
|
|
1157
|
+
kind: "input",
|
|
1158
|
+
type: "UniCalendarMarker[]",
|
|
1159
|
+
required: false,
|
|
1160
|
+
default: "[]",
|
|
1161
|
+
description: "Availability dots; `label` extends the day's accessible name."
|
|
1162
|
+
},
|
|
1163
|
+
{
|
|
1164
|
+
name: "locale",
|
|
1165
|
+
kind: "input",
|
|
1166
|
+
type: "string",
|
|
1167
|
+
required: false,
|
|
1168
|
+
description: "BCP 47 tag; defaults to the document language, then the browser's."
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
name: "weekStart",
|
|
1172
|
+
kind: "input",
|
|
1173
|
+
type: "0 | 1 | 2 | 3 | 4 | 5 | 6",
|
|
1174
|
+
required: false,
|
|
1175
|
+
description: "First day of week, 0 = Sunday; defaults from the locale's week info."
|
|
1176
|
+
},
|
|
1177
|
+
{
|
|
1178
|
+
name: "ariaLabel",
|
|
1179
|
+
kind: "input",
|
|
1180
|
+
type: "string",
|
|
1181
|
+
required: false,
|
|
1182
|
+
description: "Names the grid when it stands alone (otherwise the heading names it)."
|
|
1183
|
+
},
|
|
1184
|
+
{
|
|
1185
|
+
name: "size",
|
|
1186
|
+
kind: "input",
|
|
1187
|
+
type: "Size",
|
|
1188
|
+
required: false,
|
|
1189
|
+
default: "'md'",
|
|
1190
|
+
description: "Day geometry token; `sm`/`md`/`lg` map to the theme's `calendar` sizes."
|
|
1191
|
+
},
|
|
1192
|
+
{
|
|
1193
|
+
name: "selected",
|
|
1194
|
+
kind: "output",
|
|
1195
|
+
type: "UniDate",
|
|
1196
|
+
required: false,
|
|
1197
|
+
description: "Each committed day, including both ends of a range."
|
|
1198
|
+
}
|
|
1199
|
+
]
|
|
1200
|
+
}
|
|
1201
|
+
},
|
|
1202
|
+
examples: [
|
|
1203
|
+
{
|
|
1204
|
+
title: "Primary",
|
|
1205
|
+
framework: "angular",
|
|
1206
|
+
code: '<!-- Storybook story: Primary -->\n<uni-calendar size="sm" ariaLabel="Small" month="${MONTH}" />\n<uni-calendar size="md" ariaLabel="Medium" month="${MONTH}" />\n<uni-calendar size="lg" ariaLabel="Large" month="${MONTH}" />\n<!-- args:\n{ value: dayIn(12), month: MONTH }\n-->'
|
|
1207
|
+
},
|
|
1208
|
+
{
|
|
1209
|
+
title: "Range",
|
|
1210
|
+
framework: "angular",
|
|
1211
|
+
code: '<!-- Storybook story: Range -->\n<uni-calendar size="sm" ariaLabel="Small" month="${MONTH}" />\n<uni-calendar size="md" ariaLabel="Medium" month="${MONTH}" />\n<uni-calendar size="lg" ariaLabel="Large" month="${MONTH}" />\n<!-- args:\n{ mode: \'range\', value: { start: dayIn(3), end: dayIn(7) }, month: MONTH }\n-->'
|
|
1212
|
+
},
|
|
1213
|
+
{
|
|
1214
|
+
title: "Markers",
|
|
1215
|
+
framework: "angular",
|
|
1216
|
+
code: `<!-- Storybook story: Markers -->
|
|
1217
|
+
<uni-calendar size="sm" ariaLabel="Small" month="\${MONTH}" />
|
|
1218
|
+
<uni-calendar size="md" ariaLabel="Medium" month="\${MONTH}" />
|
|
1219
|
+
<uni-calendar size="lg" ariaLabel="Large" month="\${MONTH}" />
|
|
1220
|
+
<!-- args:
|
|
1221
|
+
{
|
|
1222
|
+
month: MONTH,
|
|
1223
|
+
markers: [
|
|
1224
|
+
{ date: dayIn(4), variant: 'success', label: '3 slots open' },
|
|
1225
|
+
{ date: dayIn(4), variant: 'primary' },
|
|
1226
|
+
{ date: dayIn(16), variant: 'warn', label: '1 slot open' },
|
|
1227
|
+
{ date: dayIn(24), variant: 'secondary' },
|
|
1228
|
+
],
|
|
1229
|
+
}
|
|
1230
|
+
-->`
|
|
1231
|
+
},
|
|
1232
|
+
{
|
|
1233
|
+
title: "Fenced And Disabled",
|
|
1234
|
+
framework: "angular",
|
|
1235
|
+
code: '<!-- Storybook story: Fenced And Disabled -->\n<uni-calendar size="sm" ariaLabel="Small" month="${MONTH}" />\n<uni-calendar size="md" ariaLabel="Medium" month="${MONTH}" />\n<uni-calendar size="lg" ariaLabel="Large" month="${MONTH}" />\n<!-- args:\n{\n month: MONTH,\n minDate: dayIn(5),\n maxDate: dayIn(25),\n disabledDates: (date: string) => [0, 6].includes(new Date(`${date}T00:00:00Z`).getUTCDay()),\n }\n-->'
|
|
1236
|
+
},
|
|
1237
|
+
{
|
|
1238
|
+
title: "Sizes",
|
|
1239
|
+
framework: "angular",
|
|
1240
|
+
code: '<!-- Storybook story: Sizes -->\n<uni-calendar size="sm" ariaLabel="Small" month="${MONTH}" />\n<uni-calendar size="md" ariaLabel="Medium" month="${MONTH}" />\n<uni-calendar size="lg" ariaLabel="Large" month="${MONTH}" />\n<!-- args:\n{ locale: \'de-DE\', weekStart: 1, month: MONTH, value: dayIn(12) }\n-->'
|
|
1241
|
+
},
|
|
1242
|
+
{
|
|
1243
|
+
title: "Locale And Week Start",
|
|
1244
|
+
framework: "angular",
|
|
1245
|
+
code: '<!-- Storybook story: Locale And Week Start -->\n<uni-calendar size="sm" ariaLabel="Small" month="${MONTH}" />\n<uni-calendar size="md" ariaLabel="Medium" month="${MONTH}" />\n<uni-calendar size="lg" ariaLabel="Large" month="${MONTH}" />\n<!-- args:\n{ locale: \'de-DE\', weekStart: 1, month: MONTH, value: dayIn(12) }\n-->'
|
|
1246
|
+
},
|
|
1247
|
+
{
|
|
1248
|
+
title: "Scheduling",
|
|
1249
|
+
framework: "angular",
|
|
1250
|
+
code: '<!-- Storybook story: Scheduling -->\n<uni-calendar size="sm" ariaLabel="Small" month="${MONTH}" />\n<uni-calendar size="md" ariaLabel="Medium" month="${MONTH}" />\n<uni-calendar size="lg" ariaLabel="Large" month="${MONTH}" />'
|
|
1251
|
+
}
|
|
1252
|
+
],
|
|
1253
|
+
guidelines: {
|
|
1254
|
+
whenToUse: "An inline month calendar \u2014 a form control in its own right, not just the\ninside of a date picker. It selects a single date or a start\u2013end range, marks\ndays with app-driven availability dots, and fences selection with\n`minDate`/`maxDate`/`disabledDates`. Values are plain ISO strings\n(`'2026-08-20'`, `{ start, end }`), never `Date` objects, so bindings are\ntimezone-free, serializable and sortable with `<`.\nReach for it directly when the calendar should stay on screen \u2014 scheduling\npages, availability dashboards, booking flows. For a text field with this\ngrid in a popup, use `uni-date-input`; both render the same component, so it\nis one grid to learn, test and theme.",
|
|
1255
|
+
dos: [
|
|
1256
|
+
"Bind ISO strings: `[value]=\"'2026-08-20'\"` is a complete, correct binding.",
|
|
1257
|
+
"Drive availability through `markers` and `disabledDates` from app data.",
|
|
1258
|
+
"Give a standalone calendar an `ariaLabel` naming the question it answers."
|
|
1259
|
+
],
|
|
1260
|
+
donts: [
|
|
1261
|
+
"Don't convert to `Date` objects at the edge of the component \u2014 midnight-UTC",
|
|
1262
|
+
"Don't restyle selection colours per instance; retheme the `primary` pair.",
|
|
1263
|
+
"Don't build a popup date field from this yourself \u2014 `uni-date-input`"
|
|
1264
|
+
],
|
|
1265
|
+
accessibility: [
|
|
1266
|
+
'The month grid is `role="grid"` labelled by the month heading (or',
|
|
1267
|
+
'Every day is a real `<button>` in a `role="gridcell"`, named with its full',
|
|
1268
|
+
"One tab stop: roving `tabindex` inside the grid; \u2190/\u2192 move a day, \u2191/\u2193 a",
|
|
1269
|
+
'Today is `aria-current="date"` with an outline; selection is a fill;',
|
|
1270
|
+
'Selections and range progress announce through one `role="status"` region;',
|
|
1271
|
+
"`aria-invalid` is gated on `invalid && (touched || dirty)`, per the"
|
|
1272
|
+
]
|
|
1273
|
+
},
|
|
1274
|
+
relatedTokens: [
|
|
1275
|
+
"calendar.behavior.dayBorderRadius",
|
|
1276
|
+
"calendar.behavior.typeface",
|
|
1277
|
+
"calendar.behavior.gap",
|
|
1278
|
+
"calendar.behavior.navPrevSymbol",
|
|
1279
|
+
"calendar.behavior.navNextSymbol",
|
|
1280
|
+
"calendar.behavior.weekdayFormat",
|
|
1281
|
+
"calendar.behavior.showOutsideDays",
|
|
1282
|
+
"calendar.behavior.todayStyle"
|
|
1283
|
+
]
|
|
1284
|
+
},
|
|
1059
1285
|
{
|
|
1060
1286
|
id: "card",
|
|
1061
1287
|
name: "Card",
|
|
@@ -1063,7 +1289,7 @@ var uni_index_default = {
|
|
|
1063
1289
|
summary: "",
|
|
1064
1290
|
description: "",
|
|
1065
1291
|
category: "layout",
|
|
1066
|
-
version: "8.
|
|
1292
|
+
version: "8.2.0",
|
|
1067
1293
|
bindings: {
|
|
1068
1294
|
angular: {
|
|
1069
1295
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1108,7 +1334,7 @@ var uni_index_default = {
|
|
|
1108
1334
|
summary: "",
|
|
1109
1335
|
description: "",
|
|
1110
1336
|
category: "layout",
|
|
1111
|
-
version: "8.
|
|
1337
|
+
version: "8.2.0",
|
|
1112
1338
|
bindings: {
|
|
1113
1339
|
angular: {
|
|
1114
1340
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1132,7 +1358,7 @@ var uni_index_default = {
|
|
|
1132
1358
|
summary: "",
|
|
1133
1359
|
description: "",
|
|
1134
1360
|
category: "layout",
|
|
1135
|
-
version: "8.
|
|
1361
|
+
version: "8.2.0",
|
|
1136
1362
|
bindings: {
|
|
1137
1363
|
angular: {
|
|
1138
1364
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1173,7 +1399,7 @@ var uni_index_default = {
|
|
|
1173
1399
|
summary: "",
|
|
1174
1400
|
description: "",
|
|
1175
1401
|
category: "layout",
|
|
1176
|
-
version: "8.
|
|
1402
|
+
version: "8.2.0",
|
|
1177
1403
|
bindings: {
|
|
1178
1404
|
angular: {
|
|
1179
1405
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1228,7 +1454,7 @@ var uni_index_default = {
|
|
|
1228
1454
|
summary: "",
|
|
1229
1455
|
description: "",
|
|
1230
1456
|
category: "forms",
|
|
1231
|
-
version: "8.
|
|
1457
|
+
version: "8.2.0",
|
|
1232
1458
|
bindings: {
|
|
1233
1459
|
angular: {
|
|
1234
1460
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1355,7 +1581,9 @@ var uni_index_default = {
|
|
|
1355
1581
|
},
|
|
1356
1582
|
relatedTokens: [
|
|
1357
1583
|
"checkbox.behavior.size",
|
|
1358
|
-
"checkbox.behavior.boxColor"
|
|
1584
|
+
"checkbox.behavior.boxColor",
|
|
1585
|
+
"checkbox.behavior.borderRadius",
|
|
1586
|
+
"checkbox.behavior.focusRingGap"
|
|
1359
1587
|
]
|
|
1360
1588
|
},
|
|
1361
1589
|
{
|
|
@@ -1365,7 +1593,7 @@ var uni_index_default = {
|
|
|
1365
1593
|
summary: "",
|
|
1366
1594
|
description: "",
|
|
1367
1595
|
category: "feedback",
|
|
1368
|
-
version: "8.
|
|
1596
|
+
version: "8.2.0",
|
|
1369
1597
|
bindings: {
|
|
1370
1598
|
angular: {
|
|
1371
1599
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1412,7 +1640,7 @@ var uni_index_default = {
|
|
|
1412
1640
|
summary: "",
|
|
1413
1641
|
description: "",
|
|
1414
1642
|
category: "forms",
|
|
1415
|
-
version: "8.
|
|
1643
|
+
version: "8.2.0",
|
|
1416
1644
|
bindings: {
|
|
1417
1645
|
angular: {
|
|
1418
1646
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1495,7 +1723,7 @@ var uni_index_default = {
|
|
|
1495
1723
|
summary: "",
|
|
1496
1724
|
description: "",
|
|
1497
1725
|
category: "data",
|
|
1498
|
-
version: "8.
|
|
1726
|
+
version: "8.2.0",
|
|
1499
1727
|
bindings: {
|
|
1500
1728
|
angular: {
|
|
1501
1729
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1590,179 +1818,344 @@ var uni_index_default = {
|
|
|
1590
1818
|
relatedTokens: []
|
|
1591
1819
|
},
|
|
1592
1820
|
{
|
|
1593
|
-
id: "
|
|
1594
|
-
name: "
|
|
1821
|
+
id: "date-input",
|
|
1822
|
+
name: "DateInput",
|
|
1595
1823
|
status: "stable",
|
|
1596
|
-
summary: "",
|
|
1597
|
-
description: "",
|
|
1824
|
+
summary: "Date field with free-typed parsing and a popup calendar.",
|
|
1825
|
+
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.",
|
|
1598
1826
|
category: "forms",
|
|
1599
|
-
version: "8.
|
|
1827
|
+
version: "8.2.0",
|
|
1600
1828
|
bindings: {
|
|
1601
1829
|
angular: {
|
|
1602
1830
|
importPath: "@uni-design-system/uni-angular",
|
|
1603
|
-
selectorOrTag: "uni-
|
|
1831
|
+
selectorOrTag: "uni-date-input, DateInput",
|
|
1604
1832
|
api: [
|
|
1605
1833
|
{
|
|
1606
|
-
name: "
|
|
1834
|
+
name: "value",
|
|
1835
|
+
kind: "model",
|
|
1836
|
+
type: "UniDate | undefined",
|
|
1837
|
+
required: false,
|
|
1838
|
+
description: ""
|
|
1839
|
+
},
|
|
1840
|
+
{
|
|
1841
|
+
name: "disabled",
|
|
1607
1842
|
kind: "input",
|
|
1608
|
-
type: "
|
|
1843
|
+
type: "boolean",
|
|
1609
1844
|
required: false,
|
|
1845
|
+
default: "false",
|
|
1610
1846
|
description: ""
|
|
1611
1847
|
},
|
|
1612
1848
|
{
|
|
1613
|
-
name: "
|
|
1849
|
+
name: "touched",
|
|
1850
|
+
kind: "model",
|
|
1851
|
+
type: "boolean",
|
|
1852
|
+
required: false,
|
|
1853
|
+
default: "false",
|
|
1854
|
+
description: ""
|
|
1855
|
+
},
|
|
1856
|
+
{
|
|
1857
|
+
name: "invalid",
|
|
1614
1858
|
kind: "input",
|
|
1615
|
-
type: "
|
|
1859
|
+
type: "boolean",
|
|
1616
1860
|
required: false,
|
|
1861
|
+
default: "false",
|
|
1617
1862
|
description: ""
|
|
1618
1863
|
},
|
|
1619
1864
|
{
|
|
1620
|
-
name: "
|
|
1865
|
+
name: "dirty",
|
|
1621
1866
|
kind: "input",
|
|
1622
|
-
type: "
|
|
1867
|
+
type: "boolean",
|
|
1623
1868
|
required: false,
|
|
1624
|
-
default: "
|
|
1869
|
+
default: "false",
|
|
1625
1870
|
description: ""
|
|
1626
1871
|
},
|
|
1627
1872
|
{
|
|
1628
|
-
name: "
|
|
1873
|
+
name: "required",
|
|
1874
|
+
kind: "input",
|
|
1875
|
+
type: "boolean",
|
|
1876
|
+
required: false,
|
|
1877
|
+
default: "false",
|
|
1878
|
+
description: ""
|
|
1879
|
+
},
|
|
1880
|
+
{
|
|
1881
|
+
name: "ariaDescribedBy",
|
|
1629
1882
|
kind: "input",
|
|
1630
1883
|
type: "string",
|
|
1631
1884
|
required: false,
|
|
1632
|
-
description: "
|
|
1885
|
+
description: ""
|
|
1886
|
+
},
|
|
1887
|
+
{
|
|
1888
|
+
name: "label",
|
|
1889
|
+
kind: "input",
|
|
1890
|
+
type: "string",
|
|
1891
|
+
required: true,
|
|
1892
|
+
description: 'Accessible name for the field, e.g. "Appointment date".'
|
|
1633
1893
|
},
|
|
1634
1894
|
{
|
|
1635
1895
|
name: "placeholder",
|
|
1636
1896
|
kind: "input",
|
|
1637
1897
|
type: "string",
|
|
1638
1898
|
required: false,
|
|
1639
|
-
|
|
1899
|
+
description: "Defaults to the locale's digit pattern, e.g. `MM/DD/YYYY`."
|
|
1900
|
+
},
|
|
1901
|
+
{
|
|
1902
|
+
name: "displayFormat",
|
|
1903
|
+
kind: "input",
|
|
1904
|
+
type: "Intl.DateTimeFormatOptions",
|
|
1905
|
+
required: false,
|
|
1906
|
+
default: "{ dateStyle: 'medium' }",
|
|
1907
|
+
description: "How the committed value renders, e.g. `{ dateStyle: 'long' }`."
|
|
1908
|
+
},
|
|
1909
|
+
{
|
|
1910
|
+
name: "locale",
|
|
1911
|
+
kind: "input",
|
|
1912
|
+
type: "string",
|
|
1913
|
+
required: false,
|
|
1914
|
+
description: "BCP 47 tag; defaults to the document language, then the browser's."
|
|
1915
|
+
},
|
|
1916
|
+
{
|
|
1917
|
+
name: "commitOnBlur",
|
|
1918
|
+
kind: "input",
|
|
1919
|
+
type: "boolean",
|
|
1920
|
+
required: false,
|
|
1921
|
+
default: "true",
|
|
1640
1922
|
description: ""
|
|
1641
1923
|
},
|
|
1642
1924
|
{
|
|
1643
|
-
name: "
|
|
1925
|
+
name: "embedded",
|
|
1644
1926
|
kind: "input",
|
|
1645
1927
|
type: "boolean",
|
|
1646
1928
|
required: false,
|
|
1647
1929
|
default: "false",
|
|
1648
|
-
description: ""
|
|
1930
|
+
description: "Renders without its own input-box chrome, for composers like uni-date-time-input."
|
|
1649
1931
|
},
|
|
1650
1932
|
{
|
|
1651
|
-
name: "
|
|
1933
|
+
name: "minDate",
|
|
1652
1934
|
kind: "input",
|
|
1653
|
-
type: "
|
|
1935
|
+
type: "UniDate",
|
|
1654
1936
|
required: false,
|
|
1655
1937
|
description: ""
|
|
1656
1938
|
},
|
|
1657
1939
|
{
|
|
1658
|
-
name: "
|
|
1940
|
+
name: "maxDate",
|
|
1659
1941
|
kind: "input",
|
|
1660
|
-
type: "
|
|
1942
|
+
type: "UniDate",
|
|
1661
1943
|
required: false,
|
|
1662
|
-
default: "undefined",
|
|
1663
1944
|
description: ""
|
|
1664
1945
|
},
|
|
1665
1946
|
{
|
|
1666
|
-
name: "
|
|
1947
|
+
name: "markers",
|
|
1667
1948
|
kind: "input",
|
|
1668
|
-
type: "
|
|
1949
|
+
type: "UniCalendarMarker[]",
|
|
1669
1950
|
required: false,
|
|
1951
|
+
default: "[]",
|
|
1670
1952
|
description: ""
|
|
1671
1953
|
},
|
|
1672
1954
|
{
|
|
1673
|
-
name: "
|
|
1955
|
+
name: "weekStart",
|
|
1674
1956
|
kind: "input",
|
|
1675
|
-
type: "
|
|
1957
|
+
type: "0 | 1 | 2 | 3 | 4 | 5 | 6",
|
|
1676
1958
|
required: false,
|
|
1677
1959
|
description: ""
|
|
1678
1960
|
},
|
|
1679
1961
|
{
|
|
1680
|
-
name: "
|
|
1962
|
+
name: "opened",
|
|
1681
1963
|
kind: "output",
|
|
1682
|
-
type: "
|
|
1964
|
+
type: "void",
|
|
1683
1965
|
required: false,
|
|
1684
|
-
description: ""
|
|
1685
|
-
}
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1966
|
+
description: "Popup shown."
|
|
1967
|
+
},
|
|
1968
|
+
{
|
|
1969
|
+
name: "closed",
|
|
1970
|
+
kind: "output",
|
|
1971
|
+
type: "void",
|
|
1972
|
+
required: false,
|
|
1973
|
+
description: "Popup hidden."
|
|
1974
|
+
},
|
|
1975
|
+
{
|
|
1976
|
+
name: "rejected",
|
|
1977
|
+
kind: "output",
|
|
1978
|
+
type: "UniDateInputRejection",
|
|
1979
|
+
required: false,
|
|
1980
|
+
description: "A typed commit was refused; the raw text stays in the field."
|
|
1981
|
+
}
|
|
1982
|
+
]
|
|
1983
|
+
}
|
|
1984
|
+
},
|
|
1985
|
+
examples: [
|
|
1986
|
+
{
|
|
1987
|
+
title: "Primary",
|
|
1692
1988
|
framework: "angular",
|
|
1693
|
-
code:
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
{
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1989
|
+
code: "<!-- Storybook story: Primary -->\n<!-- args:\n{ value: dayIn(12) }\n-->"
|
|
1990
|
+
},
|
|
1991
|
+
{
|
|
1992
|
+
title: "With Calendar Constraints",
|
|
1993
|
+
framework: "angular",
|
|
1994
|
+
code: "<!-- Storybook story: With Calendar Constraints -->\n<!-- args:\n{\n label: 'Appointment date',\n minDate: TODAY,\n maxDate: addDays(TODAY, 45),\n disabledDates: (date: string) => [0, 6].includes(new Date(`${date}T00:00:00Z`).getUTCDay()),\n markers: [\n { date: addDays(TODAY, 1), variant: 'success', label: '3 slots open' },\n { date: addDays(TODAY, 3), variant: 'primary', label: '1 slot open' },\n ],\n }\n-->"
|
|
1995
|
+
},
|
|
1996
|
+
{
|
|
1997
|
+
title: "Display Format",
|
|
1998
|
+
framework: "angular",
|
|
1999
|
+
code: "<!-- Storybook story: Display Format -->\n<!-- args:\n{ value: dayIn(12), displayFormat: { dateStyle: 'full' } }\n-->"
|
|
2000
|
+
},
|
|
2001
|
+
{
|
|
2002
|
+
title: "Disabled",
|
|
2003
|
+
framework: "angular",
|
|
2004
|
+
code: "<!-- Storybook story: Disabled -->\n<!-- args:\n{ value: dayIn(12), disabled: true }\n-->"
|
|
1705
2005
|
}
|
|
1706
2006
|
],
|
|
1707
2007
|
guidelines: {
|
|
1708
|
-
whenToUse: "A
|
|
1709
|
-
dos: [
|
|
1710
|
-
|
|
2008
|
+
whenToUse: "A date field with free-typed parsing and a popup calendar. Type `aug 20`,\n`8/20/2026` or `2026-08-20`, or pick from the grid \u2014 the form gets the same\ncanonical `'YYYY-MM-DD'` string either way. There is no input mask: masks\nfight paste, IMEs and screen-reader echo, and hard-code one digit order in a\nlocale-aware library. Text parses on Enter or blur, then re-renders in\n`displayFormat`.\nThe popup is a native popover hosting the same `uni-calendar` an app could\nrender inline, so fences, disabled days and markers forward untouched. Field\nchrome comes from `uni-input-box` \u2014 error, disabled and focus states stay\nconsistent with every other field.",
|
|
2009
|
+
dos: [
|
|
2010
|
+
"Feed fences and availability (`minDate`, `disabledDates`, `markers`)",
|
|
2011
|
+
"Listen to `(rejected)` when the app should explain a refusal in its own UI."
|
|
2012
|
+
],
|
|
2013
|
+
donts: [
|
|
2014
|
+
"Don't add an input mask on top; the field is free text by design.",
|
|
2015
|
+
"Don't parse dates yourself before binding \u2014 pass what the user typed and",
|
|
2016
|
+
"Don't use it for a time \u2014 that is `uni-time-input`; for one combined value"
|
|
2017
|
+
],
|
|
1711
2018
|
accessibility: [
|
|
1712
|
-
"
|
|
1713
|
-
|
|
2019
|
+
"The text input is a **plain input, not a combobox** \u2014 there is no",
|
|
2020
|
+
'The toggle is a real icon-button named from the value \u2014 *"Choose date"* /',
|
|
2021
|
+
'The popup is a native popover with `role="dialog"`; light-dismiss is the',
|
|
2022
|
+
'Commits, steps and rejections announce through `role="status"` \u2014 the',
|
|
2023
|
+
"A refused draft shows invalid styling and `aria-invalid` immediately (it"
|
|
1714
2024
|
]
|
|
1715
2025
|
},
|
|
1716
2026
|
relatedTokens: []
|
|
1717
2027
|
},
|
|
1718
2028
|
{
|
|
1719
|
-
id: "
|
|
1720
|
-
name: "
|
|
2029
|
+
id: "date-time-input",
|
|
2030
|
+
name: "DateTimeInput",
|
|
1721
2031
|
status: "stable",
|
|
1722
|
-
summary: "",
|
|
1723
|
-
description: "",
|
|
1724
|
-
category: "
|
|
1725
|
-
version: "8.
|
|
2032
|
+
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.",
|
|
2033
|
+
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.",
|
|
2034
|
+
category: "forms",
|
|
2035
|
+
version: "8.2.0",
|
|
1726
2036
|
bindings: {
|
|
1727
2037
|
angular: {
|
|
1728
2038
|
importPath: "@uni-design-system/uni-angular",
|
|
1729
|
-
selectorOrTag: "
|
|
2039
|
+
selectorOrTag: "uni-date-time-input, DateTimeInput",
|
|
1730
2040
|
api: [
|
|
1731
2041
|
{
|
|
1732
|
-
name: "
|
|
2042
|
+
name: "value",
|
|
1733
2043
|
kind: "model",
|
|
2044
|
+
type: "UniDateTime | undefined",
|
|
2045
|
+
required: false,
|
|
2046
|
+
description: ""
|
|
2047
|
+
},
|
|
2048
|
+
{
|
|
2049
|
+
name: "disabled",
|
|
2050
|
+
kind: "input",
|
|
1734
2051
|
type: "boolean",
|
|
1735
2052
|
required: false,
|
|
1736
2053
|
default: "false",
|
|
1737
|
-
description: "
|
|
2054
|
+
description: ""
|
|
1738
2055
|
},
|
|
1739
2056
|
{
|
|
1740
|
-
name: "
|
|
2057
|
+
name: "touched",
|
|
2058
|
+
kind: "model",
|
|
2059
|
+
type: "boolean",
|
|
2060
|
+
required: false,
|
|
2061
|
+
default: "false",
|
|
2062
|
+
description: ""
|
|
2063
|
+
},
|
|
2064
|
+
{
|
|
2065
|
+
name: "invalid",
|
|
2066
|
+
kind: "input",
|
|
2067
|
+
type: "boolean",
|
|
2068
|
+
required: false,
|
|
2069
|
+
default: "false",
|
|
2070
|
+
description: ""
|
|
2071
|
+
},
|
|
2072
|
+
{
|
|
2073
|
+
name: "dirty",
|
|
2074
|
+
kind: "input",
|
|
2075
|
+
type: "boolean",
|
|
2076
|
+
required: false,
|
|
2077
|
+
default: "false",
|
|
2078
|
+
description: ""
|
|
2079
|
+
},
|
|
2080
|
+
{
|
|
2081
|
+
name: "required",
|
|
2082
|
+
kind: "input",
|
|
2083
|
+
type: "boolean",
|
|
2084
|
+
required: false,
|
|
2085
|
+
default: "false",
|
|
2086
|
+
description: ""
|
|
2087
|
+
},
|
|
2088
|
+
{
|
|
2089
|
+
name: "ariaDescribedBy",
|
|
1741
2090
|
kind: "input",
|
|
1742
2091
|
type: "string",
|
|
1743
2092
|
required: false,
|
|
1744
|
-
description: "
|
|
2093
|
+
description: ""
|
|
1745
2094
|
},
|
|
1746
2095
|
{
|
|
1747
|
-
name: "
|
|
2096
|
+
name: "label",
|
|
1748
2097
|
kind: "input",
|
|
1749
2098
|
type: "string",
|
|
2099
|
+
required: true,
|
|
2100
|
+
description: 'Names the group; the parts are announced as "Date" and "Time" under it.'
|
|
2101
|
+
},
|
|
2102
|
+
{
|
|
2103
|
+
name: "minDateTime",
|
|
2104
|
+
kind: "input",
|
|
2105
|
+
type: "UniDateTime",
|
|
1750
2106
|
required: false,
|
|
1751
|
-
description: "
|
|
2107
|
+
description: "Earliest allowed moment; the date and time fences are split from it."
|
|
1752
2108
|
},
|
|
1753
2109
|
{
|
|
1754
|
-
name: "
|
|
2110
|
+
name: "maxDateTime",
|
|
1755
2111
|
kind: "input",
|
|
1756
|
-
type: "
|
|
2112
|
+
type: "UniDateTime",
|
|
2113
|
+
required: false,
|
|
2114
|
+
description: "Latest allowed moment; the date and time fences are split from it."
|
|
2115
|
+
},
|
|
2116
|
+
{
|
|
2117
|
+
name: "markers",
|
|
2118
|
+
kind: "input",
|
|
2119
|
+
type: "UniCalendarMarker[]",
|
|
1757
2120
|
required: false,
|
|
2121
|
+
default: "[]",
|
|
1758
2122
|
description: ""
|
|
1759
2123
|
},
|
|
1760
2124
|
{
|
|
1761
|
-
name: "
|
|
1762
|
-
kind: "
|
|
2125
|
+
name: "slots",
|
|
2126
|
+
kind: "input",
|
|
2127
|
+
type: "UniTime[]",
|
|
2128
|
+
required: false,
|
|
2129
|
+
description: "Fixed time choices; superseded per-day by `slotsFor` when that is set."
|
|
2130
|
+
},
|
|
2131
|
+
{
|
|
2132
|
+
name: "minuteStep",
|
|
2133
|
+
kind: "input",
|
|
2134
|
+
type: "number",
|
|
2135
|
+
required: false,
|
|
2136
|
+
default: "30",
|
|
2137
|
+
description: ""
|
|
2138
|
+
},
|
|
2139
|
+
{
|
|
2140
|
+
name: "hour12",
|
|
2141
|
+
kind: "input",
|
|
1763
2142
|
type: "boolean",
|
|
1764
2143
|
required: false,
|
|
1765
|
-
description: "
|
|
2144
|
+
description: ""
|
|
2145
|
+
},
|
|
2146
|
+
{
|
|
2147
|
+
name: "weekStart",
|
|
2148
|
+
kind: "input",
|
|
2149
|
+
type: "0 | 1 | 2 | 3 | 4 | 5 | 6",
|
|
2150
|
+
required: false,
|
|
2151
|
+
description: ""
|
|
2152
|
+
},
|
|
2153
|
+
{
|
|
2154
|
+
name: "locale",
|
|
2155
|
+
kind: "input",
|
|
2156
|
+
type: "string",
|
|
2157
|
+
required: false,
|
|
2158
|
+
description: ""
|
|
1766
2159
|
}
|
|
1767
2160
|
]
|
|
1768
2161
|
}
|
|
@@ -1771,124 +2164,337 @@ var uni_index_default = {
|
|
|
1771
2164
|
{
|
|
1772
2165
|
title: "Primary",
|
|
1773
2166
|
framework: "angular",
|
|
1774
|
-
code: '<!-- Storybook story: Primary -->\n<
|
|
2167
|
+
code: '<!-- Storybook story: Primary -->\n<uni-date-time-input\n label="Appointment"\n [disabledDates]="isFullyBooked"\n [markers]="markers"\n [slotsFor]="slotsFor"\n/>\n<!-- args:\n{ value: `${addDays(TODAY, 1)}T15:00` }\n-->'
|
|
2168
|
+
},
|
|
2169
|
+
{
|
|
2170
|
+
title: "Scheduling",
|
|
2171
|
+
framework: "angular",
|
|
2172
|
+
code: '<!-- Storybook story: Scheduling -->\n<uni-date-time-input\n label="Appointment"\n [disabledDates]="isFullyBooked"\n [markers]="markers"\n [slotsFor]="slotsFor"\n/>\n<!-- args:\n{ value: `${addDays(TODAY, 1)}T15:00`, disabled: true }\n-->'
|
|
2173
|
+
},
|
|
2174
|
+
{
|
|
2175
|
+
title: "Disabled",
|
|
2176
|
+
framework: "angular",
|
|
2177
|
+
code: '<!-- Storybook story: Disabled -->\n<uni-date-time-input\n label="Appointment"\n [disabledDates]="isFullyBooked"\n [markers]="markers"\n [slotsFor]="slotsFor"\n/>\n<!-- args:\n{ value: `${addDays(TODAY, 1)}T15:00`, disabled: true }\n-->'
|
|
1775
2178
|
}
|
|
1776
2179
|
],
|
|
1777
2180
|
guidelines: {
|
|
1778
|
-
whenToUse: "
|
|
1779
|
-
dos: [
|
|
1780
|
-
|
|
2181
|
+
whenToUse: "One field for a date and a time: a thin composer seating a `uni-date-input`\nand a `uni-time-input` in one `uni-input-box` chrome under one label, and\nmapping the two part-values to one combined `'YYYY-MM-DDTHH:mm'` value. The\nvalue emits only when **both** parts are set \u2014 a time without a day is not an\nanswer \u2014 and clearing the date clears it.\nIt is a convenience, not the only door: apps that need a different\narrangement (calendar always inline, slot buttons instead of a time field)\ncompose the primitives directly.",
|
|
2182
|
+
dos: [
|
|
2183
|
+
"Use `slotsFor` for availability-driven scheduling; it gates and supplies",
|
|
2184
|
+
"Treat the combined value as the only form value; the parts are internal."
|
|
2185
|
+
],
|
|
2186
|
+
donts: [
|
|
2187
|
+
"Don't wire separate date and time form fields through this component \u2014",
|
|
2188
|
+
"Don't expect a value while either part is empty; partial states are"
|
|
2189
|
+
],
|
|
1781
2190
|
accessibility: [
|
|
1782
|
-
"
|
|
1783
|
-
"
|
|
1784
|
-
"
|
|
2191
|
+
'One `role="group"` named by `label`; the parts are named *"Date"* and',
|
|
2192
|
+
"Tab order: date field \u2192 time field. Two tab stops, honestly \u2014 it *is* two",
|
|
2193
|
+
"Each part keeps its own contract: the date part's popup dialog and status"
|
|
1785
2194
|
]
|
|
1786
2195
|
},
|
|
1787
|
-
relatedTokens: [
|
|
1788
|
-
"dialog.behavior.borderRadius",
|
|
1789
|
-
"dialog.behavior.color",
|
|
1790
|
-
"dialog.behavior.border",
|
|
1791
|
-
"dialog.behavior.padding",
|
|
1792
|
-
"dialog.behavior.elevation",
|
|
1793
|
-
"dialog.behavior.backdrop"
|
|
1794
|
-
]
|
|
2196
|
+
relatedTokens: []
|
|
1795
2197
|
},
|
|
1796
2198
|
{
|
|
1797
|
-
id: "
|
|
1798
|
-
name: "
|
|
2199
|
+
id: "debounce-input",
|
|
2200
|
+
name: "DebounceInput",
|
|
1799
2201
|
status: "stable",
|
|
1800
|
-
summary: "",
|
|
1801
|
-
description: "",
|
|
1802
|
-
category: "
|
|
1803
|
-
version: "8.
|
|
2202
|
+
summary: "Text input that emits `change` only after the user pauses typing.",
|
|
2203
|
+
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.",
|
|
2204
|
+
category: "forms",
|
|
2205
|
+
version: "8.2.0",
|
|
1804
2206
|
bindings: {
|
|
1805
2207
|
angular: {
|
|
1806
2208
|
importPath: "@uni-design-system/uni-angular",
|
|
1807
|
-
selectorOrTag: "
|
|
2209
|
+
selectorOrTag: "uni-debounce-input",
|
|
1808
2210
|
api: [
|
|
1809
2211
|
{
|
|
1810
|
-
name: "
|
|
2212
|
+
name: "inputName",
|
|
1811
2213
|
kind: "input",
|
|
1812
2214
|
type: "string",
|
|
1813
2215
|
required: false,
|
|
1814
2216
|
description: ""
|
|
1815
2217
|
},
|
|
1816
2218
|
{
|
|
1817
|
-
name: "
|
|
2219
|
+
name: "inputId",
|
|
1818
2220
|
kind: "input",
|
|
1819
|
-
type: "
|
|
2221
|
+
type: "string",
|
|
1820
2222
|
required: false,
|
|
1821
2223
|
description: ""
|
|
1822
2224
|
},
|
|
1823
2225
|
{
|
|
1824
|
-
name: "
|
|
2226
|
+
name: "debounceTime",
|
|
1825
2227
|
kind: "input",
|
|
1826
|
-
type: "
|
|
2228
|
+
type: "number",
|
|
1827
2229
|
required: false,
|
|
2230
|
+
default: "400",
|
|
1828
2231
|
description: ""
|
|
1829
2232
|
},
|
|
1830
2233
|
{
|
|
1831
|
-
name: "
|
|
2234
|
+
name: "label",
|
|
1832
2235
|
kind: "input",
|
|
1833
|
-
type: "
|
|
2236
|
+
type: "string",
|
|
1834
2237
|
required: false,
|
|
2238
|
+
description: "Accessible name for the input."
|
|
2239
|
+
},
|
|
2240
|
+
{
|
|
2241
|
+
name: "placeholder",
|
|
2242
|
+
kind: "input",
|
|
2243
|
+
type: "string",
|
|
2244
|
+
required: false,
|
|
2245
|
+
default: "''",
|
|
1835
2246
|
description: ""
|
|
1836
2247
|
},
|
|
1837
2248
|
{
|
|
1838
|
-
name: "
|
|
2249
|
+
name: "disabled",
|
|
1839
2250
|
kind: "input",
|
|
1840
2251
|
type: "boolean",
|
|
1841
2252
|
required: false,
|
|
2253
|
+
default: "false",
|
|
1842
2254
|
description: ""
|
|
1843
2255
|
},
|
|
1844
2256
|
{
|
|
1845
|
-
name: "
|
|
2257
|
+
name: "role",
|
|
1846
2258
|
kind: "input",
|
|
1847
|
-
type: "
|
|
2259
|
+
type: "string",
|
|
1848
2260
|
required: false,
|
|
1849
2261
|
description: ""
|
|
1850
2262
|
},
|
|
1851
2263
|
{
|
|
1852
|
-
name: "
|
|
2264
|
+
name: "ariaExpanded",
|
|
1853
2265
|
kind: "input",
|
|
1854
|
-
type: "
|
|
2266
|
+
type: "boolean | undefined",
|
|
1855
2267
|
required: false,
|
|
2268
|
+
default: "undefined",
|
|
1856
2269
|
description: ""
|
|
1857
2270
|
},
|
|
1858
2271
|
{
|
|
1859
|
-
name: "
|
|
2272
|
+
name: "ariaControls",
|
|
1860
2273
|
kind: "input",
|
|
1861
|
-
type: "
|
|
2274
|
+
type: "string",
|
|
1862
2275
|
required: false,
|
|
1863
2276
|
description: ""
|
|
1864
2277
|
},
|
|
1865
2278
|
{
|
|
1866
|
-
name: "
|
|
2279
|
+
name: "ariaActivedescendant",
|
|
2280
|
+
kind: "input",
|
|
2281
|
+
type: "string",
|
|
2282
|
+
required: false,
|
|
2283
|
+
description: ""
|
|
2284
|
+
},
|
|
2285
|
+
{
|
|
2286
|
+
name: "change",
|
|
1867
2287
|
kind: "output",
|
|
1868
|
-
type: "
|
|
2288
|
+
type: "string",
|
|
1869
2289
|
required: false,
|
|
1870
2290
|
description: ""
|
|
1871
2291
|
}
|
|
1872
2292
|
]
|
|
1873
2293
|
}
|
|
1874
2294
|
},
|
|
1875
|
-
examples: [
|
|
2295
|
+
examples: [
|
|
2296
|
+
{
|
|
2297
|
+
title: "Primary",
|
|
2298
|
+
framework: "angular",
|
|
2299
|
+
code: `<!-- Storybook story: Primary -->
|
|
2300
|
+
<uni-debounce-input \${argsToTemplate(props)} (change)="lastEmitted = $event" #debounce />
|
|
2301
|
+
<div box-layout paddingTop="md">
|
|
2302
|
+
<div>Live value: {{ debounce.value() }}</div>
|
|
2303
|
+
<div>Debounced value: {{ lastEmitted }}</div>
|
|
2304
|
+
</div>
|
|
2305
|
+
<!-- args:
|
|
2306
|
+
{
|
|
2307
|
+
inputName: 'search',
|
|
2308
|
+
debounceTime: 400,
|
|
2309
|
+
}
|
|
2310
|
+
-->`
|
|
2311
|
+
}
|
|
2312
|
+
],
|
|
1876
2313
|
guidelines: {
|
|
1877
|
-
whenToUse: "",
|
|
2314
|
+
whenToUse: "A themed text input that emits its `change` output only after the user pauses typing\n(400 ms by default) and only when the value actually changed \u2014 a signal-based\ndebounce with no rxjs involved. The live value is exposed as the `value` signal, and\n`clear()` empties the field immediately (cancelling any pending emit).\nIt wears the shared input chrome (color, border, typeface, focus ring) via the input\nbox, and offers `pre-input` / `post-input` attribute slots for adornments plus ARIA\npassthrough inputs (`role`, `ariaExpanded`, `ariaControls`, `ariaActivedescendant`)\nso composite widgets can annotate the real input element.\nUsed by the [Search Input](?path=/docs/components-forms-search-input--search-input), which\nprojects its magnifier and clear button through the slots and drives the combobox\nARIA through the passthroughs.",
|
|
1878
2315
|
dos: [],
|
|
1879
2316
|
donts: [],
|
|
1880
|
-
accessibility: [
|
|
2317
|
+
accessibility: [
|
|
2318
|
+
"Set `label` \u2014 it becomes the accessible name (`aria-label`) of the inner input.",
|
|
2319
|
+
"The ARIA passthrough inputs (`role`, `ariaExpanded`, `ariaControls`,"
|
|
2320
|
+
]
|
|
1881
2321
|
},
|
|
1882
2322
|
relatedTokens: []
|
|
1883
2323
|
},
|
|
1884
2324
|
{
|
|
1885
|
-
id: "dialog
|
|
1886
|
-
name: "
|
|
1887
|
-
status: "stable",
|
|
2325
|
+
id: "dialog",
|
|
2326
|
+
name: "Dialog",
|
|
2327
|
+
status: "stable",
|
|
2328
|
+
summary: "",
|
|
2329
|
+
description: "",
|
|
2330
|
+
category: "feedback",
|
|
2331
|
+
version: "8.2.0",
|
|
2332
|
+
bindings: {
|
|
2333
|
+
angular: {
|
|
2334
|
+
importPath: "@uni-design-system/uni-angular",
|
|
2335
|
+
selectorOrTag: "dialog[uni-dialog]",
|
|
2336
|
+
api: [
|
|
2337
|
+
{
|
|
2338
|
+
name: "show",
|
|
2339
|
+
kind: "model",
|
|
2340
|
+
type: "boolean",
|
|
2341
|
+
required: false,
|
|
2342
|
+
default: "false",
|
|
2343
|
+
description: "Two-way bindable open state: [(show)]."
|
|
2344
|
+
},
|
|
2345
|
+
{
|
|
2346
|
+
name: "ariaLabel",
|
|
2347
|
+
kind: "input",
|
|
2348
|
+
type: "string",
|
|
2349
|
+
required: false,
|
|
2350
|
+
description: "Accessible name for dialogs without a DialogHeader. When a DialogHeader is present it labels the dialog automatically via aria-labelledby."
|
|
2351
|
+
},
|
|
2352
|
+
{
|
|
2353
|
+
name: "initialFocus",
|
|
2354
|
+
kind: "input",
|
|
2355
|
+
type: "string",
|
|
2356
|
+
required: false,
|
|
2357
|
+
description: "CSS selector for the element to focus when the dialog opens. Defaults to the browser's native behavior (first focusable element)."
|
|
2358
|
+
},
|
|
2359
|
+
{
|
|
2360
|
+
name: "defaultCloseButton",
|
|
2361
|
+
kind: "input",
|
|
2362
|
+
type: "boolean",
|
|
2363
|
+
required: false,
|
|
2364
|
+
description: ""
|
|
2365
|
+
},
|
|
2366
|
+
{
|
|
2367
|
+
name: "showing",
|
|
2368
|
+
kind: "output",
|
|
2369
|
+
type: "boolean",
|
|
2370
|
+
required: false,
|
|
2371
|
+
description: "Emits true once opened and false once the closing animation finishes."
|
|
2372
|
+
}
|
|
2373
|
+
]
|
|
2374
|
+
}
|
|
2375
|
+
},
|
|
2376
|
+
examples: [
|
|
2377
|
+
{
|
|
2378
|
+
title: "Primary",
|
|
2379
|
+
framework: "angular",
|
|
2380
|
+
code: '<!-- Storybook story: Primary -->\n<button text-button (click)="dialog.open()">Open Dialog</button>\n<dialog uni-dialog #dialog>\n <header uni-dialog-header color="primary">Sample Dialog</header>\n <div center-layout [width]="300" [height]="200">\n <span uni-text>Dialog</span>\n </div>\n <footer dialog-buttons></footer>\n</dialog>\n<!-- args:\n{}\n-->'
|
|
2381
|
+
}
|
|
2382
|
+
],
|
|
2383
|
+
guidelines: {
|
|
2384
|
+
whenToUse: "Enhanced modal dialog that extends the native HTML `<dialog>` element with built-in animations, composition components, and accessibility features.\n### Features\n- **Native HTML Dialog**: Built on the standard dialog element with full semantic support\n- **Smooth Animations**: Automatic fade transitions for open/close states\n- **Composition Components**: Optional `DialogHeader` and `DialogButtons` for consistent layouts\n- **Programmatic Control**: Open/close methods plus show property binding\n- **Backdrop Handling**: Click-outside-to-close with customizable behavior\n- **Accessibility**: Full keyboard navigation, focus trapping, and screen reader support",
|
|
2385
|
+
dos: [],
|
|
2386
|
+
donts: [],
|
|
2387
|
+
accessibility: [
|
|
2388
|
+
"Focus trapping and keyboard navigation (Tab, Escape, Enter)",
|
|
2389
|
+
"Screen reader announcements",
|
|
2390
|
+
"Semantic dialog roles"
|
|
2391
|
+
]
|
|
2392
|
+
},
|
|
2393
|
+
relatedTokens: [
|
|
2394
|
+
"dialog.behavior.borderRadius",
|
|
2395
|
+
"dialog.behavior.color",
|
|
2396
|
+
"dialog.behavior.border",
|
|
2397
|
+
"dialog.behavior.padding",
|
|
2398
|
+
"dialog.behavior.elevation",
|
|
2399
|
+
"dialog.behavior.backdrop"
|
|
2400
|
+
]
|
|
2401
|
+
},
|
|
2402
|
+
{
|
|
2403
|
+
id: "dialog-buttons",
|
|
2404
|
+
name: "DialogButtons",
|
|
2405
|
+
status: "stable",
|
|
2406
|
+
summary: "",
|
|
2407
|
+
description: "",
|
|
2408
|
+
category: "feedback",
|
|
2409
|
+
version: "8.2.0",
|
|
2410
|
+
bindings: {
|
|
2411
|
+
angular: {
|
|
2412
|
+
importPath: "@uni-design-system/uni-angular",
|
|
2413
|
+
selectorOrTag: "[uni-dialog-buttons], [dialog-buttons]",
|
|
2414
|
+
api: [
|
|
2415
|
+
{
|
|
2416
|
+
name: "confirmButtonText",
|
|
2417
|
+
kind: "input",
|
|
2418
|
+
type: "string",
|
|
2419
|
+
required: false,
|
|
2420
|
+
description: ""
|
|
2421
|
+
},
|
|
2422
|
+
{
|
|
2423
|
+
name: "confirmButtonVariant",
|
|
2424
|
+
kind: "input",
|
|
2425
|
+
type: "Variant",
|
|
2426
|
+
required: false,
|
|
2427
|
+
description: ""
|
|
2428
|
+
},
|
|
2429
|
+
{
|
|
2430
|
+
name: "cancelButtonText",
|
|
2431
|
+
kind: "input",
|
|
2432
|
+
type: "string",
|
|
2433
|
+
required: false,
|
|
2434
|
+
description: ""
|
|
2435
|
+
},
|
|
2436
|
+
{
|
|
2437
|
+
name: "cancelButtonVariant",
|
|
2438
|
+
kind: "input",
|
|
2439
|
+
type: "Variant",
|
|
2440
|
+
required: false,
|
|
2441
|
+
description: ""
|
|
2442
|
+
},
|
|
2443
|
+
{
|
|
2444
|
+
name: "disableConfirm",
|
|
2445
|
+
kind: "input",
|
|
2446
|
+
type: "boolean",
|
|
2447
|
+
required: false,
|
|
2448
|
+
description: ""
|
|
2449
|
+
},
|
|
2450
|
+
{
|
|
2451
|
+
name: "padding",
|
|
2452
|
+
kind: "input",
|
|
2453
|
+
type: "NullableSize",
|
|
2454
|
+
required: false,
|
|
2455
|
+
description: ""
|
|
2456
|
+
},
|
|
2457
|
+
{
|
|
2458
|
+
name: "paddingBottom",
|
|
2459
|
+
kind: "input",
|
|
2460
|
+
type: "NullableSize",
|
|
2461
|
+
required: false,
|
|
2462
|
+
description: ""
|
|
2463
|
+
},
|
|
2464
|
+
{
|
|
2465
|
+
name: "justifyContent",
|
|
2466
|
+
kind: "input",
|
|
2467
|
+
type: "JustifyContent",
|
|
2468
|
+
required: false,
|
|
2469
|
+
description: ""
|
|
2470
|
+
},
|
|
2471
|
+
{
|
|
2472
|
+
name: "confirmed",
|
|
2473
|
+
kind: "output",
|
|
2474
|
+
type: "unknown",
|
|
2475
|
+
required: false,
|
|
2476
|
+
description: ""
|
|
2477
|
+
}
|
|
2478
|
+
]
|
|
2479
|
+
}
|
|
2480
|
+
},
|
|
2481
|
+
examples: [],
|
|
2482
|
+
guidelines: {
|
|
2483
|
+
whenToUse: "",
|
|
2484
|
+
dos: [],
|
|
2485
|
+
donts: [],
|
|
2486
|
+
accessibility: []
|
|
2487
|
+
},
|
|
2488
|
+
relatedTokens: []
|
|
2489
|
+
},
|
|
2490
|
+
{
|
|
2491
|
+
id: "dialog-header",
|
|
2492
|
+
name: "DialogHeader",
|
|
2493
|
+
status: "stable",
|
|
1888
2494
|
summary: "",
|
|
1889
2495
|
description: "",
|
|
1890
2496
|
category: "feedback",
|
|
1891
|
-
version: "8.
|
|
2497
|
+
version: "8.2.0",
|
|
1892
2498
|
bindings: {
|
|
1893
2499
|
angular: {
|
|
1894
2500
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1912,7 +2518,7 @@ var uni_index_default = {
|
|
|
1912
2518
|
summary: "",
|
|
1913
2519
|
description: "",
|
|
1914
2520
|
category: "layout",
|
|
1915
|
-
version: "8.
|
|
2521
|
+
version: "8.2.0",
|
|
1916
2522
|
bindings: {
|
|
1917
2523
|
angular: {
|
|
1918
2524
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1968,7 +2574,7 @@ var uni_index_default = {
|
|
|
1968
2574
|
summary: "",
|
|
1969
2575
|
description: "",
|
|
1970
2576
|
category: "directives",
|
|
1971
|
-
version: "8.
|
|
2577
|
+
version: "8.2.0",
|
|
1972
2578
|
bindings: {
|
|
1973
2579
|
angular: {
|
|
1974
2580
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -1997,10 +2603,10 @@ var uni_index_default = {
|
|
|
1997
2603
|
id: "drawer",
|
|
1998
2604
|
name: "Drawer",
|
|
1999
2605
|
status: "stable",
|
|
2000
|
-
summary: "",
|
|
2001
|
-
description: "",
|
|
2606
|
+
summary: "Navigation drawer with two modes sharing one content slot: - `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.",
|
|
2607
|
+
description: "Navigation drawer with two modes sharing one content slot: - `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. Surface, width, divider, elevation, padding and backdrop all resolve from `drawer` theme tokens.",
|
|
2002
2608
|
category: "components",
|
|
2003
|
-
version: "8.
|
|
2609
|
+
version: "8.2.0",
|
|
2004
2610
|
bindings: {
|
|
2005
2611
|
angular: {
|
|
2006
2612
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2079,7 +2685,7 @@ var uni_index_default = {
|
|
|
2079
2685
|
summary: "",
|
|
2080
2686
|
description: "",
|
|
2081
2687
|
category: "components",
|
|
2082
|
-
version: "8.
|
|
2688
|
+
version: "8.2.0",
|
|
2083
2689
|
bindings: {
|
|
2084
2690
|
angular: {
|
|
2085
2691
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2196,7 +2802,7 @@ var uni_index_default = {
|
|
|
2196
2802
|
summary: "",
|
|
2197
2803
|
description: "",
|
|
2198
2804
|
category: "layout",
|
|
2199
|
-
version: "8.
|
|
2805
|
+
version: "8.2.0",
|
|
2200
2806
|
bindings: {
|
|
2201
2807
|
angular: {
|
|
2202
2808
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2284,7 +2890,7 @@ var uni_index_default = {
|
|
|
2284
2890
|
summary: "",
|
|
2285
2891
|
description: "",
|
|
2286
2892
|
category: "layout",
|
|
2287
|
-
version: "8.
|
|
2893
|
+
version: "8.2.0",
|
|
2288
2894
|
bindings: {
|
|
2289
2895
|
angular: {
|
|
2290
2896
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2352,10 +2958,10 @@ var uni_index_default = {
|
|
|
2352
2958
|
id: "expand-toggle",
|
|
2353
2959
|
name: "ExpandToggle",
|
|
2354
2960
|
status: "stable",
|
|
2355
|
-
summary: "",
|
|
2356
|
-
description: "",
|
|
2961
|
+
summary: "Trigger for a {@link UniExpandComponent} region.",
|
|
2962
|
+
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.",
|
|
2357
2963
|
category: "forms",
|
|
2358
|
-
version: "8.
|
|
2964
|
+
version: "8.2.0",
|
|
2359
2965
|
bindings: {
|
|
2360
2966
|
angular: {
|
|
2361
2967
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2440,7 +3046,7 @@ var uni_index_default = {
|
|
|
2440
3046
|
summary: "",
|
|
2441
3047
|
description: "",
|
|
2442
3048
|
category: "forms",
|
|
2443
|
-
version: "8.
|
|
3049
|
+
version: "8.2.0",
|
|
2444
3050
|
bindings: {
|
|
2445
3051
|
angular: {
|
|
2446
3052
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2598,7 +3204,7 @@ var uni_index_default = {
|
|
|
2598
3204
|
summary: "",
|
|
2599
3205
|
description: "",
|
|
2600
3206
|
category: "layout",
|
|
2601
|
-
version: "8.
|
|
3207
|
+
version: "8.2.0",
|
|
2602
3208
|
bindings: {
|
|
2603
3209
|
angular: {
|
|
2604
3210
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2695,7 +3301,7 @@ var uni_index_default = {
|
|
|
2695
3301
|
summary: "",
|
|
2696
3302
|
description: "",
|
|
2697
3303
|
category: "layout",
|
|
2698
|
-
version: "8.
|
|
3304
|
+
version: "8.2.0",
|
|
2699
3305
|
bindings: {
|
|
2700
3306
|
angular: {
|
|
2701
3307
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2727,7 +3333,7 @@ var uni_index_default = {
|
|
|
2727
3333
|
summary: "",
|
|
2728
3334
|
description: "",
|
|
2729
3335
|
category: "primitives",
|
|
2730
|
-
version: "8.
|
|
3336
|
+
version: "8.2.0",
|
|
2731
3337
|
bindings: {
|
|
2732
3338
|
angular: {
|
|
2733
3339
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2787,7 +3393,7 @@ var uni_index_default = {
|
|
|
2787
3393
|
summary: "",
|
|
2788
3394
|
description: "",
|
|
2789
3395
|
category: "primitives",
|
|
2790
|
-
version: "8.
|
|
3396
|
+
version: "8.2.0",
|
|
2791
3397
|
bindings: {
|
|
2792
3398
|
angular: {
|
|
2793
3399
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -2890,7 +3496,7 @@ var uni_index_default = {
|
|
|
2890
3496
|
summary: "",
|
|
2891
3497
|
description: "",
|
|
2892
3498
|
category: "forms",
|
|
2893
|
-
version: "8.
|
|
3499
|
+
version: "8.2.0",
|
|
2894
3500
|
bindings: {
|
|
2895
3501
|
angular: {
|
|
2896
3502
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3013,7 +3619,7 @@ var uni_index_default = {
|
|
|
3013
3619
|
]
|
|
3014
3620
|
},
|
|
3015
3621
|
relatedTokens: [
|
|
3016
|
-
"input.behavior.
|
|
3622
|
+
"input.behavior.typeface",
|
|
3017
3623
|
"input.behavior.color",
|
|
3018
3624
|
"input.behavior.textColor",
|
|
3019
3625
|
"input.behavior.disabledColor",
|
|
@@ -3035,7 +3641,7 @@ var uni_index_default = {
|
|
|
3035
3641
|
summary: "",
|
|
3036
3642
|
description: "",
|
|
3037
3643
|
category: "forms",
|
|
3038
|
-
version: "8.
|
|
3644
|
+
version: "8.2.0",
|
|
3039
3645
|
bindings: {
|
|
3040
3646
|
angular: {
|
|
3041
3647
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3108,7 +3714,7 @@ var uni_index_default = {
|
|
|
3108
3714
|
summary: "",
|
|
3109
3715
|
description: "",
|
|
3110
3716
|
category: "components",
|
|
3111
|
-
version: "8.
|
|
3717
|
+
version: "8.2.0",
|
|
3112
3718
|
bindings: {
|
|
3113
3719
|
angular: {
|
|
3114
3720
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3178,7 +3784,7 @@ var uni_index_default = {
|
|
|
3178
3784
|
summary: "",
|
|
3179
3785
|
description: "",
|
|
3180
3786
|
category: "layout",
|
|
3181
|
-
version: "8.
|
|
3787
|
+
version: "8.2.0",
|
|
3182
3788
|
bindings: {
|
|
3183
3789
|
angular: {
|
|
3184
3790
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3282,7 +3888,7 @@ var uni_index_default = {
|
|
|
3282
3888
|
summary: "",
|
|
3283
3889
|
description: "",
|
|
3284
3890
|
category: "layout",
|
|
3285
|
-
version: "8.
|
|
3891
|
+
version: "8.2.0",
|
|
3286
3892
|
bindings: {
|
|
3287
3893
|
angular: {
|
|
3288
3894
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3364,7 +3970,7 @@ var uni_index_default = {
|
|
|
3364
3970
|
summary: "",
|
|
3365
3971
|
description: "",
|
|
3366
3972
|
category: "forms",
|
|
3367
|
-
version: "8.
|
|
3973
|
+
version: "8.2.0",
|
|
3368
3974
|
bindings: {
|
|
3369
3975
|
angular: {
|
|
3370
3976
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3452,7 +4058,7 @@ var uni_index_default = {
|
|
|
3452
4058
|
summary: "",
|
|
3453
4059
|
description: "",
|
|
3454
4060
|
category: "forms",
|
|
3455
|
-
version: "8.
|
|
4061
|
+
version: "8.2.0",
|
|
3456
4062
|
bindings: {
|
|
3457
4063
|
angular: {
|
|
3458
4064
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3602,7 +4208,7 @@ var uni_index_default = {
|
|
|
3602
4208
|
summary: "",
|
|
3603
4209
|
description: "",
|
|
3604
4210
|
category: "feedback",
|
|
3605
|
-
version: "8.
|
|
4211
|
+
version: "8.2.0",
|
|
3606
4212
|
bindings: {
|
|
3607
4213
|
angular: {
|
|
3608
4214
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3846,7 +4452,7 @@ var uni_index_default = {
|
|
|
3846
4452
|
summary: "",
|
|
3847
4453
|
description: "",
|
|
3848
4454
|
category: "feedback",
|
|
3849
|
-
version: "8.
|
|
4455
|
+
version: "8.2.0",
|
|
3850
4456
|
bindings: {
|
|
3851
4457
|
angular: {
|
|
3852
4458
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3870,7 +4476,7 @@ var uni_index_default = {
|
|
|
3870
4476
|
summary: "",
|
|
3871
4477
|
description: "",
|
|
3872
4478
|
category: "data",
|
|
3873
|
-
version: "8.
|
|
4479
|
+
version: "8.2.0",
|
|
3874
4480
|
bindings: {
|
|
3875
4481
|
angular: {
|
|
3876
4482
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -3955,7 +4561,7 @@ var uni_index_default = {
|
|
|
3955
4561
|
summary: "",
|
|
3956
4562
|
description: "",
|
|
3957
4563
|
category: "layout",
|
|
3958
|
-
version: "8.
|
|
4564
|
+
version: "8.2.0",
|
|
3959
4565
|
bindings: {
|
|
3960
4566
|
angular: {
|
|
3961
4567
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4004,7 +4610,7 @@ var uni_index_default = {
|
|
|
4004
4610
|
summary: "",
|
|
4005
4611
|
description: "",
|
|
4006
4612
|
category: "feedback",
|
|
4007
|
-
version: "8.
|
|
4613
|
+
version: "8.2.0",
|
|
4008
4614
|
bindings: {
|
|
4009
4615
|
angular: {
|
|
4010
4616
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4068,7 +4674,7 @@ var uni_index_default = {
|
|
|
4068
4674
|
summary: "",
|
|
4069
4675
|
description: "",
|
|
4070
4676
|
category: "feedback",
|
|
4071
|
-
version: "8.
|
|
4677
|
+
version: "8.2.0",
|
|
4072
4678
|
bindings: {
|
|
4073
4679
|
angular: {
|
|
4074
4680
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4124,7 +4730,7 @@ var uni_index_default = {
|
|
|
4124
4730
|
summary: "",
|
|
4125
4731
|
description: "",
|
|
4126
4732
|
category: "forms",
|
|
4127
|
-
version: "8.
|
|
4733
|
+
version: "8.2.0",
|
|
4128
4734
|
bindings: {
|
|
4129
4735
|
angular: {
|
|
4130
4736
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4265,7 +4871,8 @@ var uni_index_default = {
|
|
|
4265
4871
|
relatedTokens: [
|
|
4266
4872
|
"radio.behavior.size",
|
|
4267
4873
|
"radio.behavior.ringColor",
|
|
4268
|
-
"radio.behavior.fillColor"
|
|
4874
|
+
"radio.behavior.fillColor",
|
|
4875
|
+
"radio.behavior.transitionSpeed"
|
|
4269
4876
|
]
|
|
4270
4877
|
},
|
|
4271
4878
|
{
|
|
@@ -4275,7 +4882,7 @@ var uni_index_default = {
|
|
|
4275
4882
|
summary: "",
|
|
4276
4883
|
description: "",
|
|
4277
4884
|
category: "directives",
|
|
4278
|
-
version: "8.
|
|
4885
|
+
version: "8.2.0",
|
|
4279
4886
|
bindings: {
|
|
4280
4887
|
angular: {
|
|
4281
4888
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4299,7 +4906,7 @@ var uni_index_default = {
|
|
|
4299
4906
|
summary: "",
|
|
4300
4907
|
description: "",
|
|
4301
4908
|
category: "layout",
|
|
4302
|
-
version: "8.
|
|
4909
|
+
version: "8.2.0",
|
|
4303
4910
|
bindings: {
|
|
4304
4911
|
angular: {
|
|
4305
4912
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4351,10 +4958,10 @@ var uni_index_default = {
|
|
|
4351
4958
|
id: "scroll-area",
|
|
4352
4959
|
name: "ScrollArea",
|
|
4353
4960
|
status: "stable",
|
|
4354
|
-
summary: "",
|
|
4355
|
-
description: "",
|
|
4961
|
+
summary: "Native scroll area with theme-driven scrollbar styling.",
|
|
4962
|
+
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.",
|
|
4356
4963
|
category: "layout",
|
|
4357
|
-
version: "8.
|
|
4964
|
+
version: "8.2.0",
|
|
4358
4965
|
bindings: {
|
|
4359
4966
|
angular: {
|
|
4360
4967
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4498,10 +5105,10 @@ var uni_index_default = {
|
|
|
4498
5105
|
id: "search-input",
|
|
4499
5106
|
name: "SearchInput",
|
|
4500
5107
|
status: "stable",
|
|
4501
|
-
summary: "",
|
|
4502
|
-
description: "",
|
|
5108
|
+
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.",
|
|
5109
|
+
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.",
|
|
4503
5110
|
category: "forms",
|
|
4504
|
-
version: "8.
|
|
5111
|
+
version: "8.2.0",
|
|
4505
5112
|
bindings: {
|
|
4506
5113
|
angular: {
|
|
4507
5114
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4612,7 +5219,7 @@ var uni_index_default = {
|
|
|
4612
5219
|
summary: "",
|
|
4613
5220
|
description: "",
|
|
4614
5221
|
category: "forms",
|
|
4615
|
-
version: "8.
|
|
5222
|
+
version: "8.2.0",
|
|
4616
5223
|
bindings: {
|
|
4617
5224
|
angular: {
|
|
4618
5225
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4745,10 +5352,10 @@ var uni_index_default = {
|
|
|
4745
5352
|
id: "skeleton",
|
|
4746
5353
|
name: "Skeleton",
|
|
4747
5354
|
status: "stable",
|
|
4748
|
-
summary: "",
|
|
4749
|
-
description: "",
|
|
5355
|
+
summary: "Loading placeholder painted with surface tokens.",
|
|
5356
|
+
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`.",
|
|
4750
5357
|
category: "components",
|
|
4751
|
-
version: "8.
|
|
5358
|
+
version: "8.2.0",
|
|
4752
5359
|
bindings: {
|
|
4753
5360
|
angular: {
|
|
4754
5361
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4841,10 +5448,10 @@ var uni_index_default = {
|
|
|
4841
5448
|
id: "slider",
|
|
4842
5449
|
name: "Slider",
|
|
4843
5450
|
status: "stable",
|
|
4844
|
-
summary: "",
|
|
4845
|
-
description: "",
|
|
5451
|
+
summary: 'Range slider on a native `<input type="range">` \u2014 keyboard interaction and the ARIA slider contract come from the platform.',
|
|
5452
|
+
description: 'Range slider on a native `<input type="range">` \u2014 keyboard interaction and the ARIA slider contract come from the platform. Fill, track, thumb and radii resolve from `slider` theme tokens; the fill percentage rides a CSS custom property so dragging never regenerates styles.',
|
|
4846
5453
|
category: "forms",
|
|
4847
|
-
version: "8.
|
|
5454
|
+
version: "8.2.0",
|
|
4848
5455
|
bindings: {
|
|
4849
5456
|
angular: {
|
|
4850
5457
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -4981,7 +5588,7 @@ var uni_index_default = {
|
|
|
4981
5588
|
summary: "",
|
|
4982
5589
|
description: "",
|
|
4983
5590
|
category: "feedback",
|
|
4984
|
-
version: "8.
|
|
5591
|
+
version: "8.2.0",
|
|
4985
5592
|
bindings: {
|
|
4986
5593
|
angular: {
|
|
4987
5594
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -5073,7 +5680,7 @@ var uni_index_default = {
|
|
|
5073
5680
|
summary: "",
|
|
5074
5681
|
description: "",
|
|
5075
5682
|
category: "data",
|
|
5076
|
-
version: "8.
|
|
5683
|
+
version: "8.2.0",
|
|
5077
5684
|
bindings: {
|
|
5078
5685
|
angular: {
|
|
5079
5686
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -5132,7 +5739,7 @@ var uni_index_default = {
|
|
|
5132
5739
|
summary: "",
|
|
5133
5740
|
description: "",
|
|
5134
5741
|
category: "layout",
|
|
5135
|
-
version: "8.
|
|
5742
|
+
version: "8.2.0",
|
|
5136
5743
|
bindings: {
|
|
5137
5744
|
angular: {
|
|
5138
5745
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -5184,10 +5791,10 @@ var uni_index_default = {
|
|
|
5184
5791
|
id: "stat",
|
|
5185
5792
|
name: "Stat",
|
|
5186
5793
|
status: "stable",
|
|
5187
|
-
summary: "",
|
|
5188
|
-
description: "",
|
|
5794
|
+
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.',
|
|
5795
|
+
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.',
|
|
5189
5796
|
category: "components",
|
|
5190
|
-
version: "8.
|
|
5797
|
+
version: "8.2.0",
|
|
5191
5798
|
bindings: {
|
|
5192
5799
|
angular: {
|
|
5193
5800
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -5289,7 +5896,7 @@ var uni_index_default = {
|
|
|
5289
5896
|
summary: "",
|
|
5290
5897
|
description: "",
|
|
5291
5898
|
category: "primitives",
|
|
5292
|
-
version: "8.
|
|
5899
|
+
version: "8.2.0",
|
|
5293
5900
|
bindings: {
|
|
5294
5901
|
angular: {
|
|
5295
5902
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -5359,10 +5966,10 @@ var uni_index_default = {
|
|
|
5359
5966
|
id: "tab",
|
|
5360
5967
|
name: "Tab",
|
|
5361
5968
|
status: "stable",
|
|
5362
|
-
summary: "",
|
|
5363
|
-
description: "",
|
|
5969
|
+
summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
|
|
5970
|
+
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.",
|
|
5364
5971
|
category: "components",
|
|
5365
|
-
version: "8.
|
|
5972
|
+
version: "8.2.0",
|
|
5366
5973
|
bindings: {
|
|
5367
5974
|
angular: {
|
|
5368
5975
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -5399,10 +6006,10 @@ var uni_index_default = {
|
|
|
5399
6006
|
id: "tabs",
|
|
5400
6007
|
name: "Tabs",
|
|
5401
6008
|
status: "stable",
|
|
5402
|
-
summary: "",
|
|
5403
|
-
description: "",
|
|
6009
|
+
summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
|
|
6010
|
+
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.",
|
|
5404
6011
|
category: "components",
|
|
5405
|
-
version: "8.
|
|
6012
|
+
version: "8.2.0",
|
|
5406
6013
|
bindings: {
|
|
5407
6014
|
angular: {
|
|
5408
6015
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -5463,10 +6070,10 @@ var uni_index_default = {
|
|
|
5463
6070
|
id: "tag",
|
|
5464
6071
|
name: "Tag",
|
|
5465
6072
|
status: "stable",
|
|
5466
|
-
summary: "",
|
|
5467
|
-
description: "",
|
|
6073
|
+
summary: "Compact chip for categories, states, filters and tokens.",
|
|
6074
|
+
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. 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.",
|
|
5468
6075
|
category: "data",
|
|
5469
|
-
version: "8.
|
|
6076
|
+
version: "8.2.0",
|
|
5470
6077
|
bindings: {
|
|
5471
6078
|
angular: {
|
|
5472
6079
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -5828,7 +6435,7 @@ var uni_index_default = {
|
|
|
5828
6435
|
summary: "",
|
|
5829
6436
|
description: "",
|
|
5830
6437
|
category: "forms",
|
|
5831
|
-
version: "8.
|
|
6438
|
+
version: "8.2.0",
|
|
5832
6439
|
bindings: {
|
|
5833
6440
|
angular: {
|
|
5834
6441
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -6142,10 +6749,10 @@ placeholder="Name or address\u2026"
|
|
|
6142
6749
|
id: "text",
|
|
6143
6750
|
name: "Text",
|
|
6144
6751
|
status: "stable",
|
|
6145
|
-
summary: "",
|
|
6146
|
-
description: "",
|
|
6752
|
+
summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
|
|
6753
|
+
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.',
|
|
6147
6754
|
category: "primitives",
|
|
6148
|
-
version: "8.
|
|
6755
|
+
version: "8.2.0",
|
|
6149
6756
|
bindings: {
|
|
6150
6757
|
angular: {
|
|
6151
6758
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -6247,7 +6854,7 @@ placeholder="Name or address\u2026"
|
|
|
6247
6854
|
summary: "",
|
|
6248
6855
|
description: "",
|
|
6249
6856
|
category: "primitives",
|
|
6250
|
-
version: "8.
|
|
6857
|
+
version: "8.2.0",
|
|
6251
6858
|
bindings: {
|
|
6252
6859
|
angular: {
|
|
6253
6860
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -6377,7 +6984,7 @@ placeholder="Name or address\u2026"
|
|
|
6377
6984
|
summary: "",
|
|
6378
6985
|
description: "",
|
|
6379
6986
|
category: "primitives",
|
|
6380
|
-
version: "8.
|
|
6987
|
+
version: "8.2.0",
|
|
6381
6988
|
bindings: {
|
|
6382
6989
|
angular: {
|
|
6383
6990
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -6404,10 +7011,10 @@ placeholder="Name or address\u2026"
|
|
|
6404
7011
|
id: "theme-switch",
|
|
6405
7012
|
name: "ThemeSwitch",
|
|
6406
7013
|
status: "stable",
|
|
6407
|
-
summary: "",
|
|
6408
|
-
description: "",
|
|
7014
|
+
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).",
|
|
7015
|
+
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).",
|
|
6409
7016
|
category: "components",
|
|
6410
|
-
version: "8.
|
|
7017
|
+
version: "8.2.0",
|
|
6411
7018
|
bindings: {
|
|
6412
7019
|
angular: {
|
|
6413
7020
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -6459,24 +7066,23 @@ placeholder="Name or address\u2026"
|
|
|
6459
7066
|
relatedTokens: []
|
|
6460
7067
|
},
|
|
6461
7068
|
{
|
|
6462
|
-
id: "
|
|
6463
|
-
name: "
|
|
7069
|
+
id: "time-input",
|
|
7070
|
+
name: "TimeInput",
|
|
6464
7071
|
status: "stable",
|
|
6465
|
-
summary: "",
|
|
6466
|
-
description: "",
|
|
7072
|
+
summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
|
|
7073
|
+
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.",
|
|
6467
7074
|
category: "forms",
|
|
6468
|
-
version: "8.
|
|
7075
|
+
version: "8.2.0",
|
|
6469
7076
|
bindings: {
|
|
6470
7077
|
angular: {
|
|
6471
7078
|
importPath: "@uni-design-system/uni-angular",
|
|
6472
|
-
selectorOrTag: "uni-
|
|
7079
|
+
selectorOrTag: "uni-time-input, TimeInput",
|
|
6473
7080
|
api: [
|
|
6474
7081
|
{
|
|
6475
|
-
name: "
|
|
7082
|
+
name: "value",
|
|
6476
7083
|
kind: "model",
|
|
6477
|
-
type: "
|
|
7084
|
+
type: "UniTime | undefined",
|
|
6478
7085
|
required: false,
|
|
6479
|
-
default: "false",
|
|
6480
7086
|
description: ""
|
|
6481
7087
|
},
|
|
6482
7088
|
{
|
|
@@ -6517,14 +7123,207 @@ placeholder="Name or address\u2026"
|
|
|
6517
7123
|
type: "boolean",
|
|
6518
7124
|
required: false,
|
|
6519
7125
|
default: "false",
|
|
6520
|
-
description: "
|
|
7126
|
+
description: ""
|
|
6521
7127
|
},
|
|
6522
7128
|
{
|
|
6523
7129
|
name: "ariaDescribedBy",
|
|
6524
7130
|
kind: "input",
|
|
6525
7131
|
type: "string",
|
|
6526
7132
|
required: false,
|
|
6527
|
-
description: "
|
|
7133
|
+
description: ""
|
|
7134
|
+
},
|
|
7135
|
+
{
|
|
7136
|
+
name: "label",
|
|
7137
|
+
kind: "input",
|
|
7138
|
+
type: "string",
|
|
7139
|
+
required: true,
|
|
7140
|
+
description: 'Accessible name for the field, e.g. "Start time".'
|
|
7141
|
+
},
|
|
7142
|
+
{
|
|
7143
|
+
name: "placeholder",
|
|
7144
|
+
kind: "input",
|
|
7145
|
+
type: "string",
|
|
7146
|
+
required: false,
|
|
7147
|
+
description: ""
|
|
7148
|
+
},
|
|
7149
|
+
{
|
|
7150
|
+
name: "minuteStep",
|
|
7151
|
+
kind: "input",
|
|
7152
|
+
type: "number",
|
|
7153
|
+
required: false,
|
|
7154
|
+
default: "30",
|
|
7155
|
+
description: "Generated list granularity, in minutes."
|
|
7156
|
+
},
|
|
7157
|
+
{
|
|
7158
|
+
name: "minTime",
|
|
7159
|
+
kind: "input",
|
|
7160
|
+
type: "UniTime",
|
|
7161
|
+
required: false,
|
|
7162
|
+
description: "Earliest allowed time (inclusive), `'09:00'`."
|
|
7163
|
+
},
|
|
7164
|
+
{
|
|
7165
|
+
name: "maxTime",
|
|
7166
|
+
kind: "input",
|
|
7167
|
+
type: "UniTime",
|
|
7168
|
+
required: false,
|
|
7169
|
+
description: "Latest allowed time (inclusive), `'17:00'`."
|
|
7170
|
+
},
|
|
7171
|
+
{
|
|
7172
|
+
name: "slots",
|
|
7173
|
+
kind: "input",
|
|
7174
|
+
type: "UniTime[]",
|
|
7175
|
+
required: false,
|
|
7176
|
+
description: "Exact allowed times (scheduling). When set, typed entry must match one."
|
|
7177
|
+
},
|
|
7178
|
+
{
|
|
7179
|
+
name: "hour12",
|
|
7180
|
+
kind: "input",
|
|
7181
|
+
type: "boolean",
|
|
7182
|
+
required: false,
|
|
7183
|
+
description: "12-hour display; defaults from the locale. The value stays 24-hour."
|
|
7184
|
+
},
|
|
7185
|
+
{
|
|
7186
|
+
name: "locale",
|
|
7187
|
+
kind: "input",
|
|
7188
|
+
type: "string",
|
|
7189
|
+
required: false,
|
|
7190
|
+
description: "BCP 47 tag for the display format; defaults to the document language."
|
|
7191
|
+
},
|
|
7192
|
+
{
|
|
7193
|
+
name: "commitOnBlur",
|
|
7194
|
+
kind: "input",
|
|
7195
|
+
type: "boolean",
|
|
7196
|
+
required: false,
|
|
7197
|
+
default: "true",
|
|
7198
|
+
description: ""
|
|
7199
|
+
},
|
|
7200
|
+
{
|
|
7201
|
+
name: "embedded",
|
|
7202
|
+
kind: "input",
|
|
7203
|
+
type: "boolean",
|
|
7204
|
+
required: false,
|
|
7205
|
+
default: "false",
|
|
7206
|
+
description: "Renders without its own input-box chrome, for composers like uni-date-time-input."
|
|
7207
|
+
},
|
|
7208
|
+
{
|
|
7209
|
+
name: "rejected",
|
|
7210
|
+
kind: "output",
|
|
7211
|
+
type: "UniTimeInputRejection",
|
|
7212
|
+
required: false,
|
|
7213
|
+
description: "A typed commit was refused; the raw text stays in the field."
|
|
7214
|
+
}
|
|
7215
|
+
]
|
|
7216
|
+
}
|
|
7217
|
+
},
|
|
7218
|
+
examples: [
|
|
7219
|
+
{
|
|
7220
|
+
title: "Primary",
|
|
7221
|
+
framework: "angular",
|
|
7222
|
+
code: "<!-- Storybook story: Primary -->\n<!-- args:\n{ minTime: '09:00', maxTime: '17:00', minuteStep: 30, value: '09:30' }\n-->"
|
|
7223
|
+
},
|
|
7224
|
+
{
|
|
7225
|
+
title: "Slots",
|
|
7226
|
+
framework: "angular",
|
|
7227
|
+
code: "<!-- Storybook story: Slots -->\n<!-- args:\n{ label: 'Slot time', slots: ['09:00', '09:30', '11:00', '14:30'] }\n-->"
|
|
7228
|
+
},
|
|
7229
|
+
{
|
|
7230
|
+
title: "Twenty Four Hour",
|
|
7231
|
+
framework: "angular",
|
|
7232
|
+
code: "<!-- Storybook story: Twenty Four Hour -->\n<!-- args:\n{ hour12: false, minTime: '08:00', maxTime: '18:00', value: '15:00' }\n-->"
|
|
7233
|
+
},
|
|
7234
|
+
{
|
|
7235
|
+
title: "Disabled",
|
|
7236
|
+
framework: "angular",
|
|
7237
|
+
code: "<!-- Storybook story: Disabled -->\n<!-- args:\n{ value: '09:30', disabled: true }\n-->"
|
|
7238
|
+
}
|
|
7239
|
+
],
|
|
7240
|
+
guidelines: {
|
|
7241
|
+
whenToUse: "A time field: a combobox over time options, sharing the exact listbox\ncontract of `uni-search-input` and `uni-tag-input`. Type `3p`, `930` or\n`15:00`, or pick `3:00 PM` from the list \u2014 the form always gets 24-hour\n`'HH:mm'` (`hour12` affects display only). The list is **assistive, not\nexhaustive**: any parseable time commits even if it isn't listed, unless\n`slots` pins the choices.\nTyped shorthand does what an appointment field should: `9` \u2192 09:00,\n`930` \u2192 09:30, `3p` \u2192 15:00, and a bare `3` leans PM in a 12-hour field \u2014\ntyping 3 into an appointment field means 15:00, not 03:00 (the bias yields\nif `minTime`/`maxTime` say otherwise). Unreadable or unavailable text stays\nin the field, flagged, with a `(rejected)` event.",
|
|
7242
|
+
dos: [
|
|
7243
|
+
"Pin `slots` for scheduling; leave them off for free time entry fenced by",
|
|
7244
|
+
"Keep values 24-hour everywhere in app state; let `hour12` handle display."
|
|
7245
|
+
],
|
|
7246
|
+
donts: [
|
|
7247
|
+
'Don\'t use `<input type="time">` alongside it \u2014 the platform control brings',
|
|
7248
|
+
"Don't filter the option list as the user types; the list is a picker, not"
|
|
7249
|
+
],
|
|
7250
|
+
accessibility: [
|
|
7251
|
+
'The input is `role="combobox"` with `aria-expanded`, `aria-controls` and',
|
|
7252
|
+
'Options are named in the display format (*"3:00 PM"*); the committed one',
|
|
7253
|
+
'Commits and rejections announce through `role="status"`.',
|
|
7254
|
+
"Typing never selects an option \u2014 Enter commits the draft, not whatever",
|
|
7255
|
+
"`aria-invalid` is gated on `invalid && (touched || dirty)`; a refused"
|
|
7256
|
+
]
|
|
7257
|
+
},
|
|
7258
|
+
relatedTokens: []
|
|
7259
|
+
},
|
|
7260
|
+
{
|
|
7261
|
+
id: "toggle",
|
|
7262
|
+
name: "Toggle",
|
|
7263
|
+
status: "stable",
|
|
7264
|
+
summary: "",
|
|
7265
|
+
description: "",
|
|
7266
|
+
category: "forms",
|
|
7267
|
+
version: "8.2.0",
|
|
7268
|
+
bindings: {
|
|
7269
|
+
angular: {
|
|
7270
|
+
importPath: "@uni-design-system/uni-angular",
|
|
7271
|
+
selectorOrTag: "uni-toggle",
|
|
7272
|
+
api: [
|
|
7273
|
+
{
|
|
7274
|
+
name: "checked",
|
|
7275
|
+
kind: "model",
|
|
7276
|
+
type: "boolean",
|
|
7277
|
+
required: false,
|
|
7278
|
+
default: "false",
|
|
7279
|
+
description: ""
|
|
7280
|
+
},
|
|
7281
|
+
{
|
|
7282
|
+
name: "disabled",
|
|
7283
|
+
kind: "input",
|
|
7284
|
+
type: "boolean",
|
|
7285
|
+
required: false,
|
|
7286
|
+
default: "false",
|
|
7287
|
+
description: ""
|
|
7288
|
+
},
|
|
7289
|
+
{
|
|
7290
|
+
name: "touched",
|
|
7291
|
+
kind: "model",
|
|
7292
|
+
type: "boolean",
|
|
7293
|
+
required: false,
|
|
7294
|
+
default: "false",
|
|
7295
|
+
description: ""
|
|
7296
|
+
},
|
|
7297
|
+
{
|
|
7298
|
+
name: "invalid",
|
|
7299
|
+
kind: "input",
|
|
7300
|
+
type: "boolean",
|
|
7301
|
+
required: false,
|
|
7302
|
+
default: "false",
|
|
7303
|
+
description: ""
|
|
7304
|
+
},
|
|
7305
|
+
{
|
|
7306
|
+
name: "dirty",
|
|
7307
|
+
kind: "input",
|
|
7308
|
+
type: "boolean",
|
|
7309
|
+
required: false,
|
|
7310
|
+
default: "false",
|
|
7311
|
+
description: ""
|
|
7312
|
+
},
|
|
7313
|
+
{
|
|
7314
|
+
name: "required",
|
|
7315
|
+
kind: "input",
|
|
7316
|
+
type: "boolean",
|
|
7317
|
+
required: false,
|
|
7318
|
+
default: "false",
|
|
7319
|
+
description: "Synced from required() validators by the Signal Forms [field] directive."
|
|
7320
|
+
},
|
|
7321
|
+
{
|
|
7322
|
+
name: "ariaDescribedBy",
|
|
7323
|
+
kind: "input",
|
|
7324
|
+
type: "string",
|
|
7325
|
+
required: false,
|
|
7326
|
+
description: "Id(s) of external element(s) describing this control \u2014 typically your app-rendered error message \u2014 exposed as aria-describedby."
|
|
6528
7327
|
},
|
|
6529
7328
|
{
|
|
6530
7329
|
name: "label",
|
|
@@ -6595,7 +7394,7 @@ placeholder="Name or address\u2026"
|
|
|
6595
7394
|
summary: "",
|
|
6596
7395
|
description: "",
|
|
6597
7396
|
category: "feedback",
|
|
6598
|
-
version: "8.
|
|
7397
|
+
version: "8.2.0",
|
|
6599
7398
|
bindings: {
|
|
6600
7399
|
angular: {
|
|
6601
7400
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -6674,7 +7473,7 @@ placeholder="Name or address\u2026"
|
|
|
6674
7473
|
summary: "",
|
|
6675
7474
|
description: "",
|
|
6676
7475
|
category: "layout",
|
|
6677
|
-
version: "8.
|
|
7476
|
+
version: "8.2.0",
|
|
6678
7477
|
bindings: {
|
|
6679
7478
|
angular: {
|
|
6680
7479
|
importPath: "@uni-design-system/uni-angular",
|
|
@@ -8588,6 +9387,30 @@ placeholder="Name or address\u2026"
|
|
|
8588
9387
|
DarkTheme: "surface"
|
|
8589
9388
|
}
|
|
8590
9389
|
},
|
|
9390
|
+
{
|
|
9391
|
+
id: "checkbox.behavior.borderRadius",
|
|
9392
|
+
value: 2,
|
|
9393
|
+
type: "number",
|
|
9394
|
+
kind: "behavioral",
|
|
9395
|
+
target: "component-prop",
|
|
9396
|
+
appliesTo: "checkbox",
|
|
9397
|
+
themeValues: {
|
|
9398
|
+
LightTheme: 2,
|
|
9399
|
+
DarkTheme: 2
|
|
9400
|
+
}
|
|
9401
|
+
},
|
|
9402
|
+
{
|
|
9403
|
+
id: "checkbox.behavior.focusRingGap",
|
|
9404
|
+
value: 2,
|
|
9405
|
+
type: "number",
|
|
9406
|
+
kind: "behavioral",
|
|
9407
|
+
target: "component-prop",
|
|
9408
|
+
appliesTo: "checkbox",
|
|
9409
|
+
themeValues: {
|
|
9410
|
+
LightTheme: 2,
|
|
9411
|
+
DarkTheme: 2
|
|
9412
|
+
}
|
|
9413
|
+
},
|
|
8591
9414
|
{
|
|
8592
9415
|
id: "radio.behavior.size",
|
|
8593
9416
|
value: 20,
|
|
@@ -8624,6 +9447,18 @@ placeholder="Name or address\u2026"
|
|
|
8624
9447
|
DarkTheme: "surface"
|
|
8625
9448
|
}
|
|
8626
9449
|
},
|
|
9450
|
+
{
|
|
9451
|
+
id: "radio.behavior.transitionSpeed",
|
|
9452
|
+
value: 0.3,
|
|
9453
|
+
type: "number",
|
|
9454
|
+
kind: "behavioral",
|
|
9455
|
+
target: "component-prop",
|
|
9456
|
+
appliesTo: "radio",
|
|
9457
|
+
themeValues: {
|
|
9458
|
+
LightTheme: 0.3,
|
|
9459
|
+
DarkTheme: 0.3
|
|
9460
|
+
}
|
|
9461
|
+
},
|
|
8627
9462
|
{
|
|
8628
9463
|
id: "dialog.behavior.borderRadius",
|
|
8629
9464
|
value: "lg",
|
|
@@ -9153,7 +9988,7 @@ placeholder="Name or address\u2026"
|
|
|
9153
9988
|
}
|
|
9154
9989
|
},
|
|
9155
9990
|
{
|
|
9156
|
-
id: "input.behavior.
|
|
9991
|
+
id: "input.behavior.typeface",
|
|
9157
9992
|
value: "input",
|
|
9158
9993
|
type: "string",
|
|
9159
9994
|
kind: "behavioral",
|
|
@@ -9681,224 +10516,452 @@ placeholder="Name or address\u2026"
|
|
|
9681
10516
|
}
|
|
9682
10517
|
},
|
|
9683
10518
|
{
|
|
9684
|
-
id: "
|
|
10519
|
+
id: "calendar.behavior.dayBorderRadius",
|
|
9685
10520
|
value: "max",
|
|
9686
10521
|
type: "string",
|
|
9687
10522
|
kind: "behavioral",
|
|
9688
10523
|
target: "component-prop",
|
|
9689
|
-
appliesTo: "
|
|
10524
|
+
appliesTo: "calendar",
|
|
9690
10525
|
themeValues: {
|
|
9691
10526
|
LightTheme: "max",
|
|
9692
10527
|
DarkTheme: "max"
|
|
9693
10528
|
}
|
|
9694
10529
|
},
|
|
9695
10530
|
{
|
|
9696
|
-
id: "
|
|
9697
|
-
value: "
|
|
10531
|
+
id: "calendar.behavior.typeface",
|
|
10532
|
+
value: "label",
|
|
9698
10533
|
type: "string",
|
|
9699
10534
|
kind: "behavioral",
|
|
9700
10535
|
target: "component-prop",
|
|
9701
|
-
appliesTo: "
|
|
10536
|
+
appliesTo: "calendar",
|
|
9702
10537
|
themeValues: {
|
|
9703
|
-
LightTheme: "
|
|
9704
|
-
DarkTheme: "
|
|
10538
|
+
LightTheme: "label",
|
|
10539
|
+
DarkTheme: "label"
|
|
9705
10540
|
}
|
|
9706
10541
|
},
|
|
9707
10542
|
{
|
|
9708
|
-
id: "
|
|
9709
|
-
value: "
|
|
10543
|
+
id: "calendar.behavior.gap",
|
|
10544
|
+
value: "xxs",
|
|
9710
10545
|
type: "string",
|
|
9711
10546
|
kind: "behavioral",
|
|
9712
10547
|
target: "component-prop",
|
|
9713
|
-
appliesTo: "
|
|
10548
|
+
appliesTo: "calendar",
|
|
9714
10549
|
themeValues: {
|
|
9715
|
-
LightTheme: "
|
|
9716
|
-
DarkTheme: "
|
|
10550
|
+
LightTheme: "xxs",
|
|
10551
|
+
DarkTheme: "xxs"
|
|
9717
10552
|
}
|
|
9718
10553
|
},
|
|
9719
10554
|
{
|
|
9720
|
-
id: "
|
|
9721
|
-
value: "
|
|
10555
|
+
id: "calendar.behavior.navPrevSymbol",
|
|
10556
|
+
value: "chevron_left",
|
|
9722
10557
|
type: "string",
|
|
9723
10558
|
kind: "behavioral",
|
|
9724
10559
|
target: "component-prop",
|
|
9725
|
-
appliesTo: "
|
|
10560
|
+
appliesTo: "calendar",
|
|
9726
10561
|
themeValues: {
|
|
9727
|
-
LightTheme: "
|
|
9728
|
-
DarkTheme: "
|
|
10562
|
+
LightTheme: "chevron_left",
|
|
10563
|
+
DarkTheme: "chevron_left"
|
|
9729
10564
|
}
|
|
9730
10565
|
},
|
|
9731
10566
|
{
|
|
9732
|
-
id: "
|
|
9733
|
-
value: "
|
|
10567
|
+
id: "calendar.behavior.navNextSymbol",
|
|
10568
|
+
value: "chevron_right",
|
|
9734
10569
|
type: "string",
|
|
9735
10570
|
kind: "behavioral",
|
|
9736
10571
|
target: "component-prop",
|
|
9737
|
-
appliesTo: "
|
|
10572
|
+
appliesTo: "calendar",
|
|
9738
10573
|
themeValues: {
|
|
9739
|
-
LightTheme: "
|
|
9740
|
-
DarkTheme: "
|
|
10574
|
+
LightTheme: "chevron_right",
|
|
10575
|
+
DarkTheme: "chevron_right"
|
|
9741
10576
|
}
|
|
9742
10577
|
},
|
|
9743
10578
|
{
|
|
9744
|
-
id: "
|
|
9745
|
-
value: "
|
|
10579
|
+
id: "calendar.behavior.weekdayFormat",
|
|
10580
|
+
value: "short",
|
|
9746
10581
|
type: "string",
|
|
9747
10582
|
kind: "behavioral",
|
|
9748
10583
|
target: "component-prop",
|
|
9749
|
-
appliesTo: "
|
|
10584
|
+
appliesTo: "calendar",
|
|
9750
10585
|
themeValues: {
|
|
9751
|
-
LightTheme: "
|
|
9752
|
-
DarkTheme: "
|
|
10586
|
+
LightTheme: "short",
|
|
10587
|
+
DarkTheme: "short"
|
|
9753
10588
|
}
|
|
9754
10589
|
},
|
|
9755
10590
|
{
|
|
9756
|
-
id: "
|
|
9757
|
-
value:
|
|
9758
|
-
type: "
|
|
10591
|
+
id: "calendar.behavior.showOutsideDays",
|
|
10592
|
+
value: false,
|
|
10593
|
+
type: "boolean",
|
|
9759
10594
|
kind: "behavioral",
|
|
9760
10595
|
target: "component-prop",
|
|
9761
|
-
appliesTo: "
|
|
10596
|
+
appliesTo: "calendar",
|
|
9762
10597
|
themeValues: {
|
|
9763
|
-
LightTheme:
|
|
9764
|
-
DarkTheme:
|
|
10598
|
+
LightTheme: false,
|
|
10599
|
+
DarkTheme: false
|
|
9765
10600
|
}
|
|
9766
10601
|
},
|
|
9767
10602
|
{
|
|
9768
|
-
id: "
|
|
9769
|
-
value: "
|
|
10603
|
+
id: "calendar.behavior.todayStyle",
|
|
10604
|
+
value: "outline",
|
|
9770
10605
|
type: "string",
|
|
9771
10606
|
kind: "behavioral",
|
|
9772
10607
|
target: "component-prop",
|
|
9773
|
-
appliesTo: "
|
|
10608
|
+
appliesTo: "calendar",
|
|
9774
10609
|
themeValues: {
|
|
9775
|
-
LightTheme: "
|
|
9776
|
-
DarkTheme: "
|
|
10610
|
+
LightTheme: "outline",
|
|
10611
|
+
DarkTheme: "outline"
|
|
9777
10612
|
}
|
|
9778
10613
|
},
|
|
9779
10614
|
{
|
|
9780
|
-
id: "
|
|
9781
|
-
value: "
|
|
10615
|
+
id: "dateInput.behavior.toggleSymbol",
|
|
10616
|
+
value: "calendar_month",
|
|
9782
10617
|
type: "string",
|
|
9783
10618
|
kind: "behavioral",
|
|
9784
10619
|
target: "component-prop",
|
|
9785
|
-
appliesTo: "
|
|
10620
|
+
appliesTo: "dateInput",
|
|
9786
10621
|
themeValues: {
|
|
9787
|
-
LightTheme: "
|
|
9788
|
-
DarkTheme: "
|
|
10622
|
+
LightTheme: "calendar_month",
|
|
10623
|
+
DarkTheme: "calendar_month"
|
|
9789
10624
|
}
|
|
9790
10625
|
},
|
|
9791
10626
|
{
|
|
9792
|
-
id: "
|
|
9793
|
-
value: "
|
|
10627
|
+
id: "dateInput.behavior.popupShadow",
|
|
10628
|
+
value: "menu",
|
|
9794
10629
|
type: "string",
|
|
9795
10630
|
kind: "behavioral",
|
|
9796
10631
|
target: "component-prop",
|
|
9797
|
-
appliesTo: "
|
|
10632
|
+
appliesTo: "dateInput",
|
|
9798
10633
|
themeValues: {
|
|
9799
|
-
LightTheme: "
|
|
9800
|
-
DarkTheme: "
|
|
10634
|
+
LightTheme: "menu",
|
|
10635
|
+
DarkTheme: "menu"
|
|
9801
10636
|
}
|
|
9802
10637
|
},
|
|
9803
10638
|
{
|
|
9804
|
-
id: "
|
|
9805
|
-
value: "
|
|
10639
|
+
id: "dateInput.behavior.popupBorderRadius",
|
|
10640
|
+
value: "xs",
|
|
9806
10641
|
type: "string",
|
|
9807
10642
|
kind: "behavioral",
|
|
9808
10643
|
target: "component-prop",
|
|
9809
|
-
appliesTo: "
|
|
10644
|
+
appliesTo: "dateInput",
|
|
9810
10645
|
themeValues: {
|
|
9811
|
-
LightTheme: "
|
|
9812
|
-
DarkTheme: "
|
|
10646
|
+
LightTheme: "xs",
|
|
10647
|
+
DarkTheme: "xs"
|
|
9813
10648
|
}
|
|
9814
10649
|
},
|
|
9815
10650
|
{
|
|
9816
|
-
id: "
|
|
9817
|
-
value: "
|
|
10651
|
+
id: "dateInput.behavior.popupColor",
|
|
10652
|
+
value: "primary-surface",
|
|
9818
10653
|
type: "string",
|
|
9819
10654
|
kind: "behavioral",
|
|
9820
10655
|
target: "component-prop",
|
|
9821
|
-
appliesTo: "
|
|
10656
|
+
appliesTo: "dateInput",
|
|
9822
10657
|
themeValues: {
|
|
9823
|
-
LightTheme: "
|
|
9824
|
-
DarkTheme: "
|
|
10658
|
+
LightTheme: "primary-surface",
|
|
10659
|
+
DarkTheme: "primary-surface"
|
|
9825
10660
|
}
|
|
9826
10661
|
},
|
|
9827
10662
|
{
|
|
9828
|
-
id: "
|
|
9829
|
-
value: "
|
|
10663
|
+
id: "timeInput.behavior.toggleSymbol",
|
|
10664
|
+
value: "schedule",
|
|
9830
10665
|
type: "string",
|
|
9831
10666
|
kind: "behavioral",
|
|
9832
10667
|
target: "component-prop",
|
|
9833
|
-
appliesTo: "
|
|
10668
|
+
appliesTo: "timeInput",
|
|
9834
10669
|
themeValues: {
|
|
9835
|
-
LightTheme: "
|
|
9836
|
-
DarkTheme: "
|
|
10670
|
+
LightTheme: "schedule",
|
|
10671
|
+
DarkTheme: "schedule"
|
|
9837
10672
|
}
|
|
9838
10673
|
},
|
|
9839
10674
|
{
|
|
9840
|
-
id: "
|
|
9841
|
-
value: "
|
|
10675
|
+
id: "timeInput.behavior.listColor",
|
|
10676
|
+
value: "primary-surface",
|
|
9842
10677
|
type: "string",
|
|
9843
10678
|
kind: "behavioral",
|
|
9844
10679
|
target: "component-prop",
|
|
9845
|
-
appliesTo: "
|
|
10680
|
+
appliesTo: "timeInput",
|
|
9846
10681
|
themeValues: {
|
|
9847
|
-
LightTheme: "
|
|
9848
|
-
DarkTheme: "
|
|
10682
|
+
LightTheme: "primary-surface",
|
|
10683
|
+
DarkTheme: "primary-surface"
|
|
9849
10684
|
}
|
|
9850
10685
|
},
|
|
9851
10686
|
{
|
|
9852
|
-
id: "
|
|
9853
|
-
value: "
|
|
10687
|
+
id: "timeInput.behavior.listShadow",
|
|
10688
|
+
value: "menu",
|
|
9854
10689
|
type: "string",
|
|
9855
10690
|
kind: "behavioral",
|
|
9856
10691
|
target: "component-prop",
|
|
9857
|
-
appliesTo: "
|
|
10692
|
+
appliesTo: "timeInput",
|
|
9858
10693
|
themeValues: {
|
|
9859
|
-
LightTheme: "
|
|
9860
|
-
DarkTheme: "
|
|
10694
|
+
LightTheme: "menu",
|
|
10695
|
+
DarkTheme: "menu"
|
|
9861
10696
|
}
|
|
9862
10697
|
},
|
|
9863
10698
|
{
|
|
9864
|
-
id: "
|
|
9865
|
-
value: "
|
|
10699
|
+
id: "timeInput.behavior.listBorderRadius",
|
|
10700
|
+
value: "xs",
|
|
9866
10701
|
type: "string",
|
|
9867
10702
|
kind: "behavioral",
|
|
9868
10703
|
target: "component-prop",
|
|
9869
|
-
appliesTo: "
|
|
10704
|
+
appliesTo: "timeInput",
|
|
9870
10705
|
themeValues: {
|
|
9871
|
-
LightTheme: "
|
|
9872
|
-
DarkTheme: "
|
|
10706
|
+
LightTheme: "xs",
|
|
10707
|
+
DarkTheme: "xs"
|
|
9873
10708
|
}
|
|
9874
10709
|
},
|
|
9875
10710
|
{
|
|
9876
|
-
id: "
|
|
9877
|
-
value:
|
|
9878
|
-
type: "
|
|
10711
|
+
id: "timeInput.behavior.maxVisibleOptions",
|
|
10712
|
+
value: 7,
|
|
10713
|
+
type: "number",
|
|
9879
10714
|
kind: "behavioral",
|
|
9880
10715
|
target: "component-prop",
|
|
9881
|
-
appliesTo: "
|
|
10716
|
+
appliesTo: "timeInput",
|
|
9882
10717
|
themeValues: {
|
|
9883
|
-
LightTheme:
|
|
9884
|
-
DarkTheme:
|
|
10718
|
+
LightTheme: 7,
|
|
10719
|
+
DarkTheme: 7
|
|
9885
10720
|
}
|
|
9886
10721
|
},
|
|
9887
10722
|
{
|
|
9888
|
-
id: "
|
|
10723
|
+
id: "dateTimeInput.behavior.partGap",
|
|
9889
10724
|
value: "sm",
|
|
9890
10725
|
type: "string",
|
|
9891
10726
|
kind: "behavioral",
|
|
9892
10727
|
target: "component-prop",
|
|
9893
|
-
appliesTo: "
|
|
10728
|
+
appliesTo: "dateTimeInput",
|
|
9894
10729
|
themeValues: {
|
|
9895
10730
|
LightTheme: "sm",
|
|
9896
10731
|
DarkTheme: "sm"
|
|
9897
10732
|
}
|
|
9898
10733
|
},
|
|
9899
10734
|
{
|
|
9900
|
-
id: "
|
|
9901
|
-
value: "
|
|
10735
|
+
id: "dateTimeInput.behavior.dividerColor",
|
|
10736
|
+
value: "outline",
|
|
10737
|
+
type: "string",
|
|
10738
|
+
kind: "behavioral",
|
|
10739
|
+
target: "component-prop",
|
|
10740
|
+
appliesTo: "dateTimeInput",
|
|
10741
|
+
themeValues: {
|
|
10742
|
+
LightTheme: "outline",
|
|
10743
|
+
DarkTheme: "outline"
|
|
10744
|
+
}
|
|
10745
|
+
},
|
|
10746
|
+
{
|
|
10747
|
+
id: "button.behavior.borderRadius",
|
|
10748
|
+
value: "max",
|
|
10749
|
+
type: "string",
|
|
10750
|
+
kind: "behavioral",
|
|
10751
|
+
target: "component-prop",
|
|
10752
|
+
appliesTo: "button",
|
|
10753
|
+
themeValues: {
|
|
10754
|
+
LightTheme: "max",
|
|
10755
|
+
DarkTheme: "max"
|
|
10756
|
+
}
|
|
10757
|
+
},
|
|
10758
|
+
{
|
|
10759
|
+
id: "button.behavior.typeface",
|
|
10760
|
+
value: "button",
|
|
10761
|
+
type: "string",
|
|
10762
|
+
kind: "behavioral",
|
|
10763
|
+
target: "component-prop",
|
|
10764
|
+
appliesTo: "button",
|
|
10765
|
+
themeValues: {
|
|
10766
|
+
LightTheme: "button",
|
|
10767
|
+
DarkTheme: "button"
|
|
10768
|
+
}
|
|
10769
|
+
},
|
|
10770
|
+
{
|
|
10771
|
+
id: "iconButton.behavior.borderRadius",
|
|
10772
|
+
value: "max",
|
|
10773
|
+
type: "string",
|
|
10774
|
+
kind: "behavioral",
|
|
10775
|
+
target: "component-prop",
|
|
10776
|
+
appliesTo: "iconButton",
|
|
10777
|
+
themeValues: {
|
|
10778
|
+
LightTheme: "max",
|
|
10779
|
+
DarkTheme: "max"
|
|
10780
|
+
}
|
|
10781
|
+
},
|
|
10782
|
+
{
|
|
10783
|
+
id: "card.behavior.borderRadius",
|
|
10784
|
+
value: "xs",
|
|
10785
|
+
type: "string",
|
|
10786
|
+
kind: "behavioral",
|
|
10787
|
+
target: "component-prop",
|
|
10788
|
+
appliesTo: "card",
|
|
10789
|
+
themeValues: {
|
|
10790
|
+
LightTheme: "xs",
|
|
10791
|
+
DarkTheme: "xs"
|
|
10792
|
+
}
|
|
10793
|
+
},
|
|
10794
|
+
{
|
|
10795
|
+
id: "dataSearch.behavior.border",
|
|
10796
|
+
value: "light",
|
|
10797
|
+
type: "string",
|
|
10798
|
+
kind: "behavioral",
|
|
10799
|
+
target: "component-prop",
|
|
10800
|
+
appliesTo: "dataSearch",
|
|
10801
|
+
themeValues: {
|
|
10802
|
+
LightTheme: "light",
|
|
10803
|
+
DarkTheme: "light"
|
|
10804
|
+
}
|
|
10805
|
+
},
|
|
10806
|
+
{
|
|
10807
|
+
id: "dataSearch.behavior.borderRadius",
|
|
10808
|
+
value: "xs",
|
|
10809
|
+
type: "string",
|
|
10810
|
+
kind: "behavioral",
|
|
10811
|
+
target: "component-prop",
|
|
10812
|
+
appliesTo: "dataSearch",
|
|
10813
|
+
themeValues: {
|
|
10814
|
+
LightTheme: "xs",
|
|
10815
|
+
DarkTheme: "xs"
|
|
10816
|
+
}
|
|
10817
|
+
},
|
|
10818
|
+
{
|
|
10819
|
+
id: "dataSearch.behavior.color",
|
|
10820
|
+
value: "primary-surface",
|
|
10821
|
+
type: "string",
|
|
10822
|
+
kind: "behavioral",
|
|
10823
|
+
target: "component-prop",
|
|
10824
|
+
appliesTo: "dataSearch",
|
|
10825
|
+
themeValues: {
|
|
10826
|
+
LightTheme: "primary-surface",
|
|
10827
|
+
DarkTheme: "primary-surface"
|
|
10828
|
+
}
|
|
10829
|
+
},
|
|
10830
|
+
{
|
|
10831
|
+
id: "dataSearch.behavior.placeholderColor",
|
|
10832
|
+
value: "disabled",
|
|
10833
|
+
type: "string",
|
|
10834
|
+
kind: "behavioral",
|
|
10835
|
+
target: "component-prop",
|
|
10836
|
+
appliesTo: "dataSearch",
|
|
10837
|
+
themeValues: {
|
|
10838
|
+
LightTheme: "disabled",
|
|
10839
|
+
DarkTheme: "disabled"
|
|
10840
|
+
}
|
|
10841
|
+
},
|
|
10842
|
+
{
|
|
10843
|
+
id: "dataTable.behavior.color",
|
|
10844
|
+
value: "primary-surface",
|
|
10845
|
+
type: "string",
|
|
10846
|
+
kind: "behavioral",
|
|
10847
|
+
target: "component-prop",
|
|
10848
|
+
appliesTo: "dataTable",
|
|
10849
|
+
themeValues: {
|
|
10850
|
+
LightTheme: "primary-surface",
|
|
10851
|
+
DarkTheme: "primary-surface"
|
|
10852
|
+
}
|
|
10853
|
+
},
|
|
10854
|
+
{
|
|
10855
|
+
id: "dataTable.behavior.border",
|
|
10856
|
+
value: "light",
|
|
10857
|
+
type: "string",
|
|
10858
|
+
kind: "behavioral",
|
|
10859
|
+
target: "component-prop",
|
|
10860
|
+
appliesTo: "dataTable",
|
|
10861
|
+
themeValues: {
|
|
10862
|
+
LightTheme: "light",
|
|
10863
|
+
DarkTheme: "light"
|
|
10864
|
+
}
|
|
10865
|
+
},
|
|
10866
|
+
{
|
|
10867
|
+
id: "dataTable.behavior.borderRadius",
|
|
10868
|
+
value: "sm",
|
|
10869
|
+
type: "string",
|
|
10870
|
+
kind: "behavioral",
|
|
10871
|
+
target: "component-prop",
|
|
10872
|
+
appliesTo: "dataTable",
|
|
10873
|
+
themeValues: {
|
|
10874
|
+
LightTheme: "sm",
|
|
10875
|
+
DarkTheme: "sm"
|
|
10876
|
+
}
|
|
10877
|
+
},
|
|
10878
|
+
{
|
|
10879
|
+
id: "dataTable.behavior.headerPadding",
|
|
10880
|
+
value: "sm",
|
|
10881
|
+
type: "string",
|
|
10882
|
+
kind: "behavioral",
|
|
10883
|
+
target: "component-prop",
|
|
10884
|
+
appliesTo: "dataTable",
|
|
10885
|
+
themeValues: {
|
|
10886
|
+
LightTheme: "sm",
|
|
10887
|
+
DarkTheme: "sm"
|
|
10888
|
+
}
|
|
10889
|
+
},
|
|
10890
|
+
{
|
|
10891
|
+
id: "dataTable.behavior.footerPadding",
|
|
10892
|
+
value: "sm",
|
|
10893
|
+
type: "string",
|
|
10894
|
+
kind: "behavioral",
|
|
10895
|
+
target: "component-prop",
|
|
10896
|
+
appliesTo: "dataTable",
|
|
10897
|
+
themeValues: {
|
|
10898
|
+
LightTheme: "sm",
|
|
10899
|
+
DarkTheme: "sm"
|
|
10900
|
+
}
|
|
10901
|
+
},
|
|
10902
|
+
{
|
|
10903
|
+
id: "dataTable.behavior.thTextRole",
|
|
10904
|
+
value: "headline-small",
|
|
10905
|
+
type: "string",
|
|
10906
|
+
kind: "behavioral",
|
|
10907
|
+
target: "component-prop",
|
|
10908
|
+
appliesTo: "dataTable",
|
|
10909
|
+
themeValues: {
|
|
10910
|
+
LightTheme: "headline-small",
|
|
10911
|
+
DarkTheme: "headline-small"
|
|
10912
|
+
}
|
|
10913
|
+
},
|
|
10914
|
+
{
|
|
10915
|
+
id: "dataTable.behavior.thColor",
|
|
10916
|
+
value: "primary-container",
|
|
10917
|
+
type: "string",
|
|
10918
|
+
kind: "behavioral",
|
|
10919
|
+
target: "component-prop",
|
|
10920
|
+
appliesTo: "dataTable",
|
|
10921
|
+
themeValues: {
|
|
10922
|
+
LightTheme: "primary-container",
|
|
10923
|
+
DarkTheme: "primary-container"
|
|
10924
|
+
}
|
|
10925
|
+
},
|
|
10926
|
+
{
|
|
10927
|
+
id: "dataTable.behavior.thVerticalBorder",
|
|
10928
|
+
value: "dotted",
|
|
10929
|
+
type: "string",
|
|
10930
|
+
kind: "behavioral",
|
|
10931
|
+
target: "component-prop",
|
|
10932
|
+
appliesTo: "dataTable",
|
|
10933
|
+
themeValues: {
|
|
10934
|
+
LightTheme: "dotted",
|
|
10935
|
+
DarkTheme: "dotted"
|
|
10936
|
+
}
|
|
10937
|
+
},
|
|
10938
|
+
{
|
|
10939
|
+
id: "dataTable.behavior.thHorizontalBorder",
|
|
10940
|
+
value: "light",
|
|
10941
|
+
type: "string",
|
|
10942
|
+
kind: "behavioral",
|
|
10943
|
+
target: "component-prop",
|
|
10944
|
+
appliesTo: "dataTable",
|
|
10945
|
+
themeValues: {
|
|
10946
|
+
LightTheme: "light",
|
|
10947
|
+
DarkTheme: "light"
|
|
10948
|
+
}
|
|
10949
|
+
},
|
|
10950
|
+
{
|
|
10951
|
+
id: "dataTable.behavior.thPadding",
|
|
10952
|
+
value: "sm",
|
|
10953
|
+
type: "string",
|
|
10954
|
+
kind: "behavioral",
|
|
10955
|
+
target: "component-prop",
|
|
10956
|
+
appliesTo: "dataTable",
|
|
10957
|
+
themeValues: {
|
|
10958
|
+
LightTheme: "sm",
|
|
10959
|
+
DarkTheme: "sm"
|
|
10960
|
+
}
|
|
10961
|
+
},
|
|
10962
|
+
{
|
|
10963
|
+
id: "dataTable.behavior.tdTextRole",
|
|
10964
|
+
value: "title-small",
|
|
9902
10965
|
type: "string",
|
|
9903
10966
|
kind: "behavioral",
|
|
9904
10967
|
target: "component-prop",
|
|
@@ -10746,12 +11809,15 @@ placeholder="Name or address\u2026"
|
|
|
10746
11809
|
},
|
|
10747
11810
|
checkbox: {
|
|
10748
11811
|
size: 20,
|
|
10749
|
-
boxColor: "surface"
|
|
11812
|
+
boxColor: "surface",
|
|
11813
|
+
borderRadius: 2,
|
|
11814
|
+
focusRingGap: 2
|
|
10750
11815
|
},
|
|
10751
11816
|
radio: {
|
|
10752
11817
|
size: 20,
|
|
10753
11818
|
ringColor: "outline",
|
|
10754
|
-
fillColor: "surface"
|
|
11819
|
+
fillColor: "surface",
|
|
11820
|
+
transitionSpeed: 0.3
|
|
10755
11821
|
},
|
|
10756
11822
|
dialog: {
|
|
10757
11823
|
borderRadius: "lg",
|
|
@@ -10814,7 +11880,7 @@ placeholder="Name or address\u2026"
|
|
|
10814
11880
|
logoPadding: "md"
|
|
10815
11881
|
},
|
|
10816
11882
|
input: {
|
|
10817
|
-
|
|
11883
|
+
typeface: "input",
|
|
10818
11884
|
color: "primary-surface",
|
|
10819
11885
|
textColor: "on-primary-surface",
|
|
10820
11886
|
disabledColor: "disabled-surface",
|
|
@@ -10871,6 +11937,33 @@ placeholder="Name or address\u2026"
|
|
|
10871
11937
|
listBorderRadius: "xs",
|
|
10872
11938
|
maxSuggestions: 8
|
|
10873
11939
|
},
|
|
11940
|
+
calendar: {
|
|
11941
|
+
dayBorderRadius: "max",
|
|
11942
|
+
typeface: "label",
|
|
11943
|
+
gap: "xxs",
|
|
11944
|
+
navPrevSymbol: "chevron_left",
|
|
11945
|
+
navNextSymbol: "chevron_right",
|
|
11946
|
+
weekdayFormat: "short",
|
|
11947
|
+
showOutsideDays: false,
|
|
11948
|
+
todayStyle: "outline"
|
|
11949
|
+
},
|
|
11950
|
+
dateInput: {
|
|
11951
|
+
toggleSymbol: "calendar_month",
|
|
11952
|
+
popupShadow: "menu",
|
|
11953
|
+
popupBorderRadius: "xs",
|
|
11954
|
+
popupColor: "primary-surface"
|
|
11955
|
+
},
|
|
11956
|
+
timeInput: {
|
|
11957
|
+
toggleSymbol: "schedule",
|
|
11958
|
+
listColor: "primary-surface",
|
|
11959
|
+
listShadow: "menu",
|
|
11960
|
+
listBorderRadius: "xs",
|
|
11961
|
+
maxVisibleOptions: 7
|
|
11962
|
+
},
|
|
11963
|
+
dateTimeInput: {
|
|
11964
|
+
partGap: "sm",
|
|
11965
|
+
dividerColor: "outline"
|
|
11966
|
+
},
|
|
10874
11967
|
button: {
|
|
10875
11968
|
borderRadius: "max",
|
|
10876
11969
|
typeface: "button"
|
|
@@ -11163,12 +12256,15 @@ placeholder="Name or address\u2026"
|
|
|
11163
12256
|
},
|
|
11164
12257
|
checkbox: {
|
|
11165
12258
|
size: 20,
|
|
11166
|
-
boxColor: "surface"
|
|
12259
|
+
boxColor: "surface",
|
|
12260
|
+
borderRadius: 2,
|
|
12261
|
+
focusRingGap: 2
|
|
11167
12262
|
},
|
|
11168
12263
|
radio: {
|
|
11169
12264
|
size: 20,
|
|
11170
12265
|
ringColor: "outline",
|
|
11171
|
-
fillColor: "surface"
|
|
12266
|
+
fillColor: "surface",
|
|
12267
|
+
transitionSpeed: 0.3
|
|
11172
12268
|
},
|
|
11173
12269
|
dialog: {
|
|
11174
12270
|
borderRadius: "lg",
|
|
@@ -11231,7 +12327,7 @@ placeholder="Name or address\u2026"
|
|
|
11231
12327
|
logoPadding: "md"
|
|
11232
12328
|
},
|
|
11233
12329
|
input: {
|
|
11234
|
-
|
|
12330
|
+
typeface: "input",
|
|
11235
12331
|
color: "primary-surface",
|
|
11236
12332
|
textColor: "on-primary-surface",
|
|
11237
12333
|
disabledColor: "disabled-surface",
|
|
@@ -11269,128 +12365,1309 @@ placeholder="Name or address\u2026"
|
|
|
11269
12365
|
focusOutline: "2px solid #AFB5D8",
|
|
11270
12366
|
focusOutlineOffset: 2
|
|
11271
12367
|
},
|
|
11272
|
-
badge: {
|
|
11273
|
-
borderRadius: "xxs"
|
|
12368
|
+
badge: {
|
|
12369
|
+
borderRadius: "xxs"
|
|
12370
|
+
},
|
|
12371
|
+
tag: {
|
|
12372
|
+
borderRadius: "max",
|
|
12373
|
+
typeface: "tag",
|
|
12374
|
+
gap: "xs",
|
|
12375
|
+
removeIcon: "close",
|
|
12376
|
+
selectedIcon: "check"
|
|
12377
|
+
},
|
|
12378
|
+
tagInput: {
|
|
12379
|
+
chipGap: "xs",
|
|
12380
|
+
chipSize: "md",
|
|
12381
|
+
minInputWidth: "12ch",
|
|
12382
|
+
listColor: "primary-surface",
|
|
12383
|
+
listShadow: "menu",
|
|
12384
|
+
listBorderRadius: "xs",
|
|
12385
|
+
maxSuggestions: 8
|
|
12386
|
+
},
|
|
12387
|
+
calendar: {
|
|
12388
|
+
dayBorderRadius: "max",
|
|
12389
|
+
typeface: "label",
|
|
12390
|
+
gap: "xxs",
|
|
12391
|
+
navPrevSymbol: "chevron_left",
|
|
12392
|
+
navNextSymbol: "chevron_right",
|
|
12393
|
+
weekdayFormat: "short",
|
|
12394
|
+
showOutsideDays: false,
|
|
12395
|
+
todayStyle: "outline"
|
|
12396
|
+
},
|
|
12397
|
+
dateInput: {
|
|
12398
|
+
toggleSymbol: "calendar_month",
|
|
12399
|
+
popupShadow: "menu",
|
|
12400
|
+
popupBorderRadius: "xs",
|
|
12401
|
+
popupColor: "primary-surface"
|
|
12402
|
+
},
|
|
12403
|
+
timeInput: {
|
|
12404
|
+
toggleSymbol: "schedule",
|
|
12405
|
+
listColor: "primary-surface",
|
|
12406
|
+
listShadow: "menu",
|
|
12407
|
+
listBorderRadius: "xs",
|
|
12408
|
+
maxVisibleOptions: 7
|
|
12409
|
+
},
|
|
12410
|
+
dateTimeInput: {
|
|
12411
|
+
partGap: "sm",
|
|
12412
|
+
dividerColor: "outline"
|
|
12413
|
+
},
|
|
12414
|
+
button: {
|
|
12415
|
+
borderRadius: "max",
|
|
12416
|
+
typeface: "button"
|
|
12417
|
+
},
|
|
12418
|
+
iconButton: {
|
|
12419
|
+
borderRadius: "max"
|
|
12420
|
+
},
|
|
12421
|
+
card: {
|
|
12422
|
+
borderRadius: "xs"
|
|
12423
|
+
},
|
|
12424
|
+
dataSearch: {
|
|
12425
|
+
border: "light",
|
|
12426
|
+
borderRadius: "xs",
|
|
12427
|
+
color: "primary-surface",
|
|
12428
|
+
placeholderColor: "disabled"
|
|
12429
|
+
},
|
|
12430
|
+
dataTable: {
|
|
12431
|
+
color: "primary-surface",
|
|
12432
|
+
border: "light",
|
|
12433
|
+
borderRadius: "sm",
|
|
12434
|
+
headerPadding: "sm",
|
|
12435
|
+
footerPadding: "sm",
|
|
12436
|
+
thTextRole: "headline-small",
|
|
12437
|
+
thColor: "primary-container",
|
|
12438
|
+
thVerticalBorder: "dotted",
|
|
12439
|
+
thHorizontalBorder: "light",
|
|
12440
|
+
thPadding: "sm",
|
|
12441
|
+
tdTextRole: "title-small",
|
|
12442
|
+
tdColor: "primary-surface",
|
|
12443
|
+
tdStickyColor: "primary-container",
|
|
12444
|
+
tdPadding: "sm",
|
|
12445
|
+
tdVerticalBorder: "dotted",
|
|
12446
|
+
tdHorizontalBorder: "light",
|
|
12447
|
+
rowHoverColor: "primary-container",
|
|
12448
|
+
loadingOverlayColor: "scrim",
|
|
12449
|
+
loadingSpinnerColor: "primary",
|
|
12450
|
+
loadingSpinnerSize: 40
|
|
12451
|
+
},
|
|
12452
|
+
notificationBadge: {
|
|
12453
|
+
borderRadius: "sm",
|
|
12454
|
+
offset: -10
|
|
12455
|
+
},
|
|
12456
|
+
paginator: {
|
|
12457
|
+
gap: "xs",
|
|
12458
|
+
textRole: "label",
|
|
12459
|
+
inputBorder: "light",
|
|
12460
|
+
inputBorderRadius: "xs",
|
|
12461
|
+
pageBorderRadius: "xs",
|
|
12462
|
+
currentPageBorder: "light",
|
|
12463
|
+
currentPageBorderRadius: "xs"
|
|
12464
|
+
},
|
|
12465
|
+
stat: {
|
|
12466
|
+
labelTypeface: "label",
|
|
12467
|
+
valueTypeface: "stat",
|
|
12468
|
+
color: "surface",
|
|
12469
|
+
border: "light",
|
|
12470
|
+
borderRadius: "xs",
|
|
12471
|
+
positiveColor: "success",
|
|
12472
|
+
negativeColor: "error",
|
|
12473
|
+
trendColor: "outline",
|
|
12474
|
+
trendAccent: "primary",
|
|
12475
|
+
padding: "md",
|
|
12476
|
+
gap: "xxs"
|
|
12477
|
+
},
|
|
12478
|
+
slider: {
|
|
12479
|
+
color: "primary",
|
|
12480
|
+
trackColor: "surface-variant",
|
|
12481
|
+
borderRadius: "max",
|
|
12482
|
+
trackHeight: 4,
|
|
12483
|
+
thumbSize: 16
|
|
12484
|
+
},
|
|
12485
|
+
skeleton: {
|
|
12486
|
+
color: "surface-variant",
|
|
12487
|
+
highlightColor: "surface",
|
|
12488
|
+
borderRadius: "xs",
|
|
12489
|
+
animation: "shimmer",
|
|
12490
|
+
duration: 1.4,
|
|
12491
|
+
gap: "sm"
|
|
12492
|
+
},
|
|
12493
|
+
snackbar: {
|
|
12494
|
+
bottomPosition: 40,
|
|
12495
|
+
transitionDelay: "0.35s",
|
|
12496
|
+
autoCloseDelay: 35e3
|
|
12497
|
+
},
|
|
12498
|
+
symbol: {
|
|
12499
|
+
fill: 0,
|
|
12500
|
+
weight: 400,
|
|
12501
|
+
grade: 0,
|
|
12502
|
+
opticalSize: 24
|
|
12503
|
+
},
|
|
12504
|
+
toggle: {
|
|
12505
|
+
size: 20,
|
|
12506
|
+
trackColor: "surface-variant",
|
|
12507
|
+
knobColor: "surface"
|
|
12508
|
+
},
|
|
12509
|
+
tooltip: {
|
|
12510
|
+
borderRadius: "xs",
|
|
12511
|
+
shadow: "raised",
|
|
12512
|
+
color: "inverse-surface",
|
|
12513
|
+
typeface: "label"
|
|
12514
|
+
}
|
|
12515
|
+
},
|
|
12516
|
+
usage: "Apply style overrides through the Emotion theme provider (the `UniTheme` object), and pass component options as component inputs/props. Import the theme from `@uni-design-system/uni-core` (`DarkTheme`)."
|
|
12517
|
+
}
|
|
12518
|
+
],
|
|
12519
|
+
changelogs: [
|
|
12520
|
+
{
|
|
12521
|
+
package: "@uni-design-system/uni-angular",
|
|
12522
|
+
releases: [
|
|
12523
|
+
{
|
|
12524
|
+
version: "8.2.0",
|
|
12525
|
+
entries: [
|
|
12526
|
+
{
|
|
12527
|
+
bump: "minor",
|
|
12528
|
+
title: "Input options: `typeFace` \u2192 `typeface`, matching the tooltip/button/tabs casing. The base theme now writes `typeface`, and the input box reads the new key with the old one as a deprecated fallback, so themes that still set `typeFace` render unchanged. The `typeFace` key is deprecated and will be removed in the next major.",
|
|
12529
|
+
body: "",
|
|
12530
|
+
commit: "57a8c4c"
|
|
12531
|
+
},
|
|
12532
|
+
{
|
|
12533
|
+
bump: "minor",
|
|
12534
|
+
title: "`uni-select`: `compareWith` input for object values.",
|
|
12535
|
+
body: "The select matched `value` against option values with `===`, so an object value that was structurally but not referentially equal \u2014 a saved record matched against options from a fresh fetch \u2014 never matched, and the native select silently rendered the first option (or the placeholder) instead of the preselection. The new `compareWith` input, called as `compareWith(optionValue, value)` and defaulting to reference equality, lets object-valued selects pass a key comparison like `(a, b) => a?.id === b?.id`. Primitive values were and remain unaffected.",
|
|
12536
|
+
commit: "96113ee"
|
|
12537
|
+
},
|
|
12538
|
+
{
|
|
12539
|
+
bump: "patch",
|
|
12540
|
+
title: "`uni-notification-badge`: a theme that omits the `offset` option no longer breaks badge positioning \u2014 the position values serialized as the invalid length `'undefinedpx'` and the badge lost its corner placement. Missing `offset` now falls back to `0`.",
|
|
12541
|
+
body: "",
|
|
12542
|
+
commit: "57a8c4c"
|
|
12543
|
+
},
|
|
12544
|
+
{
|
|
12545
|
+
bump: "patch",
|
|
12546
|
+
title: "`uni-calendar` / `uni-date-input`: a bound `''` now counts as \"no value\".",
|
|
12547
|
+
body: "An empty string \u2014 the only typeable empty for a string-typed model, and the natural \"no value yet\" in consumer code \u2014 slipped past the month path's nullish (`??`) guards into the grid math: `viewMonth` became `''`, the month heading threw `RangeError: Invalid time value` from `Intl.format` on every change-detection pass, and the grid rendered zero weeks. This hit on first render (the popup content projects eagerly), not just on open. The guards are now falsy, matching how `displayText`, `splitDateTime`, and the rest of the datetime path already treat `''`, so a calendar or date-input bound to `''` renders the current month exactly like `undefined`. `uni-time-input` and `uni-date-time-input` were already safe. Consumers no longer need to normalize `''` to `undefined` before binding \u2014 and note the `value` models were always typed `UniDate | undefined`, so no `$any()` cast is needed for a `string | undefined` draft signal.",
|
|
12548
|
+
commit: "92e5d5e"
|
|
12549
|
+
},
|
|
12550
|
+
{
|
|
12551
|
+
bump: "patch",
|
|
12552
|
+
title: "Ship `CHANGELOG.md` in the published packages. The release notes existed only in the repo; an installed package carried no record of what changed, so upgrade questions couldn't be answered from `node_modules`. uni-angular copies it into the ng-packagr `dist` via `assets`; the rest add it to `files`.",
|
|
12553
|
+
body: "",
|
|
12554
|
+
commit: "e706e38"
|
|
12555
|
+
},
|
|
12556
|
+
{
|
|
12557
|
+
bump: "patch",
|
|
12558
|
+
title: "`uni-menu`, `uni-multi-select`, `uni-data-table`: stop tracking loop collections by identity (NG0956).",
|
|
12559
|
+
body: '`uni-menu` items, `uni-multi-select` options, and `uni-data-table` records tracked by object identity, so a consumer rebuilding the array each change-detection pass \u2014 the natural way to write `[menuItems]="[...]"` or re-fetch table rows \u2014 recreated every DOM node and tripped NG0956. They now track by `$index` (none of these collections carries a stable key: menu items may be templates or dividers, option values may be objects, records are arbitrary), and data-table columns track by their unique `columnDef`. Consumers no longer need to memoize a stable array; DOM nodes \u2014 including a focused menu item \u2014 survive a rebuild.',
|
|
12560
|
+
commit: "96113ee"
|
|
12561
|
+
}
|
|
12562
|
+
],
|
|
12563
|
+
dependencyBumps: []
|
|
12564
|
+
},
|
|
12565
|
+
{
|
|
12566
|
+
version: "8.1.0",
|
|
12567
|
+
entries: [
|
|
12568
|
+
{
|
|
12569
|
+
bump: "minor",
|
|
12570
|
+
title: "Calendar, date & time entry: `uni-calendar`, `uni-date-input`, `uni-time-input` and `uni-date-time-input`, plus a pure datetime helper layer in the cdk.",
|
|
12571
|
+
body: "The most-requested form control family anywhere, built native-platform-first with zero runtime dependencies: `Intl` does all formatting and parsing (no date library), the popup rides the native popover top layer with CSS anchor positioning, and every day in the grid is a real `<button>`.\n- **Values are plain ISO strings, never `Date`s** \u2014 `UniDate` (`'YYYY-MM-DD'`), `UniTime` (`'HH:mm'`, always 24-hour), `UniDateTime` (`'YYYY-MM-DDTHH:mm'`), `UniDateRange` (`{ start, end }`). A `Date` is a timestamp with a timezone problem; a calendar date is a label on a wall calendar. Strings are timezone-free, JSON-serializable and sortable with `<`, and `[value]=\"'2026-08-20'\"` is a complete, correct binding.\n- **`uni-calendar`** is an inline month grid and a form control in its own right: single and range modes in one component (the value shape switches with `mode`), availability **markers** with screen-reader labels, `minDate`/`maxDate` fences, `disabledDates` as a list or predicate, and a two-way `month` model so an app can drive \"jump to June\". One tab stop with a roving-tabindex `role=\"grid\"`; the full APG keyboard map (arrows, week `Home`/`End`, `PageUp`/`PageDown` with `Shift` for years) crosses month edges, skips disabled days directionally, and stops at fences without wrapping. Range selection paints a live preview band, swaps a backwards commit instead of erroring, and narrates every step through a `role=\"status\"` region.\n- **`uni-date-input`** is free-typed date entry \u2014 no input mask (masks fight paste, IMEs and screen-reader echo). The parser accepts ISO, locale-numeric text with the digit order read from `Intl.DateTimeFormat(locale).formatToParts()`, and the locale's own month names; a missing year resolves to the next occurrence and two-digit years are refused rather than guessed. Unreadable, fenced or unavailable text **stays in the field**, flagged, with a `rejected` event. The popup is the same `uni-calendar`, hosted in a `role=\"dialog\"` popover via the shared `uni-dropdown`; `\u2191`/`\u2193` on a committed value step \xB11 day.\n- **`uni-time-input`** is a combobox over time slots \u2014 byte-for-byte the search-input/tag-input listbox contract via the CDK's `ListboxNavigation`. `9` \u2192 09:00, `930` \u2192 09:30, `3p` \u2192 15:00, and a bare `3` leans PM in a 12-hour field (the bias yields when `minTime`/`maxTime` say otherwise). `slots` pins the choices for scheduling, refusing a typed `5pm` as `'unavailable'`; `\u2191`/`\u2193` on a committed value step \xB1`minuteStep`.\n- **`uni-date-time-input`** seats both parts in one `uni-input-box` chrome under one `role=\"group\"` label, emitting one combined value only when both parts are set. `slotsFor` is the scheduling flow in one attribute: the time part stays disabled until a day is chosen, then offers exactly that day's slots, and changing the day clears a slot that no longer exists. The parts gained an `embedded` input so the composer renders one shared box instead of nested chrome.\n- **cdk `datetime` module** (public export): the string-math and `Intl` layer \u2014 `addDays`/`addMonths`/`buildMonthGrid`/`parseDateText`/`parseTimeText`/`timeSlots`/`localeWeekStart` and friends \u2014 pure functions, unit-tested hard, usable by apps directly.\n- **uni-core**: `'calendar'`, `'dateInput'`, `'timeInput'`, `'dateTimeInput'` join `ComponentName` with base-theme entries (day geometry per size token, `dayBorderRadius: 'xxs'` for the square look, toggle glyphs, popup/list chrome). Selection, range and today colours are deliberately not options \u2014 they are the `primary` role pair, so themes restyle them by restyling the palette.\n- **Naming note:** the fences are `minDate`/`maxDate`/`minTime`/`maxTime`/`minDateTime`/`maxDateTime` rather than the platform's `min`/`max`, because Signal Forms' `FormUiControl` reserves `min`/`max` as numeric signals on form controls.",
|
|
12572
|
+
commit: "71bc74c"
|
|
12573
|
+
},
|
|
12574
|
+
{
|
|
12575
|
+
bump: "minor",
|
|
12576
|
+
title: "Themable focus chrome: a shared `focusRing` primitive for every control, plus `focusBorder`/`focusShadow`/`focusColor` options for input boxes.",
|
|
12577
|
+
body: "**Shared focus ring.** A theme can now restyle the keyboard-focus indicator across the whole library by defining `focusRing` **border** and/or **shadow** primitives: `ThemeService.focusRing()` (and the new selector-less `focusRingStyle()`) replaces its default 2px outline with that border \u2014 drawn as an outline hugging the control \u2014 plus the ring shadow. A `focusRing` **thickness** primitive sets the ring's outline offset (negative values overlay the control's resting border, reading as a border-color change). Checkbox, radio, toggle and slider now route their hand-rolled focus styles through the shared helper (calendar days and tag chips already did), so one primitive trio gives every control the same focus language. Themes without the primitives render exactly as before.\n\n**uni-core:** `Thicknesses` is now an open record like `Borders`/`Shadows` (extra named primitives allowed), and `createTheme` accepts a sparse `thicknesses` override merged over the base scale.\n\n**Also in this release:**\n- Radio and toggle scope their transitions (border/background/transform) instead of `all`, so the focus ring's outline and shadow apply instantly \u2014 `transition: all` interpolated the outline from a stale color, flashing a dark ring before the themed ring color landed.\n- The radio's dot grow/retract animation is a token \u2014 `radio.options.transitionSpeed` (seconds, default 0.3 preserving the current feel; 0 switches instantly).\n- The checkbox focus ring rounds proportionally again (box radius plus its gap) and the gap itself is a new `checkbox.options.focusRingGap` option; a `focusRingStyle` call's explicit gap wins over the theme's `focusRing` thickness, then the branch defaults.\n\nThe `input` component options could previously restyle focus only through `focusOutline`/`focusOutlineOffset`. The new optional trio mirrors the error-state trio (`errorBorder`/`errorShadow`/`errorColor`) and applies while any projected control has focus: `focusBorder` swaps the border primitive, `focusShadow` draws a ring (e.g. a soft `0 0 0 3px` spread), and `focusColor` swaps the background. All three default to `undefined`, so existing themes render exactly as before, and they yield to the error state so a flagged field stays visibly flagged while being corrected.\n\nThe Wellsourced showcase theme now defines the `focusRing` pair for its app's `.search-input:focus` look \u2014 an ochre (`secondary`) 1px border with a 10% ring of the same hue, tinted per palette in light and dark \u2014 so text fields (which rest on a canvas tint and snap to the clean surface on focus), checkboxes, radios, toggles, sliders, calendar days and tag chips all share one focus treatment.",
|
|
12578
|
+
commit: "1a6b382"
|
|
12579
|
+
}
|
|
12580
|
+
],
|
|
12581
|
+
dependencyBumps: []
|
|
12582
|
+
},
|
|
12583
|
+
{
|
|
12584
|
+
version: "8.0.0",
|
|
12585
|
+
entries: [
|
|
12586
|
+
{
|
|
12587
|
+
bump: "major",
|
|
12588
|
+
title: "`uni-tag` v2: themable, opt-in removal, two style axes",
|
|
12589
|
+
body: "v1 was a single hardcoded look with the palette welded into its template, an\nunconditional remove button, and no theme entry \u2014 a filter chip, a status pill\nand a recipient token all rendered identically. v2 makes the chip a real themed\ncomponent and the building block `uni-tag-input` composes.\n\n**Breaking (uni-angular)**\n- **`(close)` is now `(removed)`.** The old name shadowed the native `close`\n event and needed an eslint suppression to compile.\n- **The remove button is opt-in** \u2014 set `[removable]=\"true\"`. Previously every\n tag, including a plain category label, shipped a \"Remove \u2026\" button into the\n accessibility tree.\n- Codemod: rename `(close)` \u2192 `(removed)` and add `[removable]=\"true\"` wherever\n a `(close)` handler exists.\n\n**Fixed**\n- **A falsy value can now be removed.** `handleClose` guarded with `if (v)`, so\n a tag keyed `''` or `0` silently could not be dismissed. Every defined value\n emits, and a tag with no value emits `undefined`.\n- The remove control now sizes from the chip instead of the icon-button's own\n `sm` size \u2014 it was 22px inside a 24px chip, and taller than an `sm` chip\n entirely.\n\n**New**\n- **Two orthogonal style axes**: `variant` picks the colour role, `tone` picks\n the archetype (`soft` / `solid` / `outline`). Both resolve from the new `tag`\n theme entry, with tones as nested `&.tone-*` selectors inside each variant so\n a theme author restyles both axes in one place.\n- **`'tag'` joins core's `ComponentName`**, with a `TagTone` type and a full\n theme entry (`options` for radius/typeface/gap/symbols, `variants` per colour\n role, `sizes` carrying geometry only).\n- **`interactive`** turns the chip body into a `<button>` with `selected` mapped\n to `aria-pressed`, keeping the remove control a sibling \u2014 nesting them would\n be invalid HTML and would strand the inner control for keyboard users.\n- **Lead slot**: `avatarSrc`, `avatarName` (initials fallback), `iconName`,\n `symbolName` and `dot` convenience inputs, plus a `[tag-lead]` slot for\n anything richer. Lead elements size from the chip height, and all are\n `aria-hidden` so the chip's text stays its accessible name.\n- **Glyphs are theme icon primitives, not Material ligatures.** The remove and\n selected affordances resolve through the new `removeIcon` / `selectedIcon`\n theme options (defaulting to the built-in `close` and `check`), so they mask\n `currentColor`, recolour with the chip's tone, and can be swapped per theme.\n They also contribute no text to the DOM, which a ligature does \u2014 one less way\n for an accessible name to be polluted. `symbolName` remains as the escape\n hatch for glyphs the theme's icon set doesn't carry.\n- **`invalid`** sets `aria-invalid` and a dashed underline, so the state does\n not rely on colour alone (WCAG 1.4.1); `disabled`, `maxWidth` truncation with\n a `title`, and `removeLabel` for overriding the remove button's name.\n- The component ships with 21 specs, having previously had none.",
|
|
12590
|
+
commit: "760b761"
|
|
12591
|
+
},
|
|
12592
|
+
{
|
|
12593
|
+
bump: "major",
|
|
12594
|
+
title: "`ThemeService`: validated writes, runtime theme registration, live options",
|
|
12595
|
+
body: 'The theme registry was bootstrap-frozen and nothing validated theme writes \u2014\nand a brand theme applied via `applyPalette` never appeared in\n`uni-theme-switch`, leaving the select on a bogus value with no way back.\n\n**Breaking**\n- `ThemeService.theme` is now a **readonly signal**. Direct `theme.set(...)`\n calls (already discouraged in the docs) must move to `setTheme(input)`,\n which validates and returns `ThemeParseResult` \u2014 acceptance or the complete\n list of rejection reasons \u2014 leaving the active theme untouched on rejection.\n- `selectTheme(name)` now returns `boolean` and, for an unknown name, **does\n nothing** \u2014 previously it silently kept the old theme while still recording\n the bad key in `selectedThemeKey` and localStorage.\n- `themeOptions` is now a `computed` (was a once-written writable signal).\n\n**New**\n- **`registerTheme(input, { select? })`** validates and adds a theme to the\n live registry \u2014 it appears in `themeOptions`/`uni-theme-switch` immediately.\n **`unregisterTheme(id)`** removes it, falling back to the first remaining\n theme when it was active. Themes injected via `UNI_THEMES` are validated at\n startup; malformed entries are excluded with a console warning listing every\n reason.\n- **`applyPalette` registers the generated theme under `CustomTheme`**, so\n "Your Brand" is an ordinary, selectable option: it shows in the switcher,\n survives switching away and back, and `clearCustomPalette` unregisters it.\n- **`uni-select` fix:** a selection pointing at an option added in the same\n change-detection pass now applies (per-option `[selected]` binding; the\n select-level `[value]` write landed before new options existed and was\n ignored by the browser) \u2014 any consumer with a growing options list was\n affected.',
|
|
12596
|
+
commit: "6a4c7da"
|
|
12597
|
+
},
|
|
12598
|
+
{
|
|
12599
|
+
bump: "minor",
|
|
12600
|
+
title: "`uni-multi-select-dropdown`: a real accessible name, keyboard navigation, debounced filtering \u2014 and its first specs",
|
|
12601
|
+
body: 'This was the weakest component in the library on exactly the axes the roadmap\'s\ncombobox item names, and it had **no spec file at all**, which is why the\nmissing accessible name survived since it was written.\n- **New `label` input, and the trigger finally names the field.** Its\n accessible name now reads "Fruits, 2 selected, Apple, Cherry". Previously it\n announced only the current selection \u2014 a screen reader user heard\n "Option 1, Option 3" with no way to tell which field it belonged to. The\n selection count comes along, so "how many did I pick" is not left to counting\n commas.\n- **Arrow keys, Home and End walk the options** from anywhere in the panel,\n including the filter box. Reaching the last of thirty options previously\n meant thirty `Tab` presses. Wrapping and the index arithmetic come from the\n CDK\'s shared `ListboxNavigation`, so the keys behave exactly as they do in\n `uni-search-input` and `uni-tag-input`.\n- **The filter is debounced** (new `debounceTime`, default 200ms) instead of\n re-filtering on every keystroke \u2014 the open item in TODO.md.\n- **An empty filter result says so** through `role="status"`, rather than\n leaving the panel blank.\n- **The options are grouped** as a `role="group"` labelled from `label`.\n- **20 specs**, covering the accessible name, selection and toggling, disabled\n behaviour, filtering and debounce, keyboard navigation, and the form-control\n contract.\n\n**A deliberate non-change:** the options stay real checkboxes rather than\nbecoming a multi-selectable `listbox`. APG notes that multi-select listboxes are\nhandled inconsistently across screen readers and suggests a checkbox group\ninstead, and real checkboxes keep each option\'s state announced natively \u2014 so\nconverting would have traded a well-supported pattern for a fashionable one,\nand duplicated the checkbox\'s animated visual into this component where it\nwould drift.',
|
|
12602
|
+
commit: "970c36d"
|
|
12603
|
+
},
|
|
12604
|
+
{
|
|
12605
|
+
bump: "minor",
|
|
12606
|
+
title: "New `uni-tag-input`, plus a shared listbox contract in the CDK",
|
|
12607
|
+
body: 'The type-to-add chip field \u2014 recipients, filters, labels. It is the **open-set**\ncontrol: anything typed can become a token, whether or not it matches a\nsuggestion. Closed-set picking stays with `uni-select` /\n`uni-multi-select-dropdown`, which is the deliberate split \u2014 the two look alike\nbut differ on the one thing that decides the value type, so a single component\nwould force one of them to carry an API it can never use.\n- **`FormValueControl<UniTagItem[]>`.** `{ value: \'a@b.com\' }` is a complete\n item; `label`, `avatarSrc`, `invalid` and `disabled` are optional enrichment.\n- **Invalid entries stay in the value, flagged**, rather than being dropped \u2014 a\n field that silently swallows a typo\'d address is worse than one that shows it\n in red, and Enter on the chip lifts it back into the input to fix. Duplicates\n and over-`max` entries are refused through `(rejected)` with a reason.\n- **Full keyboard contract**: separators commit, Tab commits without trapping,\n Backspace on an empty field _focuses_ the last chip rather than deleting it\n blind, and on a chip Backspace and Delete both remove but move focus in\n opposite directions \u2014 what makes pruning a list feel right.\n- **The whole field is one tab stop.** Chips carry `tabindex="-1"`, so Tab never\n walks through eight recipients to reach the next control.\n- **Announces through a `role="status"` live region** on every add, remove and\n rejection; the removal route is described once per field rather than by every\n chip.\n- **`preset="email"`** wires an address validator, a paste parser that unwraps\n `Name <a@b.com>` and keeps an unterminated tail in the field, and Space as a\n separator.\n- **`\'tagInput\'` joins core\'s `ComponentName`** with a theme entry for the chip\n field\'s own tokens. Field chrome is not duplicated \u2014 it comes from `input` via\n `uni-input-box`, so a tag input restyles with every other field.\n\n**Also in this release**\n- **`ListboxNavigation` in the CDK** (`createListboxNavigation`) owns the\n combobox bookkeeping every type-ahead control needs: open state, active\n option, wrap-around arithmetic, Home/End, and `aria-activedescendant` wiring\n that can never point at an option a narrowing filter has removed.\n `uni-search-input` now uses it \u2014 behaviour unchanged, and it gains Home/End\n for free \u2014 and the multi-select combobox upgrade will too. Three hand-rolled\n copies of one keyboard contract is how they drift.\n- **`uni-tag` gains `controlTabIndex`**, so a composite that owns its own roving\n focus can take its chips out of the tab order, and **`selected` is now\n optional**: an interactive chip carries `aria-pressed` only when it is\n genuinely a toggle. Announcing "not pressed" on a recipient chip is worse than\n announcing nothing.',
|
|
12608
|
+
commit: "de83fe4"
|
|
12609
|
+
},
|
|
12610
|
+
{
|
|
12611
|
+
bump: "minor",
|
|
12612
|
+
title: "Themes registered from JSON get the built-in icons back",
|
|
12613
|
+
body: "`registerTheme` and `setTheme` now hydrate a theme's icons on the way in: the\nbuilt-in set is merged _under_ whatever icons the payload carries, so the\ntheme's own icons still win.\n\nThis is what makes a theme fetched as JSON usable. Transports elide `BaseIcons`\n\u2014 roughly 71% of a serialized theme, and bytes the consumer already ships \u2014 so\nwithout hydration a fetched theme would validate cleanly and then render no\nicons at all. The rule is the same one `createTheme` already applies at\nconstruction (`{...BaseIcons, ...icons}`), so a theme behaves identically\nwhether it was built in-process or arrived over the wire.\n\nThemes provided through `UNI_THEMES` are unaffected: they already carry the full\nset, so hydration is a no-op.",
|
|
12614
|
+
commit: "5414517"
|
|
12615
|
+
},
|
|
12616
|
+
{
|
|
12617
|
+
bump: "patch",
|
|
12618
|
+
title: "Menu items no longer look preselected when opened with the mouse",
|
|
12619
|
+
body: "Opening a `uni-menu` by click left the first item highlighted before the\npointer had touched it, reading as a preselected default. Two correct\nbehaviours combined badly: `onOpened()` implements ARIA roving focus by calling\n`.focus()` on an item every open, and the item styles deliberately painted\n`:focus` the same as `:hover`. Nothing was wrong with the focus itself \u2014 only\nwith painting it after a pointer open.\n- **The highlight now keys on `:focus-visible`.** Programmatic focus following a\n click doesn't match it, while keyboard-driven focus does \u2014 so mouse users get\n no phantom highlight, and keyboard users keep the focus cursor. Roving-focus\n bookkeeping is untouched: a mouse open still moves focus to the first item, so\n screen readers announce it exactly as before.\n- **New `HOVER_OR_KEYBOARD_FOCUS` constant exported from uni-core**, holding\n that selector. Emotion merges styles by _exact selector text_, so a component's\n base rule and any theme variant restyling it have to agree character for\n character \u2014 a variant keyed `'&:hover, &:focus'` would both fail to override\n and reintroduce the phantom highlight. Naming the selector once removes the\n trap; the base theme's `menuItem.warn` tone and the Carbon/Wellsourced\n showcase themes now use it.\n\nThemes with their own `menuItem` variants should key the highlight with\n`HOVER_OR_KEYBOARD_FOCUS`. Note that `:focus-visible` is a browser heuristic:\nafter a user has been navigating by keyboard, a subsequent click may still show\nthe highlight, which is the intended \"this person is using the keyboard\"\nbehaviour rather than a regression.",
|
|
12620
|
+
commit: "3279186"
|
|
12621
|
+
}
|
|
12622
|
+
],
|
|
12623
|
+
dependencyBumps: [
|
|
12624
|
+
"@uni-design-system/uni-core@8.0.0"
|
|
12625
|
+
]
|
|
12626
|
+
},
|
|
12627
|
+
{
|
|
12628
|
+
version: "7.3.0",
|
|
12629
|
+
entries: [
|
|
12630
|
+
{
|
|
12631
|
+
bump: "minor",
|
|
12632
|
+
title: "`expand` gains a themable, size-aware speed",
|
|
12633
|
+
body: "The reveal/collapse duration was hardcoded at 350ms, so a consumer wanting a\nsnappier disclosure \u2014 or wanting adjacent styling to fade on the same clock \u2014\nhad nothing to reference. A fixed duration also reads differently at different\nsizes: sluggish on a two-line region, rushed on a full-page one.\n- **New `transitionSpeed` option in the `expand` theme options** (seconds,\n default `0.35`, matching alert/card `transitionSpeed`) sets the base\n duration. `'expand'` joins core's `ComponentName` union, so custom and\n derived themes can type an `expand` entry.\n- **Duration scales with content height.** The actual duration is\n `transitionSpeed \xD7 \u221A(height \xF7 240px)`, clamped to ~0.15\u20130.6s at the default\n speed (the envelope scales proportionally with a themed speed), so perceived\n speed stays steady across region sizes. The curve and its constants\n (`expandDuration`, `EXPAND_DEFAULT_SPEED`, `EXPAND_MIN_DURATION`,\n `EXPAND_MAX_DURATION`, `EXPAND_REFERENCE_HEIGHT`) are exported from\n uni-core.\n- **New per-instance `transitionSpeed` input** sets an exact duration for one\n region, bypassing the scaling: `<uni-expand [transitionSpeed]=\"0.15\">`.\n- **The resolved duration is exposed as the public `duration` signal** on\n `uni-expand`, so adjacent styling can move on the reveal's clock with a\n plain binding \u2014 `[style.transition-duration]=\"expand.duration() + 's'\"` \u2014\n keeping all timing in the theme/signal pipeline, with no custom CSS.\n- **`expand-toggle` gains a matching `transitionSpeed` input** and otherwise\n follows the theme token instead of its own hardcoded 350ms. Expand Area\n binds the region's resolved `duration` to its toggle, keeping chevron and\n reveal on one clock even when size-scaled or overridden.\n- **Speed is theme-reactive**: swapping themes at runtime retimes regions and\n chevrons live.\n- **Enter/leave easing is now `ease-in-out`** (was `ease-in`), matching the\n chevron rotation so trigger and region decelerate together.\n- **`UniExpandOptions` is exported** from uni-angular for\n `getComponentOptions<UniExpandOptions>('expand')` consumers.",
|
|
12634
|
+
commit: "c828982"
|
|
12635
|
+
},
|
|
12636
|
+
{
|
|
12637
|
+
bump: "minor",
|
|
12638
|
+
title: "Menus join the theme model: `menu` + `menuItem` component options, item tones, and dividers",
|
|
12639
|
+
body: "The menu was the only composite component with no theme surface of its own \u2014\npanel chrome came from the shared `dropdown` entry and every item-level knob\n(height 38, `primary-container` hover, `check` active symbol, `label` type\nrole) was hardcoded. Every Uni menu therefore looked identical, and the gaps a\nreal product hits first (a red Delete, a separator before it, disabled rows)\nwere only reachable via `::ng-deep`.\n- **New `menu` theme options** (`'menu'` joins core's `ComponentName` union):\n `minWidth`, panel `color`/`border`/`borderRadius`/`shadow` (each falling\n back to the `dropdown` options when unset, so menus follow generic popovers\n until a theme deliberately splits them), `paddingVertical`/\n `paddingHorizontal` (panel inset \u2014 `xs` inset plus item `borderRadius`\n yields the \"hover pill\" look; `none` yields full-bleed rows), and\n `dividerBorder`/`dividerSpacing` for separators.\n- **New `menuItem` theme options + variants** (`'menuItem'` joins\n `ComponentName`): `height`, `paddingHorizontal`, `gap`, `borderRadius`,\n `typeface`, `textColor`, `hoverColor`, `activeSymbol` (undefined removes the\n trailing check), and `transitionSpeed`. Theme `variants` on `menuItem` carry\n tones \u2014 the base theme ships a `warn` tone for destructive actions.\n- **`MenuItem` grows `variant`, `disabled`, and `{ divider: true }`.**\n `variant: 'warn'` routes through the theme's `menuItem` variants; `disabled`\n items render in the disabled color, carry `aria-disabled`, and are skipped\n by keyboard navigation; dividers render as `role=\"separator\"` rules styled\n by the `menu` options. `isDivider` and the `UniMenuOptions`/\n `UniMenuItemOptions` interfaces are exported from uni-angular.\n- **`uni-dropdown` panel chrome is now input-overridable**\n (`border`/`borderRadius`/`shadow`/`color`), falling back to the `dropdown`\n theme options \u2014 this is the mechanism `uni-menu` uses; other consumers are\n unchanged.\n- **Default-rendering change:** menus now have `minWidth: 184` from the base\n theme (previously they sized to the widest item). All other defaults\n reproduce the previous look, including the 0.35s hover transition.\n- **The Carbon experiment themes gain menu styling** (sharp full-bleed 40px\n rows, IBM Plex, `$layer-hover`, red danger option, ~110ms motion) with a new\n Carbon Menu story demonstrating that the same component renders both\n aesthetics untouched.",
|
|
12640
|
+
commit: "6e8b429"
|
|
12641
|
+
},
|
|
12642
|
+
{
|
|
12643
|
+
bump: "patch",
|
|
12644
|
+
title: "Tooltip no longer blinks after activating a wrapped control",
|
|
12645
|
+
body: 'Clicking a button inside `uni-tooltip` used to fall through to the bubble\'s\ntap-to-toggle handler and then re-show on the still-hovering pointer \u2014 a\nstate-flipping label ("Expand" \u2192 "Collapse") visibly blinked off and back on\nafter the click.\n- **Activating an interactive element inside the host now hides the bubble\n and suppresses it** until the pointer leaves and returns (or focus moves\n away). Tap-to-toggle is unchanged for non-interactive hosts (inline text).\n- **`expand-toggle` drops its icon-only tooltip.** The rotating chevron plus\n `aria-expanded` and the button\'s accessible name already say everything the\n bubble restated; use the `label` input when a disclosure needs a visible\n name.',
|
|
12646
|
+
commit: "ba4e38d"
|
|
12647
|
+
}
|
|
12648
|
+
],
|
|
12649
|
+
dependencyBumps: []
|
|
12650
|
+
},
|
|
12651
|
+
{
|
|
12652
|
+
version: "7.2.0",
|
|
12653
|
+
entries: [
|
|
12654
|
+
{
|
|
12655
|
+
bump: "minor",
|
|
12656
|
+
title: "Centre `icon-button`'s glyph, fix `expand-toggle`'s rotation, make `expand`",
|
|
12657
|
+
body: "block-level and motion-safe, and give `expand-toggle` a label\n\nGaps found while building collapsible sections in a consuming app, where each\none had to be worked around locally.\n- **`icon-button` centres its glyph.** Sizing `iconName` from the size token\n (shipped in the previous release) made the glyph smaller than the button \u2014\n an `sm` button is a 22px box around an 18px icon \u2014 but the button was\n `display: block`, so the glyph sat in the top-left corner with all the slack\n on its right and bottom. It is now a centring flex box; flex is still\n block-level, so the button's own layout is unchanged, and the\n absolutely-positioned accessible-name span stays out of the flex flow.\n **Visual change** for every `icon-button`: glyphs shift to the middle of the\n box. `symbolName` ligatures centre too, which also means the known\n oversized-ligature case (a 24px glyph in a 22px `sm` box) now clips evenly on\n all sides instead of only bottom-right. Covered by a test.\n- **`expand-toggle` rotates the glyph instead of its host.** This is a fix to\n existing behaviour, visible in 7.1.0 and earlier: the 180\xB0 turn was applied to\n the component host, which is both the tooltip's positioning box (`uni-tooltip`\n sets `anchor-name` on its own element, nested inside the host) and taller than\n the glyph, since an inline-level box reserves baseline descender space. So the\n bubble bobbed along an arc as the chevron turned, and the chevron itself\n drifted off-centre rather than spinning in place. The transform now lands on\n `uni-icon` \u2014 a centred square sized to the glyph, and the only box here that\n rotates symmetrically. The host keeps its `toggled` attribute, so any consumer\n styling keyed on it still works.\n- **`uni-expand` is now `display: block`.** As a custom element it defaulted to\n `display: inline`, so its animated grid laid out as a block-in-inline box and\n the revealed content's spacing came out subtly wrong. Every consumer was\n writing `uni-expand { display: block }` by hand. **Visual change** for anyone\n who was relying on the inline default or already shipping that override \u2014 the\n override is now redundant and can be deleted.\n- **The reveal respects `prefers-reduced-motion`** (WCAG 2.3.3). The\n expand/collapse keyframes ran unconditionally; they're now wrapped in\n `motionSafe`, as is `expand-toggle`'s chevron rotation. Under reduced motion\n the region appears and disappears instantly. `overflow: hidden` moved inside\n the guard deliberately: it exists to clip the box mid-animation, and leaving\n it applied at rest would crop decorations that legitimately paint outside the\n region (focus rings, offset outlines). Angular removes a leaving node on the\n next frame when it detects no animation, so nothing hangs.\n- **`expand-toggle` takes `label` and `sublabel`.** It was chevron-only, so any\n disclosure that names its section \u2014 most of them \u2014 had to hand-roll the whole\n trigger row and its styles, which is how consumers end up with a private\n copy of this component. With `label` set the toggle renders a full-width row\n (chevron, label, muted qualifier) as a single button whose accessible name is\n the label, instead of an icon button sitting next to unrelated text. Only the\n chevron rotates, so the label stays upright. Omit `label` and the icon-only\n shape is unchanged, tooltip and all \u2014 `uni-expand-area` is unaffected.",
|
|
12658
|
+
commit: "8d77ed7"
|
|
12659
|
+
},
|
|
12660
|
+
{
|
|
12661
|
+
bump: "minor",
|
|
12662
|
+
title: "Size `icon-button`'s `iconName` glyph from its size token",
|
|
12663
|
+
body: "`icon-button` rendered a `symbolName` ligature at a font size, but an `iconName`\nmask with no size at all \u2014 and the base `iconButton` size tokens carry no\npadding, so the icon filled the entire button box edge to edge. That made\n`symbolName` \u2192 `iconName` a visual regression rather than a like-for-like swap,\nwhich matters now that `uni-icon` is the preferred path (a mask paints on the\nfirst frame, where a ligature waits on the variable font).\n- `iconName` is now sized from the size token's `fontSize` \u2014 the same value that\n scales the rest of the control \u2014 so the glyph sits inside the button and grows\n with `size`. Concretely, `size=\"sm\"` renders an 18px glyph in a 22px button\n instead of a 22px one.\n- **Visual change** for existing `iconName` call sites: glyphs get slightly\n smaller and gain breathing room. Themes that size icon-buttons with padding\n (e.g. the Carbon example) set a matching `fontSize`, so they land on the same\n glyph size either way and are unaffected.\n- Known gap, now covered by a test that documents rather than blesses it:\n `uni-symbol` takes its size from `opticalSize` (default 24) and ignores the\n button's size token, so a `sm` button renders a 24px ligature in a 22px box.\n Masked icons do not have that problem \u2014 one more reason to prefer `iconName`.",
|
|
12664
|
+
commit: "c532c95"
|
|
12665
|
+
},
|
|
12666
|
+
{
|
|
12667
|
+
bump: "patch",
|
|
12668
|
+
title: 'Fix `uni-icon` ignoring `size="24"` written as a static attribute',
|
|
12669
|
+
body: '`size` appended `px` only to numbers, but a static template attribute arrives as\na string \u2014 so `<uni-icon name="mail" size="24" />` emitted the invalid\n`width: 24`. Browsers drop an invalid declaration, which silently fell back to\nthe stylesheet\'s `width: 100%; height: 100%`.\n\nThat failed in two different ways depending on the container, neither of them\nobvious: inside a fixed box the icon quietly filled it (a 16px glyph rendering\nat 30px), and inside a content-sized flex row `height: 100%` collapsed to zero,\nso the icon vanished while still occupying full width and pushing its label\nacross the row.\n\nA bare numeric string is now treated as px, matching the number form. Genuine\nCSS lengths (`\'1.25rem\'`, `\'50%\'`, `calc(\u2026)`) still pass through untouched.\n`[size]="24"` was unaffected throughout, since property binding passes a real\nnumber.',
|
|
12670
|
+
commit: "c532c95"
|
|
12671
|
+
}
|
|
12672
|
+
],
|
|
12673
|
+
dependencyBumps: []
|
|
12674
|
+
},
|
|
12675
|
+
{
|
|
12676
|
+
version: "7.1.0",
|
|
12677
|
+
entries: [
|
|
12678
|
+
{
|
|
12679
|
+
bump: "minor",
|
|
12680
|
+
title: "Expand `BaseIcons` to 59 icons and add `uni-icon` sizing",
|
|
12681
|
+
body: "The 34-icon set shipped in 7.0.0 covered the library's own components but not a\nreal application \u2014 an app migrating off inline `<svg>` (or off `uni-symbol`, in\nAngular) ran out of names almost immediately. Everything here is additive; all\n34 existing names are unchanged.\n- **25 new icons**, same Material Symbols Outlined 300 source and the same\n `0 -960 960 960` grid as the rest of the set: navigation (`link`, `expand`,\n `gridView`, `listView`), actions (`moreHorizontal`, `copy`, `send`,\n `refresh`, `dragHandle`, `qrCode`), feedback (`star`, `verified`) and\n user/system (`group`, `shieldPerson`, `clock`, `mail`, `chat`, `image`,\n `document`, `payment`, `bank`, `trendingUp`, `extension`, `webhook`,\n `logout`).\n - `moreHorizontal` ships alongside `more` because that one is `more_vert` and\n row-aligned menus need the horizontal kebab.\n - `star` is separate from `favorite`, which is the heart.\n- **`uni-icon` gains an optional `size` input** (`CssLength` \u2014 bare numbers are\n px, strings pass through, so `20` and `'1.25rem'` both work). Left unset,\n behaviour is unchanged: the icon fills its container, which is what lets a\n themed control size its own glyph through padding. Set, it applies\n width/height as inline styles, so an explicit size wins over the\n fill-the-container rule regardless of style injection order. This removes the\n per-call-site `width`/`height` CSS rule that replacing an inline `<svg>` with\n `<uni-icon>` would otherwise need.\n- The MCP `create-icon-tokens` tool now lists the built-in icon names above the\n token map it returns. Apps routinely hand-draw their own `close`, `check` or\n `plus`; encoding those into theme tokens works but adds redundant artwork on a\n foreign grid when the theme already ships the glyph. The tool cannot recognise\n a shape, so it hands the caller the list to check against before adding\n anything.",
|
|
12682
|
+
commit: "c2421c0"
|
|
12683
|
+
}
|
|
12684
|
+
],
|
|
12685
|
+
dependencyBumps: []
|
|
12686
|
+
},
|
|
12687
|
+
{
|
|
12688
|
+
version: "7.0.0",
|
|
12689
|
+
entries: [
|
|
12690
|
+
{
|
|
12691
|
+
bump: "minor",
|
|
12692
|
+
title: "Replace `BaseIcons` with a normalized 34-icon Material Symbols set",
|
|
12693
|
+
body: "The built-in icon set was 11 glyphs drawn from four different grids\n(`0 0 24 24`, `0 0 50 50`, `0 0 64 64`, `0 -960 960 960`), so `checkCircle` and\n`xCircle` rendered as solid filled discs next to a hairline `alertCircle` and an\noversized `close` \u2014 three optical weights in one set.\n- `BaseIcons` is now Material Symbols Outlined at weight 300, every glyph on a\n single `0 -960 960 960` grid, grouped by intent: navigation (`menu`,\n `chevronUp/Down/Left/Right`, `arrowLeft/Right`, `home`, `externalLink`),\n actions (`search`, `close`, `plus`, `minus`, `more`, `delete`, `edit`,\n `download`, `upload`, `share`, `filter`), feedback (`check`, `checkCircle`,\n `xCircle`, `alertCircle`, `info`, `warning`, `lock`) and user/system\n (`profile`, `settings`, `notification`, `favorite`, `help`, `calendar`).\n- All 11 previously shipped names are preserved, so existing `<uni-icon>` call\n sites and theme overrides keep working. Their **appearance changes**: the\n filled `checkCircle`/`xCircle` are now outlined, and the set reads lighter\n overall. `spinner` is carried over verbatim, keyframes intact.\n- New `IconName` and `BaseIconName` types. `IconName` is\n `BaseIconName | (string & {})`, so built-ins autocomplete and typos surface\n while themes can still register arbitrary names via `createTheme({ icons })`.\n `uni-icon`'s `name` input is typed with it instead of `keyof Icons`.\n- **Breaking**: removes the unused `IconToken`, `IconStyle`, `ToggleableIcon`\n and `IconConfig` exports. Nothing in the library referenced them and\n `IconToken`'s 60-name union contradicted the actual `BaseIcons` keys. Use\n `IconName` instead.\n- New exported `svgToIconUri(svg, options?)` \u2014 the supported way to bring your\n own icons (a brand set, a designer handoff) into a theme. It normalizes the\n source (drops the xml declaration, comments and fixed `width`/`height` so the\n mask scales), percent-encodes it, and **rejects artwork that cannot survive\n masking**: no `viewBox`, an embedded raster `<image>`, an external reference,\n a gradient/pattern fill, or more than one paint color. That last one is the\n trap worth naming \u2014 masks use the alpha channel, so a multi-color logo\n flattens to a silhouette in `currentColor`; pass `{ allowMultiColor: true }`\n when that is intended. `createTheme({ icons })` merges the result over\n `BaseIcons` per name, so a built-in name reskins and a new name is added.\n- New MCP tool `create-icon-tokens`, the agent-facing front end to\n `svgToIconUri`: hand it a project's inline `<svg>` (or a brand set) and it\n returns a paste-ready `icons` map for `uni-theme.ts`. It encodes via the same\n helper, so tokens are byte-identical to the built-in set, and adds the\n set-level checks a per-icon helper cannot make \u2014 which names override\n built-ins, and whether the artwork mixes viewBox grids. Bad artwork is\n reported per icon rather than failing the batch, and re-running is safe\n (already-encoded URIs pass through). The server instructions now point agents\n at it whenever they encounter inline SVG.\n- `BaseIcons` is generated by `scripts/generate-icons.mjs` (`pnpm icons:generate`),\n which fetches from the canonical Material Symbols source and validates every\n glyph before writing \u2014 a malformed path, an off-grid viewBox or geometry\n outside the grid aborts the run. `pnpm icons:check` verifies the committed\n file without writing. Add or change icons in that script's manifest and\n regenerate; the file is not hand-edited. `icon.records.spec.ts` asserts the\n same invariants against the committed output.",
|
|
12694
|
+
commit: "f7727aa"
|
|
12695
|
+
}
|
|
12696
|
+
],
|
|
12697
|
+
dependencyBumps: [
|
|
12698
|
+
"@uni-design-system/uni-core@7.0.0"
|
|
12699
|
+
]
|
|
12700
|
+
},
|
|
12701
|
+
{
|
|
12702
|
+
version: "6.1.0",
|
|
12703
|
+
entries: [],
|
|
12704
|
+
dependencyBumps: []
|
|
12705
|
+
},
|
|
12706
|
+
{
|
|
12707
|
+
version: "6.0.1",
|
|
12708
|
+
entries: [
|
|
12709
|
+
{
|
|
12710
|
+
bump: "patch",
|
|
12711
|
+
title: "Canonical MDX docs structure across the entire library",
|
|
12712
|
+
body: "- Component docs pages now follow one flow (spec in AGENTS.md): imports \u2192 Overview \u2192\n Usage (the compact playground: story + source + knobs) \u2192 named variation examples \u2192\n **Theme options** \u2192 Accessibility \u2192 Do/Don't. Property/API/Methods/Events tables are\n retired \u2014 the playground's controls are the API reference.\n- New `ThemeOptions` docs block renders a component's per-theme option tokens live from\n the active Storybook theme (with color swatches), distinguishing per-theme options\n from per-instance inputs; data-table's raw `ThemeDataBlock` dump is replaced.\n- All ~55 component pages conform: the 7 form-control pages (200\u2013390 lines of legacy\n API tables) rewritten; empty Overviews authored (card, tag, icon-button, scroll-area,\n expand-area, data-table); accessibility bullets added across navigation, feedback,\n and form components.\n- The MCP index now carries when-to-use guidance for 55 of 70 components (was 41) and\n accessibility guidance for 36 (was 21) \u2014 the remainder are subcomponents documented\n on their parent pages and internal directives.",
|
|
12713
|
+
commit: "4bfb057"
|
|
12714
|
+
}
|
|
12715
|
+
],
|
|
12716
|
+
dependencyBumps: []
|
|
12717
|
+
},
|
|
12718
|
+
{
|
|
12719
|
+
version: "6.0.0",
|
|
12720
|
+
entries: [
|
|
12721
|
+
{
|
|
12722
|
+
bump: "major",
|
|
12723
|
+
title: "Layout components are attribute-only, on any element",
|
|
12724
|
+
body: '**Breaking:** the shorthand element selectors `Box`, `Stack`, `Row`, `Grid`, `Wrap`,\nand `GridArea` are removed \u2014 a concept inherited from another library that conflicted\nwith semantic HTML. Migrate to the attribute form: `<Box padding="md">` \u2192\n`<div box-layout padding="md">` (GridArea \u2192 `grid-area-layout`).\n\nIn exchange, the attribute selectors now apply to **any element**, not just `div` \u2014\nlayout and semantics compose: `<main box-layout [grow]="1" padding="md">`,\n`<nav stack-layout gap="sm">`, `<section stack-layout>`.\n\nAlso documented, unchanged in behavior: the sizing convention (number = px via\nbinding, `[height]="420"`; plain attribute = CSS length, `height="420px"`) and\nStack/Row\'s `fit-content` min-size defaults (set `[minHeight]="0"` / `[minWidth]="0"`\nfor scroll containment). All internal usages, stories, and docs are migrated \u2014\nincluding the Divider story\'s `<Center>`, which had silently never rendered (Center\nnever had an element selector).',
|
|
12725
|
+
commit: "a02afee"
|
|
12726
|
+
},
|
|
12727
|
+
{
|
|
12728
|
+
bump: "major",
|
|
12729
|
+
title: "Selector unification: one form per component",
|
|
12730
|
+
body: "**Breaking:** every PascalCase alias selector is removed (`Card`, `Menu`, `Symbol`,\n`Icon`, `Dialog`, `Button`, `Tabs`, `Snackbar`, `SelectInput`, `Confirmation`, \u2026 \u2014 a\nconcept inherited from another library). Each component now has exactly one canonical\nform, chosen by what the component is:\n- **Widgets and content-renderers** keep their `uni-*` element: `<uni-card>`,\n `<uni-menu>`, `<uni-symbol>`, `<uni-icon>`, `<uni-tabs>`, `<uni-select>`,\n `<uni-confirmation-dialog>`, \u2026\n- **Decorators of native elements** are attribute-only, and their `div`-locks are\n lifted: `[uni-badge]`, `[uni-dialog-header]` (e.g. on `<header>`),\n `[uni-dialog-buttons]`/`[dialog-buttons]` (e.g. on `<footer>`),\n `[uni-scroll-area]`/`[scroll-area]`, `[uni-menu-item]`/`[menu-item]` (e.g. on\n `<li>`).\n- **Host-locked selectors stay host-locked** where the native element carries the\n behavior: `dialog[uni-dialog]`, `button[uni-text-button]`/`button[text-button]`,\n `button[uni-icon-button]`/`button[icon-button]`.\n\nMigration is mechanical: `<Card>` \u2192 `<uni-card>`, `<Button \u2026>` \u2192\n`<button text-button \u2026>`, `<Dialog \u2026>` \u2192 `<dialog uni-dialog \u2026>`, `<Badge \u2026>` \u2192\n`<div uni-badge \u2026>`, `<ScrollArea \u2026>` \u2192 `<div scroll-area \u2026>`. All internal usages,\nstories, and docs are migrated; `llms.txt` and the MCP index reflect the canonical\nforms.",
|
|
12731
|
+
commit: "f1796fb"
|
|
12732
|
+
},
|
|
12733
|
+
{
|
|
12734
|
+
bump: "major",
|
|
12735
|
+
title: "Text is attribute-only, with a value shorthand and element-aware defaults",
|
|
12736
|
+
body: '**Breaking:** the `uni-text` and `Text` element selectors are removed. Text is now the\nattribute `[uni-text]` on any element, keeping your HTML semantics:\n- **Value shorthand** \u2014 the attribute value is the typeface:\n `<h1 uni-text="display-small">`, `<span uni-text="caption">`, dynamic via\n `[uni-text]="role()"`. The explicit `typeface` input still works (the attribute\n value wins when both are set).\n- **Element-aware defaults** \u2014 with no value, the typeface is inferred from the host:\n `h1`\u2192headline-large, `h2`\u2192headline-medium, `h3`\u2192headline-small, `h4`\u2192title-large,\n `p`\u2192body-1-long, `small`/`figcaption`\u2192caption, `blockquote`\u2192quote, `label`\u2192label,\n else title-small. Plain semantic markup is correctly set with zero configuration.\n\nMigrate `<uni-text typeface="body-1-long">\u2026</uni-text>` \u2192\n`<p uni-text>\u2026</p>` (or `<span uni-text="body-1-long">` where no semantic element\nfits). All internal usages, stories, and docs are migrated.',
|
|
12737
|
+
commit: "a62e9b1"
|
|
12738
|
+
},
|
|
12739
|
+
{
|
|
12740
|
+
bump: "minor",
|
|
12741
|
+
title: "Search input stripped back and made generic; debounce input dressed in the shared chrome",
|
|
12742
|
+
body: "- **`uni-debounce-input`** now wears the themed input chrome via `uni-input-box`\n (color, border, typeface, focus ring) and gains `label` (accessible name),\n `placeholder`, `disabled`, `pre-input`/`post-input` attribute slots for adornments,\n ARIA passthroughs (`role`, `ariaExpanded`, `ariaControls`, `ariaActivedescendant`)\n for composite widgets, and `clear()`/`focus()` methods. Debounce behavior unchanged.\n- **`uni-search-input` redesigned**: the opinionated solid-primary pill bar with the\n embedded `title-large` label is gone. It's now a standard themed field \u2014 decorative\n leading magnifier, clear button while a query exists (refocusing on clear), Enter\n emits `search`, Escape closes/clears.\n- **Type-ahead added**: pass `suggestions` (refresh from `change`) and the field\n becomes an ARIA combobox \u2014 keyboard-navigable listbox (ArrowUp/Down, Enter selects,\n emitting `suggestionSelected` + `search`), `aria-activedescendant` wiring, focus-out\n closing. New `searchInput` theme options: `searchSymbol`, `clearSymbol`, suggestion\n list `listColor`/`listShadow`/`listBorderRadius`, `maxSuggestions`.\n- Visual breaking change for SearchInput consumers (deliberate strip-back); code API\n is compatible (`label`/`width`/`change`/`search` retained; `label` is now the\n accessible name + placeholder fallback rather than displayed text).",
|
|
12743
|
+
commit: "5a6fc60"
|
|
12744
|
+
},
|
|
12745
|
+
{
|
|
12746
|
+
bump: "minor",
|
|
12747
|
+
title: "Checkbox, radio, and toggle conform to theme tokens",
|
|
12748
|
+
body: "- The last hardcoded control colors (`#FFF`, `#ccc`, `#d0d0d0`, `#e0e0e0`,\n `rgba(0,0,0,0.2)`) are gone. Chrome now resolves from new option tokens \u2014\n checkbox `boxColor: 'surface'`; radio `ringColor: 'outline'` / `fillColor:\n correctly on dark and brand themes.\n- The checkbox's check/dash strokes wear the variant's paired on-color\n (`on-primary`, `on-warn`, \u2026) instead of assuming white; disabled states use the\n `disabled`/`on-disabled` tokens; the toggle knob's shadow is the theme's\n brand-tinted `raised` stack, and its hover uses the button convention's\n brightness filter instead of a fixed grey.",
|
|
12749
|
+
commit: "8953d59"
|
|
12750
|
+
},
|
|
12751
|
+
{
|
|
12752
|
+
bump: "minor",
|
|
12753
|
+
title: "New `uni-stat` KPI tile",
|
|
12754
|
+
body: '- Muted label + large headline value (numbers auto-compact via\n `Intl.NumberFormat`: `48234` \u2192 "48.2K") set in a new `stat` type-scale role\n (32px semibold, proportional figures).\n- Optional signed `delta` whose ink is decided by direction \xD7 `upIsGood` \u2014 churn\n going down reads green, tickets going up reads red \u2014 with the arrow glyph\n accompanied by screen-reader "up"/"down" text so state never rides color alone;\n `caption` names the comparison period.\n- Optional decorative 12-point sparkline (`trend` input): stroke in the outline hue,\n endpoint dotted in the accent, `aria-hidden`.\n- Fully token-driven via `stat.options`: card-recipe frame (`color`/`border`/\n `borderRadius`), `labelTypeface`/`valueTypeface`, `positiveColor`/`negativeColor`\n (the semantic inks, AA-guaranteed on surface), `trendColor`/`trendAccent`, spacing.',
|
|
12755
|
+
commit: "7a6da4f"
|
|
12756
|
+
},
|
|
12757
|
+
{
|
|
12758
|
+
bump: "minor",
|
|
12759
|
+
title: "Fix invisible icons; icons become first-class theme primitives",
|
|
12760
|
+
body: "- **Bug**: `uni-icon` resolves icons from `theme.icons`, but every theme shipped\n `icons: {}` \u2014 the icon record was never wired in, so all icons (dialog close, button\n spinner, search/clear affordances) rendered nothing.\n- **Fix + pattern**: the default icon set now lives in core (`BaseIcons`, in\n `concepts/iconography`) and `createTheme` merges a theme's `icons` over it \u2014 themes\n can override or add icons under any name (inline SVG data URIs, masked with\n `currentColor` so they recolor with the theme). The angular `icons` record re-exports\n `BaseIcons` (deprecated).\n- `uni-icon` also sets the standard `mask-image` (was webkit-only, so icons were\n invisible in Firefox regardless) and renders nothing for unknown names instead of a\n broken `url(\"undefined\")`.\n- The emitted `uni-theme.ts` gains an editable `icons` section, and the MCP's\n `generate-uni-theme` guidance instructs agents: never inline SVG in components \u2014\n define an icon once in the theme's `icons` map and render it via `<uni-icon>`.",
|
|
12761
|
+
commit: "fea0b2e"
|
|
12762
|
+
}
|
|
12763
|
+
],
|
|
12764
|
+
dependencyBumps: [
|
|
12765
|
+
"@uni-design-system/uni-core@6.0.0"
|
|
12766
|
+
]
|
|
12767
|
+
},
|
|
12768
|
+
{
|
|
12769
|
+
version: "5.2.0",
|
|
12770
|
+
entries: [
|
|
12771
|
+
{
|
|
12772
|
+
bump: "minor",
|
|
12773
|
+
title: "New `uni-avatar` and `uni-avatar-group` components",
|
|
12774
|
+
body: '- Graceful fallback chain: image \u2192 initials derived from `name` (first + last) \u2192\n themed symbol. Accessible by default: `role="img"` + `aria-label` from the name,\n `aria-hidden` when purely decorative.\n- Fully token-driven: variants color from the role\'s `*-container` tokens, sizes from\n the theme\'s `avatar` size records, corner radius from `options.borderRadius`\n (`max` = circles; a `sharp` theme gets square avatars), initials typeface from\n `options.typeface`, fallback symbol from `options.fallbackSymbol`.\n- `uni-avatar-group` stacks avatars with a token-driven overlap (spacing token) and\n separator ring (`ringColor`/`ringWidth` options); `max` collapses the overflow into\n a themed "+N" chip that is itself a `uni-avatar` (verbatim `text` input).',
|
|
12775
|
+
commit: "1f5ee1d"
|
|
12776
|
+
},
|
|
12777
|
+
{
|
|
12778
|
+
bump: "minor",
|
|
12779
|
+
title: "New `uni-breadcrumb` component",
|
|
12780
|
+
body: '- WAI-ARIA breadcrumb: labelled `nav` landmark wrapping an ordered list, the last item\n marked `aria-current="page"`, separators decorative (`aria-hidden`).\n- Data-driven `items` (root first). Items with `href` render as real anchors; without\n one they render as link-styled buttons emitting `itemClicked` for SPA routing.\n- Token-driven via `breadcrumb.options`: `typeface`, link `color`, `currentColor`,\n `separatorSymbol` (material symbol), and `gap` spacing.',
|
|
12781
|
+
commit: "dca84b1"
|
|
12782
|
+
},
|
|
12783
|
+
{
|
|
12784
|
+
bump: "minor",
|
|
12785
|
+
title: "Button corner rounding and typography conform to component-options tokens",
|
|
12786
|
+
body: "- `button` and `iconButton` themes gain `options: { borderRadius: 'max' }`; the hardcoded\n per-size pixel radii (11/13/18/24) and the icon button's inline `borderRadius: 999` are\n removed. Components resolve the token through `theme.radius()`, so the theme's radii\n scale \u2014 shape languages (`sharp` \u2192 square, `playful` \u2192 pill) and custom radii\n primitives \u2014 now restyles buttons like every other tokened component.\n- Back-compat: the options radius is applied before theme `sizes`/`fixed` styles, so\n hand-authored themes that still set a size-level `borderRadius` keep winning; icon\n buttons fall back to the legacy circle when a theme predates iconButton options.\n- `button` themes also gain `options: { typeface: 'button' }`: the hardcoded\n `fontFamily: 'Euphemia'` (a font no theme loads) is removed from `fixed` and the sizes;\n labels now render the type scale's `button` role (Red Hat Display, medium, capitalize),\n with per-size `fontSize` still applied by `sizes`. Point the token at any typography\n role \u2014 including custom ones \u2014 to restyle every button label.\n- New `UniButtonOptions` interface (`borderRadius`, `typeface`) exported from the button\n model.",
|
|
12787
|
+
commit: "7844dde"
|
|
12788
|
+
},
|
|
12789
|
+
{
|
|
12790
|
+
bump: "minor",
|
|
12791
|
+
title: "Card frame conforms to token primitives",
|
|
12792
|
+
body: "- The card theme's hardcoded frame (`borderStyle`/`borderWidth`/`borderRadius: '8px'` in\n `fixed`, `borderColor` per variant) is replaced by tokens: the card resolves its border\n from the **border primitive named by its variant** (`borders.primary` \u2026\n `borders.success`), its corner radius from the radii scale (`options.borderRadius:\n- `UniCardOptions` gains `border` (pin every card to one primitive \u2014 including a custom\n one \u2014 instead of variant-following) and documents the existing `borderRadius`/\n `elevation`; redefining a border primitive in a theme now restyles cards and every\n other component sharing that token.\n- Token styles apply under the merged theme style, so hand-authored themes that still\n set card `fixed`/`variants` frame styles keep winning. No visual change for default\n themes \u2014 this is pure tokenization.",
|
|
12793
|
+
commit: "7844dde"
|
|
12794
|
+
},
|
|
12795
|
+
{
|
|
12796
|
+
bump: "minor",
|
|
12797
|
+
title: "New `uni-drawer` and `uni-app-bar` \u2014 the dashboard shell",
|
|
12798
|
+
body: '- **`uni-drawer`** has two modes sharing one content slot: `side` renders an in-flow\n `<aside>` that pushes content (width-animated open/close, divider border primitive at\n its edge, `aria-hidden` while closed); `over` renders a native `<dialog>` in the top\n layer \u2014 focus trap, Escape, and scrim backdrop come from the platform, sliding in\n from `position` (`start`/`end`). `open` is a two-way `model()`; Escape and backdrop\n clicks keep it in sync. Tokens: `drawer.options` (`color`, `width`, `divider`,\n `elevation`, `padding`, `backdrop`).\n- **`uni-app-bar`**: leading/trailing content projection slots around a `title` (or\n custom center content), trailing pushed to the far edge; optional `sticky`. Tokens:\n `appBar.options` (`color`, `height`, `divider`, `typeface`, `padding`, `gap`,\n optional `elevation`).\n- The Drawer "DashboardShell" story documents the composition recipe: app bar with a\n menu toggle + side drawer + content.',
|
|
12799
|
+
commit: "17cf662"
|
|
12800
|
+
},
|
|
12801
|
+
{
|
|
12802
|
+
bump: "minor",
|
|
12803
|
+
title: "Progress gauge derives from the palette instead of hardcoded pastels",
|
|
12804
|
+
body: "The gauge's track colors were fixed pastel hexes (`#b3d4ea`, `#b3e7c2`, \u2026) that ignored\nthe active theme entirely \u2014 secondary and success even shared the same green. Tracks now\nuse the role's `*-container` token (the palette's soft tint of that role) and arcs the\nrole base, so gauges follow any brand palette, in both light and dark modes.",
|
|
12805
|
+
commit: "7844dde"
|
|
12806
|
+
},
|
|
12807
|
+
{
|
|
12808
|
+
bump: "minor",
|
|
12809
|
+
title: "New `uni-skeleton` loading placeholder",
|
|
12810
|
+
body: "- Three shapes: `text` (multi-line, ending on a short line like real copy), `rect`,\n and `circle`; explicit `width`/`height` accept CSS strings or px numbers.\n- Painted with surface tokens (`skeleton.options`: `color`, `highlightColor`,\n `borderRadius`, `gap`) so placeholders sit naturally on light and dark themes; the\n shimmer sweep (`animation`/`duration` options) only runs when the user allows motion\n and degrades to static blocks under `prefers-reduced-motion`.\n- `aria-hidden` \u2014 placeholders are invisible to assistive tech by design.",
|
|
12811
|
+
commit: "4ccf18b"
|
|
12812
|
+
},
|
|
12813
|
+
{
|
|
12814
|
+
bump: "minor",
|
|
12815
|
+
title: "New `uni-slider` component \u2014 clears the declared-but-unbuilt `ComponentName` entry",
|
|
12816
|
+
body: '- Native `<input type="range">` under the hood: platform keyboard interaction\n (arrows, Home/End, Page Up/Down) and ARIA slider semantics for free; Signal Forms\n contract (`FormValueControl<number>`) matching Input/Textarea.\n- `min`/`max`/`step` inputs (fractional steps supported), required accessible `label`.\n- Token-driven via `slider.options`: fill/thumb `color`, `trackColor`, `borderRadius`,\n and geometry (`trackHeight`, `thumbSize`). The fill level rides a CSS custom\n property, so dragging never regenerates Emotion styles; Firefox uses the native\n `::-moz-range-progress`, WebKit a gradient stop.',
|
|
12817
|
+
commit: "5d9062a"
|
|
12818
|
+
},
|
|
12819
|
+
{
|
|
12820
|
+
bump: "minor",
|
|
12821
|
+
title: "New `uni-tabs` / `uni-tab` components",
|
|
12822
|
+
body: "- Full WAI-ARIA tabs pattern: `tablist`/`tab`/`tabpanel` roles with wired\n `aria-selected`/`aria-controls`/`aria-labelledby`, roving tabindex, automatic\n activation on ArrowLeft/ArrowRight (wrapping, disabled tabs skipped), Home/End,\n and motion-safe transitions.\n- `selectedIndex` is a two-way `model()`; selection snaps to the nearest enabled tab.\n Panel content is captured per-tab and only the selected panel is instantiated.\n- Every visual knob is a theme option token (`tabs.options`): `typeface`, `textColor`,\n `activeTextColor`, `indicatorColor`, `indicatorThickness` (thickness token),\n `divider` (border primitive), `gap`/`padding` (spacing tokens), `borderRadius`, and\n optional `activeColor` \u2014 the defaults render underline tabs; `borderRadius: 'max'` +\n `activeColor` turns them into segmented pills with no component changes.",
|
|
12823
|
+
commit: "15a8f73"
|
|
12824
|
+
},
|
|
12825
|
+
{
|
|
12826
|
+
bump: "minor",
|
|
12827
|
+
title: "New `uni-textarea` component",
|
|
12828
|
+
body: "- Multi-line text field with the same Signal Forms contract as `uni-input`\n (`FormValueControl<string>`: `value` model, `disabled`/`invalid`/`dirty`/`required`,\n touched-aware error styling, `aria-*` wiring).\n- Reuses `uni-input-box` for its chrome, so it inherits the input's themed color,\n border, typeface, focus outline, and disabled treatment automatically; the box's\n field selectors now cover `textarea` (with auto height and vertical padding), and\n the box accepts a `height` override.\n- Theme options follow the token pattern: `textarea: { options: { rows: 3, resize:\n instance.",
|
|
12829
|
+
commit: "b04b97b"
|
|
12830
|
+
},
|
|
12831
|
+
{
|
|
12832
|
+
bump: "minor",
|
|
12833
|
+
title: "Theme Builder becomes the full playground (PRD \xA75.2)",
|
|
12834
|
+
body: "- **Light & dark side by side**: both palettes generate on every input change,\n independent of the storybook-wide mode toggle, each rendered in its own panel.\n- **Contrast report panel**: live pass/fail matrix over all checked pairs (summary +\n failing rows always visible, full detail on demand). Failures only occur with hard\n brand pins; the panel says so and points at soft targets.\n- **Shape language input** (`sharp`/`modern`/`playful`): applies `ShapeRadii` live via\n the new `radii` pass-through on `BrandPaletteConfig`/`createThemeFromPalette`.\n- **Export paths**: copy the static `uni-theme.ts` (via `emitThemeFile`), copy a\n pre-encoded `ng add` command, or copy W3C DTCG JSON for both modes via the new\n `emitDtcgTokens()` interop emitter in uni-core (Style Dictionary compatible).",
|
|
12835
|
+
commit: "8f55b4c"
|
|
12836
|
+
}
|
|
12837
|
+
],
|
|
12838
|
+
dependencyBumps: []
|
|
12839
|
+
},
|
|
12840
|
+
{
|
|
12841
|
+
version: "5.1.0",
|
|
12842
|
+
entries: [
|
|
12843
|
+
{
|
|
12844
|
+
bump: "patch",
|
|
12845
|
+
title: "Fix `ng add` against real published packages (found by fresh `ng new` e2e):",
|
|
12846
|
+
body: '- The schematic bundle is CJS, but ng-packagr stamps `"type": "module"` into the\n published package.json, so Node loaded it as ESM and the CLI reported "no ng add\n actions". A nested `schematics/package.json` (`"type": "commonjs"`) scopes the\n bundle back to CJS.\n- The emitted `uni-theme.ts` used dot access on `Colors` (which has an index\n signature), failing under `ng new`\'s strict `noPropertyAccessFromIndexSignature`.\n The emitter (and the MCP tool\'s guidance) now uses bracket access throughout.\n- `uni-angular`\'s peer range on `uni-core` is now `workspace:^` (publishes as `^5.x`)\n instead of `workspace:*` (published as an exact pin). Alongside changesets\'\n `onlyUpdatePeerDependentsWhenOutOfRange`, this stops minor releases from being\n inflated to majors by the peer-dependents rule \u2014 the cause of the 4.0.0 and 5.0.0\n version jumps.',
|
|
12847
|
+
commit: "f2951db"
|
|
12848
|
+
}
|
|
12849
|
+
],
|
|
12850
|
+
dependencyBumps: []
|
|
12851
|
+
},
|
|
12852
|
+
{
|
|
12853
|
+
version: "5.0.0",
|
|
12854
|
+
entries: [
|
|
12855
|
+
{
|
|
12856
|
+
bump: "minor",
|
|
12857
|
+
title: "OKLCH theme generation engine (`concepts/generation`)",
|
|
12858
|
+
body: "- New `generateThemes(input)` / `generateUniThemes(input)`: brand seed(s) in, complete\n WCAG-AA light+dark `Colors` pair out, with a machine-readable `ContrastReport`\n (110 checked pairs per theme pair). Pure and deterministic.\n- All palette math moved from HSL to perceptual OKLCH: uniform lightness slots across\n hues, per-category chroma model (`CategoryChroma`), dark-mode accent chroma decoupling\n (C \u2264 0.16), and a contrast guard-rail that adjusts lightness only \u2014 never hue.\n- Brand colors ride as soft `targets` (kept verbatim when already AA, lightness-adjusted\n when not) alongside the existing hard `brand` pins; accepted by `generatePalette`,\n `createThemeFromPalette`, and Angular's `BrandPaletteConfig`.\n- Semantic inks re-tuned per role: error 27\xB0/C 0.20, warn 55\xB0/C 0.18 (rotated off amber \u2014\n dark yellow reads brown), success 152\xB0/C 0.16.\n- `createTheme` accepts optional `radii`/`shadows` overrides; `ShapeRadii` presets\n (`sharp` / `modern` / `playful`) emitted via the `shape` generation input.\n- Theme Builder ships nine curated AA-clean presets built on soft targets.\n- Deprecated (thin wrappers/tables retained): `uniColor`, `randomRangeValue`,\n `CategorySaturation`, `CategoryLightness`. `schemeHues` moved to `color.utils`.\n- `createTheme` deep-merges optional `borders` and `components` overrides over its\n derived defaults \u2014 themes can define custom named primitives and rewire per-component\n options without restating untouched sections.\n- New `emitThemeFile()` renders a static `uni-theme.ts` \u2014 literal colors, visible border\n primitives, sparse component overrides \u2014 the editable source of truth; the engine\n never ships to the browser.\n- New `ng add @uni-design-system/uni-angular` schematic: installs the peer set, writes\n the generated theme file, registers `UNI_THEMES` in `app.config.ts`, adds typeface\n links, scaffolds a themed smoke test, and prints the contrast summary.\n- New MCP tool `generate-uni-theme`: returns the static theme file content, provider\n snippet, and contrast report, with agent guidance to edit the file for restyling.\n- `uni-core` gains its first Vitest suite, including a 1,080-seed contrast property\n corpus with zero tolerance in both modes; the schematic gets its own spec suite.",
|
|
12859
|
+
commit: "f7f0bdd"
|
|
12860
|
+
}
|
|
12861
|
+
],
|
|
12862
|
+
dependencyBumps: [
|
|
12863
|
+
"@uni-design-system/uni-core@5.0.0"
|
|
12864
|
+
]
|
|
12865
|
+
},
|
|
12866
|
+
{
|
|
12867
|
+
version: "4.0.0",
|
|
12868
|
+
entries: [
|
|
12869
|
+
{
|
|
12870
|
+
bump: "minor",
|
|
12871
|
+
title: "Porting Components",
|
|
12872
|
+
body: "",
|
|
12873
|
+
commit: "ef9b3b5"
|
|
12874
|
+
}
|
|
12875
|
+
],
|
|
12876
|
+
dependencyBumps: [
|
|
12877
|
+
"@uni-design-system/uni-core@4.0.0"
|
|
12878
|
+
]
|
|
12879
|
+
},
|
|
12880
|
+
{
|
|
12881
|
+
version: "3.0.2",
|
|
12882
|
+
entries: [
|
|
12883
|
+
{
|
|
12884
|
+
bump: "patch",
|
|
12885
|
+
title: "Extending the Symbol component to support theme options.",
|
|
12886
|
+
body: "",
|
|
12887
|
+
commit: "dcaf166"
|
|
12888
|
+
}
|
|
12889
|
+
],
|
|
12890
|
+
dependencyBumps: [
|
|
12891
|
+
"@uni-design-system/uni-core@3.0.2"
|
|
12892
|
+
]
|
|
12893
|
+
},
|
|
12894
|
+
{
|
|
12895
|
+
version: "3.0.1",
|
|
12896
|
+
entries: [
|
|
12897
|
+
{
|
|
12898
|
+
bump: "patch",
|
|
12899
|
+
title: "Exporting new components and formatting.",
|
|
12900
|
+
body: "",
|
|
12901
|
+
commit: "fabbb73"
|
|
12902
|
+
}
|
|
12903
|
+
],
|
|
12904
|
+
dependencyBumps: [
|
|
12905
|
+
"@uni-design-system/uni-core@3.0.1"
|
|
12906
|
+
]
|
|
12907
|
+
},
|
|
12908
|
+
{
|
|
12909
|
+
version: "3.0.0",
|
|
12910
|
+
entries: [
|
|
12911
|
+
{
|
|
12912
|
+
bump: "minor",
|
|
12913
|
+
title: "Exporting Components, Themes, and CDK",
|
|
12914
|
+
body: "",
|
|
12915
|
+
commit: "54a945c"
|
|
12916
|
+
}
|
|
12917
|
+
],
|
|
12918
|
+
dependencyBumps: [
|
|
12919
|
+
"@uni-design-system/uni-core@3.0.0"
|
|
12920
|
+
]
|
|
12921
|
+
},
|
|
12922
|
+
{
|
|
12923
|
+
version: "2.0.4",
|
|
12924
|
+
entries: [
|
|
12925
|
+
{
|
|
12926
|
+
bump: "patch",
|
|
12927
|
+
title: "Exporting multiple Angular Components",
|
|
12928
|
+
body: "",
|
|
12929
|
+
commit: "ad5dd15"
|
|
12930
|
+
}
|
|
12931
|
+
],
|
|
12932
|
+
dependencyBumps: [
|
|
12933
|
+
"@uni-design-system/uni-core@2.0.4"
|
|
12934
|
+
]
|
|
12935
|
+
},
|
|
12936
|
+
{
|
|
12937
|
+
version: "2.0.3",
|
|
12938
|
+
entries: [
|
|
12939
|
+
{
|
|
12940
|
+
bump: "patch",
|
|
12941
|
+
title: "fix: setting dist directory in publishConfig",
|
|
12942
|
+
body: "",
|
|
12943
|
+
commit: "eb80cff"
|
|
12944
|
+
}
|
|
12945
|
+
],
|
|
12946
|
+
dependencyBumps: [
|
|
12947
|
+
"@uni-design-system/uni-core@2.0.3"
|
|
12948
|
+
]
|
|
12949
|
+
},
|
|
12950
|
+
{
|
|
12951
|
+
version: "2.0.2",
|
|
12952
|
+
entries: [],
|
|
12953
|
+
dependencyBumps: [
|
|
12954
|
+
"@uni-design-system/uni-core@2.0.2"
|
|
12955
|
+
]
|
|
12956
|
+
},
|
|
12957
|
+
{
|
|
12958
|
+
version: "2.0.1",
|
|
12959
|
+
entries: [
|
|
12960
|
+
{
|
|
12961
|
+
bump: "patch",
|
|
12962
|
+
title: "Setting Fixed Versioning for all packages.",
|
|
12963
|
+
body: "",
|
|
12964
|
+
commit: "be0fb26"
|
|
12965
|
+
}
|
|
12966
|
+
],
|
|
12967
|
+
dependencyBumps: [
|
|
12968
|
+
"@uni-design-system/uni-core@2.0.1"
|
|
12969
|
+
]
|
|
12970
|
+
},
|
|
12971
|
+
{
|
|
12972
|
+
version: "2.0.0",
|
|
12973
|
+
entries: [],
|
|
12974
|
+
dependencyBumps: [
|
|
12975
|
+
"@uni-design-system/uni-core@1.1.0"
|
|
12976
|
+
]
|
|
12977
|
+
},
|
|
12978
|
+
{
|
|
12979
|
+
version: "1.0.0",
|
|
12980
|
+
entries: [
|
|
12981
|
+
{
|
|
12982
|
+
bump: "major",
|
|
12983
|
+
title: "init release",
|
|
12984
|
+
body: "",
|
|
12985
|
+
commit: "7d18157"
|
|
12986
|
+
}
|
|
12987
|
+
],
|
|
12988
|
+
dependencyBumps: [
|
|
12989
|
+
"@uni-design-system/uni-core@1.0.0"
|
|
12990
|
+
]
|
|
12991
|
+
}
|
|
12992
|
+
]
|
|
12993
|
+
},
|
|
12994
|
+
{
|
|
12995
|
+
package: "@uni-design-system/uni-core",
|
|
12996
|
+
releases: [
|
|
12997
|
+
{
|
|
12998
|
+
version: "8.2.0",
|
|
12999
|
+
entries: [
|
|
13000
|
+
{
|
|
13001
|
+
bump: "minor",
|
|
13002
|
+
title: "`createTheme` accepts a sparse `typography` override, deep-merged over the base type scale \u2014 restate only the roles (or the individual `TextStyle` fields within a role) that change, and add product-specific roles under any name. Closes the gap where a derived theme (e.g. the Carbon experiment) had to spread `typography` over the created theme by hand.",
|
|
13003
|
+
body: "",
|
|
13004
|
+
commit: "57a8c4c"
|
|
13005
|
+
},
|
|
13006
|
+
{
|
|
13007
|
+
bump: "minor",
|
|
13008
|
+
title: "Input options: `typeFace` \u2192 `typeface`, matching the tooltip/button/tabs casing. The base theme now writes `typeface`, and the input box reads the new key with the old one as a deprecated fallback, so themes that still set `typeFace` render unchanged. The `typeFace` key is deprecated and will be removed in the next major.",
|
|
13009
|
+
body: "",
|
|
13010
|
+
commit: "57a8c4c"
|
|
13011
|
+
},
|
|
13012
|
+
{
|
|
13013
|
+
bump: "patch",
|
|
13014
|
+
title: "Ship `CHANGELOG.md` in the published packages. The release notes existed only in the repo; an installed package carried no record of what changed, so upgrade questions couldn't be answered from `node_modules`. uni-angular copies it into the ng-packagr `dist` via `assets`; the rest add it to `files`.",
|
|
13015
|
+
body: "",
|
|
13016
|
+
commit: "e706e38"
|
|
13017
|
+
}
|
|
13018
|
+
],
|
|
13019
|
+
dependencyBumps: []
|
|
13020
|
+
},
|
|
13021
|
+
{
|
|
13022
|
+
version: "8.1.0",
|
|
13023
|
+
entries: [
|
|
13024
|
+
{
|
|
13025
|
+
bump: "minor",
|
|
13026
|
+
title: "Calendar, date & time entry: `uni-calendar`, `uni-date-input`, `uni-time-input` and `uni-date-time-input`, plus a pure datetime helper layer in the cdk.",
|
|
13027
|
+
body: "The most-requested form control family anywhere, built native-platform-first with zero runtime dependencies: `Intl` does all formatting and parsing (no date library), the popup rides the native popover top layer with CSS anchor positioning, and every day in the grid is a real `<button>`.\n- **Values are plain ISO strings, never `Date`s** \u2014 `UniDate` (`'YYYY-MM-DD'`), `UniTime` (`'HH:mm'`, always 24-hour), `UniDateTime` (`'YYYY-MM-DDTHH:mm'`), `UniDateRange` (`{ start, end }`). A `Date` is a timestamp with a timezone problem; a calendar date is a label on a wall calendar. Strings are timezone-free, JSON-serializable and sortable with `<`, and `[value]=\"'2026-08-20'\"` is a complete, correct binding.\n- **`uni-calendar`** is an inline month grid and a form control in its own right: single and range modes in one component (the value shape switches with `mode`), availability **markers** with screen-reader labels, `minDate`/`maxDate` fences, `disabledDates` as a list or predicate, and a two-way `month` model so an app can drive \"jump to June\". One tab stop with a roving-tabindex `role=\"grid\"`; the full APG keyboard map (arrows, week `Home`/`End`, `PageUp`/`PageDown` with `Shift` for years) crosses month edges, skips disabled days directionally, and stops at fences without wrapping. Range selection paints a live preview band, swaps a backwards commit instead of erroring, and narrates every step through a `role=\"status\"` region.\n- **`uni-date-input`** is free-typed date entry \u2014 no input mask (masks fight paste, IMEs and screen-reader echo). The parser accepts ISO, locale-numeric text with the digit order read from `Intl.DateTimeFormat(locale).formatToParts()`, and the locale's own month names; a missing year resolves to the next occurrence and two-digit years are refused rather than guessed. Unreadable, fenced or unavailable text **stays in the field**, flagged, with a `rejected` event. The popup is the same `uni-calendar`, hosted in a `role=\"dialog\"` popover via the shared `uni-dropdown`; `\u2191`/`\u2193` on a committed value step \xB11 day.\n- **`uni-time-input`** is a combobox over time slots \u2014 byte-for-byte the search-input/tag-input listbox contract via the CDK's `ListboxNavigation`. `9` \u2192 09:00, `930` \u2192 09:30, `3p` \u2192 15:00, and a bare `3` leans PM in a 12-hour field (the bias yields when `minTime`/`maxTime` say otherwise). `slots` pins the choices for scheduling, refusing a typed `5pm` as `'unavailable'`; `\u2191`/`\u2193` on a committed value step \xB1`minuteStep`.\n- **`uni-date-time-input`** seats both parts in one `uni-input-box` chrome under one `role=\"group\"` label, emitting one combined value only when both parts are set. `slotsFor` is the scheduling flow in one attribute: the time part stays disabled until a day is chosen, then offers exactly that day's slots, and changing the day clears a slot that no longer exists. The parts gained an `embedded` input so the composer renders one shared box instead of nested chrome.\n- **cdk `datetime` module** (public export): the string-math and `Intl` layer \u2014 `addDays`/`addMonths`/`buildMonthGrid`/`parseDateText`/`parseTimeText`/`timeSlots`/`localeWeekStart` and friends \u2014 pure functions, unit-tested hard, usable by apps directly.\n- **uni-core**: `'calendar'`, `'dateInput'`, `'timeInput'`, `'dateTimeInput'` join `ComponentName` with base-theme entries (day geometry per size token, `dayBorderRadius: 'xxs'` for the square look, toggle glyphs, popup/list chrome). Selection, range and today colours are deliberately not options \u2014 they are the `primary` role pair, so themes restyle them by restyling the palette.\n- **Naming note:** the fences are `minDate`/`maxDate`/`minTime`/`maxTime`/`minDateTime`/`maxDateTime` rather than the platform's `min`/`max`, because Signal Forms' `FormUiControl` reserves `min`/`max` as numeric signals on form controls.",
|
|
13028
|
+
commit: "71bc74c"
|
|
13029
|
+
},
|
|
13030
|
+
{
|
|
13031
|
+
bump: "minor",
|
|
13032
|
+
title: "Themable focus chrome: a shared `focusRing` primitive for every control, plus `focusBorder`/`focusShadow`/`focusColor` options for input boxes.",
|
|
13033
|
+
body: "**Shared focus ring.** A theme can now restyle the keyboard-focus indicator across the whole library by defining `focusRing` **border** and/or **shadow** primitives: `ThemeService.focusRing()` (and the new selector-less `focusRingStyle()`) replaces its default 2px outline with that border \u2014 drawn as an outline hugging the control \u2014 plus the ring shadow. A `focusRing` **thickness** primitive sets the ring's outline offset (negative values overlay the control's resting border, reading as a border-color change). Checkbox, radio, toggle and slider now route their hand-rolled focus styles through the shared helper (calendar days and tag chips already did), so one primitive trio gives every control the same focus language. Themes without the primitives render exactly as before.\n\n**uni-core:** `Thicknesses` is now an open record like `Borders`/`Shadows` (extra named primitives allowed), and `createTheme` accepts a sparse `thicknesses` override merged over the base scale.\n\n**Also in this release:**\n- Radio and toggle scope their transitions (border/background/transform) instead of `all`, so the focus ring's outline and shadow apply instantly \u2014 `transition: all` interpolated the outline from a stale color, flashing a dark ring before the themed ring color landed.\n- The radio's dot grow/retract animation is a token \u2014 `radio.options.transitionSpeed` (seconds, default 0.3 preserving the current feel; 0 switches instantly).\n- The checkbox focus ring rounds proportionally again (box radius plus its gap) and the gap itself is a new `checkbox.options.focusRingGap` option; a `focusRingStyle` call's explicit gap wins over the theme's `focusRing` thickness, then the branch defaults.\n\nThe `input` component options could previously restyle focus only through `focusOutline`/`focusOutlineOffset`. The new optional trio mirrors the error-state trio (`errorBorder`/`errorShadow`/`errorColor`) and applies while any projected control has focus: `focusBorder` swaps the border primitive, `focusShadow` draws a ring (e.g. a soft `0 0 0 3px` spread), and `focusColor` swaps the background. All three default to `undefined`, so existing themes render exactly as before, and they yield to the error state so a flagged field stays visibly flagged while being corrected.\n\nThe Wellsourced showcase theme now defines the `focusRing` pair for its app's `.search-input:focus` look \u2014 an ochre (`secondary`) 1px border with a 10% ring of the same hue, tinted per palette in light and dark \u2014 so text fields (which rest on a canvas tint and snap to the clean surface on focus), checkboxes, radios, toggles, sliders, calendar days and tag chips all share one focus treatment.",
|
|
13034
|
+
commit: "1a6b382"
|
|
13035
|
+
}
|
|
13036
|
+
],
|
|
13037
|
+
dependencyBumps: []
|
|
13038
|
+
},
|
|
13039
|
+
{
|
|
13040
|
+
version: "8.0.0",
|
|
13041
|
+
entries: [
|
|
13042
|
+
{
|
|
13043
|
+
bump: "minor",
|
|
13044
|
+
title: "Menu items no longer look preselected when opened with the mouse",
|
|
13045
|
+
body: "Opening a `uni-menu` by click left the first item highlighted before the\npointer had touched it, reading as a preselected default. Two correct\nbehaviours combined badly: `onOpened()` implements ARIA roving focus by calling\n`.focus()` on an item every open, and the item styles deliberately painted\n`:focus` the same as `:hover`. Nothing was wrong with the focus itself \u2014 only\nwith painting it after a pointer open.\n- **The highlight now keys on `:focus-visible`.** Programmatic focus following a\n click doesn't match it, while keyboard-driven focus does \u2014 so mouse users get\n no phantom highlight, and keyboard users keep the focus cursor. Roving-focus\n bookkeeping is untouched: a mouse open still moves focus to the first item, so\n screen readers announce it exactly as before.\n- **New `HOVER_OR_KEYBOARD_FOCUS` constant exported from uni-core**, holding\n that selector. Emotion merges styles by _exact selector text_, so a component's\n base rule and any theme variant restyling it have to agree character for\n character \u2014 a variant keyed `'&:hover, &:focus'` would both fail to override\n and reintroduce the phantom highlight. Naming the selector once removes the\n trap; the base theme's `menuItem.warn` tone and the Carbon/Wellsourced\n showcase themes now use it.\n\nThemes with their own `menuItem` variants should key the highlight with\n`HOVER_OR_KEYBOARD_FOCUS`. Note that `:focus-visible` is a browser heuristic:\nafter a user has been navigating by keyboard, a subsequent click may still show\nthe highlight, which is the intended \"this person is using the keyboard\"\nbehaviour rather than a regression.",
|
|
13046
|
+
commit: "3279186"
|
|
13047
|
+
},
|
|
13048
|
+
{
|
|
13049
|
+
bump: "minor",
|
|
13050
|
+
title: "New `uni-tag-input`, plus a shared listbox contract in the CDK",
|
|
13051
|
+
body: 'The type-to-add chip field \u2014 recipients, filters, labels. It is the **open-set**\ncontrol: anything typed can become a token, whether or not it matches a\nsuggestion. Closed-set picking stays with `uni-select` /\n`uni-multi-select-dropdown`, which is the deliberate split \u2014 the two look alike\nbut differ on the one thing that decides the value type, so a single component\nwould force one of them to carry an API it can never use.\n- **`FormValueControl<UniTagItem[]>`.** `{ value: \'a@b.com\' }` is a complete\n item; `label`, `avatarSrc`, `invalid` and `disabled` are optional enrichment.\n- **Invalid entries stay in the value, flagged**, rather than being dropped \u2014 a\n field that silently swallows a typo\'d address is worse than one that shows it\n in red, and Enter on the chip lifts it back into the input to fix. Duplicates\n and over-`max` entries are refused through `(rejected)` with a reason.\n- **Full keyboard contract**: separators commit, Tab commits without trapping,\n Backspace on an empty field _focuses_ the last chip rather than deleting it\n blind, and on a chip Backspace and Delete both remove but move focus in\n opposite directions \u2014 what makes pruning a list feel right.\n- **The whole field is one tab stop.** Chips carry `tabindex="-1"`, so Tab never\n walks through eight recipients to reach the next control.\n- **Announces through a `role="status"` live region** on every add, remove and\n rejection; the removal route is described once per field rather than by every\n chip.\n- **`preset="email"`** wires an address validator, a paste parser that unwraps\n `Name <a@b.com>` and keeps an unterminated tail in the field, and Space as a\n separator.\n- **`\'tagInput\'` joins core\'s `ComponentName`** with a theme entry for the chip\n field\'s own tokens. Field chrome is not duplicated \u2014 it comes from `input` via\n `uni-input-box`, so a tag input restyles with every other field.\n\n**Also in this release**\n- **`ListboxNavigation` in the CDK** (`createListboxNavigation`) owns the\n combobox bookkeeping every type-ahead control needs: open state, active\n option, wrap-around arithmetic, Home/End, and `aria-activedescendant` wiring\n that can never point at an option a narrowing filter has removed.\n `uni-search-input` now uses it \u2014 behaviour unchanged, and it gains Home/End\n for free \u2014 and the multi-select combobox upgrade will too. Three hand-rolled\n copies of one keyboard contract is how they drift.\n- **`uni-tag` gains `controlTabIndex`**, so a composite that owns its own roving\n focus can take its chips out of the tab order, and **`selected` is now\n optional**: an interactive chip carries `aria-pressed` only when it is\n genuinely a toggle. Announcing "not pressed" on a recipient chip is worse than\n announcing nothing.',
|
|
13052
|
+
commit: "de83fe4"
|
|
13053
|
+
},
|
|
13054
|
+
{
|
|
13055
|
+
bump: "minor",
|
|
13056
|
+
title: "`uni-tag` v2: themable, opt-in removal, two style axes",
|
|
13057
|
+
body: "v1 was a single hardcoded look with the palette welded into its template, an\nunconditional remove button, and no theme entry \u2014 a filter chip, a status pill\nand a recipient token all rendered identically. v2 makes the chip a real themed\ncomponent and the building block `uni-tag-input` composes.\n\n**Breaking (uni-angular)**\n- **`(close)` is now `(removed)`.** The old name shadowed the native `close`\n event and needed an eslint suppression to compile.\n- **The remove button is opt-in** \u2014 set `[removable]=\"true\"`. Previously every\n tag, including a plain category label, shipped a \"Remove \u2026\" button into the\n accessibility tree.\n- Codemod: rename `(close)` \u2192 `(removed)` and add `[removable]=\"true\"` wherever\n a `(close)` handler exists.\n\n**Fixed**\n- **A falsy value can now be removed.** `handleClose` guarded with `if (v)`, so\n a tag keyed `''` or `0` silently could not be dismissed. Every defined value\n emits, and a tag with no value emits `undefined`.\n- The remove control now sizes from the chip instead of the icon-button's own\n `sm` size \u2014 it was 22px inside a 24px chip, and taller than an `sm` chip\n entirely.\n\n**New**\n- **Two orthogonal style axes**: `variant` picks the colour role, `tone` picks\n the archetype (`soft` / `solid` / `outline`). Both resolve from the new `tag`\n theme entry, with tones as nested `&.tone-*` selectors inside each variant so\n a theme author restyles both axes in one place.\n- **`'tag'` joins core's `ComponentName`**, with a `TagTone` type and a full\n theme entry (`options` for radius/typeface/gap/symbols, `variants` per colour\n role, `sizes` carrying geometry only).\n- **`interactive`** turns the chip body into a `<button>` with `selected` mapped\n to `aria-pressed`, keeping the remove control a sibling \u2014 nesting them would\n be invalid HTML and would strand the inner control for keyboard users.\n- **Lead slot**: `avatarSrc`, `avatarName` (initials fallback), `iconName`,\n `symbolName` and `dot` convenience inputs, plus a `[tag-lead]` slot for\n anything richer. Lead elements size from the chip height, and all are\n `aria-hidden` so the chip's text stays its accessible name.\n- **Glyphs are theme icon primitives, not Material ligatures.** The remove and\n selected affordances resolve through the new `removeIcon` / `selectedIcon`\n theme options (defaulting to the built-in `close` and `check`), so they mask\n `currentColor`, recolour with the chip's tone, and can be swapped per theme.\n They also contribute no text to the DOM, which a ligature does \u2014 one less way\n for an accessible name to be polluted. `symbolName` remains as the escape\n hatch for glyphs the theme's icon set doesn't carry.\n- **`invalid`** sets `aria-invalid` and a dashed underline, so the state does\n not rely on colour alone (WCAG 1.4.1); `disabled`, `maxWidth` truncation with\n a `title`, and `removeLabel` for overriding the remove button's name.\n- The component ships with 21 specs, having previously had none.",
|
|
13058
|
+
commit: "760b761"
|
|
13059
|
+
},
|
|
13060
|
+
{
|
|
13061
|
+
bump: "minor",
|
|
13062
|
+
title: "Theme validation contract: `parseTheme` / `assertTheme` / `isUniTheme`",
|
|
13063
|
+
body: "Every theme scale is `Partial<Record<\u2026>>`, so a malformed theme \u2014 hand\nwritten, generated, or fetched as JSON \u2014 rendered as silent `undefined` CSS\nwith no diagnosis. Core now ships a **dependency-free** structural validator\n(core stays zero-dep; no zod outside the MCP):\n- **`parseTheme(input): ThemeParseResult`** collects every issue rather than\n failing fast: `{ success, theme?, issues: [{ path, message }] }` with dotted\n paths like `colors.primary` or `typography.label.fontSize`. Acceptance /\n rejection **with reasons** is the API.\n- **`assertTheme(input)`** throws with all reasons; **`isUniTheme`** is the\n type-guard form; **`formatThemeIssues`** renders issues for logs.\n- The contract requires what components can't render without: 16\n `REQUIRED_COLOR_TOKENS`, all 22 canonical `REQUIRED_TEXT_ROLES` (with\n `fontFamily`/`fontSize`/`lineHeight`), the spacing/radii/shadow/thickness\n scale keys, and recursively-valid component style expressions. All\n `REQUIRED_*` sets are exported for tooling (MCP, docs, registries). Themes\n remain free to add arbitrary named primitives on every scale.\n- Because a `UniTheme` is plain serializable data, the same contract\n validates JSON round-trips \u2014 the foundation for theme distribution and\n runtime theme registries (ROADMAP Track 1).",
|
|
13064
|
+
commit: "6a4c7da"
|
|
13065
|
+
},
|
|
13066
|
+
{
|
|
13067
|
+
bump: "minor",
|
|
13068
|
+
title: "A wire format for themes: `hydrateTheme` / `dehydrateTheme`",
|
|
13069
|
+
body: "A `UniTheme` is plain serializable data, which makes JSON the natural transport\nfor distributing themes \u2014 but a serialized theme is ~50 KB and **~71% of that is\nthe 61 built-in icon data URIs that every uni-core consumer already ships**.\n- **`dehydrateTheme(theme)`** returns the wire form: icons identical to\n `BaseIcons` are dropped, genuine overrides kept. A theme goes from ~50 KB to\n ~14 KB, and still passes `parseTheme`.\n- **`hydrateTheme(theme)`** restores the built-in set on the way in, applying\n the same `{...BaseIcons, ...icons}` contract `createTheme` applies at\n construction \u2014 the theme's own icons win, built-ins fill the rest.\n- **`generateUniThemes` now returns the `ContrastReport`** alongside the\n light/dark pair, so a caller can generate registration-ready themes and their\n WCAG audit in one call instead of falling back to `emitThemeFile` (which\n returns TypeScript source) just to see the report.\n- **`summarizeContrast(report)`** is extracted and exported, so the generated\n theme file's header and every other consumer word the audit identically.",
|
|
13070
|
+
commit: "5414517"
|
|
13071
|
+
}
|
|
13072
|
+
],
|
|
13073
|
+
dependencyBumps: []
|
|
13074
|
+
},
|
|
13075
|
+
{
|
|
13076
|
+
version: "7.3.0",
|
|
13077
|
+
entries: [
|
|
13078
|
+
{
|
|
13079
|
+
bump: "minor",
|
|
13080
|
+
title: "`expand` gains a themable, size-aware speed",
|
|
13081
|
+
body: "The reveal/collapse duration was hardcoded at 350ms, so a consumer wanting a\nsnappier disclosure \u2014 or wanting adjacent styling to fade on the same clock \u2014\nhad nothing to reference. A fixed duration also reads differently at different\nsizes: sluggish on a two-line region, rushed on a full-page one.\n- **New `transitionSpeed` option in the `expand` theme options** (seconds,\n default `0.35`, matching alert/card `transitionSpeed`) sets the base\n duration. `'expand'` joins core's `ComponentName` union, so custom and\n derived themes can type an `expand` entry.\n- **Duration scales with content height.** The actual duration is\n `transitionSpeed \xD7 \u221A(height \xF7 240px)`, clamped to ~0.15\u20130.6s at the default\n speed (the envelope scales proportionally with a themed speed), so perceived\n speed stays steady across region sizes. The curve and its constants\n (`expandDuration`, `EXPAND_DEFAULT_SPEED`, `EXPAND_MIN_DURATION`,\n `EXPAND_MAX_DURATION`, `EXPAND_REFERENCE_HEIGHT`) are exported from\n uni-core.\n- **New per-instance `transitionSpeed` input** sets an exact duration for one\n region, bypassing the scaling: `<uni-expand [transitionSpeed]=\"0.15\">`.\n- **The resolved duration is exposed as the public `duration` signal** on\n `uni-expand`, so adjacent styling can move on the reveal's clock with a\n plain binding \u2014 `[style.transition-duration]=\"expand.duration() + 's'\"` \u2014\n keeping all timing in the theme/signal pipeline, with no custom CSS.\n- **`expand-toggle` gains a matching `transitionSpeed` input** and otherwise\n follows the theme token instead of its own hardcoded 350ms. Expand Area\n binds the region's resolved `duration` to its toggle, keeping chevron and\n reveal on one clock even when size-scaled or overridden.\n- **Speed is theme-reactive**: swapping themes at runtime retimes regions and\n chevrons live.\n- **Enter/leave easing is now `ease-in-out`** (was `ease-in`), matching the\n chevron rotation so trigger and region decelerate together.\n- **`UniExpandOptions` is exported** from uni-angular for\n `getComponentOptions<UniExpandOptions>('expand')` consumers.",
|
|
13082
|
+
commit: "c828982"
|
|
13083
|
+
},
|
|
13084
|
+
{
|
|
13085
|
+
bump: "minor",
|
|
13086
|
+
title: "Menus join the theme model: `menu` + `menuItem` component options, item tones, and dividers",
|
|
13087
|
+
body: "The menu was the only composite component with no theme surface of its own \u2014\npanel chrome came from the shared `dropdown` entry and every item-level knob\n(height 38, `primary-container` hover, `check` active symbol, `label` type\nrole) was hardcoded. Every Uni menu therefore looked identical, and the gaps a\nreal product hits first (a red Delete, a separator before it, disabled rows)\nwere only reachable via `::ng-deep`.\n- **New `menu` theme options** (`'menu'` joins core's `ComponentName` union):\n `minWidth`, panel `color`/`border`/`borderRadius`/`shadow` (each falling\n back to the `dropdown` options when unset, so menus follow generic popovers\n until a theme deliberately splits them), `paddingVertical`/\n `paddingHorizontal` (panel inset \u2014 `xs` inset plus item `borderRadius`\n yields the \"hover pill\" look; `none` yields full-bleed rows), and\n `dividerBorder`/`dividerSpacing` for separators.\n- **New `menuItem` theme options + variants** (`'menuItem'` joins\n `ComponentName`): `height`, `paddingHorizontal`, `gap`, `borderRadius`,\n `typeface`, `textColor`, `hoverColor`, `activeSymbol` (undefined removes the\n trailing check), and `transitionSpeed`. Theme `variants` on `menuItem` carry\n tones \u2014 the base theme ships a `warn` tone for destructive actions.\n- **`MenuItem` grows `variant`, `disabled`, and `{ divider: true }`.**\n `variant: 'warn'` routes through the theme's `menuItem` variants; `disabled`\n items render in the disabled color, carry `aria-disabled`, and are skipped\n by keyboard navigation; dividers render as `role=\"separator\"` rules styled\n by the `menu` options. `isDivider` and the `UniMenuOptions`/\n `UniMenuItemOptions` interfaces are exported from uni-angular.\n- **`uni-dropdown` panel chrome is now input-overridable**\n (`border`/`borderRadius`/`shadow`/`color`), falling back to the `dropdown`\n theme options \u2014 this is the mechanism `uni-menu` uses; other consumers are\n unchanged.\n- **Default-rendering change:** menus now have `minWidth: 184` from the base\n theme (previously they sized to the widest item). All other defaults\n reproduce the previous look, including the 0.35s hover transition.\n- **The Carbon experiment themes gain menu styling** (sharp full-bleed 40px\n rows, IBM Plex, `$layer-hover`, red danger option, ~110ms motion) with a new\n Carbon Menu story demonstrating that the same component renders both\n aesthetics untouched.",
|
|
13088
|
+
commit: "6e8b429"
|
|
13089
|
+
}
|
|
13090
|
+
],
|
|
13091
|
+
dependencyBumps: []
|
|
13092
|
+
},
|
|
13093
|
+
{
|
|
13094
|
+
version: "7.2.0",
|
|
13095
|
+
entries: [
|
|
13096
|
+
{
|
|
13097
|
+
bump: "minor",
|
|
13098
|
+
title: "Add `funnel` and `building` icons",
|
|
13099
|
+
body: 'Two gaps found while migrating a real app off inline SVG \u2014 both cases where the\nexisting set forced the app to keep hand-drawn artwork.\n- **`funnel`** (`filter_alt`) \u2014 `filter` is `filter_list`, the stacked-lines\n metaphor. Apps that name the feature itself a funnel ("Funnel Analytics") draw\n the shape, and substituting stacked lines loses the reference.\n- **`building`** (`apartment`) \u2014 pairs with `home` for residential-vs-commercial\n distinctions, which had no built-in counterpart.\n\nBoth are Material Symbols Outlined 300 on the shared `0 -960 960 960` grid, so\nthe set is now 61 icons. Note `building` carries more internal detail than most\nof the set; it reads well from ~14px but goes muddy below ~12px, so prefer a\nlarger size or `home`\'s simpler silhouette in very small badges.',
|
|
13100
|
+
commit: "e72ec94"
|
|
13101
|
+
}
|
|
13102
|
+
],
|
|
13103
|
+
dependencyBumps: []
|
|
13104
|
+
},
|
|
13105
|
+
{
|
|
13106
|
+
version: "7.1.0",
|
|
13107
|
+
entries: [
|
|
13108
|
+
{
|
|
13109
|
+
bump: "minor",
|
|
13110
|
+
title: "Expand `BaseIcons` to 59 icons and add `uni-icon` sizing",
|
|
13111
|
+
body: "The 34-icon set shipped in 7.0.0 covered the library's own components but not a\nreal application \u2014 an app migrating off inline `<svg>` (or off `uni-symbol`, in\nAngular) ran out of names almost immediately. Everything here is additive; all\n34 existing names are unchanged.\n- **25 new icons**, same Material Symbols Outlined 300 source and the same\n `0 -960 960 960` grid as the rest of the set: navigation (`link`, `expand`,\n `gridView`, `listView`), actions (`moreHorizontal`, `copy`, `send`,\n `refresh`, `dragHandle`, `qrCode`), feedback (`star`, `verified`) and\n user/system (`group`, `shieldPerson`, `clock`, `mail`, `chat`, `image`,\n `document`, `payment`, `bank`, `trendingUp`, `extension`, `webhook`,\n `logout`).\n - `moreHorizontal` ships alongside `more` because that one is `more_vert` and\n row-aligned menus need the horizontal kebab.\n - `star` is separate from `favorite`, which is the heart.\n- **`uni-icon` gains an optional `size` input** (`CssLength` \u2014 bare numbers are\n px, strings pass through, so `20` and `'1.25rem'` both work). Left unset,\n behaviour is unchanged: the icon fills its container, which is what lets a\n themed control size its own glyph through padding. Set, it applies\n width/height as inline styles, so an explicit size wins over the\n fill-the-container rule regardless of style injection order. This removes the\n per-call-site `width`/`height` CSS rule that replacing an inline `<svg>` with\n `<uni-icon>` would otherwise need.\n- The MCP `create-icon-tokens` tool now lists the built-in icon names above the\n token map it returns. Apps routinely hand-draw their own `close`, `check` or\n `plus`; encoding those into theme tokens works but adds redundant artwork on a\n foreign grid when the theme already ships the glyph. The tool cannot recognise\n a shape, so it hands the caller the list to check against before adding\n anything.",
|
|
13112
|
+
commit: "c2421c0"
|
|
13113
|
+
}
|
|
13114
|
+
],
|
|
13115
|
+
dependencyBumps: []
|
|
13116
|
+
},
|
|
13117
|
+
{
|
|
13118
|
+
version: "7.0.0",
|
|
13119
|
+
entries: [
|
|
13120
|
+
{
|
|
13121
|
+
bump: "major",
|
|
13122
|
+
title: "Replace `BaseIcons` with a normalized 34-icon Material Symbols set",
|
|
13123
|
+
body: "The built-in icon set was 11 glyphs drawn from four different grids\n(`0 0 24 24`, `0 0 50 50`, `0 0 64 64`, `0 -960 960 960`), so `checkCircle` and\n`xCircle` rendered as solid filled discs next to a hairline `alertCircle` and an\noversized `close` \u2014 three optical weights in one set.\n- `BaseIcons` is now Material Symbols Outlined at weight 300, every glyph on a\n single `0 -960 960 960` grid, grouped by intent: navigation (`menu`,\n `chevronUp/Down/Left/Right`, `arrowLeft/Right`, `home`, `externalLink`),\n actions (`search`, `close`, `plus`, `minus`, `more`, `delete`, `edit`,\n `download`, `upload`, `share`, `filter`), feedback (`check`, `checkCircle`,\n `xCircle`, `alertCircle`, `info`, `warning`, `lock`) and user/system\n (`profile`, `settings`, `notification`, `favorite`, `help`, `calendar`).\n- All 11 previously shipped names are preserved, so existing `<uni-icon>` call\n sites and theme overrides keep working. Their **appearance changes**: the\n filled `checkCircle`/`xCircle` are now outlined, and the set reads lighter\n overall. `spinner` is carried over verbatim, keyframes intact.\n- New `IconName` and `BaseIconName` types. `IconName` is\n `BaseIconName | (string & {})`, so built-ins autocomplete and typos surface\n while themes can still register arbitrary names via `createTheme({ icons })`.\n `uni-icon`'s `name` input is typed with it instead of `keyof Icons`.\n- **Breaking**: removes the unused `IconToken`, `IconStyle`, `ToggleableIcon`\n and `IconConfig` exports. Nothing in the library referenced them and\n `IconToken`'s 60-name union contradicted the actual `BaseIcons` keys. Use\n `IconName` instead.\n- New exported `svgToIconUri(svg, options?)` \u2014 the supported way to bring your\n own icons (a brand set, a designer handoff) into a theme. It normalizes the\n source (drops the xml declaration, comments and fixed `width`/`height` so the\n mask scales), percent-encodes it, and **rejects artwork that cannot survive\n masking**: no `viewBox`, an embedded raster `<image>`, an external reference,\n a gradient/pattern fill, or more than one paint color. That last one is the\n trap worth naming \u2014 masks use the alpha channel, so a multi-color logo\n flattens to a silhouette in `currentColor`; pass `{ allowMultiColor: true }`\n when that is intended. `createTheme({ icons })` merges the result over\n `BaseIcons` per name, so a built-in name reskins and a new name is added.\n- New MCP tool `create-icon-tokens`, the agent-facing front end to\n `svgToIconUri`: hand it a project's inline `<svg>` (or a brand set) and it\n returns a paste-ready `icons` map for `uni-theme.ts`. It encodes via the same\n helper, so tokens are byte-identical to the built-in set, and adds the\n set-level checks a per-icon helper cannot make \u2014 which names override\n built-ins, and whether the artwork mixes viewBox grids. Bad artwork is\n reported per icon rather than failing the batch, and re-running is safe\n (already-encoded URIs pass through). The server instructions now point agents\n at it whenever they encounter inline SVG.\n- `BaseIcons` is generated by `scripts/generate-icons.mjs` (`pnpm icons:generate`),\n which fetches from the canonical Material Symbols source and validates every\n glyph before writing \u2014 a malformed path, an off-grid viewBox or geometry\n outside the grid aborts the run. `pnpm icons:check` verifies the committed\n file without writing. Add or change icons in that script's manifest and\n regenerate; the file is not hand-edited. `icon.records.spec.ts` asserts the\n same invariants against the committed output.",
|
|
13124
|
+
commit: "f7727aa"
|
|
13125
|
+
}
|
|
13126
|
+
],
|
|
13127
|
+
dependencyBumps: []
|
|
13128
|
+
},
|
|
13129
|
+
{
|
|
13130
|
+
version: "6.1.0",
|
|
13131
|
+
entries: [
|
|
13132
|
+
{
|
|
13133
|
+
bump: "minor",
|
|
13134
|
+
title: "TextStyle now accepts CSS length strings, not just px numbers",
|
|
13135
|
+
body: "- `fontSize`, `lineHeight`, `letterSpacing`, `textIndent`, and `wordSpacing` on\n `TextStyle` are widened from `number` to the new exported `CssLength`\n (`number | string`). Bare numbers still mean px, matching Emotion's own\n convention; strings pass through verbatim, so any unit the CSS engine accepts\n works \u2014 `'1.2rem'`, `'2em'`, `'clamp(1rem, 2vw, 1.5rem)'`, unitless\n line-height multipliers like `'1.5'`, etc.\n- `toTypeface` no longer blindly appends `px`: numbers are converted, strings\n are passed through untouched. Existing numeric themes are unaffected.",
|
|
13136
|
+
commit: "28323ec"
|
|
13137
|
+
}
|
|
13138
|
+
],
|
|
13139
|
+
dependencyBumps: []
|
|
13140
|
+
},
|
|
13141
|
+
{
|
|
13142
|
+
version: "6.0.1",
|
|
13143
|
+
entries: [],
|
|
13144
|
+
dependencyBumps: []
|
|
13145
|
+
},
|
|
13146
|
+
{
|
|
13147
|
+
version: "6.0.0",
|
|
13148
|
+
entries: [
|
|
13149
|
+
{
|
|
13150
|
+
bump: "minor",
|
|
13151
|
+
title: "Search input stripped back and made generic; debounce input dressed in the shared chrome",
|
|
13152
|
+
body: "- **`uni-debounce-input`** now wears the themed input chrome via `uni-input-box`\n (color, border, typeface, focus ring) and gains `label` (accessible name),\n `placeholder`, `disabled`, `pre-input`/`post-input` attribute slots for adornments,\n ARIA passthroughs (`role`, `ariaExpanded`, `ariaControls`, `ariaActivedescendant`)\n for composite widgets, and `clear()`/`focus()` methods. Debounce behavior unchanged.\n- **`uni-search-input` redesigned**: the opinionated solid-primary pill bar with the\n embedded `title-large` label is gone. It's now a standard themed field \u2014 decorative\n leading magnifier, clear button while a query exists (refocusing on clear), Enter\n emits `search`, Escape closes/clears.\n- **Type-ahead added**: pass `suggestions` (refresh from `change`) and the field\n becomes an ARIA combobox \u2014 keyboard-navigable listbox (ArrowUp/Down, Enter selects,\n emitting `suggestionSelected` + `search`), `aria-activedescendant` wiring, focus-out\n closing. New `searchInput` theme options: `searchSymbol`, `clearSymbol`, suggestion\n list `listColor`/`listShadow`/`listBorderRadius`, `maxSuggestions`.\n- Visual breaking change for SearchInput consumers (deliberate strip-back); code API\n is compatible (`label`/`width`/`change`/`search` retained; `label` is now the\n accessible name + placeholder fallback rather than displayed text).",
|
|
13153
|
+
commit: "5a6fc60"
|
|
13154
|
+
},
|
|
13155
|
+
{
|
|
13156
|
+
bump: "minor",
|
|
13157
|
+
title: "Checkbox, radio, and toggle conform to theme tokens",
|
|
13158
|
+
body: "- The last hardcoded control colors (`#FFF`, `#ccc`, `#d0d0d0`, `#e0e0e0`,\n `rgba(0,0,0,0.2)`) are gone. Chrome now resolves from new option tokens \u2014\n checkbox `boxColor: 'surface'`; radio `ringColor: 'outline'` / `fillColor:\n correctly on dark and brand themes.\n- The checkbox's check/dash strokes wear the variant's paired on-color\n (`on-primary`, `on-warn`, \u2026) instead of assuming white; disabled states use the\n `disabled`/`on-disabled` tokens; the toggle knob's shadow is the theme's\n brand-tinted `raised` stack, and its hover uses the button convention's\n brightness filter instead of a fixed grey.",
|
|
13159
|
+
commit: "8953d59"
|
|
13160
|
+
},
|
|
13161
|
+
{
|
|
13162
|
+
bump: "minor",
|
|
13163
|
+
title: "New `uni-stat` KPI tile",
|
|
13164
|
+
body: '- Muted label + large headline value (numbers auto-compact via\n `Intl.NumberFormat`: `48234` \u2192 "48.2K") set in a new `stat` type-scale role\n (32px semibold, proportional figures).\n- Optional signed `delta` whose ink is decided by direction \xD7 `upIsGood` \u2014 churn\n going down reads green, tickets going up reads red \u2014 with the arrow glyph\n accompanied by screen-reader "up"/"down" text so state never rides color alone;\n `caption` names the comparison period.\n- Optional decorative 12-point sparkline (`trend` input): stroke in the outline hue,\n endpoint dotted in the accent, `aria-hidden`.\n- Fully token-driven via `stat.options`: card-recipe frame (`color`/`border`/\n `borderRadius`), `labelTypeface`/`valueTypeface`, `positiveColor`/`negativeColor`\n (the semantic inks, AA-guaranteed on surface), `trendColor`/`trendAccent`, spacing.',
|
|
13165
|
+
commit: "7a6da4f"
|
|
13166
|
+
},
|
|
13167
|
+
{
|
|
13168
|
+
bump: "minor",
|
|
13169
|
+
title: "Fix invisible icons; icons become first-class theme primitives",
|
|
13170
|
+
body: "- **Bug**: `uni-icon` resolves icons from `theme.icons`, but every theme shipped\n `icons: {}` \u2014 the icon record was never wired in, so all icons (dialog close, button\n spinner, search/clear affordances) rendered nothing.\n- **Fix + pattern**: the default icon set now lives in core (`BaseIcons`, in\n `concepts/iconography`) and `createTheme` merges a theme's `icons` over it \u2014 themes\n can override or add icons under any name (inline SVG data URIs, masked with\n `currentColor` so they recolor with the theme). The angular `icons` record re-exports\n `BaseIcons` (deprecated).\n- `uni-icon` also sets the standard `mask-image` (was webkit-only, so icons were\n invisible in Firefox regardless) and renders nothing for unknown names instead of a\n broken `url(\"undefined\")`.\n- The emitted `uni-theme.ts` gains an editable `icons` section, and the MCP's\n `generate-uni-theme` guidance instructs agents: never inline SVG in components \u2014\n define an icon once in the theme's `icons` map and render it via `<uni-icon>`.",
|
|
13171
|
+
commit: "fea0b2e"
|
|
13172
|
+
}
|
|
13173
|
+
],
|
|
13174
|
+
dependencyBumps: []
|
|
13175
|
+
},
|
|
13176
|
+
{
|
|
13177
|
+
version: "5.2.0",
|
|
13178
|
+
entries: [
|
|
13179
|
+
{
|
|
13180
|
+
bump: "minor",
|
|
13181
|
+
title: "New `uni-avatar` and `uni-avatar-group` components",
|
|
13182
|
+
body: '- Graceful fallback chain: image \u2192 initials derived from `name` (first + last) \u2192\n themed symbol. Accessible by default: `role="img"` + `aria-label` from the name,\n `aria-hidden` when purely decorative.\n- Fully token-driven: variants color from the role\'s `*-container` tokens, sizes from\n the theme\'s `avatar` size records, corner radius from `options.borderRadius`\n (`max` = circles; a `sharp` theme gets square avatars), initials typeface from\n `options.typeface`, fallback symbol from `options.fallbackSymbol`.\n- `uni-avatar-group` stacks avatars with a token-driven overlap (spacing token) and\n separator ring (`ringColor`/`ringWidth` options); `max` collapses the overflow into\n a themed "+N" chip that is itself a `uni-avatar` (verbatim `text` input).',
|
|
13183
|
+
commit: "1f5ee1d"
|
|
13184
|
+
},
|
|
13185
|
+
{
|
|
13186
|
+
bump: "minor",
|
|
13187
|
+
title: "New `uni-breadcrumb` component",
|
|
13188
|
+
body: '- WAI-ARIA breadcrumb: labelled `nav` landmark wrapping an ordered list, the last item\n marked `aria-current="page"`, separators decorative (`aria-hidden`).\n- Data-driven `items` (root first). Items with `href` render as real anchors; without\n one they render as link-styled buttons emitting `itemClicked` for SPA routing.\n- Token-driven via `breadcrumb.options`: `typeface`, link `color`, `currentColor`,\n `separatorSymbol` (material symbol), and `gap` spacing.',
|
|
13189
|
+
commit: "dca84b1"
|
|
13190
|
+
},
|
|
13191
|
+
{
|
|
13192
|
+
bump: "minor",
|
|
13193
|
+
title: "Button corner rounding and typography conform to component-options tokens",
|
|
13194
|
+
body: "- `button` and `iconButton` themes gain `options: { borderRadius: 'max' }`; the hardcoded\n per-size pixel radii (11/13/18/24) and the icon button's inline `borderRadius: 999` are\n removed. Components resolve the token through `theme.radius()`, so the theme's radii\n scale \u2014 shape languages (`sharp` \u2192 square, `playful` \u2192 pill) and custom radii\n primitives \u2014 now restyles buttons like every other tokened component.\n- Back-compat: the options radius is applied before theme `sizes`/`fixed` styles, so\n hand-authored themes that still set a size-level `borderRadius` keep winning; icon\n buttons fall back to the legacy circle when a theme predates iconButton options.\n- `button` themes also gain `options: { typeface: 'button' }`: the hardcoded\n `fontFamily: 'Euphemia'` (a font no theme loads) is removed from `fixed` and the sizes;\n labels now render the type scale's `button` role (Red Hat Display, medium, capitalize),\n with per-size `fontSize` still applied by `sizes`. Point the token at any typography\n role \u2014 including custom ones \u2014 to restyle every button label.\n- New `UniButtonOptions` interface (`borderRadius`, `typeface`) exported from the button\n model.",
|
|
13195
|
+
commit: "7844dde"
|
|
13196
|
+
},
|
|
13197
|
+
{
|
|
13198
|
+
bump: "minor",
|
|
13199
|
+
title: "Card frame conforms to token primitives",
|
|
13200
|
+
body: "- The card theme's hardcoded frame (`borderStyle`/`borderWidth`/`borderRadius: '8px'` in\n `fixed`, `borderColor` per variant) is replaced by tokens: the card resolves its border\n from the **border primitive named by its variant** (`borders.primary` \u2026\n `borders.success`), its corner radius from the radii scale (`options.borderRadius:\n- `UniCardOptions` gains `border` (pin every card to one primitive \u2014 including a custom\n one \u2014 instead of variant-following) and documents the existing `borderRadius`/\n `elevation`; redefining a border primitive in a theme now restyles cards and every\n other component sharing that token.\n- Token styles apply under the merged theme style, so hand-authored themes that still\n set card `fixed`/`variants` frame styles keep winning. No visual change for default\n themes \u2014 this is pure tokenization.",
|
|
13201
|
+
commit: "7844dde"
|
|
13202
|
+
},
|
|
13203
|
+
{
|
|
13204
|
+
bump: "minor",
|
|
13205
|
+
title: "New `uni-drawer` and `uni-app-bar` \u2014 the dashboard shell",
|
|
13206
|
+
body: '- **`uni-drawer`** has two modes sharing one content slot: `side` renders an in-flow\n `<aside>` that pushes content (width-animated open/close, divider border primitive at\n its edge, `aria-hidden` while closed); `over` renders a native `<dialog>` in the top\n layer \u2014 focus trap, Escape, and scrim backdrop come from the platform, sliding in\n from `position` (`start`/`end`). `open` is a two-way `model()`; Escape and backdrop\n clicks keep it in sync. Tokens: `drawer.options` (`color`, `width`, `divider`,\n `elevation`, `padding`, `backdrop`).\n- **`uni-app-bar`**: leading/trailing content projection slots around a `title` (or\n custom center content), trailing pushed to the far edge; optional `sticky`. Tokens:\n `appBar.options` (`color`, `height`, `divider`, `typeface`, `padding`, `gap`,\n optional `elevation`).\n- The Drawer "DashboardShell" story documents the composition recipe: app bar with a\n menu toggle + side drawer + content.',
|
|
13207
|
+
commit: "17cf662"
|
|
13208
|
+
},
|
|
13209
|
+
{
|
|
13210
|
+
bump: "minor",
|
|
13211
|
+
title: "Progress gauge derives from the palette instead of hardcoded pastels",
|
|
13212
|
+
body: "The gauge's track colors were fixed pastel hexes (`#b3d4ea`, `#b3e7c2`, \u2026) that ignored\nthe active theme entirely \u2014 secondary and success even shared the same green. Tracks now\nuse the role's `*-container` token (the palette's soft tint of that role) and arcs the\nrole base, so gauges follow any brand palette, in both light and dark modes.",
|
|
13213
|
+
commit: "7844dde"
|
|
13214
|
+
},
|
|
13215
|
+
{
|
|
13216
|
+
bump: "minor",
|
|
13217
|
+
title: "New `uni-skeleton` loading placeholder",
|
|
13218
|
+
body: "- Three shapes: `text` (multi-line, ending on a short line like real copy), `rect`,\n and `circle`; explicit `width`/`height` accept CSS strings or px numbers.\n- Painted with surface tokens (`skeleton.options`: `color`, `highlightColor`,\n `borderRadius`, `gap`) so placeholders sit naturally on light and dark themes; the\n shimmer sweep (`animation`/`duration` options) only runs when the user allows motion\n and degrades to static blocks under `prefers-reduced-motion`.\n- `aria-hidden` \u2014 placeholders are invisible to assistive tech by design.",
|
|
13219
|
+
commit: "4ccf18b"
|
|
13220
|
+
},
|
|
13221
|
+
{
|
|
13222
|
+
bump: "minor",
|
|
13223
|
+
title: "New `uni-slider` component \u2014 clears the declared-but-unbuilt `ComponentName` entry",
|
|
13224
|
+
body: '- Native `<input type="range">` under the hood: platform keyboard interaction\n (arrows, Home/End, Page Up/Down) and ARIA slider semantics for free; Signal Forms\n contract (`FormValueControl<number>`) matching Input/Textarea.\n- `min`/`max`/`step` inputs (fractional steps supported), required accessible `label`.\n- Token-driven via `slider.options`: fill/thumb `color`, `trackColor`, `borderRadius`,\n and geometry (`trackHeight`, `thumbSize`). The fill level rides a CSS custom\n property, so dragging never regenerates Emotion styles; Firefox uses the native\n `::-moz-range-progress`, WebKit a gradient stop.',
|
|
13225
|
+
commit: "5d9062a"
|
|
13226
|
+
},
|
|
13227
|
+
{
|
|
13228
|
+
bump: "minor",
|
|
13229
|
+
title: "New `uni-tabs` / `uni-tab` components",
|
|
13230
|
+
body: "- Full WAI-ARIA tabs pattern: `tablist`/`tab`/`tabpanel` roles with wired\n `aria-selected`/`aria-controls`/`aria-labelledby`, roving tabindex, automatic\n activation on ArrowLeft/ArrowRight (wrapping, disabled tabs skipped), Home/End,\n and motion-safe transitions.\n- `selectedIndex` is a two-way `model()`; selection snaps to the nearest enabled tab.\n Panel content is captured per-tab and only the selected panel is instantiated.\n- Every visual knob is a theme option token (`tabs.options`): `typeface`, `textColor`,\n `activeTextColor`, `indicatorColor`, `indicatorThickness` (thickness token),\n `divider` (border primitive), `gap`/`padding` (spacing tokens), `borderRadius`, and\n optional `activeColor` \u2014 the defaults render underline tabs; `borderRadius: 'max'` +\n `activeColor` turns them into segmented pills with no component changes.",
|
|
13231
|
+
commit: "15a8f73"
|
|
13232
|
+
},
|
|
13233
|
+
{
|
|
13234
|
+
bump: "minor",
|
|
13235
|
+
title: "New `uni-textarea` component",
|
|
13236
|
+
body: "- Multi-line text field with the same Signal Forms contract as `uni-input`\n (`FormValueControl<string>`: `value` model, `disabled`/`invalid`/`dirty`/`required`,\n touched-aware error styling, `aria-*` wiring).\n- Reuses `uni-input-box` for its chrome, so it inherits the input's themed color,\n border, typeface, focus outline, and disabled treatment automatically; the box's\n field selectors now cover `textarea` (with auto height and vertical padding), and\n the box accepts a `height` override.\n- Theme options follow the token pattern: `textarea: { options: { rows: 3, resize:\n instance.",
|
|
13237
|
+
commit: "b04b97b"
|
|
13238
|
+
},
|
|
13239
|
+
{
|
|
13240
|
+
bump: "minor",
|
|
13241
|
+
title: "Theme Builder becomes the full playground (PRD \xA75.2)",
|
|
13242
|
+
body: "- **Light & dark side by side**: both palettes generate on every input change,\n independent of the storybook-wide mode toggle, each rendered in its own panel.\n- **Contrast report panel**: live pass/fail matrix over all checked pairs (summary +\n failing rows always visible, full detail on demand). Failures only occur with hard\n brand pins; the panel says so and points at soft targets.\n- **Shape language input** (`sharp`/`modern`/`playful`): applies `ShapeRadii` live via\n the new `radii` pass-through on `BrandPaletteConfig`/`createThemeFromPalette`.\n- **Export paths**: copy the static `uni-theme.ts` (via `emitThemeFile`), copy a\n pre-encoded `ng add` command, or copy W3C DTCG JSON for both modes via the new\n `emitDtcgTokens()` interop emitter in uni-core (Style Dictionary compatible).",
|
|
13243
|
+
commit: "8f55b4c"
|
|
13244
|
+
}
|
|
13245
|
+
],
|
|
13246
|
+
dependencyBumps: []
|
|
13247
|
+
},
|
|
13248
|
+
{
|
|
13249
|
+
version: "5.1.0",
|
|
13250
|
+
entries: [
|
|
13251
|
+
{
|
|
13252
|
+
bump: "minor",
|
|
13253
|
+
title: "Brand-tinted, theme-scoped elevation shadows (PRD \xA73.5.C)",
|
|
13254
|
+
body: "- New `generateShadows(colors, mode)`: light themes replace the dead-neutral\n `rgba(0,0,0,\u2026)` stacks with a shadow ink pulled toward the brand hue; dark themes go\n near-zero (`raised: none`) with only a faint veil on floating overlays \u2014 elevation\n reads from the surface lightness steps instead. The `warn` glow is tinted with the\n theme's own error color in both modes.\n- `generateThemes` now returns `lightShadows`/`darkShadows`; `generateUniThemes`,\n `createThemeFromPalette` (Theme Builder), the emitted `uni-theme.ts`, and the shipped\n stock Light/Dark themes all carry them.",
|
|
13255
|
+
commit: "c1dc853"
|
|
13256
|
+
},
|
|
13257
|
+
{
|
|
13258
|
+
bump: "patch",
|
|
13259
|
+
title: "Fix `ng add` against real published packages (found by fresh `ng new` e2e):",
|
|
13260
|
+
body: '- The schematic bundle is CJS, but ng-packagr stamps `"type": "module"` into the\n published package.json, so Node loaded it as ESM and the CLI reported "no ng add\n actions". A nested `schematics/package.json` (`"type": "commonjs"`) scopes the\n bundle back to CJS.\n- The emitted `uni-theme.ts` used dot access on `Colors` (which has an index\n signature), failing under `ng new`\'s strict `noPropertyAccessFromIndexSignature`.\n The emitter (and the MCP tool\'s guidance) now uses bracket access throughout.\n- `uni-angular`\'s peer range on `uni-core` is now `workspace:^` (publishes as `^5.x`)\n instead of `workspace:*` (published as an exact pin). Alongside changesets\'\n `onlyUpdatePeerDependentsWhenOutOfRange`, this stops minor releases from being\n inflated to majors by the peer-dependents rule \u2014 the cause of the 4.0.0 and 5.0.0\n version jumps.',
|
|
13261
|
+
commit: "f2951db"
|
|
13262
|
+
}
|
|
13263
|
+
],
|
|
13264
|
+
dependencyBumps: []
|
|
13265
|
+
},
|
|
13266
|
+
{
|
|
13267
|
+
version: "5.0.0",
|
|
13268
|
+
entries: [
|
|
13269
|
+
{
|
|
13270
|
+
bump: "minor",
|
|
13271
|
+
title: "OKLCH theme generation engine (`concepts/generation`)",
|
|
13272
|
+
body: "- New `generateThemes(input)` / `generateUniThemes(input)`: brand seed(s) in, complete\n WCAG-AA light+dark `Colors` pair out, with a machine-readable `ContrastReport`\n (110 checked pairs per theme pair). Pure and deterministic.\n- All palette math moved from HSL to perceptual OKLCH: uniform lightness slots across\n hues, per-category chroma model (`CategoryChroma`), dark-mode accent chroma decoupling\n (C \u2264 0.16), and a contrast guard-rail that adjusts lightness only \u2014 never hue.\n- Brand colors ride as soft `targets` (kept verbatim when already AA, lightness-adjusted\n when not) alongside the existing hard `brand` pins; accepted by `generatePalette`,\n `createThemeFromPalette`, and Angular's `BrandPaletteConfig`.\n- Semantic inks re-tuned per role: error 27\xB0/C 0.20, warn 55\xB0/C 0.18 (rotated off amber \u2014\n dark yellow reads brown), success 152\xB0/C 0.16.\n- `createTheme` accepts optional `radii`/`shadows` overrides; `ShapeRadii` presets\n (`sharp` / `modern` / `playful`) emitted via the `shape` generation input.\n- Theme Builder ships nine curated AA-clean presets built on soft targets.\n- Deprecated (thin wrappers/tables retained): `uniColor`, `randomRangeValue`,\n `CategorySaturation`, `CategoryLightness`. `schemeHues` moved to `color.utils`.\n- `createTheme` deep-merges optional `borders` and `components` overrides over its\n derived defaults \u2014 themes can define custom named primitives and rewire per-component\n options without restating untouched sections.\n- New `emitThemeFile()` renders a static `uni-theme.ts` \u2014 literal colors, visible border\n primitives, sparse component overrides \u2014 the editable source of truth; the engine\n never ships to the browser.\n- New `ng add @uni-design-system/uni-angular` schematic: installs the peer set, writes\n the generated theme file, registers `UNI_THEMES` in `app.config.ts`, adds typeface\n links, scaffolds a themed smoke test, and prints the contrast summary.\n- New MCP tool `generate-uni-theme`: returns the static theme file content, provider\n snippet, and contrast report, with agent guidance to edit the file for restyling.\n- `uni-core` gains its first Vitest suite, including a 1,080-seed contrast property\n corpus with zero tolerance in both modes; the schematic gets its own spec suite.",
|
|
13273
|
+
commit: "f7f0bdd"
|
|
13274
|
+
}
|
|
13275
|
+
],
|
|
13276
|
+
dependencyBumps: []
|
|
13277
|
+
},
|
|
13278
|
+
{
|
|
13279
|
+
version: "4.0.0",
|
|
13280
|
+
entries: [
|
|
13281
|
+
{
|
|
13282
|
+
bump: "minor",
|
|
13283
|
+
title: "Porting Components",
|
|
13284
|
+
body: "",
|
|
13285
|
+
commit: "ef9b3b5"
|
|
13286
|
+
}
|
|
13287
|
+
],
|
|
13288
|
+
dependencyBumps: []
|
|
13289
|
+
},
|
|
13290
|
+
{
|
|
13291
|
+
version: "3.0.2",
|
|
13292
|
+
entries: [],
|
|
13293
|
+
dependencyBumps: []
|
|
13294
|
+
},
|
|
13295
|
+
{
|
|
13296
|
+
version: "3.0.1",
|
|
13297
|
+
entries: [],
|
|
13298
|
+
dependencyBumps: []
|
|
13299
|
+
},
|
|
13300
|
+
{
|
|
13301
|
+
version: "3.0.0",
|
|
13302
|
+
entries: [],
|
|
13303
|
+
dependencyBumps: []
|
|
13304
|
+
},
|
|
13305
|
+
{
|
|
13306
|
+
version: "2.0.4",
|
|
13307
|
+
entries: [],
|
|
13308
|
+
dependencyBumps: []
|
|
13309
|
+
},
|
|
13310
|
+
{
|
|
13311
|
+
version: "2.0.3",
|
|
13312
|
+
entries: [],
|
|
13313
|
+
dependencyBumps: []
|
|
13314
|
+
},
|
|
13315
|
+
{
|
|
13316
|
+
version: "2.0.2",
|
|
13317
|
+
entries: [],
|
|
13318
|
+
dependencyBumps: []
|
|
13319
|
+
},
|
|
13320
|
+
{
|
|
13321
|
+
version: "2.0.1",
|
|
13322
|
+
entries: [
|
|
13323
|
+
{
|
|
13324
|
+
bump: "patch",
|
|
13325
|
+
title: "Fix: switch to bundled dual-package distribution via Vite to resolve strict ESM relative path failures",
|
|
13326
|
+
body: "",
|
|
13327
|
+
commit: "e2cad74"
|
|
13328
|
+
},
|
|
13329
|
+
{
|
|
13330
|
+
bump: "patch",
|
|
13331
|
+
title: "Setting Fixed Versioning for all packages.",
|
|
13332
|
+
body: "",
|
|
13333
|
+
commit: "be0fb26"
|
|
13334
|
+
}
|
|
13335
|
+
],
|
|
13336
|
+
dependencyBumps: []
|
|
13337
|
+
},
|
|
13338
|
+
{
|
|
13339
|
+
version: "1.1.0",
|
|
13340
|
+
entries: [
|
|
13341
|
+
{
|
|
13342
|
+
bump: "minor",
|
|
13343
|
+
title: "Adding cjs support",
|
|
13344
|
+
body: "",
|
|
13345
|
+
commit: "4a049de"
|
|
13346
|
+
}
|
|
13347
|
+
],
|
|
13348
|
+
dependencyBumps: []
|
|
13349
|
+
},
|
|
13350
|
+
{
|
|
13351
|
+
version: "1.0.0",
|
|
13352
|
+
entries: [
|
|
13353
|
+
{
|
|
13354
|
+
bump: "major",
|
|
13355
|
+
title: "init release",
|
|
13356
|
+
body: "",
|
|
13357
|
+
commit: "7d18157"
|
|
13358
|
+
}
|
|
13359
|
+
],
|
|
13360
|
+
dependencyBumps: []
|
|
13361
|
+
}
|
|
13362
|
+
]
|
|
13363
|
+
},
|
|
13364
|
+
{
|
|
13365
|
+
package: "@uni-design-system/uni-react",
|
|
13366
|
+
releases: [
|
|
13367
|
+
{
|
|
13368
|
+
version: "8.2.0",
|
|
13369
|
+
entries: [
|
|
13370
|
+
{
|
|
13371
|
+
bump: "patch",
|
|
13372
|
+
title: "Ship `CHANGELOG.md` in the published packages. The release notes existed only in the repo; an installed package carried no record of what changed, so upgrade questions couldn't be answered from `node_modules`. uni-angular copies it into the ng-packagr `dist` via `assets`; the rest add it to `files`.",
|
|
13373
|
+
body: "",
|
|
13374
|
+
commit: "e706e38"
|
|
13375
|
+
}
|
|
13376
|
+
],
|
|
13377
|
+
dependencyBumps: []
|
|
13378
|
+
},
|
|
13379
|
+
{
|
|
13380
|
+
version: "8.1.0",
|
|
13381
|
+
entries: [],
|
|
13382
|
+
dependencyBumps: []
|
|
13383
|
+
},
|
|
13384
|
+
{
|
|
13385
|
+
version: "8.0.0",
|
|
13386
|
+
entries: [],
|
|
13387
|
+
dependencyBumps: []
|
|
13388
|
+
},
|
|
13389
|
+
{
|
|
13390
|
+
version: "7.3.0",
|
|
13391
|
+
entries: [],
|
|
13392
|
+
dependencyBumps: []
|
|
13393
|
+
},
|
|
13394
|
+
{
|
|
13395
|
+
version: "7.2.0",
|
|
13396
|
+
entries: [],
|
|
13397
|
+
dependencyBumps: []
|
|
13398
|
+
},
|
|
13399
|
+
{
|
|
13400
|
+
version: "7.1.0",
|
|
13401
|
+
entries: [],
|
|
13402
|
+
dependencyBumps: []
|
|
13403
|
+
},
|
|
13404
|
+
{
|
|
13405
|
+
version: "7.0.0",
|
|
13406
|
+
entries: [],
|
|
13407
|
+
dependencyBumps: []
|
|
13408
|
+
},
|
|
13409
|
+
{
|
|
13410
|
+
version: "6.1.0",
|
|
13411
|
+
entries: [],
|
|
13412
|
+
dependencyBumps: []
|
|
13413
|
+
},
|
|
13414
|
+
{
|
|
13415
|
+
version: "6.0.1",
|
|
13416
|
+
entries: [],
|
|
13417
|
+
dependencyBumps: []
|
|
13418
|
+
},
|
|
13419
|
+
{
|
|
13420
|
+
version: "6.0.0",
|
|
13421
|
+
entries: [],
|
|
13422
|
+
dependencyBumps: []
|
|
13423
|
+
},
|
|
13424
|
+
{
|
|
13425
|
+
version: "5.2.0",
|
|
13426
|
+
entries: [],
|
|
13427
|
+
dependencyBumps: []
|
|
13428
|
+
},
|
|
13429
|
+
{
|
|
13430
|
+
version: "5.1.0",
|
|
13431
|
+
entries: [],
|
|
13432
|
+
dependencyBumps: []
|
|
13433
|
+
},
|
|
13434
|
+
{
|
|
13435
|
+
version: "5.0.0",
|
|
13436
|
+
entries: [],
|
|
13437
|
+
dependencyBumps: [
|
|
13438
|
+
"@uni-design-system/uni-core@5.0.0"
|
|
13439
|
+
]
|
|
13440
|
+
},
|
|
13441
|
+
{
|
|
13442
|
+
version: "4.0.0",
|
|
13443
|
+
entries: [],
|
|
13444
|
+
dependencyBumps: [
|
|
13445
|
+
"@uni-design-system/uni-core@4.0.0"
|
|
13446
|
+
]
|
|
11274
13447
|
},
|
|
11275
|
-
|
|
11276
|
-
|
|
11277
|
-
|
|
11278
|
-
|
|
11279
|
-
|
|
11280
|
-
|
|
13448
|
+
{
|
|
13449
|
+
version: "3.0.2",
|
|
13450
|
+
entries: [],
|
|
13451
|
+
dependencyBumps: [
|
|
13452
|
+
"@uni-design-system/uni-core@3.0.2"
|
|
13453
|
+
]
|
|
11281
13454
|
},
|
|
11282
|
-
|
|
11283
|
-
|
|
11284
|
-
|
|
11285
|
-
|
|
11286
|
-
|
|
11287
|
-
|
|
11288
|
-
listBorderRadius: "xs",
|
|
11289
|
-
maxSuggestions: 8
|
|
13455
|
+
{
|
|
13456
|
+
version: "3.0.1",
|
|
13457
|
+
entries: [],
|
|
13458
|
+
dependencyBumps: [
|
|
13459
|
+
"@uni-design-system/uni-core@3.0.1"
|
|
13460
|
+
]
|
|
11290
13461
|
},
|
|
11291
|
-
|
|
11292
|
-
|
|
11293
|
-
|
|
13462
|
+
{
|
|
13463
|
+
version: "3.0.0",
|
|
13464
|
+
entries: [],
|
|
13465
|
+
dependencyBumps: [
|
|
13466
|
+
"@uni-design-system/uni-core@3.0.0"
|
|
13467
|
+
]
|
|
11294
13468
|
},
|
|
11295
|
-
|
|
11296
|
-
|
|
13469
|
+
{
|
|
13470
|
+
version: "2.0.4",
|
|
13471
|
+
entries: [],
|
|
13472
|
+
dependencyBumps: [
|
|
13473
|
+
"@uni-design-system/uni-core@2.0.4"
|
|
13474
|
+
]
|
|
11297
13475
|
},
|
|
11298
|
-
|
|
11299
|
-
|
|
13476
|
+
{
|
|
13477
|
+
version: "2.0.3",
|
|
13478
|
+
entries: [],
|
|
13479
|
+
dependencyBumps: [
|
|
13480
|
+
"@uni-design-system/uni-core@2.0.3"
|
|
13481
|
+
]
|
|
11300
13482
|
},
|
|
11301
|
-
|
|
11302
|
-
|
|
11303
|
-
|
|
11304
|
-
|
|
11305
|
-
|
|
13483
|
+
{
|
|
13484
|
+
version: "2.0.2",
|
|
13485
|
+
entries: [
|
|
13486
|
+
{
|
|
13487
|
+
bump: "patch",
|
|
13488
|
+
title: "Fix: switch React package distribution to bundled multi-format outputs via Vite to resolve strict ESM runtime and source compilation issues inside consumers.",
|
|
13489
|
+
body: "",
|
|
13490
|
+
commit: "c5c552a"
|
|
13491
|
+
}
|
|
13492
|
+
],
|
|
13493
|
+
dependencyBumps: [
|
|
13494
|
+
"@uni-design-system/uni-core@2.0.2"
|
|
13495
|
+
]
|
|
11306
13496
|
},
|
|
11307
|
-
|
|
11308
|
-
|
|
11309
|
-
|
|
11310
|
-
|
|
11311
|
-
|
|
11312
|
-
|
|
11313
|
-
|
|
11314
|
-
|
|
11315
|
-
|
|
11316
|
-
|
|
11317
|
-
|
|
11318
|
-
|
|
11319
|
-
|
|
11320
|
-
tdStickyColor: "primary-container",
|
|
11321
|
-
tdPadding: "sm",
|
|
11322
|
-
tdVerticalBorder: "dotted",
|
|
11323
|
-
tdHorizontalBorder: "light",
|
|
11324
|
-
rowHoverColor: "primary-container",
|
|
11325
|
-
loadingOverlayColor: "scrim",
|
|
11326
|
-
loadingSpinnerColor: "primary",
|
|
11327
|
-
loadingSpinnerSize: 40
|
|
13497
|
+
{
|
|
13498
|
+
version: "2.0.1",
|
|
13499
|
+
entries: [
|
|
13500
|
+
{
|
|
13501
|
+
bump: "patch",
|
|
13502
|
+
title: "Setting Fixed Versioning for all packages.",
|
|
13503
|
+
body: "",
|
|
13504
|
+
commit: "be0fb26"
|
|
13505
|
+
}
|
|
13506
|
+
],
|
|
13507
|
+
dependencyBumps: [
|
|
13508
|
+
"@uni-design-system/uni-core@2.0.1"
|
|
13509
|
+
]
|
|
11328
13510
|
},
|
|
11329
|
-
|
|
11330
|
-
|
|
11331
|
-
|
|
13511
|
+
{
|
|
13512
|
+
version: "2.0.0",
|
|
13513
|
+
entries: [
|
|
13514
|
+
{
|
|
13515
|
+
bump: "minor",
|
|
13516
|
+
title: "Adding cjs support",
|
|
13517
|
+
body: "",
|
|
13518
|
+
commit: "4a049de"
|
|
13519
|
+
}
|
|
13520
|
+
],
|
|
13521
|
+
dependencyBumps: [
|
|
13522
|
+
"@uni-design-system/uni-core@1.1.0"
|
|
13523
|
+
]
|
|
11332
13524
|
},
|
|
11333
|
-
|
|
11334
|
-
|
|
11335
|
-
|
|
11336
|
-
|
|
11337
|
-
|
|
11338
|
-
|
|
11339
|
-
|
|
11340
|
-
|
|
13525
|
+
{
|
|
13526
|
+
version: "1.0.0",
|
|
13527
|
+
entries: [
|
|
13528
|
+
{
|
|
13529
|
+
bump: "major",
|
|
13530
|
+
title: "init release",
|
|
13531
|
+
body: "",
|
|
13532
|
+
commit: "7d18157"
|
|
13533
|
+
}
|
|
13534
|
+
],
|
|
13535
|
+
dependencyBumps: [
|
|
13536
|
+
"@uni-design-system/uni-core@1.0.0"
|
|
13537
|
+
]
|
|
13538
|
+
}
|
|
13539
|
+
]
|
|
13540
|
+
},
|
|
13541
|
+
{
|
|
13542
|
+
package: "@uni-design-system/uni-mcp",
|
|
13543
|
+
releases: [
|
|
13544
|
+
{
|
|
13545
|
+
version: "4.7.0",
|
|
13546
|
+
entries: [
|
|
13547
|
+
{
|
|
13548
|
+
bump: "minor",
|
|
13549
|
+
title: "`get-changelog`: release notes as a first-class MCP tool, plus a `uni://changelog/{package}` resource.",
|
|
13550
|
+
body: 'The index now ingests every published package\'s changesets `CHANGELOG.md` (a new build adapter parses them into structured releases \u2014 bump level, headline, full body, commit, dependency bumps). The tool answers "what changed in X?" and "what do I get by upgrading?": `version` returns one release\'s full notes (`"8.1"` matches every 8.1.x), `since` returns the full notes of every release after an installed version, and no scope returns a compact release digest. `package` accepts npm or short names (`uni-angular` is the default).',
|
|
13551
|
+
commit: "e706e38"
|
|
13552
|
+
},
|
|
13553
|
+
{
|
|
13554
|
+
bump: "minor",
|
|
13555
|
+
title: "`export-dtcg-tokens`: W3C DTCG JSON (Style Dictionary compatible) for a built-in theme's color, radius, and spacing scales, named with Uni token ids \u2014 exposing core's existing `emitDtcgTokens` as an MCP tool for external token pipelines. The `UniTheme` JSON from the theme tools remains the lossless primary format.",
|
|
13556
|
+
body: "",
|
|
13557
|
+
commit: "57a8c4c"
|
|
13558
|
+
},
|
|
13559
|
+
{
|
|
13560
|
+
bump: "patch",
|
|
13561
|
+
title: "Ship `CHANGELOG.md` in the published packages. The release notes existed only in the repo; an installed package carried no record of what changed, so upgrade questions couldn't be answered from `node_modules`. uni-angular copies it into the ng-packagr `dist` via `assets`; the rest add it to `files`.",
|
|
13562
|
+
body: "",
|
|
13563
|
+
commit: "e706e38"
|
|
13564
|
+
}
|
|
13565
|
+
],
|
|
13566
|
+
dependencyBumps: []
|
|
11341
13567
|
},
|
|
11342
|
-
|
|
11343
|
-
|
|
11344
|
-
|
|
11345
|
-
|
|
11346
|
-
|
|
11347
|
-
|
|
11348
|
-
|
|
11349
|
-
|
|
11350
|
-
|
|
11351
|
-
|
|
11352
|
-
|
|
11353
|
-
gap: "xxs"
|
|
13568
|
+
{
|
|
13569
|
+
version: "4.6.0",
|
|
13570
|
+
entries: [
|
|
13571
|
+
{
|
|
13572
|
+
bump: "minor",
|
|
13573
|
+
title: "Runtime theme JSON: `generate-runtime-theme`, `get-runtime-theme`, and a theme registry endpoint",
|
|
13574
|
+
body: "`generate-uni-theme` returns `uni-theme.ts` **source** \u2014 codegen by design, and\nthe right answer for branding an app permanently. It is the wrong answer when a\ntheme needs to apply _now_: an agent had to write a file and rebuild. These tools\nclose that gap (ROADMAP Track 1 item 4).\n- **`generate-runtime-theme`** \u2014 brand hex color(s) in, a WCAG-AA light+dark pair\n out as validated JSON, ready for `ThemeService.registerTheme(theme, { select:\n- **`get-runtime-theme`** \u2014 a theme that ships with Uni as a registerable\n `UniTheme`. Distinct from `get-theme-template`, which returns a flat read-only\n projection of token values rather than the theme object itself.\n- **Both validate before returning.** Every theme is run through uni-core's\n `parseTheme`, so \"validated\" is checked rather than claimed; a failure comes\n back as a tool error listing every reason.\n- **First tools with an MCP `outputSchema`**, so agents get a machine-readable\n contract instead of parsing prose (opens ROADMAP Track 1 item 6). The theme\n itself is typed as an opaque validated object on purpose \u2014 uni-core's\n `parseTheme` stays the single source of truth for theme shape, and a mirrored\n schema here would drift from it.\n- **Payloads elide the built-in icon set** (`dehydrateTheme`), taking a\n light+dark result from ~100 KB to ~30 KB \u2014 roughly 7.6k tokens instead of 25k\n per call. Consumers restore them on registration.\n- **New registry endpoint on the HTTP server**: `GET /themes` lists the ids and\n `GET /themes/{id}.json` returns one registerable theme, for apps that fetch a\n theme without speaking MCP. These routes are public, read-only and\n CORS-enabled so a browser can fetch them directly; `/mcp` stays token-guarded\n and same-origin.\n- The server's instructions now carry a routing rule for the four theme tools\n (brand permanently / apply now / inspect values), and the README tool table\n lists `create-icon-tokens`, which shipped undocumented.",
|
|
13575
|
+
commit: "5414517"
|
|
13576
|
+
}
|
|
13577
|
+
],
|
|
13578
|
+
dependencyBumps: []
|
|
11354
13579
|
},
|
|
11355
|
-
|
|
11356
|
-
|
|
11357
|
-
|
|
11358
|
-
|
|
11359
|
-
|
|
11360
|
-
|
|
13580
|
+
{
|
|
13581
|
+
version: "4.5.0",
|
|
13582
|
+
entries: [
|
|
13583
|
+
{
|
|
13584
|
+
bump: "minor",
|
|
13585
|
+
title: "Expand `BaseIcons` to 59 icons and add `uni-icon` sizing",
|
|
13586
|
+
body: "The 34-icon set shipped in 7.0.0 covered the library's own components but not a\nreal application \u2014 an app migrating off inline `<svg>` (or off `uni-symbol`, in\nAngular) ran out of names almost immediately. Everything here is additive; all\n34 existing names are unchanged.\n- **25 new icons**, same Material Symbols Outlined 300 source and the same\n `0 -960 960 960` grid as the rest of the set: navigation (`link`, `expand`,\n `gridView`, `listView`), actions (`moreHorizontal`, `copy`, `send`,\n `refresh`, `dragHandle`, `qrCode`), feedback (`star`, `verified`) and\n user/system (`group`, `shieldPerson`, `clock`, `mail`, `chat`, `image`,\n `document`, `payment`, `bank`, `trendingUp`, `extension`, `webhook`,\n `logout`).\n - `moreHorizontal` ships alongside `more` because that one is `more_vert` and\n row-aligned menus need the horizontal kebab.\n - `star` is separate from `favorite`, which is the heart.\n- **`uni-icon` gains an optional `size` input** (`CssLength` \u2014 bare numbers are\n px, strings pass through, so `20` and `'1.25rem'` both work). Left unset,\n behaviour is unchanged: the icon fills its container, which is what lets a\n themed control size its own glyph through padding. Set, it applies\n width/height as inline styles, so an explicit size wins over the\n fill-the-container rule regardless of style injection order. This removes the\n per-call-site `width`/`height` CSS rule that replacing an inline `<svg>` with\n `<uni-icon>` would otherwise need.\n- The MCP `create-icon-tokens` tool now lists the built-in icon names above the\n token map it returns. Apps routinely hand-draw their own `close`, `check` or\n `plus`; encoding those into theme tokens works but adds redundant artwork on a\n foreign grid when the theme already ships the glyph. The tool cannot recognise\n a shape, so it hands the caller the list to check against before adding\n anything.",
|
|
13587
|
+
commit: "c2421c0"
|
|
13588
|
+
}
|
|
13589
|
+
],
|
|
13590
|
+
dependencyBumps: []
|
|
11361
13591
|
},
|
|
11362
|
-
|
|
11363
|
-
|
|
11364
|
-
|
|
11365
|
-
|
|
11366
|
-
|
|
11367
|
-
|
|
11368
|
-
|
|
13592
|
+
{
|
|
13593
|
+
version: "4.4.0",
|
|
13594
|
+
entries: [
|
|
13595
|
+
{
|
|
13596
|
+
bump: "minor",
|
|
13597
|
+
title: "Replace `BaseIcons` with a normalized 34-icon Material Symbols set",
|
|
13598
|
+
body: "The built-in icon set was 11 glyphs drawn from four different grids\n(`0 0 24 24`, `0 0 50 50`, `0 0 64 64`, `0 -960 960 960`), so `checkCircle` and\n`xCircle` rendered as solid filled discs next to a hairline `alertCircle` and an\noversized `close` \u2014 three optical weights in one set.\n- `BaseIcons` is now Material Symbols Outlined at weight 300, every glyph on a\n single `0 -960 960 960` grid, grouped by intent: navigation (`menu`,\n `chevronUp/Down/Left/Right`, `arrowLeft/Right`, `home`, `externalLink`),\n actions (`search`, `close`, `plus`, `minus`, `more`, `delete`, `edit`,\n `download`, `upload`, `share`, `filter`), feedback (`check`, `checkCircle`,\n `xCircle`, `alertCircle`, `info`, `warning`, `lock`) and user/system\n (`profile`, `settings`, `notification`, `favorite`, `help`, `calendar`).\n- All 11 previously shipped names are preserved, so existing `<uni-icon>` call\n sites and theme overrides keep working. Their **appearance changes**: the\n filled `checkCircle`/`xCircle` are now outlined, and the set reads lighter\n overall. `spinner` is carried over verbatim, keyframes intact.\n- New `IconName` and `BaseIconName` types. `IconName` is\n `BaseIconName | (string & {})`, so built-ins autocomplete and typos surface\n while themes can still register arbitrary names via `createTheme({ icons })`.\n `uni-icon`'s `name` input is typed with it instead of `keyof Icons`.\n- **Breaking**: removes the unused `IconToken`, `IconStyle`, `ToggleableIcon`\n and `IconConfig` exports. Nothing in the library referenced them and\n `IconToken`'s 60-name union contradicted the actual `BaseIcons` keys. Use\n `IconName` instead.\n- New exported `svgToIconUri(svg, options?)` \u2014 the supported way to bring your\n own icons (a brand set, a designer handoff) into a theme. It normalizes the\n source (drops the xml declaration, comments and fixed `width`/`height` so the\n mask scales), percent-encodes it, and **rejects artwork that cannot survive\n masking**: no `viewBox`, an embedded raster `<image>`, an external reference,\n a gradient/pattern fill, or more than one paint color. That last one is the\n trap worth naming \u2014 masks use the alpha channel, so a multi-color logo\n flattens to a silhouette in `currentColor`; pass `{ allowMultiColor: true }`\n when that is intended. `createTheme({ icons })` merges the result over\n `BaseIcons` per name, so a built-in name reskins and a new name is added.\n- New MCP tool `create-icon-tokens`, the agent-facing front end to\n `svgToIconUri`: hand it a project's inline `<svg>` (or a brand set) and it\n returns a paste-ready `icons` map for `uni-theme.ts`. It encodes via the same\n helper, so tokens are byte-identical to the built-in set, and adds the\n set-level checks a per-icon helper cannot make \u2014 which names override\n built-ins, and whether the artwork mixes viewBox grids. Bad artwork is\n reported per icon rather than failing the batch, and re-running is safe\n (already-encoded URIs pass through). The server instructions now point agents\n at it whenever they encounter inline SVG.\n- `BaseIcons` is generated by `scripts/generate-icons.mjs` (`pnpm icons:generate`),\n which fetches from the canonical Material Symbols source and validates every\n glyph before writing \u2014 a malformed path, an off-grid viewBox or geometry\n outside the grid aborts the run. `pnpm icons:check` verifies the committed\n file without writing. Add or change icons in that script's manifest and\n regenerate; the file is not hand-edited. `icon.records.spec.ts` asserts the\n same invariants against the committed output.",
|
|
13599
|
+
commit: "f7727aa"
|
|
13600
|
+
}
|
|
13601
|
+
],
|
|
13602
|
+
dependencyBumps: []
|
|
11369
13603
|
},
|
|
11370
|
-
|
|
11371
|
-
|
|
11372
|
-
|
|
11373
|
-
|
|
13604
|
+
{
|
|
13605
|
+
version: "4.3.0",
|
|
13606
|
+
entries: [
|
|
13607
|
+
{
|
|
13608
|
+
bump: "minor",
|
|
13609
|
+
title: "MDX guidelines adapter \u2014 authored docs now reach AI agents",
|
|
13610
|
+
body: "- New build adapter parses each component's co-located `.mdx` docs page into the\n index's previously-empty `guidelines` field: the `## Overview` prose becomes\n `whenToUse`, and optional `## Do` / `## Don't` / `## Accessibility` bullet sections\n map to their fields \u2014 so guidelines are authored in the same file the Storybook\n sidebar shows, with JSX/import scaffolding stripped.\n- 48 components gain guidelines immediately; `get-guidelines` and `uni://guidelines/*`\n now answer with real when-to-use guidance (including the canonical selector forms\n from the 6.0 unification).\n- MDX\u2194component matching: shared basename first (`tabs.mdx` \u2192 `tabs.component.ts`),\n same-directory fallback for group docs.",
|
|
13611
|
+
commit: "076202d"
|
|
13612
|
+
},
|
|
13613
|
+
{
|
|
13614
|
+
bump: "patch",
|
|
13615
|
+
title: "Canonical MDX docs structure across the entire library",
|
|
13616
|
+
body: "- Component docs pages now follow one flow (spec in AGENTS.md): imports \u2192 Overview \u2192\n Usage (the compact playground: story + source + knobs) \u2192 named variation examples \u2192\n **Theme options** \u2192 Accessibility \u2192 Do/Don't. Property/API/Methods/Events tables are\n retired \u2014 the playground's controls are the API reference.\n- New `ThemeOptions` docs block renders a component's per-theme option tokens live from\n the active Storybook theme (with color swatches), distinguishing per-theme options\n from per-instance inputs; data-table's raw `ThemeDataBlock` dump is replaced.\n- All ~55 component pages conform: the 7 form-control pages (200\u2013390 lines of legacy\n API tables) rewritten; empty Overviews authored (card, tag, icon-button, scroll-area,\n expand-area, data-table); accessibility bullets added across navigation, feedback,\n and form components.\n- The MCP index now carries when-to-use guidance for 55 of 70 components (was 41) and\n accessibility guidance for 36 (was 21) \u2014 the remainder are subcomponents documented\n on their parent pages and internal directives.",
|
|
13617
|
+
commit: "4bfb057"
|
|
13618
|
+
}
|
|
13619
|
+
],
|
|
13620
|
+
dependencyBumps: []
|
|
11374
13621
|
},
|
|
11375
|
-
|
|
11376
|
-
|
|
11377
|
-
|
|
11378
|
-
|
|
11379
|
-
|
|
13622
|
+
{
|
|
13623
|
+
version: "4.2.0",
|
|
13624
|
+
entries: [
|
|
13625
|
+
{
|
|
13626
|
+
bump: "minor",
|
|
13627
|
+
title: "Fix invisible icons; icons become first-class theme primitives",
|
|
13628
|
+
body: "- **Bug**: `uni-icon` resolves icons from `theme.icons`, but every theme shipped\n `icons: {}` \u2014 the icon record was never wired in, so all icons (dialog close, button\n spinner, search/clear affordances) rendered nothing.\n- **Fix + pattern**: the default icon set now lives in core (`BaseIcons`, in\n `concepts/iconography`) and `createTheme` merges a theme's `icons` over it \u2014 themes\n can override or add icons under any name (inline SVG data URIs, masked with\n `currentColor` so they recolor with the theme). The angular `icons` record re-exports\n `BaseIcons` (deprecated).\n- `uni-icon` also sets the standard `mask-image` (was webkit-only, so icons were\n invisible in Firefox regardless) and renders nothing for unknown names instead of a\n broken `url(\"undefined\")`.\n- The emitted `uni-theme.ts` gains an editable `icons` section, and the MCP's\n `generate-uni-theme` guidance instructs agents: never inline SVG in components \u2014\n define an icon once in the theme's `icons` map and render it via `<uni-icon>`.",
|
|
13629
|
+
commit: "fea0b2e"
|
|
13630
|
+
}
|
|
13631
|
+
],
|
|
13632
|
+
dependencyBumps: []
|
|
11380
13633
|
},
|
|
11381
|
-
|
|
11382
|
-
|
|
11383
|
-
|
|
11384
|
-
|
|
13634
|
+
{
|
|
13635
|
+
version: "4.1.2",
|
|
13636
|
+
entries: [
|
|
13637
|
+
{
|
|
13638
|
+
bump: "patch",
|
|
13639
|
+
title: "Fix published index losing its Storybook examples, and keep the index in sync",
|
|
13640
|
+
body: "- `uni-mcp@4.1.x` shipped with **0 examples**: the package build regenerated the index in\n CI, where `storybook-static` (gitignored) doesn't exist, silently overwriting the\n committed 107-example index before bundling. `build` is now `tsup` only \u2014 the committed\n `uni-index.json` is the single source of truth and is bundled as-is.\n- The index is regenerated once per release instead: the changesets `version` step\n (`pnpm version-packages`) builds Storybook and reruns `build-index` after the version\n bump, so the refreshed index lands reviewably in the Version Packages PR.\n- `build-index` now fails loudly when it finds zero examples, so an example-less index\n can never ship silently again.\n- Index refreshed to v5.1.0: includes the new component option tokens\n (`button.behavior.borderRadius`/`typeface`, `card.behavior.borderRadius`), the nine\n Theme Builder presets' generation updates, and all 107 examples.",
|
|
13641
|
+
commit: "ffb9692"
|
|
13642
|
+
}
|
|
13643
|
+
],
|
|
13644
|
+
dependencyBumps: []
|
|
11385
13645
|
},
|
|
11386
|
-
|
|
11387
|
-
|
|
11388
|
-
|
|
11389
|
-
|
|
11390
|
-
|
|
13646
|
+
{
|
|
13647
|
+
version: "4.1.1",
|
|
13648
|
+
entries: [
|
|
13649
|
+
{
|
|
13650
|
+
bump: "patch",
|
|
13651
|
+
title: "Fix `ng add` against real published packages (found by fresh `ng new` e2e):",
|
|
13652
|
+
body: '- The schematic bundle is CJS, but ng-packagr stamps `"type": "module"` into the\n published package.json, so Node loaded it as ESM and the CLI reported "no ng add\n actions". A nested `schematics/package.json` (`"type": "commonjs"`) scopes the\n bundle back to CJS.\n- The emitted `uni-theme.ts` used dot access on `Colors` (which has an index\n signature), failing under `ng new`\'s strict `noPropertyAccessFromIndexSignature`.\n The emitter (and the MCP tool\'s guidance) now uses bracket access throughout.\n- `uni-angular`\'s peer range on `uni-core` is now `workspace:^` (publishes as `^5.x`)\n instead of `workspace:*` (published as an exact pin). Alongside changesets\'\n `onlyUpdatePeerDependentsWhenOutOfRange`, this stops minor releases from being\n inflated to majors by the peer-dependents rule \u2014 the cause of the 4.0.0 and 5.0.0\n version jumps.',
|
|
13653
|
+
commit: "f2951db"
|
|
13654
|
+
}
|
|
13655
|
+
],
|
|
13656
|
+
dependencyBumps: []
|
|
13657
|
+
},
|
|
13658
|
+
{
|
|
13659
|
+
version: "4.1.0",
|
|
13660
|
+
entries: [
|
|
13661
|
+
{
|
|
13662
|
+
bump: "minor",
|
|
13663
|
+
title: "OKLCH theme generation engine (`concepts/generation`)",
|
|
13664
|
+
body: "- New `generateThemes(input)` / `generateUniThemes(input)`: brand seed(s) in, complete\n WCAG-AA light+dark `Colors` pair out, with a machine-readable `ContrastReport`\n (110 checked pairs per theme pair). Pure and deterministic.\n- All palette math moved from HSL to perceptual OKLCH: uniform lightness slots across\n hues, per-category chroma model (`CategoryChroma`), dark-mode accent chroma decoupling\n (C \u2264 0.16), and a contrast guard-rail that adjusts lightness only \u2014 never hue.\n- Brand colors ride as soft `targets` (kept verbatim when already AA, lightness-adjusted\n when not) alongside the existing hard `brand` pins; accepted by `generatePalette`,\n `createThemeFromPalette`, and Angular's `BrandPaletteConfig`.\n- Semantic inks re-tuned per role: error 27\xB0/C 0.20, warn 55\xB0/C 0.18 (rotated off amber \u2014\n dark yellow reads brown), success 152\xB0/C 0.16.\n- `createTheme` accepts optional `radii`/`shadows` overrides; `ShapeRadii` presets\n (`sharp` / `modern` / `playful`) emitted via the `shape` generation input.\n- Theme Builder ships nine curated AA-clean presets built on soft targets.\n- Deprecated (thin wrappers/tables retained): `uniColor`, `randomRangeValue`,\n `CategorySaturation`, `CategoryLightness`. `schemeHues` moved to `color.utils`.\n- `createTheme` deep-merges optional `borders` and `components` overrides over its\n derived defaults \u2014 themes can define custom named primitives and rewire per-component\n options without restating untouched sections.\n- New `emitThemeFile()` renders a static `uni-theme.ts` \u2014 literal colors, visible border\n primitives, sparse component overrides \u2014 the editable source of truth; the engine\n never ships to the browser.\n- New `ng add @uni-design-system/uni-angular` schematic: installs the peer set, writes\n the generated theme file, registers `UNI_THEMES` in `app.config.ts`, adds typeface\n links, scaffolds a themed smoke test, and prints the contrast summary.\n- New MCP tool `generate-uni-theme`: returns the static theme file content, provider\n snippet, and contrast report, with agent guidance to edit the file for restyling.\n- `uni-core` gains its first Vitest suite, including a 1,080-seed contrast property\n corpus with zero tolerance in both modes; the schematic gets its own spec suite.",
|
|
13665
|
+
commit: "f7f0bdd"
|
|
13666
|
+
}
|
|
13667
|
+
],
|
|
13668
|
+
dependencyBumps: []
|
|
11391
13669
|
}
|
|
11392
|
-
|
|
11393
|
-
usage: "Apply style overrides through the Emotion theme provider (the `UniTheme` object), and pass component options as component inputs/props. Import the theme from `@uni-design-system/uni-core` (`DarkTheme`)."
|
|
13670
|
+
]
|
|
11394
13671
|
}
|
|
11395
13672
|
]
|
|
11396
13673
|
};
|
|
@@ -11429,6 +13706,36 @@ function listThemes() {
|
|
|
11429
13706
|
function getTheme(id) {
|
|
11430
13707
|
return index.themes.find((t) => t.id === id);
|
|
11431
13708
|
}
|
|
13709
|
+
function listChangelogs() {
|
|
13710
|
+
return index.changelogs ?? [];
|
|
13711
|
+
}
|
|
13712
|
+
function getChangelog(pkg = "uni-angular") {
|
|
13713
|
+
const q = pkg.trim().toLowerCase();
|
|
13714
|
+
return listChangelogs().find((c) => {
|
|
13715
|
+
const name = c.package.toLowerCase();
|
|
13716
|
+
const short = name.split("/").pop() ?? name;
|
|
13717
|
+
return name === q || short === q || short.replace(/^uni-/, "") === q;
|
|
13718
|
+
});
|
|
13719
|
+
}
|
|
13720
|
+
function compareVersions(a, b) {
|
|
13721
|
+
const nums = (v) => v.trim().replace(/^v/, "").split(".").map((s) => parseInt(s, 10) || 0);
|
|
13722
|
+
const [pa, pb] = [nums(a), nums(b)];
|
|
13723
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
13724
|
+
const d = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
13725
|
+
if (d) return d;
|
|
13726
|
+
}
|
|
13727
|
+
return 0;
|
|
13728
|
+
}
|
|
13729
|
+
function matchesVersion(version, query) {
|
|
13730
|
+
const v = version.split(".");
|
|
13731
|
+
const q = query.trim().replace(/^v/, "").split(".");
|
|
13732
|
+
return q.every((seg, i) => v[i] === seg);
|
|
13733
|
+
}
|
|
13734
|
+
function selectReleases(cl, scope) {
|
|
13735
|
+
if (scope.version) return cl.releases.filter((r) => matchesVersion(r.version, scope.version));
|
|
13736
|
+
if (scope.since) return cl.releases.filter((r) => compareVersions(r.version, scope.since) > 0);
|
|
13737
|
+
return cl.releases;
|
|
13738
|
+
}
|
|
11432
13739
|
function search(query, kind) {
|
|
11433
13740
|
const q = query.toLowerCase().trim();
|
|
11434
13741
|
if (!q) return [];
|
|
@@ -11604,6 +13911,43 @@ ${g.donts.map((d) => `- ${d}`).join("\n")}`);
|
|
|
11604
13911
|
${g.accessibility.map((a) => `- ${a}`).join("\n")}`);
|
|
11605
13912
|
return out.join("\n");
|
|
11606
13913
|
}
|
|
13914
|
+
function formatRelease(r, full) {
|
|
13915
|
+
const out = [`## ${r.version}`];
|
|
13916
|
+
for (const bump of ["major", "minor", "patch"]) {
|
|
13917
|
+
const entries = r.entries.filter((e) => e.bump === bump);
|
|
13918
|
+
if (!entries.length) continue;
|
|
13919
|
+
out.push(`
|
|
13920
|
+
### ${bump[0].toUpperCase()}${bump.slice(1)} changes`);
|
|
13921
|
+
for (const e of entries) {
|
|
13922
|
+
const commit = e.commit ? ` _(${e.commit.slice(0, 7)})_` : "";
|
|
13923
|
+
if (full && e.body) out.push(`
|
|
13924
|
+
**${e.title}**${commit}
|
|
13925
|
+
|
|
13926
|
+
${e.body}`);
|
|
13927
|
+
else out.push(`- ${e.title}${commit}`);
|
|
13928
|
+
}
|
|
13929
|
+
}
|
|
13930
|
+
if (r.dependencyBumps.length) {
|
|
13931
|
+
out.push(`
|
|
13932
|
+
_Dependency bumps: ${r.dependencyBumps.map((d) => `\`${d}\``).join(", ")}_`);
|
|
13933
|
+
}
|
|
13934
|
+
if (!r.entries.length && !r.dependencyBumps.length) out.push("_No entries._");
|
|
13935
|
+
return out.join("\n");
|
|
13936
|
+
}
|
|
13937
|
+
function formatChangelog(cl, scope = {}) {
|
|
13938
|
+
const releases = selectReleases(cl, scope);
|
|
13939
|
+
if (!releases.length) {
|
|
13940
|
+
const wanted = scope.version ? `release matching \`${scope.version}\`` : `releases after \`${scope.since}\``;
|
|
13941
|
+
return `No ${wanted} found for ${cl.package}. Latest release: ${cl.releases[0]?.version ?? "none"}.`;
|
|
13942
|
+
}
|
|
13943
|
+
const full = Boolean(scope.version || scope.since);
|
|
13944
|
+
const shown = full ? releases : releases.slice(0, 15);
|
|
13945
|
+
const out = [`# ${cl.package} \u2014 release notes`, ...shown.map((r) => formatRelease(r, full))];
|
|
13946
|
+
if (shown.length < releases.length) {
|
|
13947
|
+
out.push(`_...and ${releases.length - shown.length} older releases. Pass \`version\` or \`since\` to scope._`);
|
|
13948
|
+
}
|
|
13949
|
+
return out.join("\n\n");
|
|
13950
|
+
}
|
|
11607
13951
|
function formatSearch(query, hits) {
|
|
11608
13952
|
if (!hits.length) return `No results for "${query}".`;
|
|
11609
13953
|
const rows = hits.slice(0, 40).map((h) => `- _[${h.kind}]_ **${h.label}** \`${h.id}\` - ${h.snippet}`);
|
|
@@ -12098,6 +14442,20 @@ var generateColors = (config) => {
|
|
|
12098
14442
|
};
|
|
12099
14443
|
};
|
|
12100
14444
|
var generatePalette = (config) => generateColors(config);
|
|
14445
|
+
var dimensionEntries = (record) => Object.fromEntries(Object.entries(record ?? {}).filter(([, value]) => value !== void 0 && value !== "none").map(([key, value]) => [key, {
|
|
14446
|
+
$value: String(value),
|
|
14447
|
+
$type: "dimension"
|
|
14448
|
+
}]));
|
|
14449
|
+
var emitDtcgTokens = (input) => ({
|
|
14450
|
+
color: Object.fromEntries(Object.entries(input.colors).filter(([, value]) => value !== void 0).map(([key, value]) => [key, {
|
|
14451
|
+
$value: value,
|
|
14452
|
+
$type: "color"
|
|
14453
|
+
}])),
|
|
14454
|
+
size: {
|
|
14455
|
+
radius: dimensionEntries(input.radii),
|
|
14456
|
+
spacing: dimensionEntries(input.spacing)
|
|
14457
|
+
}
|
|
14458
|
+
});
|
|
12101
14459
|
var rgba = (hex, alpha) => {
|
|
12102
14460
|
const { red, green, blue } = hexToRgb(hex);
|
|
12103
14461
|
return `rgba(${red}, ${green}, ${blue}, ${alpha})`;
|
|
@@ -12497,12 +14855,15 @@ var buildComponents = (c) => ({
|
|
|
12497
14855
|
} },
|
|
12498
14856
|
checkbox: { options: {
|
|
12499
14857
|
size: 20,
|
|
12500
|
-
boxColor: "surface"
|
|
14858
|
+
boxColor: "surface",
|
|
14859
|
+
borderRadius: 2,
|
|
14860
|
+
focusRingGap: 2
|
|
12501
14861
|
} },
|
|
12502
14862
|
radio: { options: {
|
|
12503
14863
|
size: 20,
|
|
12504
14864
|
ringColor: "outline",
|
|
12505
|
-
fillColor: "surface"
|
|
14865
|
+
fillColor: "surface",
|
|
14866
|
+
transitionSpeed: 0.3
|
|
12506
14867
|
} },
|
|
12507
14868
|
dialog: { options: {
|
|
12508
14869
|
borderRadius: "lg",
|
|
@@ -12580,7 +14941,7 @@ var buildComponents = (c) => ({
|
|
|
12580
14941
|
logoPadding: "md"
|
|
12581
14942
|
} },
|
|
12582
14943
|
input: { options: {
|
|
12583
|
-
|
|
14944
|
+
typeface: "input",
|
|
12584
14945
|
color: "primary-surface",
|
|
12585
14946
|
textColor: "on-primary-surface",
|
|
12586
14947
|
disabledColor: "disabled-surface",
|
|
@@ -12693,6 +15054,56 @@ var buildComponents = (c) => ({
|
|
|
12693
15054
|
listBorderRadius: "xs",
|
|
12694
15055
|
maxSuggestions: 8
|
|
12695
15056
|
} },
|
|
15057
|
+
calendar: {
|
|
15058
|
+
options: {
|
|
15059
|
+
dayBorderRadius: "max",
|
|
15060
|
+
typeface: "label",
|
|
15061
|
+
gap: "xxs",
|
|
15062
|
+
navPrevSymbol: "chevron_left",
|
|
15063
|
+
navNextSymbol: "chevron_right",
|
|
15064
|
+
weekdayFormat: "short",
|
|
15065
|
+
showOutsideDays: false,
|
|
15066
|
+
todayStyle: "outline"
|
|
15067
|
+
},
|
|
15068
|
+
fixed: {
|
|
15069
|
+
display: "inline-block",
|
|
15070
|
+
userSelect: "none"
|
|
15071
|
+
},
|
|
15072
|
+
sizes: {
|
|
15073
|
+
sm: {
|
|
15074
|
+
width: 28,
|
|
15075
|
+
height: 28,
|
|
15076
|
+
fontSize: 12
|
|
15077
|
+
},
|
|
15078
|
+
md: {
|
|
15079
|
+
width: 34,
|
|
15080
|
+
height: 34,
|
|
15081
|
+
fontSize: 13
|
|
15082
|
+
},
|
|
15083
|
+
lg: {
|
|
15084
|
+
width: 40,
|
|
15085
|
+
height: 40,
|
|
15086
|
+
fontSize: 15
|
|
15087
|
+
}
|
|
15088
|
+
}
|
|
15089
|
+
},
|
|
15090
|
+
dateInput: { options: {
|
|
15091
|
+
toggleSymbol: "calendar_month",
|
|
15092
|
+
popupShadow: "menu",
|
|
15093
|
+
popupBorderRadius: "xs",
|
|
15094
|
+
popupColor: "primary-surface"
|
|
15095
|
+
} },
|
|
15096
|
+
timeInput: { options: {
|
|
15097
|
+
toggleSymbol: "schedule",
|
|
15098
|
+
listColor: "primary-surface",
|
|
15099
|
+
listShadow: "menu",
|
|
15100
|
+
listBorderRadius: "xs",
|
|
15101
|
+
maxVisibleOptions: 7
|
|
15102
|
+
} },
|
|
15103
|
+
dateTimeInput: { options: {
|
|
15104
|
+
partGap: "sm",
|
|
15105
|
+
dividerColor: "outline"
|
|
15106
|
+
} },
|
|
12696
15107
|
button: {
|
|
12697
15108
|
options: {
|
|
12698
15109
|
borderRadius: "max",
|
|
@@ -13003,16 +15414,19 @@ var deepMerge = (base, override) => {
|
|
|
13003
15414
|
for (const [key, value] of Object.entries(override)) out[key] = isRecord$1(value) && isRecord$1(out[key]) ? deepMerge(out[key], value) : value;
|
|
13004
15415
|
return out;
|
|
13005
15416
|
};
|
|
13006
|
-
var createTheme = ({ id, name, colors, icons = {}, radii = BaseRadii, shadows = BaseShadows, borders, components }) => ({
|
|
15417
|
+
var createTheme = ({ id, name, colors, icons = {}, radii = BaseRadii, shadows = BaseShadows, typography, borders, thicknesses, components }) => ({
|
|
13007
15418
|
id,
|
|
13008
15419
|
name,
|
|
13009
15420
|
colors,
|
|
13010
|
-
typography: BaseTypography,
|
|
15421
|
+
typography: deepMerge(BaseTypography, typography),
|
|
13011
15422
|
borders: deepMerge(buildBorders(colors), borders),
|
|
13012
15423
|
radii,
|
|
13013
15424
|
shadows,
|
|
13014
15425
|
spacing: BaseSpacing,
|
|
13015
|
-
thicknesses:
|
|
15426
|
+
thicknesses: {
|
|
15427
|
+
...BaseThicknesses,
|
|
15428
|
+
...thicknesses
|
|
15429
|
+
},
|
|
13016
15430
|
icons: {
|
|
13017
15431
|
...BaseIcons,
|
|
13018
15432
|
...icons
|
|
@@ -13880,6 +16294,19 @@ function buildStoredTheme(id) {
|
|
|
13880
16294
|
{ id: theme.id, name: theme.name, mode: modeOf(id), theme: dehydrateTheme(theme) }
|
|
13881
16295
|
]);
|
|
13882
16296
|
}
|
|
16297
|
+
function buildDtcgTokens(id) {
|
|
16298
|
+
const theme = UniThemes[id];
|
|
16299
|
+
if (!theme) {
|
|
16300
|
+
const ids = Object.keys(UniThemes).join(", ");
|
|
16301
|
+
return { ok: false, error: `No theme found with id \`${id}\`. Available: ${ids}.` };
|
|
16302
|
+
}
|
|
16303
|
+
const tokens = emitDtcgTokens({
|
|
16304
|
+
colors: theme.colors,
|
|
16305
|
+
radii: theme.radii,
|
|
16306
|
+
spacing: theme.spacing
|
|
16307
|
+
});
|
|
16308
|
+
return { ok: true, json: JSON.stringify(tokens, null, 2) };
|
|
16309
|
+
}
|
|
13883
16310
|
function summarizeEnvelope(env) {
|
|
13884
16311
|
const list = env.themes.map((t) => `\`${t.id}\` (${t.mode})`).join(", ");
|
|
13885
16312
|
const failing = env.contrast?.failing.length ? `
|
|
@@ -13957,7 +16384,7 @@ function createUniServer() {
|
|
|
13957
16384
|
const server = new McpServer(
|
|
13958
16385
|
{ name: "uni-design-system", version: meta.version },
|
|
13959
16386
|
{
|
|
13960
|
-
instructions:
|
|
16387
|
+
instructions: 'Authoritative interface to the Uni Design System. Prefer these tools over recalling component APIs or token values from memory: names, props, and tokens here match the exact Uni release the developer installed. Start with `list-components` or `search`, then `get-component` / `get-component-examples`. Use real token ids (via `list-tokens`) instead of raw hex. Theming has four tools, split by what you need: to brand an app permanently, call `generate-uni-theme` once and write the returned static `uni-theme.ts` \u2014 then change look and feel by editing that file\'s tokens directly, since shared tokens propagate everywhere; to apply a theme immediately with no build step (previews, per-tenant theming, generated UI), call `generate-runtime-theme` or `get-runtime-theme` and register the JSON they return; to read a theme\'s token values without applying one, use `get-theme-template`. Never inline `<svg>` in a component: when you meet inline SVG, or a brand icon set to import, call `create-icon-tokens` to convert it into theme icon tokens, add them to `uni-theme.ts`, and render with `<uni-icon name="\u2026" />`. For release questions ("what changed in 8.1?", "what does upgrading get me?"), call `get-changelog`.'
|
|
13961
16388
|
}
|
|
13962
16389
|
);
|
|
13963
16390
|
server.registerTool(
|
|
@@ -14099,6 +16526,21 @@ function createUniServer() {
|
|
|
14099
16526
|
},
|
|
14100
16527
|
async ({ id }) => runtimeTheme(buildStoredTheme(id))
|
|
14101
16528
|
);
|
|
16529
|
+
server.registerTool(
|
|
16530
|
+
"export-dtcg-tokens",
|
|
16531
|
+
{
|
|
16532
|
+
title: "Export DTCG design tokens",
|
|
16533
|
+
description: "W3C DTCG JSON (Style Dictionary compatible) for a built-in Uni theme \u2014 the color, radius, and spacing scales, named with Uni token ids. Use this to feed external token pipelines; the `UniTheme` JSON from the theme tools remains the lossless primary format.",
|
|
16534
|
+
inputSchema: {
|
|
16535
|
+
theme: z.string().describe('Theme id, e.g. "LightTheme" or "DarkTheme".')
|
|
16536
|
+
}
|
|
16537
|
+
},
|
|
16538
|
+
async ({ theme }) => {
|
|
16539
|
+
const result = buildDtcgTokens(theme);
|
|
16540
|
+
if (!result.ok) return { content: [{ type: "text", text: result.error }], isError: true };
|
|
16541
|
+
return text("```json\n" + result.json + "\n```");
|
|
16542
|
+
}
|
|
16543
|
+
);
|
|
14102
16544
|
server.registerTool(
|
|
14103
16545
|
"create-icon-tokens",
|
|
14104
16546
|
{
|
|
@@ -14118,6 +16560,26 @@ function createUniServer() {
|
|
|
14118
16560
|
},
|
|
14119
16561
|
async ({ icons }) => text(formatIconTokens(icons))
|
|
14120
16562
|
);
|
|
16563
|
+
server.registerTool(
|
|
16564
|
+
"get-changelog",
|
|
16565
|
+
{
|
|
16566
|
+
title: "Get release notes",
|
|
16567
|
+
description: 'Release notes for the Uni packages, from their changesets changelogs. Answers "what changed in X?" and "what do I get by upgrading?". Pass `version` for one release\'s full notes ("8.1" matches every 8.1.x), `since` for the full notes of every release after an installed version (an upgrade diff), or neither for a compact release list.',
|
|
16568
|
+
inputSchema: {
|
|
16569
|
+
package: z.string().optional().describe('npm name or short name, e.g. "uni-angular" (default), "uni-core", "uni-react", "uni-mcp".'),
|
|
16570
|
+
version: z.string().optional().describe('One release, e.g. "8.1.0" or "8.1".'),
|
|
16571
|
+
since: z.string().optional().describe('Every release newer than this version, e.g. the installed "8.0.0".')
|
|
16572
|
+
}
|
|
16573
|
+
},
|
|
16574
|
+
async ({ package: pkg, version, since }) => {
|
|
16575
|
+
const cl = getChangelog(pkg);
|
|
16576
|
+
if (!cl) {
|
|
16577
|
+
const known = listChangelogs().map((c) => `\`${c.package}\``).join(", ");
|
|
16578
|
+
return text(`No changelog for \`${pkg}\`. Known packages: ${known}.`);
|
|
16579
|
+
}
|
|
16580
|
+
return text(formatChangelog(cl, { version, since }));
|
|
16581
|
+
}
|
|
16582
|
+
);
|
|
14121
16583
|
server.registerTool(
|
|
14122
16584
|
"search",
|
|
14123
16585
|
{
|
|
@@ -14223,6 +16685,35 @@ function registerResources(server) {
|
|
|
14223
16685
|
};
|
|
14224
16686
|
}
|
|
14225
16687
|
);
|
|
16688
|
+
server.registerResource(
|
|
16689
|
+
"changelog",
|
|
16690
|
+
new ResourceTemplate("uni://changelog/{package}", {
|
|
16691
|
+
list: async () => ({
|
|
16692
|
+
resources: listChangelogs().map((c) => ({
|
|
16693
|
+
uri: `uni://changelog/${c.package.split("/").pop()}`,
|
|
16694
|
+
name: `${c.package} changelog`,
|
|
16695
|
+
description: `Release notes, latest ${c.releases[0]?.version ?? "none"}.`
|
|
16696
|
+
}))
|
|
16697
|
+
})
|
|
16698
|
+
}),
|
|
16699
|
+
{
|
|
16700
|
+
title: "Uni changelog",
|
|
16701
|
+
description: "A package's release notes (compact digest).",
|
|
16702
|
+
mimeType: "text/markdown"
|
|
16703
|
+
},
|
|
16704
|
+
async (uri, { package: pkg }) => {
|
|
16705
|
+
const cl = getChangelog(String(pkg));
|
|
16706
|
+
return {
|
|
16707
|
+
contents: [
|
|
16708
|
+
{
|
|
16709
|
+
uri: uri.href,
|
|
16710
|
+
mimeType: "text/markdown",
|
|
16711
|
+
text: cl ? formatChangelog(cl) : `Unknown package: ${pkg}`
|
|
16712
|
+
}
|
|
16713
|
+
]
|
|
16714
|
+
};
|
|
16715
|
+
}
|
|
16716
|
+
);
|
|
14226
16717
|
server.registerResource(
|
|
14227
16718
|
"guidelines",
|
|
14228
16719
|
new ResourceTemplate("uni://guidelines/{id}", {
|
|
@@ -14260,4 +16751,4 @@ export {
|
|
|
14260
16751
|
buildStoredTheme,
|
|
14261
16752
|
createUniServer
|
|
14262
16753
|
};
|
|
14263
|
-
//# sourceMappingURL=chunk-
|
|
16754
|
+
//# sourceMappingURL=chunk-JOMMURY6.js.map
|