@webority/ui-react 0.107.0 → 0.108.1

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.
Files changed (195) hide show
  1. package/dist/canvas-kit/kit.js +26159 -26822
  2. package/dist/canvas-kit/manifest.json +1130 -1695
  3. package/dist/canvas-kit/release.json +6 -6
  4. package/dist/components/AppAccordion.js +1 -1
  5. package/dist/components/AppActionIcon.js +1 -1
  6. package/dist/components/AppAlert.js +1 -1
  7. package/dist/components/AppAsyncBlock.js +1 -1
  8. package/dist/components/AppAutocomplete.js +1 -1
  9. package/dist/components/AppAvatar.js +1 -1
  10. package/dist/components/AppAvatarGroup.js +1 -1
  11. package/dist/components/AppBadge.js +1 -1
  12. package/dist/components/AppBanner.js +1 -1
  13. package/dist/components/AppBreadcrumbs.js +1 -1
  14. package/dist/components/AppButton.js +1 -1
  15. package/dist/components/AppButtonGroup.js +1 -1
  16. package/dist/components/AppCalendar.js +1 -1
  17. package/dist/components/AppCard.js +1 -1
  18. package/dist/components/AppCarousel.js +1 -1
  19. package/dist/components/AppChart.js +1 -1
  20. package/dist/components/AppChartCard.js +1 -1
  21. package/dist/components/AppCheckbox.js +1 -1
  22. package/dist/components/AppChip.js +1 -1
  23. package/dist/components/AppChipGroup.js +1 -1
  24. package/dist/components/AppChoiceCard.js +1 -1
  25. package/dist/components/AppChoiceChip.js +1 -1
  26. package/dist/components/AppCodeBlock.js +1 -1
  27. package/dist/components/AppColorField.js +1 -1
  28. package/dist/components/AppColumnMenu.js +1 -1
  29. package/dist/components/AppCommandPalette.js +1 -1
  30. package/dist/components/AppCommentThread.js +1 -1
  31. package/dist/components/AppCompareTable.js +1 -1
  32. package/dist/components/AppConfirmDialog.js +1 -1
  33. package/dist/components/AppConsentBanner.js +1 -1
  34. package/dist/components/AppContextMenu.js +1 -1
  35. package/dist/components/AppCopyButton.js +1 -1
  36. package/dist/components/AppCountryFlag.js +1 -1
  37. package/dist/components/AppCountrySelect.js +1 -1
  38. package/dist/components/AppDashboardCell.js +1 -1
  39. package/dist/components/AppDashboardGrid.js +1 -1
  40. package/dist/components/AppDataTable.js +1 -1
  41. package/dist/components/AppDatePicker.js +1 -1
  42. package/dist/components/AppDateRangePicker.js +1 -1
  43. package/dist/components/AppDescriptions.js +1 -1
  44. package/dist/components/AppDetailPane.js +1 -1
  45. package/dist/components/AppDrawer.js +1 -1
  46. package/dist/components/AppDropZone.js +1 -1
  47. package/dist/components/AppDropdown.js +1 -1
  48. package/dist/components/AppDueDate.js +1 -1
  49. package/dist/components/AppEmptyState.js +1 -1
  50. package/dist/components/AppErrorSummary.js +1 -1
  51. package/dist/components/AppFileAttachment.js +1 -1
  52. package/dist/components/AppFilePicker.js +1 -1
  53. package/dist/components/AppFileTiles.js +1 -1
  54. package/dist/components/AppFileViewer.js +1 -1
  55. package/dist/components/AppFilterBar.js +1 -1
  56. package/dist/components/AppFloatingDock.js +1 -1
  57. package/dist/components/AppFormActions.js +1 -1
  58. package/dist/components/AppFormRow.js +1 -1
  59. package/dist/components/AppFormSection.js +1 -1
  60. package/dist/components/AppHoverCard.js +1 -1
  61. package/dist/components/AppIcon.js +1 -1
  62. package/dist/components/AppImagePicker.js +1 -0
  63. package/dist/components/AppInfoTip.js +1 -1
  64. package/dist/components/AppInlineEdit.js +1 -1
  65. package/dist/components/AppInput.js +1 -1
  66. package/dist/components/AppInputGroup.js +1 -1
  67. package/dist/components/AppKanban.js +1 -1
  68. package/dist/components/AppKbd.js +1 -1
  69. package/dist/components/AppKpiTile.js +1 -1
  70. package/dist/components/AppLightbox.js +1 -1
  71. package/dist/components/AppLink.js +1 -1
  72. package/dist/components/AppMarkdown.js +1 -1
  73. package/dist/components/AppMentionInput.js +1 -1
  74. package/dist/components/AppMeter.js +1 -1
  75. package/dist/components/AppMetricStrip.js +1 -1
  76. package/dist/components/AppModal.js +1 -1
  77. package/dist/components/AppMultiSelect.js +1 -1
  78. package/dist/components/AppNavList.js +1 -1
  79. package/dist/components/AppNavigationMenu.js +1 -1
  80. package/dist/components/AppNotificationCenter.js +1 -1
  81. package/dist/components/AppNumberInput.js +1 -1
  82. package/dist/components/AppOnboardingChecklist.js +1 -1
  83. package/dist/components/AppOtpInput.js +1 -1
  84. package/dist/components/AppPageHeader.js +1 -1
  85. package/dist/components/AppPhoneNumberInput.js +1 -1
  86. package/dist/components/AppPricingCard.js +1 -1
  87. package/dist/components/AppProgress.js +1 -1
  88. package/dist/components/AppQrCode.js +1 -1
  89. package/dist/components/AppRadio.js +1 -1
  90. package/dist/components/AppRadioGroup.js +1 -1
  91. package/dist/components/AppRating.js +1 -1
  92. package/dist/components/AppRecordPager.js +1 -1
  93. package/dist/components/AppRelativeTime.js +1 -1
  94. package/dist/components/AppRepeater.js +1 -1
  95. package/dist/components/AppResizable.js +1 -1
  96. package/dist/components/AppResizableHandle.js +1 -1
  97. package/dist/components/AppResizablePanel.js +1 -1
  98. package/dist/components/AppResourceCard.js +1 -1
  99. package/dist/components/AppResult.js +1 -1
  100. package/dist/components/AppRichText.js +1 -1
  101. package/dist/components/AppRollingNumber.js +1 -1
  102. package/dist/components/AppRouteError.js +1 -1
  103. package/dist/components/AppScrollbar.js +1 -1
  104. package/dist/components/AppSearch.js +1 -1
  105. package/dist/components/AppSectionCallToAction.js +1 -1
  106. package/dist/components/AppSectionFaq.js +1 -1
  107. package/dist/components/AppSectionFeatures.js +1 -1
  108. package/dist/components/AppSectionHero.js +1 -1
  109. package/dist/components/AppSectionLeadCapture.js +1 -0
  110. package/dist/components/AppSectionLogos.js +1 -1
  111. package/dist/components/AppSectionPricing.js +1 -1
  112. package/dist/components/AppSectionTestimonials.js +1 -1
  113. package/dist/components/AppSegmented.js +1 -1
  114. package/dist/components/AppSelect.js +1 -1
  115. package/dist/components/AppSeoHead.js +1 -0
  116. package/dist/components/AppShell.js +1 -1
  117. package/dist/components/AppShortcutLegend.js +1 -1
  118. package/dist/components/AppShowMore.js +1 -1
  119. package/dist/components/AppSkeleton.js +1 -1
  120. package/dist/components/AppSkeletonLines.js +1 -1
  121. package/dist/components/AppSlider.js +1 -1
  122. package/dist/components/AppSortableList.js +1 -1
  123. package/dist/components/AppSparkline.js +1 -1
  124. package/dist/components/AppSpinner.js +1 -1
  125. package/dist/components/AppSplash.js +1 -1
  126. package/dist/components/AppSplitButton.js +1 -1
  127. package/dist/components/AppSplitView.js +1 -1
  128. package/dist/components/AppStatusBadge.js +1 -1
  129. package/dist/components/AppStepper.js +1 -1
  130. package/dist/components/AppSwitch.js +1 -1
  131. package/dist/components/AppTablePagination.js +1 -1
  132. package/dist/components/AppTableToolbar.js +1 -1
  133. package/dist/components/AppTabs.js +1 -1
  134. package/dist/components/AppTagInput.js +1 -1
  135. package/dist/components/AppTextarea.js +1 -1
  136. package/dist/components/AppThemeToggle.js +1 -1
  137. package/dist/components/AppTimePicker.js +1 -1
  138. package/dist/components/AppTimeline.js +1 -1
  139. package/dist/components/AppToast.js +1 -1
  140. package/dist/components/AppToolbar.js +1 -1
  141. package/dist/components/AppTooltip.js +1 -1
  142. package/dist/components/AppTour.js +1 -1
  143. package/dist/components/AppTreeView.js +1 -1
  144. package/dist/components/AppTruncate.js +1 -1
  145. package/dist/components/AppUpdateBar.js +1 -1
  146. package/dist/components/AppWhatsNew.js +1 -1
  147. package/dist/components/AppWizard.js +1 -1
  148. package/dist/components/AppWorkspaceSwitcher.js +1 -1
  149. package/dist/components/iconCatalogNames.g.js +1 -1
  150. package/dist/components/iconGlyphs.g.js +1 -1
  151. package/dist/components/iconVariants.g.js +1 -1
  152. package/dist/guidance.json +119 -600
  153. package/dist/lib/useCommandPaletteShortcut.js +1 -1
  154. package/dist/lib/useFileDrop.js +1 -0
  155. package/dist/lib/wuiMarker.js +1 -1
  156. package/dist/types/components/AppAccordion.d.ts +1 -1
  157. package/dist/types/components/AppCompareTable.d.ts +45 -10
  158. package/dist/types/components/AppDescriptions.d.ts +10 -8
  159. package/dist/types/components/AppDrawer.d.ts +37 -0
  160. package/dist/types/components/AppEmptyState.d.ts +12 -5
  161. package/dist/types/components/AppImagePicker.d.ts +149 -0
  162. package/dist/types/components/AppInlineEdit.d.ts +0 -1
  163. package/dist/types/components/AppNavigationMenu.d.ts +1 -1
  164. package/dist/types/components/AppNotificationCenter.d.ts +16 -1
  165. package/dist/types/components/AppRecordPager.d.ts +2 -2
  166. package/dist/types/components/AppSectionLeadCapture.d.ts +67 -0
  167. package/dist/types/components/AppSelect.d.ts +7 -0
  168. package/dist/types/components/AppSeoHead.d.ts +42 -0
  169. package/dist/types/components/AppShortcutLegend.d.ts +13 -1
  170. package/dist/types/components/AppStepper.d.ts +2 -2
  171. package/dist/types/components/AppTablePagination.d.ts +36 -11
  172. package/dist/types/components/AppWhatsNew.d.ts +11 -2
  173. package/dist/types/components/iconGlyphs.g.d.ts +1 -0
  174. package/dist/types/components/iconVariants.g.d.ts +5 -0
  175. package/dist/types/index.d.ts +3 -8
  176. package/dist/types/lib/useFileDrop.d.ts +24 -0
  177. package/dist/types/lib/wuiMarker.d.ts +10 -0
  178. package/dist/ui-react.js +1 -1
  179. package/package.json +5 -5
  180. package/dist/components/AppAvatarPicker.js +0 -1
  181. package/dist/components/AppInfoList.js +0 -1
  182. package/dist/components/AppLogoPicker.js +0 -1
  183. package/dist/components/AppMenubar.js +0 -1
  184. package/dist/components/AppPagination.js +0 -1
  185. package/dist/components/AppSelectMini.js +0 -1
  186. package/dist/components/AppSidebarMenu.js +0 -1
  187. package/dist/components/AppTableEmptyState.js +0 -1
  188. package/dist/types/components/AppAvatarPicker.d.ts +0 -92
  189. package/dist/types/components/AppInfoList.d.ts +0 -29
  190. package/dist/types/components/AppLogoPicker.d.ts +0 -125
  191. package/dist/types/components/AppMenubar.d.ts +0 -50
  192. package/dist/types/components/AppPagination.d.ts +0 -39
  193. package/dist/types/components/AppSelectMini.d.ts +0 -53
  194. package/dist/types/components/AppSidebarMenu.d.ts +0 -90
  195. package/dist/types/components/AppTableEmptyState.d.ts +0 -22
@@ -2,7 +2,7 @@
2
2
  "kind": "WeborityWeb",
3
3
  "library": {
4
4
  "name": "@webority/ui-react",
5
- "version": "0.107.0"
5
+ "version": "0.108.1"
6
6
  },
7
7
  "rendererProtocolVersion": 12,
8
8
  "platform": "Web",
@@ -664,7 +664,7 @@
664
664
  },
665
665
  {
666
666
  "text": "The empty body of a data table specifically.",
667
- "instead": "AppTableEmptyState"
667
+ "instead": "AppEmptyState variant=\"table\""
668
668
  },
669
669
  {
670
670
  "text": "The whole app is booting, not one screen.",
@@ -1189,7 +1189,7 @@
1189
1189
  },
1190
1190
  {
1191
1191
  "text": "You are showing a company logo.",
1192
- "instead": "AppLogoPicker"
1192
+ "instead": "AppImagePicker"
1193
1193
  }
1194
1194
  ],
1195
1195
  "do": [
@@ -1332,182 +1332,6 @@
1332
1332
  ]
1333
1333
  }
1334
1334
  },
1335
- {
1336
- "name": "AppAvatarPicker",
1337
- "marker": "AppAvatarPicker",
1338
- "acceptsChildren": false,
1339
- "props": [
1340
- {
1341
- "name": "accept",
1342
- "type": "string",
1343
- "required": false,
1344
- "description": "The file types a person may choose. Defaults to JPG, PNG, WebP and HEIC; HEIC opens only where the browser can decode it."
1345
- },
1346
- {
1347
- "name": "ariaLabel",
1348
- "type": "string",
1349
- "required": false,
1350
- "description": "The accessible name of the photo button. Defaults to the words of the action."
1351
- },
1352
- {
1353
- "name": "className",
1354
- "type": "string",
1355
- "required": false,
1356
- "description": "Extra class on the picker (the photo and its actions).",
1357
- "default": ""
1358
- },
1359
- {
1360
- "name": "disabled",
1361
- "type": "boolean",
1362
- "required": false,
1363
- "description": "Blocks every action.",
1364
- "default": false
1365
- },
1366
- {
1367
- "name": "error",
1368
- "type": "string",
1369
- "required": false,
1370
- "description": "An error message shown below the picker. It wins over a rejection reason."
1371
- },
1372
- {
1373
- "name": "fieldClassName",
1374
- "type": "string",
1375
- "required": false,
1376
- "description": "Extra class on the field wrapper.",
1377
- "default": ""
1378
- },
1379
- {
1380
- "name": "hint",
1381
- "type": "string",
1382
- "required": false,
1383
- "description": "Help text shown below the picker. An error replaces it."
1384
- },
1385
- {
1386
- "name": "initials",
1387
- "type": "string",
1388
- "required": false,
1389
- "description": "Shown when there is no photo. A person icon shows when it is empty."
1390
- },
1391
- {
1392
- "name": "label",
1393
- "type": "string",
1394
- "required": false,
1395
- "description": "The text shown above the picker."
1396
- },
1397
- {
1398
- "name": "loading",
1399
- "type": "boolean",
1400
- "required": false,
1401
- "description": "Shows a spinner on the photo and blocks every action while a photo uploads.",
1402
- "default": false
1403
- },
1404
- {
1405
- "name": "maxSizeMb",
1406
- "type": "number",
1407
- "required": false,
1408
- "description": "The size limit of the chosen photo in megabytes. 0 means no limit.",
1409
- "default": 10
1410
- },
1411
- {
1412
- "name": "name",
1413
- "type": "string",
1414
- "required": false,
1415
- "description": "The form field name. The cropped photo is written into the file input, so an uncontrolled form posts it."
1416
- },
1417
- {
1418
- "name": "outputSize",
1419
- "type": "number",
1420
- "required": false,
1421
- "description": "The width and height of the saved square, in pixels.",
1422
- "default": 512
1423
- },
1424
- {
1425
- "name": "removeName",
1426
- "type": "string",
1427
- "required": false,
1428
- "description": "A form field that posts true once Remove is pressed. It also shows Remove while there is a photo."
1429
- },
1430
- {
1431
- "name": "required",
1432
- "type": "boolean",
1433
- "required": false,
1434
- "description": "Marks the field as required.",
1435
- "default": false
1436
- },
1437
- {
1438
- "name": "size",
1439
- "type": "enumOrNumber",
1440
- "enum": [
1441
- "lg",
1442
- "md",
1443
- "sm"
1444
- ],
1445
- "required": false,
1446
- "description": "The photo diameter: sm, md or lg, or a number of pixels.",
1447
- "default": "md"
1448
- },
1449
- {
1450
- "name": "value",
1451
- "type": "string",
1452
- "required": false,
1453
- "nullable": true,
1454
- "description": "The current photo URL, or null when there is none."
1455
- }
1456
- ],
1457
- "itemsTakeAction": [],
1458
- "takesAction": [],
1459
- "source": "@webority/ui-react",
1460
- "usage": {
1461
- "when": [
1462
- "A person sets their own profile photo.",
1463
- "An admin sets a staff member's photo on their record."
1464
- ],
1465
- "whenNot": [
1466
- {
1467
- "text": "A company or workspace logo, which is often not square.",
1468
- "instead": "AppLogoPicker"
1469
- },
1470
- {
1471
- "text": "Documents or other files.",
1472
- "instead": "AppFileAttachment"
1473
- }
1474
- ],
1475
- "do": [
1476
- {
1477
- "note": "Say what a good photo is. People crop better when they know.",
1478
- "example": [
1479
- {
1480
- "component": "AppAvatarPicker",
1481
- "props": {
1482
- "initials": "NS",
1483
- "label": "Profile photo",
1484
- "hint": "Your face, looking at the camera."
1485
- }
1486
- }
1487
- ]
1488
- }
1489
- ],
1490
- "dont": [
1491
- {
1492
- "note": "A tiny, disabled picker with no label. Nobody can tell it sets their photo.",
1493
- "example": [
1494
- {
1495
- "component": "AppAvatarPicker",
1496
- "props": {
1497
- "initials": "NS",
1498
- "size": "sm",
1499
- "disabled": true
1500
- }
1501
- }
1502
- ]
1503
- }
1504
- ],
1505
- "a11y": [
1506
- "The photo button is named by ariaLabel, else by the action's words (Choose or Change photo), and is described by the error, else the hint.",
1507
- "The photo button sits out of the tab order and reports busy while loading; the Upload button beside it is the keyboard path to the same action."
1508
- ]
1509
- }
1510
- },
1511
1335
  {
1512
1336
  "name": "AppBadge",
1513
1337
  "marker": "AppBadge",
@@ -2095,7 +1919,8 @@
2095
1919
  "when": [
2096
1920
  "The user performs an action: submit, save, open a dialog, confirm.",
2097
1921
  "You need to mark the single most important action on a screen (one primary).",
2098
- "A destructive action needs to stand out (danger): pair it with a confirm dialog."
1922
+ "A destructive action needs to stand out (danger): pair it with a confirm dialog.",
1923
+ "A form's submit button takes loading from the mutation state; that also blocks a second press."
2099
1924
  ],
2100
1925
  "whenNot": [
2101
1926
  {
@@ -5384,6 +5209,17 @@
5384
5209
  "name": "columns",
5385
5210
  "type": "array",
5386
5211
  "itemFields": [
5212
+ {
5213
+ "name": "align",
5214
+ "type": "enum",
5215
+ "enum": [
5216
+ "center",
5217
+ "start"
5218
+ ],
5219
+ "required": false,
5220
+ "description": "start or center: center suits a column of ticks and short answers.",
5221
+ "default": "start"
5222
+ },
5387
5223
  {
5388
5224
  "name": "highlight",
5389
5225
  "type": "boolean",
@@ -5395,15 +5231,49 @@
5395
5231
  "type": "string",
5396
5232
  "required": true,
5397
5233
  "description": "The column heading; empty for the capability-name column."
5234
+ },
5235
+ {
5236
+ "name": "nowrap",
5237
+ "type": "boolean",
5238
+ "required": false,
5239
+ "description": "Keeps the column's cells on one line."
5398
5240
  }
5399
5241
  ],
5400
5242
  "required": true,
5401
5243
  "description": "The columns, including the leading capability-name column, whose label is normally empty."
5402
5244
  },
5245
+ {
5246
+ "name": "density",
5247
+ "type": "enum",
5248
+ "enum": [
5249
+ "comfortable",
5250
+ "relaxed"
5251
+ ],
5252
+ "required": false,
5253
+ "description": "relaxed sets a 16px body and 32px side padding for marketing tables.",
5254
+ "default": "comfortable"
5255
+ },
5256
+ {
5257
+ "name": "mobile",
5258
+ "type": "enum",
5259
+ "enum": [
5260
+ "scroll",
5261
+ "stack"
5262
+ ],
5263
+ "required": false,
5264
+ "description": "Under 576px of table width: stack (default) turns each row into a card; scroll keeps the columns and scrolls sideways.",
5265
+ "default": "stack"
5266
+ },
5403
5267
  {
5404
5268
  "name": "rows",
5405
5269
  "type": "array",
5406
5270
  "itemFields": [
5271
+ {
5272
+ "name": "group",
5273
+ "type": "string",
5274
+ "required": false,
5275
+ "description": "A heading drawn above the first row of each run of rows that share it."
5276
+ },
5407
5277
  {
5408
5278
  "name": "key",
5409
5279
  "type": "string",
@@ -5420,11 +5290,25 @@
5420
5290
  "name": "values",
5421
5291
  "type": "array",
5422
5292
  "required": true,
5423
- "description": "One cell per column after the first: true shows a tick, false a dash, anything else shows as written."
5293
+ "description": "One cell per column after the first: true shows a tick, false a dash, { state, text } shows a state icon beside its text (yes, no, warn or partial), { code } shows a reference code, anything else shows as written."
5424
5294
  }
5425
5295
  ],
5426
5296
  "required": true,
5427
5297
  "description": "One row per capability."
5298
+ },
5299
+ {
5300
+ "name": "stickyFirstColumn",
5301
+ "type": "boolean",
5302
+ "required": false,
5303
+ "description": "With mobile scroll: the first column stays in place while the rest scrolls.",
5304
+ "default": false
5305
+ },
5306
+ {
5307
+ "name": "stickyHeader",
5308
+ "type": "boolean",
5309
+ "required": false,
5310
+ "description": "The header row stays on screen while a long table scrolls past it.",
5311
+ "default": false
5428
5312
  }
5429
5313
  ],
5430
5314
  "itemsTakeAction": [],
@@ -5447,7 +5331,7 @@
5447
5331
  },
5448
5332
  {
5449
5333
  "text": "It is a list of facts about one thing.",
5450
- "instead": "AppInfoList"
5334
+ "instead": "AppDescriptions"
5451
5335
  }
5452
5336
  ],
5453
5337
  "do": [
@@ -5487,7 +5371,7 @@
5487
5371
  ],
5488
5372
  "dont": [
5489
5373
  {
5490
- "note": "Two highlighted columns highlight neither; internal jargon in the row label; and hand-typed dashes and Y instead of booleans lose the tick's shape cue.",
5374
+ "note": "Two highlighted columns both tint, so no option reads as the recommendation; internal jargon in the row label; and hand-typed dashes and Y instead of booleans lose the tick's shape cue.",
5491
5375
  "example": [
5492
5376
  {
5493
5377
  "component": "AppCompareTable",
@@ -5524,7 +5408,10 @@
5524
5408
  "a11y": [
5525
5409
  "The caption prop is a visually hidden table caption, read by a screen reader before the table.",
5526
5410
  "Column headings are th elements with scope col.",
5527
- "Each row label is a th element with scope row."
5411
+ "Each row label is a th element with scope row.",
5412
+ "Each cell repeats its column name in data-label, so a stacked phone card reads the same as the table.",
5413
+ "A state's icon is hidden from screen readers; its state is spoken as a hidden prefix such as Yes or Warning.",
5414
+ "With mobile scroll, the scrolling region is focusable and named by the caption."
5528
5415
  ]
5529
5416
  }
5530
5417
  },
@@ -5696,7 +5583,7 @@
5696
5583
  },
5697
5584
  {
5698
5585
  "text": "You're confirming across a slide-in panel of options.",
5699
- "instead": "AppSidebarMenu"
5586
+ "instead": "AppDrawer"
5700
5587
  }
5701
5588
  ],
5702
5589
  "do": [
@@ -5867,6 +5754,9 @@
5867
5754
  },
5868
5755
  {
5869
5756
  "text": "You are building the Razor head include that loads the tags and the consent record (the app-analytics-head tag)."
5757
+ },
5758
+ {
5759
+ "text": "You are starting analytics or tags by hand beside the banner. The choice saved through initConsent decides which analytics start: the analytics category turns PostHog capture and Clarity on, and Consent Mode holds Tag Manager's tags until analytics consent, or marketing consent when adStorage is on."
5870
5760
  }
5871
5761
  ],
5872
5762
  "do": [],
@@ -6823,7 +6713,7 @@
6823
6713
  },
6824
6714
  {
6825
6715
  "text": "The empty list deserves a rich call to action.",
6826
- "instead": "AppTableEmptyState (as empty)"
6716
+ "instead": "AppEmptyState variant=\"table\" (as empty)"
6827
6717
  }
6828
6718
  ],
6829
6719
  "do": [
@@ -7302,7 +7192,8 @@
7302
7192
  "enum": [
7303
7193
  1,
7304
7194
  2,
7305
- 3
7195
+ 3,
7196
+ 4
7306
7197
  ],
7307
7198
  "required": false,
7308
7199
  "description": "How many columns the grid should have, before the media-breakpoint collapse.",
@@ -7318,6 +7209,18 @@
7318
7209
  "required": false,
7319
7210
  "description": "Marks the total row: bold, with a rule above."
7320
7211
  },
7212
+ {
7213
+ "name": "href",
7214
+ "type": "url",
7215
+ "required": false,
7216
+ "description": "Makes the value a link. Leave it out for a value that is not actionable."
7217
+ },
7218
+ {
7219
+ "name": "icon",
7220
+ "type": "icon",
7221
+ "required": false,
7222
+ "description": "A glyph in a 36px round tile before the label, by name or as a node."
7223
+ },
7321
7224
  {
7322
7225
  "name": "key",
7323
7226
  "type": "string",
@@ -7332,12 +7235,7 @@
7332
7235
  },
7333
7236
  {
7334
7237
  "name": "span",
7335
- "type": "enum",
7336
- "enum": [
7337
- 1,
7338
- 2,
7339
- 3
7340
- ],
7238
+ "type": "number",
7341
7239
  "required": false,
7342
7240
  "description": "How many grid columns the item spans: 2 or 3 for a longer value."
7343
7241
  },
@@ -7356,10 +7254,11 @@
7356
7254
  "type": "enum",
7357
7255
  "enum": [
7358
7256
  "grid",
7257
+ "list",
7359
7258
  "summary"
7360
7259
  ],
7361
7260
  "required": false,
7362
- "description": "summary puts each label left of its value, with tabular figures.",
7261
+ "description": "summary puts each label left of its value, with tabular figures. list is one column of rows with a rule between them, a flush first and last row and a single-line value.",
7363
7262
  "default": "grid"
7364
7263
  },
7365
7264
  {
@@ -7380,7 +7279,9 @@
7380
7279
  "description": "Optional heading above the grid."
7381
7280
  }
7382
7281
  ],
7383
- "itemsTakeAction": [],
7282
+ "itemsTakeAction": [
7283
+ "items"
7284
+ ],
7384
7285
  "takesAction": [],
7385
7286
  "source": "@webority/ui-react",
7386
7287
  "usage": {
@@ -7402,14 +7303,6 @@
7402
7303
  {
7403
7304
  "text": "You are listing many records.",
7404
7305
  "instead": "AppDataTable"
7405
- },
7406
- {
7407
- "text": "Each row has a leading icon and is actionable.",
7408
- "instead": "AppInfoList"
7409
- },
7410
- {
7411
- "text": "Values are facts without labels.",
7412
- "instead": "AppInfoList"
7413
7306
  }
7414
7307
  ],
7415
7308
  "do": [
@@ -7582,6 +7475,13 @@
7582
7475
  "required": false,
7583
7476
  "description": "The dialog's accessible name when there is no title."
7584
7477
  },
7478
+ {
7479
+ "name": "bodyClassName",
7480
+ "type": "string",
7481
+ "required": false,
7482
+ "description": "Classes on the scrolling body, such as p-0 to drop its padding.",
7483
+ "default": ""
7484
+ },
7585
7485
  {
7586
7486
  "name": "className",
7587
7487
  "type": "string",
@@ -7589,6 +7489,13 @@
7589
7489
  "description": "Extra classes on the drawer element.",
7590
7490
  "default": ""
7591
7491
  },
7492
+ {
7493
+ "name": "closeLabel",
7494
+ "type": "string",
7495
+ "required": false,
7496
+ "description": "The close button's accessible name, for other languages.",
7497
+ "default": "Close"
7498
+ },
7592
7499
  {
7593
7500
  "name": "confirmDiscard",
7594
7501
  "type": "string",
@@ -7622,6 +7529,18 @@
7622
7529
  "required": false,
7623
7530
  "description": "Pinned below the scrolling body."
7624
7531
  },
7532
+ {
7533
+ "name": "header",
7534
+ "type": "node",
7535
+ "required": false,
7536
+ "description": "A custom header that replaces the default one (title, subtitle and close button)."
7537
+ },
7538
+ {
7539
+ "name": "maxWidth",
7540
+ "type": "string",
7541
+ "required": false,
7542
+ "description": "Caps the panel's width, such as 600px. Unset, the theme caps it at 92vw."
7543
+ },
7625
7544
  {
7626
7545
  "name": "open",
7627
7546
  "type": "boolean",
@@ -7629,6 +7548,13 @@
7629
7548
  "description": "Whether the drawer is open. The caller owns it and closes it in onClose.",
7630
7549
  "default": false
7631
7550
  },
7551
+ {
7552
+ "name": "sheet",
7553
+ "type": "boolean",
7554
+ "required": false,
7555
+ "description": "Below md the drawer is a bottom sheet that rests on snapPoints. false keeps the side panel at every width, for a menu or a filter panel.",
7556
+ "default": true
7557
+ },
7632
7558
  {
7633
7559
  "name": "side",
7634
7560
  "type": "enum",
@@ -7670,6 +7596,12 @@
7670
7596
  "description": "The backdrop, Escape and a drag down no longer close it; only the close button or open can.",
7671
7597
  "default": false
7672
7598
  },
7599
+ {
7600
+ "name": "style",
7601
+ "type": "object",
7602
+ "required": false,
7603
+ "description": "Inline style on the drawer element."
7604
+ },
7673
7605
  {
7674
7606
  "name": "subtitle",
7675
7607
  "type": "string",
@@ -7681,14 +7613,27 @@
7681
7613
  "type": "string",
7682
7614
  "required": false,
7683
7615
  "description": "The heading, and the dialog's accessible name."
7684
- }
7685
- ],
7616
+ },
7617
+ {
7618
+ "name": "titleIcon",
7619
+ "type": "icon",
7620
+ "required": false,
7621
+ "description": "Library icon beside the title."
7622
+ },
7623
+ {
7624
+ "name": "width",
7625
+ "type": "string",
7626
+ "required": false,
7627
+ "description": "The panel's CSS width, such as 420px. Overrides size."
7628
+ }
7629
+ ],
7686
7630
  "itemsTakeAction": [],
7687
7631
  "takesAction": [],
7688
7632
  "source": "@webority/ui-react",
7689
7633
  "usage": {
7690
7634
  "when": [
7691
7635
  "A filter, detail or edit panel that must not squeeze the page on a phone.",
7636
+ "A menu or filter panel that stays a side panel on a phone (sheet false).",
7692
7637
  "Secondary content the user opens, reads or edits, then dismisses."
7693
7638
  ],
7694
7639
  "whenNot": [
@@ -8299,6 +8244,17 @@
8299
8244
  "type": "node",
8300
8245
  "required": true,
8301
8246
  "description": "The headline of the empty state."
8247
+ },
8248
+ {
8249
+ "name": "variant",
8250
+ "type": "enum",
8251
+ "enum": [
8252
+ "card",
8253
+ "table"
8254
+ ],
8255
+ "required": false,
8256
+ "description": "The look: card is the card or section empty state; table is the body of a data table, with a larger disc above the title. The table look has no sm scale, so size sm with table warns.",
8257
+ "default": "card"
8302
8258
  }
8303
8259
  ],
8304
8260
  "itemsTakeAction": [],
@@ -8308,17 +8264,14 @@
8308
8264
  "when": [
8309
8265
  "A card or section has loaded but there is genuinely nothing to show.",
8310
8266
  "A first-run experience where the user hasn't created anything yet.",
8311
- "A filtered or searched view returned no matches and you want to explain why."
8267
+ "A filtered or searched view returned no matches and you want to explain why.",
8268
+ "A data table has loaded with no rows: use variant=\"table\" for the table body."
8312
8269
  ],
8313
8270
  "whenNot": [
8314
8271
  {
8315
8272
  "text": "The data is still loading (first fetch).",
8316
8273
  "instead": "AppSkeleton"
8317
8274
  },
8318
- {
8319
- "text": "The empty result lives inside a data table body.",
8320
- "instead": "AppTableEmptyState"
8321
- },
8322
8275
  {
8323
8276
  "text": "Something went wrong fetching the data.",
8324
8277
  "instead": "AppAlert"
@@ -8569,7 +8522,7 @@
8569
8522
  },
8570
8523
  {
8571
8524
  "text": "The upload is a round avatar or a company logo.",
8572
- "instead": "AppLogoPicker"
8525
+ "instead": "AppImagePicker"
8573
8526
  },
8574
8527
  {
8575
8528
  "text": "It is a plain text or number field, not a file.",
@@ -8768,7 +8721,7 @@
8768
8721
  },
8769
8722
  {
8770
8723
  "text": "The upload is a round avatar or a company logo in a header.",
8771
- "instead": "AppLogoPicker"
8724
+ "instead": "AppImagePicker"
8772
8725
  },
8773
8726
  {
8774
8727
  "text": "It is a plain, non-image file input with no preview.",
@@ -9782,238 +9735,449 @@
9782
9735
  }
9783
9736
  },
9784
9737
  {
9785
- "name": "AppInfoList",
9786
- "marker": "AppInfoList",
9738
+ "name": "AppImagePicker",
9739
+ "marker": "AppImagePicker",
9787
9740
  "acceptsChildren": false,
9788
9741
  "props": [
9742
+ {
9743
+ "name": "accept",
9744
+ "type": "string",
9745
+ "required": false,
9746
+ "description": "The file types a person may choose. Defaults to PNG, JPG and WebP for logo; JPG, PNG, WebP and HEIC for avatar. HEIC opens only where the browser can decode it."
9747
+ },
9748
+ {
9749
+ "name": "ariaLabel",
9750
+ "type": "string",
9751
+ "required": false,
9752
+ "description": "The accessible name of the upload control. Defaults to Upload photo for the overlay and to the action's words for buttons."
9753
+ },
9754
+ {
9755
+ "name": "camera",
9756
+ "type": "boolean",
9757
+ "required": false,
9758
+ "description": "Shows the Take photo button, which opens the front camera. Default false for logo, true for avatar."
9759
+ },
9789
9760
  {
9790
9761
  "name": "className",
9791
9762
  "type": "string",
9792
9763
  "required": false,
9793
- "description": "Extra classes on the list.",
9764
+ "description": "Extra class on the picker.",
9794
9765
  "default": ""
9795
9766
  },
9796
9767
  {
9797
- "name": "items",
9798
- "type": "array",
9799
- "itemFields": [
9800
- {
9801
- "name": "href",
9802
- "type": "url",
9803
- "required": false,
9804
- "description": "Makes the row a link. Leave it out for a plain row that is not actionable."
9805
- },
9806
- {
9807
- "name": "icon",
9808
- "type": "icon",
9809
- "required": true,
9810
- "description": "The glyph for the round tile, by name or as a node. Match it to the field."
9811
- },
9812
- {
9813
- "name": "key",
9814
- "type": "string",
9815
- "required": false,
9816
- "description": "A stable key for the row when the rows reorder. Defaults to the label and position."
9817
- },
9818
- {
9819
- "name": "label",
9820
- "type": "string",
9821
- "required": true,
9822
- "description": "What the value is. Be specific."
9823
- },
9824
- {
9825
- "name": "value",
9826
- "type": "node",
9827
- "required": true,
9828
- "description": "The fact itself, pre-formatted. An empty value shows a dash placeholder."
9829
- }
9768
+ "name": "controls",
9769
+ "type": "enum",
9770
+ "enum": [
9771
+ "buttons",
9772
+ "overlay"
9830
9773
  ],
9831
- "required": true,
9832
- "description": "The rows, in order. Each row has an icon, a label and a value."
9833
- }
9834
- ],
9835
- "itemsTakeAction": [
9836
- "items"
9837
- ],
9838
- "takesAction": [],
9839
- "source": "@webority/ui-react",
9840
- "usage": {
9841
- "when": [
9842
- "You are stating several facts about one record.",
9843
- "Some of the values are actionable (email, phone, a document link).",
9844
- "The panel is read-only, a details view, a drawer, a summary column."
9845
- ],
9846
- "whenNot": [
9847
- {
9848
- "text": "The values are editable.",
9849
- "instead": "AppInput and friends"
9850
- },
9851
- {
9852
- "text": "It is one headline number.",
9853
- "instead": "AppKpiTile"
9854
- },
9855
- {
9856
- "text": "You are listing many records.",
9857
- "instead": "AppDataTable"
9858
- },
9859
- {
9860
- "text": "The facts are events over time.",
9861
- "instead": "AppTimeline"
9862
- }
9863
- ],
9864
- "do": [
9865
- {
9866
- "note": "An icon that matches the field, a specific label, and an href only where the value is genuinely actionable.",
9867
- "example": [
9868
- {
9869
- "component": "AppInfoList",
9870
- "props": {
9871
- "items": [
9872
- {
9873
- "icon": "mail",
9874
- "label": "Email",
9875
- "value": "ravi@acme.example",
9876
- "href": "mailto:ravi@acme.example"
9877
- }
9878
- ]
9879
- }
9880
- }
9881
- ]
9882
- }
9883
- ],
9884
- "dont": [
9885
- {
9886
- "note": "A generic icon and “Info” as the label carry no meaning, and a placeholder href makes a dead link the reader will click.",
9887
- "example": [
9888
- {
9889
- "component": "AppInfoList",
9890
- "props": {
9891
- "items": [
9892
- {
9893
- "icon": "circle",
9894
- "label": "Info",
9895
- "value": "ravi@acme.example",
9896
- "href": "#"
9897
- }
9898
- ]
9899
- }
9900
- }
9901
- ]
9902
- }
9903
- ],
9904
- "a11y": [
9905
- "A row with an href renders as a link; a row without one renders as a plain row, so a value that cannot be acted on never looks clickable.",
9906
- "The icon tile sits beside the label and value text.",
9907
- "An empty value shows a dash placeholder."
9908
- ]
9909
- }
9910
- },
9911
- {
9912
- "name": "AppInfoTip",
9913
- "marker": "AppInfoTip",
9914
- "acceptsChildren": true,
9915
- "props": [
9774
+ "required": false,
9775
+ "description": "overlay is a ring with a hover label and an x to remove. buttons is the photo beside Upload or Change, Take photo and Remove. Default overlay for logo, buttons for avatar."
9776
+ },
9916
9777
  {
9917
- "name": "className",
9778
+ "name": "crop",
9779
+ "type": "enumOrNumber",
9780
+ "enum": [
9781
+ "free"
9782
+ ],
9783
+ "required": false,
9784
+ "description": "Adds a crop step before upload. A number is the frame's width divided by its height, such as 1 for a round avatar; free lets the person resize the frame. Default none for logo, 1 for avatar."
9785
+ },
9786
+ {
9787
+ "name": "disabled",
9788
+ "type": "boolean",
9789
+ "required": false,
9790
+ "description": "Blocks every action.",
9791
+ "default": false
9792
+ },
9793
+ {
9794
+ "name": "error",
9918
9795
  "type": "string",
9919
9796
  "required": false,
9920
- "description": "Extra classes on the wrapper.",
9797
+ "description": "An error from the caller. It wins over a rejection reason."
9798
+ },
9799
+ {
9800
+ "name": "fallback",
9801
+ "type": "node",
9802
+ "required": false,
9803
+ "description": "Shown when there is no image, for example initials."
9804
+ },
9805
+ {
9806
+ "name": "fieldClassName",
9807
+ "type": "string",
9808
+ "required": false,
9809
+ "description": "Extra class on the field wrapper.",
9921
9810
  "default": ""
9922
9811
  },
9923
9812
  {
9924
- "name": "label",
9813
+ "name": "hint",
9925
9814
  "type": "string",
9926
9815
  "required": false,
9927
- "description": "The popover title and the trigger’s accessible name. Unset, the trigger is named “More information”."
9816
+ "description": "Help text under the picker. An error replaces it."
9928
9817
  },
9929
9818
  {
9930
- "name": "placement",
9819
+ "name": "kind",
9931
9820
  "type": "enum",
9932
9821
  "enum": [
9933
- "auto",
9934
- "bottom",
9935
- "end",
9936
- "start",
9937
- "top"
9822
+ "avatar",
9823
+ "logo"
9938
9824
  ],
9939
9825
  "required": false,
9940
- "description": "Where the popover opens. Auto flips it to stay in view.",
9941
- "default": "auto"
9826
+ "description": "The preset: logo is an identity ring, avatar is a person's profile photo. Each prop below overrides the preset.",
9827
+ "default": "logo"
9942
9828
  },
9943
9829
  {
9944
- "name": "width",
9830
+ "name": "label",
9831
+ "type": "node",
9832
+ "required": false,
9833
+ "description": "An optional field label above the picker."
9834
+ },
9835
+ {
9836
+ "name": "layout",
9945
9837
  "type": "enum",
9946
9838
  "enum": [
9947
- "lg",
9948
- "md",
9949
- "sm",
9950
- "xl"
9839
+ "inline",
9840
+ "profile",
9841
+ "stacked"
9951
9842
  ],
9952
9843
  "required": false,
9953
- "description": "The widest the card grows before its text wraps, at 220, 276, 360 or 480px. It is a maximum, so a short tip stays as narrow as its text.",
9954
- "default": "md"
9955
- }
9956
- ],
9957
- "itemsTakeAction": [],
9958
- "takesAction": [],
9959
- "source": "@webority/ui-react",
9960
- "usage": {
9961
- "when": [
9962
- "A field label uses a term the user may not know and you want an on-demand explanation.",
9963
- "The help is secondary, useful but not something every user needs to read.",
9964
- "You want accessible hover/focus behaviour without wiring a tooltip yourself."
9965
- ],
9966
- "whenNot": [
9967
- {
9968
- "text": "The message must be seen by everyone, persistently, in context.",
9969
- "instead": "AppAlert"
9970
- },
9971
- {
9972
- "text": "It is a permanent hint under a field the user should always read.",
9973
- "instead": "the hint prop on AppInput"
9974
- },
9975
- {
9976
- "text": "You would otherwise expose the text via a native title=\"\".",
9977
- "instead": "AppInfoTip"
9978
- },
9979
- {
9980
- "text": "It is a brief, transient confirmation after an action.",
9981
- "instead": "toast"
9982
- }
9983
- ],
9984
- "do": [
9985
- {
9986
- "note": "Give the tip a descriptive label (a real question) so it’s clear what the “?” explains, and keep the body to a sentence.",
9987
- "example": [
9988
- {
9989
- "component": "span",
9990
- "props": {
9991
- "className": "label d-inline-flex align-items-center gap-1"
9992
- },
9993
- "children": [
9994
- "Risk tolerance",
9995
- {
9996
- "component": "AppInfoTip",
9997
- "props": {
9998
- "label": "What is risk tolerance?"
9999
- },
10000
- "children": "The maximum acceptable annual loss probability under IEC 62305."
10001
- }
10002
- ]
10003
- }
10004
- ]
10005
- },
10006
- {
10007
- "note": "Attach the tip to the exact term it explains, inline with the label, so the “?” sits where the question arises.",
10008
- "example": [
10009
- {
10010
- "component": "span",
10011
- "props": {
10012
- "className": "label d-inline-flex align-items-center gap-1"
10013
- },
10014
- "children": [
10015
- "Collection area",
10016
- {
9844
+ "description": "Stacked is the ring with the hint below. Inline puts the ring on the left with a title, subtitle and hint column beside it. Profile stacks the same identity block, centred, beneath the ring. Applies to the overlay controls.",
9845
+ "default": "stacked"
9846
+ },
9847
+ {
9848
+ "name": "loading",
9849
+ "type": "boolean",
9850
+ "required": false,
9851
+ "description": "Shows a spinner and blocks every action while the picked file uploads.",
9852
+ "default": false
9853
+ },
9854
+ {
9855
+ "name": "maxSizeMb",
9856
+ "type": "number",
9857
+ "required": false,
9858
+ "description": "The size limit in megabytes; 0 means no limit. Defaults to 5 for logo and 10 for avatar."
9859
+ },
9860
+ {
9861
+ "name": "name",
9862
+ "type": "string",
9863
+ "required": false,
9864
+ "description": "The form field name. The chosen file, or the crop when cropping, is written into the file input, so an uncontrolled form posts it."
9865
+ },
9866
+ {
9867
+ "name": "outputSize",
9868
+ "type": "number",
9869
+ "required": false,
9870
+ "description": "The width and height of the saved square, in pixels, with a crop of 1. Default none for logo, 512 for avatar."
9871
+ },
9872
+ {
9873
+ "name": "outputType",
9874
+ "type": "enum",
9875
+ "enum": [
9876
+ "image/webp",
9877
+ "keep"
9878
+ ],
9879
+ "required": false,
9880
+ "description": "The type of the saved crop: keep the chosen type, or WebP. Default keep for logo, WebP for avatar."
9881
+ },
9882
+ {
9883
+ "name": "overlayIcon",
9884
+ "type": "icon",
9885
+ "required": false,
9886
+ "description": "The icon name for the hover overlay. Overlay controls only.",
9887
+ "default": "image"
9888
+ },
9889
+ {
9890
+ "name": "overlayLabel",
9891
+ "type": "string",
9892
+ "required": false,
9893
+ "description": "The text of the hover overlay. Overlay controls only.",
9894
+ "default": "Update photo"
9895
+ },
9896
+ {
9897
+ "name": "previews",
9898
+ "type": "boolean",
9899
+ "required": false,
9900
+ "description": "Shows the 96 and 48 px live previews in the crop dialog. Default false for logo, true for avatar."
9901
+ },
9902
+ {
9903
+ "name": "removeLabel",
9904
+ "type": "string",
9905
+ "required": false,
9906
+ "description": "The accessible name and tooltip of the remove control. Use Remove logo on a logo picker.",
9907
+ "default": "Remove photo"
9908
+ },
9909
+ {
9910
+ "name": "removeName",
9911
+ "type": "string",
9912
+ "required": false,
9913
+ "description": "A form field that posts true once Remove is pressed."
9914
+ },
9915
+ {
9916
+ "name": "required",
9917
+ "type": "boolean",
9918
+ "required": false,
9919
+ "description": "Marks the field as required.",
9920
+ "default": false
9921
+ },
9922
+ {
9923
+ "name": "rotatable",
9924
+ "type": "boolean",
9925
+ "required": false,
9926
+ "description": "Offers rotation in the crop dialog. Default false for logo, true for avatar."
9927
+ },
9928
+ {
9929
+ "name": "shape",
9930
+ "type": "enum",
9931
+ "enum": [
9932
+ "circle",
9933
+ "rounded",
9934
+ "square"
9935
+ ],
9936
+ "required": false,
9937
+ "description": "The ring or frame shape.",
9938
+ "default": "circle"
9939
+ },
9940
+ {
9941
+ "name": "size",
9942
+ "type": "enumOrNumber",
9943
+ "enum": [
9944
+ "lg",
9945
+ "md",
9946
+ "sm"
9947
+ ],
9948
+ "required": false,
9949
+ "description": "A preset diameter (logo 72, 120, 160 px; avatar 64, 96, 128 px) or an exact number of pixels.",
9950
+ "default": "md"
9951
+ },
9952
+ {
9953
+ "name": "style",
9954
+ "type": "object",
9955
+ "required": false,
9956
+ "description": "Inline style on the picker."
9957
+ },
9958
+ {
9959
+ "name": "subtitle",
9960
+ "type": "node",
9961
+ "required": false,
9962
+ "description": "Muted secondary text beside the ring. Inline and profile layouts only."
9963
+ },
9964
+ {
9965
+ "name": "title",
9966
+ "type": "node",
9967
+ "required": false,
9968
+ "description": "Bold primary text beside the ring. Inline and profile layouts only."
9969
+ },
9970
+ {
9971
+ "name": "value",
9972
+ "type": "string",
9973
+ "required": false,
9974
+ "description": "The current image URL. Absent or empty means no image."
9975
+ },
9976
+ {
9977
+ "name": "variant",
9978
+ "type": "enum",
9979
+ "enum": [
9980
+ "avatar",
9981
+ "initials"
9982
+ ],
9983
+ "required": false,
9984
+ "description": "With no fallback, avatar draws a person icon. The avatar kind uses avatar.",
9985
+ "default": "initials"
9986
+ }
9987
+ ],
9988
+ "itemsTakeAction": [],
9989
+ "takesAction": [],
9990
+ "source": "@webority/ui-react",
9991
+ "usage": {
9992
+ "when": [
9993
+ "An identity image is being set, such as a workspace logo, a company avatar or a profile picture.",
9994
+ "A person sets their own profile photo, or an admin sets a staff member's photo on their record.",
9995
+ "You want a hover-to-change overlay plus a loading state while the file uploads."
9996
+ ],
9997
+ "whenNot": [
9998
+ {
9999
+ "text": "A single, rectangular image where the preview should be large.",
10000
+ "instead": "AppFilePicker"
10001
+ },
10002
+ {
10003
+ "text": "A file attached to a record where the name or size matters.",
10004
+ "instead": "AppFileAttachment"
10005
+ },
10006
+ {
10007
+ "text": "You only need to display an avatar, not upload one.",
10008
+ "instead": "AppAvatar"
10009
+ }
10010
+ ],
10011
+ "do": [
10012
+ {
10013
+ "note": "Set an overlay label that names the thing, such as \"Change logo\", so the hover affordance says exactly what happens.",
10014
+ "example": [
10015
+ {
10016
+ "component": "AppImagePicker",
10017
+ "props": {
10018
+ "fallback": "AC",
10019
+ "overlayLabel": "Change logo"
10020
+ }
10021
+ }
10022
+ ]
10023
+ },
10024
+ {
10025
+ "note": "Say what a good photo is. People crop better when they know.",
10026
+ "example": [
10027
+ {
10028
+ "component": "AppImagePicker",
10029
+ "props": {
10030
+ "kind": "avatar",
10031
+ "fallback": "NS",
10032
+ "label": "Profile photo",
10033
+ "hint": "Your face, looking at the camera."
10034
+ }
10035
+ }
10036
+ ]
10037
+ }
10038
+ ],
10039
+ "dont": [
10040
+ {
10041
+ "note": "A generic \"Click\" overlay tells the user how to interact but not what the action does.",
10042
+ "example": [
10043
+ {
10044
+ "component": "AppImagePicker",
10045
+ "props": {
10046
+ "fallback": "AC",
10047
+ "overlayLabel": "Click"
10048
+ }
10049
+ }
10050
+ ]
10051
+ },
10052
+ {
10053
+ "note": "A tiny, disabled avatar picker with no label. Nobody can tell it sets their photo.",
10054
+ "example": [
10055
+ {
10056
+ "component": "AppImagePicker",
10057
+ "props": {
10058
+ "kind": "avatar",
10059
+ "fallback": "NS",
10060
+ "size": "sm",
10061
+ "disabled": true
10062
+ }
10063
+ }
10064
+ ]
10065
+ }
10066
+ ],
10067
+ "a11y": [
10068
+ "The upload control is named by ariaLabel, else by Upload photo for the overlay and by the action's words (Choose or Change photo) for buttons. It is disabled and marked busy while loading.",
10069
+ "The remove control is its own button named by removeLabel, and it stays hidden until there is an image to remove.",
10070
+ "The hint or the error is tied to the upload control with aria-describedby, and an error wins over the hint.",
10071
+ "The buttons look sits out of the tab order and the Upload button beside it is the keyboard path to the same action."
10072
+ ]
10073
+ }
10074
+ },
10075
+ {
10076
+ "name": "AppInfoTip",
10077
+ "marker": "AppInfoTip",
10078
+ "acceptsChildren": true,
10079
+ "props": [
10080
+ {
10081
+ "name": "className",
10082
+ "type": "string",
10083
+ "required": false,
10084
+ "description": "Extra classes on the wrapper.",
10085
+ "default": ""
10086
+ },
10087
+ {
10088
+ "name": "label",
10089
+ "type": "string",
10090
+ "required": false,
10091
+ "description": "The popover title and the trigger’s accessible name. Unset, the trigger is named “More information”."
10092
+ },
10093
+ {
10094
+ "name": "placement",
10095
+ "type": "enum",
10096
+ "enum": [
10097
+ "auto",
10098
+ "bottom",
10099
+ "end",
10100
+ "start",
10101
+ "top"
10102
+ ],
10103
+ "required": false,
10104
+ "description": "Where the popover opens. Auto flips it to stay in view.",
10105
+ "default": "auto"
10106
+ },
10107
+ {
10108
+ "name": "width",
10109
+ "type": "enum",
10110
+ "enum": [
10111
+ "lg",
10112
+ "md",
10113
+ "sm",
10114
+ "xl"
10115
+ ],
10116
+ "required": false,
10117
+ "description": "The widest the card grows before its text wraps, at 220, 276, 360 or 480px. It is a maximum, so a short tip stays as narrow as its text.",
10118
+ "default": "md"
10119
+ }
10120
+ ],
10121
+ "itemsTakeAction": [],
10122
+ "takesAction": [],
10123
+ "source": "@webority/ui-react",
10124
+ "usage": {
10125
+ "when": [
10126
+ "A field label uses a term the user may not know and you want an on-demand explanation.",
10127
+ "The help is secondary, useful but not something every user needs to read.",
10128
+ "You want accessible hover/focus behaviour without wiring a tooltip yourself."
10129
+ ],
10130
+ "whenNot": [
10131
+ {
10132
+ "text": "The message must be seen by everyone, persistently, in context.",
10133
+ "instead": "AppAlert"
10134
+ },
10135
+ {
10136
+ "text": "It is a permanent hint under a field the user should always read.",
10137
+ "instead": "the hint prop on AppInput"
10138
+ },
10139
+ {
10140
+ "text": "You would otherwise expose the text via a native title=\"\".",
10141
+ "instead": "AppInfoTip"
10142
+ },
10143
+ {
10144
+ "text": "It is a brief, transient confirmation after an action.",
10145
+ "instead": "toast"
10146
+ }
10147
+ ],
10148
+ "do": [
10149
+ {
10150
+ "note": "Give the tip a descriptive label (a real question) so it’s clear what the “?” explains, and keep the body to a sentence.",
10151
+ "example": [
10152
+ {
10153
+ "component": "span",
10154
+ "props": {
10155
+ "className": "label d-inline-flex align-items-center gap-1"
10156
+ },
10157
+ "children": [
10158
+ "Risk tolerance",
10159
+ {
10160
+ "component": "AppInfoTip",
10161
+ "props": {
10162
+ "label": "What is risk tolerance?"
10163
+ },
10164
+ "children": "The maximum acceptable annual loss probability under IEC 62305."
10165
+ }
10166
+ ]
10167
+ }
10168
+ ]
10169
+ },
10170
+ {
10171
+ "note": "Attach the tip to the exact term it explains, inline with the label, so the “?” sits where the question arises.",
10172
+ "example": [
10173
+ {
10174
+ "component": "span",
10175
+ "props": {
10176
+ "className": "label d-inline-flex align-items-center gap-1"
10177
+ },
10178
+ "children": [
10179
+ "Collection area",
10180
+ {
10017
10181
  "component": "AppInfoTip",
10018
10182
  "props": {
10019
10183
  "label": "How is collection area computed?"
@@ -11184,7 +11348,7 @@
11184
11348
  },
11185
11349
  {
11186
11350
  "text": "It is a label/value pair among several facts.",
11187
- "instead": "AppInfoList"
11351
+ "instead": "AppDescriptions"
11188
11352
  },
11189
11353
  {
11190
11354
  "text": "The number needs a chart to make sense.",
@@ -11374,303 +11538,58 @@
11374
11538
  "default": false
11375
11539
  },
11376
11540
  {
11377
- "name": "external",
11378
- "type": "boolean",
11379
- "required": false,
11380
- "description": "Opens the link in a new tab, with the matching target and rel.",
11381
- "default": false
11382
- },
11383
- {
11384
- "name": "href",
11385
- "type": "url",
11386
- "required": false,
11387
- "description": "The destination, or the `to` path when a link component is given. Left out, the anchor has no href."
11388
- },
11389
- {
11390
- "name": "label",
11391
- "type": "node",
11392
- "required": false,
11393
- "description": "The link text as a prop, an alternative to children. When both are given, children wins."
11394
- },
11395
- {
11396
- "name": "leftIcon",
11397
- "type": "icon",
11398
- "required": false,
11399
- "description": "The leading glyph: an icon name or a node."
11400
- },
11401
- {
11402
- "name": "rightIcon",
11403
- "type": "icon",
11404
- "required": false,
11405
- "description": "The trailing glyph: an icon name or a node."
11406
- },
11407
- {
11408
- "name": "size",
11409
- "type": "enum",
11410
- "enum": [
11411
- "lg",
11412
- "md",
11413
- "sm"
11414
- ],
11415
- "required": false,
11416
- "description": "The text and icon size.",
11417
- "default": "md"
11418
- },
11419
- {
11420
- "name": "surface",
11421
- "type": "enum",
11422
- "enum": [
11423
- "dark",
11424
- "default"
11425
- ],
11426
- "required": false,
11427
- "description": "Set dark when the link sits on a dark panel such as a dark hero or footer; the text turns light.",
11428
- "default": "default"
11429
- }
11430
- ],
11431
- "itemsTakeAction": [],
11432
- "takesAction": [],
11433
- "source": "@webority/ui-react",
11434
- "usage": {
11435
- "when": [
11436
- "An inline prose link inside body copy.",
11437
- "A footer link or a 'read more' / 'learn more' affordance.",
11438
- "A marketing call-to-action link where the hover should feel deliberate."
11439
- ],
11440
- "whenNot": [
11441
- {
11442
- "text": "The control performs an action rather than navigating.",
11443
- "instead": "AppButton"
11444
- },
11445
- {
11446
- "text": "It is a primary navigation item in the app chrome.",
11447
- "instead": "AppShell"
11448
- },
11449
- {
11450
- "text": "It is a rich link card with an icon tile and supporting text.",
11451
- "instead": "AppResourceCard"
11452
- },
11453
- {
11454
- "text": "It is the trail to the current page.",
11455
- "instead": "AppBreadcrumbs"
11456
- }
11457
- ],
11458
- "do": [
11459
- {
11460
- "note": "One clear animation and a descriptive label. The link reads as a link and says where it goes.",
11461
- "example": [
11462
- {
11463
- "component": "AppLink",
11464
- "props": {
11465
- "href": "#best",
11466
- "rightIcon": "arrow-right"
11467
- },
11468
- "children": "See pricing"
11469
- }
11470
- ]
11471
- }
11472
- ],
11473
- "dont": [
11474
- {
11475
- "note": "“Click here” tells the reader nothing. Name the destination so the link explains where it goes.",
11476
- "example": [
11477
- {
11478
- "component": "AppLink",
11479
- "props": {
11480
- "href": "#best",
11481
- "animation": "glow"
11482
- },
11483
- "children": "Click here"
11484
- }
11485
- ]
11486
- }
11487
- ],
11488
- "a11y": [
11489
- "A disabled link renders as a plain span with aria-disabled set and no href, so it is neither focusable nor announced as a link.",
11490
- "An external link opens in a new tab with rel noopener noreferrer.",
11491
- "Every animation is disabled under prefers-reduced-motion: reduce, where the link degrades to a static underline."
11492
- ]
11493
- }
11494
- },
11495
- {
11496
- "name": "AppLogoPicker",
11497
- "marker": "AppLogoPicker",
11498
- "acceptsChildren": false,
11499
- "props": [
11500
- {
11501
- "name": "accept",
11502
- "type": "string",
11503
- "required": false,
11504
- "description": "The file types the picker accepts.",
11505
- "default": "image/png,image/jpeg,image/webp"
11506
- },
11507
- {
11508
- "name": "ariaLabel",
11509
- "type": "string",
11510
- "required": false,
11511
- "description": "The accessible name of the upload button.",
11512
- "default": "Upload photo"
11513
- },
11514
- {
11515
- "name": "className",
11516
- "type": "string",
11517
- "required": false,
11518
- "description": "Extra classes on the field wrapper.",
11519
- "default": ""
11520
- },
11521
- {
11522
- "name": "crop",
11523
- "type": "enumOrNumber",
11524
- "enum": [
11525
- "free"
11526
- ],
11527
- "required": false,
11528
- "description": "Adds a crop step before upload: a dialog lets the person drag and zoom a frame, and the picked file is the cropped one. A number is the frame's width divided by its height, such as 1 for an avatar; free lets them resize the frame."
11529
- },
11530
- {
11531
- "name": "disabled",
11532
- "type": "boolean",
11533
- "required": false,
11534
- "description": "A non-busy, non-interactive state.",
11535
- "default": false
11536
- },
11537
- {
11538
- "name": "error",
11539
- "type": "string",
11540
- "required": false,
11541
- "description": "An inline error from the caller. It wins over an automatic rejection reason."
11542
- },
11543
- {
11544
- "name": "fallback",
11545
- "type": "node",
11546
- "required": false,
11547
- "description": "Shown when there is no image, for example initials."
11548
- },
11549
- {
11550
- "name": "hint",
11551
- "type": "string",
11552
- "required": false,
11553
- "description": "Optional helper text: below the ring when stacked, in the side column when inline or profile."
11554
- },
11555
- {
11556
- "name": "label",
11557
- "type": "string",
11558
- "required": false,
11559
- "description": "An optional field label above the ring."
11560
- },
11561
- {
11562
- "name": "layout",
11563
- "type": "enum",
11564
- "enum": [
11565
- "inline",
11566
- "profile",
11567
- "stacked"
11568
- ],
11569
- "required": false,
11570
- "description": "Stacked is the ring with the hint below. Inline is a profile row with the ring on the left and a title, subtitle and hint column beside it. Profile stacks the same identity block, centred, beneath the ring.",
11571
- "default": "stacked"
11572
- },
11573
- {
11574
- "name": "loading",
11575
- "type": "boolean",
11576
- "required": false,
11577
- "description": "Shows a spinner and blocks interaction while the picked file uploads.",
11578
- "default": false
11579
- },
11580
- {
11581
- "name": "maxSizeMb",
11582
- "type": "number",
11583
- "required": false,
11584
- "description": "The largest accepted file in megabytes. 0 means no size limit.",
11585
- "default": 5
11586
- },
11587
- {
11588
- "name": "name",
11589
- "type": "string",
11590
- "required": false,
11591
- "description": "The form field name, so an uncontrolled form can post the file."
11592
- },
11593
- {
11594
- "name": "overlayIcon",
11595
- "type": "icon",
11541
+ "name": "external",
11542
+ "type": "boolean",
11596
11543
  "required": false,
11597
- "description": "The icon name for the hover overlay.",
11598
- "default": "image"
11544
+ "description": "Opens the link in a new tab, with the matching target and rel.",
11545
+ "default": false
11599
11546
  },
11600
11547
  {
11601
- "name": "overlayLabel",
11602
- "type": "string",
11548
+ "name": "href",
11549
+ "type": "url",
11603
11550
  "required": false,
11604
- "description": "The text of the hover overlay.",
11605
- "default": "Update photo"
11551
+ "description": "The destination, or the `to` path when a link component is given. Left out, the anchor has no href."
11606
11552
  },
11607
11553
  {
11608
- "name": "removeLabel",
11609
- "type": "string",
11554
+ "name": "label",
11555
+ "type": "node",
11610
11556
  "required": false,
11611
- "description": "The accessible name and tooltip of the remove control. Use Remove logo on a logo picker.",
11612
- "default": "Remove photo"
11557
+ "description": "The link text as a prop, an alternative to children. When both are given, children wins."
11613
11558
  },
11614
11559
  {
11615
- "name": "required",
11616
- "type": "boolean",
11560
+ "name": "leftIcon",
11561
+ "type": "icon",
11617
11562
  "required": false,
11618
- "description": "Marks the field as required.",
11619
- "default": false
11563
+ "description": "The leading glyph: an icon name or a node."
11620
11564
  },
11621
11565
  {
11622
- "name": "shape",
11623
- "type": "enum",
11624
- "enum": [
11625
- "circle",
11626
- "rounded",
11627
- "square"
11628
- ],
11566
+ "name": "rightIcon",
11567
+ "type": "icon",
11629
11568
  "required": false,
11630
- "description": "The ring shape.",
11631
- "default": "circle"
11569
+ "description": "The trailing glyph: an icon name or a node."
11632
11570
  },
11633
11571
  {
11634
11572
  "name": "size",
11635
- "type": "enumOrNumber",
11573
+ "type": "enum",
11636
11574
  "enum": [
11637
11575
  "lg",
11638
11576
  "md",
11639
11577
  "sm"
11640
11578
  ],
11641
11579
  "required": false,
11642
- "description": "A preset (sm 72, md 120, lg 160 pixels) or an exact ring diameter in pixels. The whole control scales from it.",
11580
+ "description": "The text and icon size.",
11643
11581
  "default": "md"
11644
11582
  },
11645
11583
  {
11646
- "name": "subtitle",
11647
- "type": "node",
11648
- "required": false,
11649
- "description": "Muted secondary text beside the ring. Inline and profile layouts only."
11650
- },
11651
- {
11652
- "name": "title",
11653
- "type": "node",
11654
- "required": false,
11655
- "description": "Bold primary text beside the ring. Inline and profile layouts only."
11656
- },
11657
- {
11658
- "name": "value",
11659
- "type": "string",
11660
- "required": false,
11661
- "nullable": true,
11662
- "description": "The current image URL. Null and absent both mean no image."
11663
- },
11664
- {
11665
- "name": "variant",
11584
+ "name": "surface",
11666
11585
  "type": "enum",
11667
11586
  "enum": [
11668
- "avatar",
11669
- "initials"
11587
+ "dark",
11588
+ "default"
11670
11589
  ],
11671
11590
  "required": false,
11672
- "description": "The placeholder style: initials text, or a standard avatar with a muted disc and a person icon when there are no initials.",
11673
- "default": "initials"
11591
+ "description": "Set dark when the link sits on a dark panel such as a dark hero or footer; the text turns light.",
11592
+ "default": "default"
11674
11593
  }
11675
11594
  ],
11676
11595
  "itemsTakeAction": [],
@@ -11678,84 +11597,62 @@
11678
11597
  "source": "@webority/ui-react",
11679
11598
  "usage": {
11680
11599
  "when": [
11681
- "An identity image is being set, such as a workspace logo, a company avatar or a profile picture.",
11682
- "The upload lives in a header or settings panel, shown as a round ring.",
11683
- "You want a hover-to-change overlay plus a loading state while the file uploads."
11600
+ "An inline prose link inside body copy.",
11601
+ "A footer link or a 'read more' / 'learn more' affordance.",
11602
+ "A marketing call-to-action link where the hover should feel deliberate."
11684
11603
  ],
11685
11604
  "whenNot": [
11686
11605
  {
11687
- "text": "A single, rectangular image where the preview should be large.",
11688
- "instead": "AppFilePicker"
11606
+ "text": "The control performs an action rather than navigating.",
11607
+ "instead": "AppButton"
11689
11608
  },
11690
11609
  {
11691
- "text": "A file attached to a record where the name or size matters.",
11692
- "instead": "AppFileAttachment"
11610
+ "text": "It is a primary navigation item in the app chrome.",
11611
+ "instead": "AppShell"
11693
11612
  },
11694
11613
  {
11695
- "text": "You only need to display an avatar, not upload one.",
11696
- "instead": "AppAvatar"
11614
+ "text": "It is a rich link card with an icon tile and supporting text.",
11615
+ "instead": "AppResourceCard"
11697
11616
  },
11698
11617
  {
11699
- "text": "You hand-roll a raw <input type=\"file\"> with a circular mask.",
11700
- "instead": "AppLogoPicker"
11618
+ "text": "It is the trail to the current page.",
11619
+ "instead": "AppBreadcrumbs"
11701
11620
  }
11702
11621
  ],
11703
11622
  "do": [
11704
11623
  {
11705
- "note": "Set an overlay label that names the thing, such as \"Change logo\", so the hover affordance says exactly what happens.",
11706
- "example": [
11707
- {
11708
- "component": "AppLogoPicker",
11709
- "props": {
11710
- "fallback": "AC",
11711
- "overlayLabel": "Change logo"
11712
- }
11713
- }
11714
- ]
11715
- },
11716
- {
11717
- "note": "Give the control a clear accessible name so screen readers announce the upload action, not just \"button\".",
11624
+ "note": "One clear animation and a descriptive label. The link reads as a link and says where it goes.",
11718
11625
  "example": [
11719
11626
  {
11720
- "component": "AppLogoPicker",
11627
+ "component": "AppLink",
11721
11628
  "props": {
11722
- "fallback": "WS",
11723
- "ariaLabel": "Upload workspace logo"
11724
- }
11629
+ "href": "#best",
11630
+ "rightIcon": "arrow-right"
11631
+ },
11632
+ "children": "See pricing"
11725
11633
  }
11726
11634
  ]
11727
11635
  }
11728
11636
  ],
11729
11637
  "dont": [
11730
11638
  {
11731
- "note": "A generic \"Click\" overlay tells the user how to interact but not what the action does.",
11732
- "example": [
11733
- {
11734
- "component": "AppLogoPicker",
11735
- "props": {
11736
- "fallback": "AC",
11737
- "overlayLabel": "Click"
11738
- }
11739
- }
11740
- ]
11741
- },
11742
- {
11743
- "note": "A vague accessible name gives assistive tech nothing specific to announce for the control.",
11639
+ "note": "“Click here” tells the reader nothing. Name the destination so the link explains where it goes.",
11744
11640
  "example": [
11745
11641
  {
11746
- "component": "AppLogoPicker",
11642
+ "component": "AppLink",
11747
11643
  "props": {
11748
- "fallback": "WS",
11749
- "ariaLabel": "Upload photo"
11750
- }
11644
+ "href": "#best",
11645
+ "animation": "glow"
11646
+ },
11647
+ "children": "Click here"
11751
11648
  }
11752
11649
  ]
11753
11650
  }
11754
11651
  ],
11755
11652
  "a11y": [
11756
- "The upload control is one button named by ariaLabel. It is disabled and marked busy while loading, and the spinner in the overlay is hidden from assistive technology.",
11757
- "The remove control is its own button named by removeLabel, and it stays hidden until there is an image to remove.",
11758
- "The hint or the error is tied to the upload button with aria-describedby, and an error wins over the hint. The picture has empty alt text because the button already carries the name."
11653
+ "A disabled link renders as a plain span with aria-disabled set and no href, so it is neither focusable nor announced as a link.",
11654
+ "An external link opens in a new tab with rel noopener noreferrer.",
11655
+ "Every animation is disabled under prefers-reduced-motion: reduce, where the link degrades to a static underline."
11759
11656
  ]
11760
11657
  }
11761
11658
  },
@@ -11932,157 +11829,22 @@
11932
11829
  {
11933
11830
  "name": "required",
11934
11831
  "type": "boolean",
11935
- "required": false,
11936
- "description": "Marks the field as required.",
11937
- "default": false
11938
- },
11939
- {
11940
- "name": "rows",
11941
- "type": "number",
11942
- "required": false,
11943
- "description": "The number of visible lines.",
11944
- "default": 3
11945
- },
11946
- {
11947
- "name": "value",
11948
- "type": "string",
11949
- "required": false,
11950
- "description": "The stored value, plain text with each mention written as @[Asha Rao](u-12)."
11951
- }
11952
- ],
11953
- "itemsTakeAction": [],
11954
- "takesAction": [],
11955
- "source": "@webority/ui-react",
11956
- "usage": {
11957
- "when": [
11958
- "A comment, note or message that should reach named people.",
11959
- "Any text a server reads to notify someone."
11960
- ],
11961
- "whenNot": [
11962
- {
11963
- "text": "Choosing people as a field value.",
11964
- "instead": "AppMultiSelect"
11965
- },
11966
- {
11967
- "text": "Formatted text with headings and lists.",
11968
- "instead": "AppRichText"
11969
- }
11970
- ],
11971
- "do": [],
11972
- "dont": [],
11973
- "a11y": [
11974
- "The label points at the text box, whose id is the element id plus -text, so the label names it.",
11975
- "The hint or the error is tied to the box with aria-describedby, and an error also marks the box aria-invalid.",
11976
- "In the list, Up and Down choose, Enter or Tab mention and Escape closes it. Backspace just after a mention removes it whole."
11977
- ]
11978
- }
11979
- },
11980
- {
11981
- "name": "AppMenubar",
11982
- "marker": "AppMenubar",
11983
- "acceptsChildren": false,
11984
- "props": [
11985
- {
11986
- "name": "ariaLabel",
11987
- "type": "string",
11988
- "required": false,
11989
- "description": "The accessible name of the bar.",
11990
- "default": "Application menu"
11991
- },
11992
- {
11993
- "name": "className",
11994
- "type": "string",
11995
- "required": false,
11996
- "description": "Extra classes on the bar.",
11997
- "default": ""
11998
- },
11999
- {
12000
- "name": "menus",
12001
- "type": "array",
12002
- "itemFields": [
12003
- {
12004
- "name": "disabled",
12005
- "type": "boolean",
12006
- "required": false,
12007
- "description": "Lists the menu but it cannot be opened."
12008
- },
12009
- {
12010
- "name": "items",
12011
- "type": "array",
12012
- "itemFields": [
12013
- {
12014
- "name": "danger",
12015
- "type": "boolean",
12016
- "required": false,
12017
- "description": "Styles the row as a destructive action."
12018
- },
12019
- {
12020
- "name": "disabled",
12021
- "type": "boolean",
12022
- "required": false,
12023
- "description": "Lists the row but the arrow keys skip it and it cannot be chosen."
12024
- },
12025
- {
12026
- "name": "divider",
12027
- "type": "boolean",
12028
- "required": false,
12029
- "description": "Makes the row a separator."
12030
- },
12031
- {
12032
- "name": "icon",
12033
- "type": "icon",
12034
- "required": false,
12035
- "description": "A glyph name, or a node, drawn before the label."
12036
- },
12037
- {
12038
- "name": "items",
12039
- "type": "array",
12040
- "required": false,
12041
- "description": "A submenu. When set, the row opens it and ignores its action and link."
12042
- },
12043
- {
12044
- "name": "key",
12045
- "type": "string",
12046
- "required": true,
12047
- "description": "The item's key; not shown."
12048
- },
12049
- {
12050
- "name": "label",
12051
- "type": "string",
12052
- "required": false,
12053
- "description": "The row text. A divider row needs none."
12054
- },
12055
- {
12056
- "name": "shortcut",
12057
- "type": "string",
12058
- "required": false,
12059
- "description": "The key hint drawn as a key chip at the end of the row. The page binds the key itself."
12060
- },
12061
- {
12062
- "name": "to",
12063
- "type": "string",
12064
- "required": false,
12065
- "description": "A router path. The row becomes a link; it goes through the link component when one is given."
12066
- }
12067
- ],
12068
- "required": true,
12069
- "description": "The rows of the menu, top to bottom."
12070
- },
12071
- {
12072
- "name": "key",
12073
- "type": "string",
12074
- "required": true,
12075
- "description": "The item's key; not shown."
12076
- },
12077
- {
12078
- "name": "label",
12079
- "type": "string",
12080
- "required": true,
12081
- "description": "The menu name shown on the bar."
12082
- }
12083
- ],
12084
- "required": true,
12085
- "description": "The menus, left to right. A row is an action or a link; a row with items opens a submenu; a divider row is a separator."
11832
+ "required": false,
11833
+ "description": "Marks the field as required.",
11834
+ "default": false
11835
+ },
11836
+ {
11837
+ "name": "rows",
11838
+ "type": "number",
11839
+ "required": false,
11840
+ "description": "The number of visible lines.",
11841
+ "default": 3
11842
+ },
11843
+ {
11844
+ "name": "value",
11845
+ "type": "string",
11846
+ "required": false,
11847
+ "description": "The stored value, plain text with each mention written as @[Asha Rao](u-12)."
12086
11848
  }
12087
11849
  ],
12088
11850
  "itemsTakeAction": [],
@@ -12090,29 +11852,25 @@
12090
11852
  "source": "@webority/ui-react",
12091
11853
  "usage": {
12092
11854
  "when": [
12093
- "A tool or editor has many commands grouped by task, as in a desktop application.",
12094
- "Users expect keyboard movement across the groups and shortcut hints beside the commands."
11855
+ "A comment, note or message that should reach named people.",
11856
+ "Any text a server reads to notify someone."
12095
11857
  ],
12096
11858
  "whenNot": [
12097
11859
  {
12098
- "text": "A site's top navigation with links and rich dropdown panels.",
12099
- "instead": "AppNavigationMenu"
12100
- },
12101
- {
12102
- "text": "One button or icon opens a short list of actions.",
12103
- "instead": "AppDropdown"
11860
+ "text": "Choosing people as a field value.",
11861
+ "instead": "AppMultiSelect"
12104
11862
  },
12105
11863
  {
12106
- "text": "The actions belong to a row or card the user right-clicks.",
12107
- "instead": "AppContextMenu"
11864
+ "text": "Formatted text with headings and lists.",
11865
+ "instead": "AppRichText"
12108
11866
  }
12109
11867
  ],
12110
11868
  "do": [],
12111
11869
  "dont": [],
12112
11870
  "a11y": [
12113
- "The bar has role menubar, named by ariaLabel. Each menu trigger is a menu item that reports aria-haspopup and aria-expanded, and its panel is a menu named by the menu label.",
12114
- "The bar is one tab stop. Left and Right move across the menus, Down and Up open one, Right opens a submenu, Escape closes a level and Tab leaves.",
12115
- "A disabled menu or row is announced as disabled and skipped by the arrow keys. A shortcut is announced as the key it names, but the page must bind it."
11871
+ "The label points at the text box, whose id is the element id plus -text, so the label names it.",
11872
+ "The hint or the error is tied to the box with aria-describedby, and an error also marks the box aria-invalid.",
11873
+ "In the list, Up and Down choose, Enter or Tab mention and Escape closes it. Backspace just after a mention removes it whole."
12116
11874
  ]
12117
11875
  }
12118
11876
  },
@@ -12528,7 +12286,7 @@
12528
12286
  },
12529
12287
  {
12530
12288
  "text": "It's a slide-in navigation or filter panel on mobile.",
12531
- "instead": "AppSidebarMenu"
12289
+ "instead": "AppDrawer"
12532
12290
  },
12533
12291
  {
12534
12292
  "text": "The content is a full workflow with many steps and forms.",
@@ -13132,7 +12890,7 @@
13132
12890
  },
13133
12891
  {
13134
12892
  "text": "A signed-in app's sidebar of destinations.",
13135
- "instead": "AppSidebarMenu"
12893
+ "instead": "AppShell"
13136
12894
  },
13137
12895
  {
13138
12896
  "text": "A choice between several values in a form.",
@@ -13248,13 +13006,9 @@
13248
13006
  "Some entries are plain links beside the ones with panels."
13249
13007
  ],
13250
13008
  "whenNot": [
13251
- {
13252
- "text": "An application menubar of commands (File, Edit).",
13253
- "instead": "AppMenubar"
13254
- },
13255
13009
  {
13256
13010
  "text": "A signed-in app's sidebar of destinations.",
13257
- "instead": "AppSidebarMenu"
13011
+ "instead": "AppShell"
13258
13012
  },
13259
13013
  {
13260
13014
  "text": "One button opens a short list of actions.",
@@ -13293,6 +13047,12 @@
13293
13047
  "name": "items",
13294
13048
  "type": "array",
13295
13049
  "itemFields": [
13050
+ {
13051
+ "name": "archived",
13052
+ "type": "boolean",
13053
+ "required": false,
13054
+ "description": "Filed away: shown only under the Archived tab."
13055
+ },
13296
13056
  {
13297
13057
  "name": "at",
13298
13058
  "type": "string",
@@ -13352,6 +13112,12 @@
13352
13112
  "required": false,
13353
13113
  "description": "The clock for Today and Yesterday, as ISO text or epoch milliseconds. The current time when omitted."
13354
13114
  },
13115
+ {
13116
+ "name": "tabs",
13117
+ "type": "any",
13118
+ "required": false,
13119
+ "description": "true for the tabs All, Unread and Archived, or the tabs to show in order as `{ key, label? }`, where key is all, unread or archived and label defaults to the key's name. All and Unread leave out archived items; Archived shows only them. Absent: no tab strip."
13120
+ },
13355
13121
  {
13356
13122
  "name": "unread",
13357
13123
  "type": "number",
@@ -13373,7 +13139,8 @@
13373
13139
  "usage": {
13374
13140
  "when": [
13375
13141
  "A portal's list of things that happened to the person: approvals, comments, runs finished.",
13376
- "Anything that links to a record."
13142
+ "Anything that links to a record.",
13143
+ "A row needs its own controls, such as Accept and Decline buttons: pass renderItem(item), which returns the row's content in place of the icon, title, text and time. The dot, the Unread prefix and the read handling stay."
13377
13144
  ],
13378
13145
  "whenNot": [
13379
13146
  {
@@ -14184,88 +13951,6 @@
14184
13951
  ]
14185
13952
  }
14186
13953
  },
14187
- {
14188
- "name": "AppPagination",
14189
- "marker": "AppPagination",
14190
- "acceptsChildren": false,
14191
- "props": [
14192
- {
14193
- "name": "ariaLabel",
14194
- "type": "string",
14195
- "required": false,
14196
- "description": "Accessible label for the nav element.",
14197
- "default": "Pagination"
14198
- },
14199
- {
14200
- "name": "className",
14201
- "type": "string",
14202
- "required": false,
14203
- "description": "Extra CSS class to add to the nav wrapper."
14204
- },
14205
- {
14206
- "name": "page",
14207
- "type": "number",
14208
- "required": true,
14209
- "description": "Current page, 1-based. The page button for this page carries aria-current set to page."
14210
- },
14211
- {
14212
- "name": "siblings",
14213
- "type": "number",
14214
- "required": false,
14215
- "description": "Window radius: how many page buttons sit either side of the current page before an ellipsis appears. The default of 1 shows the current page plus or minus one.",
14216
- "default": 1
14217
- },
14218
- {
14219
- "name": "size",
14220
- "type": "enum",
14221
- "enum": [
14222
- "md",
14223
- "sm"
14224
- ],
14225
- "required": false,
14226
- "description": "Control size: compact ('sm') or standard ('md').",
14227
- "default": "md"
14228
- },
14229
- {
14230
- "name": "totalPages",
14231
- "type": "number",
14232
- "required": true,
14233
- "description": "Total page count. The component renders nothing when it is 1 or less."
14234
- }
14235
- ],
14236
- "itemsTakeAction": [],
14237
- "takesAction": [],
14238
- "source": "@webority/ui-react",
14239
- "usage": {
14240
- "when": [
14241
- "You have a list of items split across multiple pages.",
14242
- "The user needs to move between pages via numbered buttons.",
14243
- "You're paginating cards, search results, or any content outside a table."
14244
- ],
14245
- "whenNot": [
14246
- {
14247
- "text": "The list is short and fits on one screen.",
14248
- "instead": "no pager"
14249
- },
14250
- {
14251
- "text": "You're paging a table and need a rows-per-page selector.",
14252
- "instead": "AppTablePagination"
14253
- },
14254
- {
14255
- "text": "The user should keep scrolling instead of paging.",
14256
- "instead": "infinite scroll"
14257
- }
14258
- ],
14259
- "do": [],
14260
- "dont": [],
14261
- "a11y": [
14262
- "The root is a nav element labelled by the ariaLabel prop, which defaults to Pagination.",
14263
- "The current page button carries aria-current set to page.",
14264
- "Each numbered page button is labelled Page N; the Previous and Next buttons are labelled Previous page and Next page.",
14265
- "The ellipsis is hidden from assistive technology."
14266
- ]
14267
- }
14268
- },
14269
13954
  {
14270
13955
  "name": "AppPhoneNumberInput",
14271
13956
  "marker": "AppPhoneNumberInput",
@@ -15705,7 +15390,7 @@
15705
15390
  "whenNot": [
15706
15391
  {
15707
15392
  "text": "Moving between pages of a list.",
15708
- "instead": "AppPagination"
15393
+ "instead": "AppTablePagination"
15709
15394
  }
15710
15395
  ],
15711
15396
  "do": [],
@@ -17456,49 +17141,212 @@
17456
17141
  "default": "h1"
17457
17142
  },
17458
17143
  {
17459
- "name": "className",
17144
+ "name": "className",
17145
+ "type": "string",
17146
+ "required": false,
17147
+ "description": "Extra class names for the root element.",
17148
+ "default": ""
17149
+ },
17150
+ {
17151
+ "name": "eyebrow",
17152
+ "type": "node",
17153
+ "required": false,
17154
+ "description": "A short label above the heading: any node, including a styled container drawn as a pill."
17155
+ },
17156
+ {
17157
+ "name": "eyebrowTone",
17158
+ "type": "enum",
17159
+ "enum": [
17160
+ "danger",
17161
+ "info",
17162
+ "neutral",
17163
+ "primary",
17164
+ "success",
17165
+ "warning"
17166
+ ],
17167
+ "required": false,
17168
+ "description": "Draws the eyebrow as a pill in this tone; unset keeps plain text."
17169
+ },
17170
+ {
17171
+ "name": "media",
17172
+ "type": "node",
17173
+ "required": false,
17174
+ "description": "An `<img>` with `width` and `height`, beside the copy."
17175
+ },
17176
+ {
17177
+ "name": "subtitle",
17178
+ "type": "node",
17179
+ "required": false,
17180
+ "description": "One or two sentences under the heading."
17181
+ },
17182
+ {
17183
+ "name": "title",
17184
+ "type": "node",
17185
+ "required": true,
17186
+ "description": "The page's heading."
17187
+ },
17188
+ {
17189
+ "name": "variant",
17190
+ "type": "enum",
17191
+ "enum": [
17192
+ "default",
17193
+ "muted"
17194
+ ],
17195
+ "required": false,
17196
+ "description": "The section's background.",
17197
+ "default": "default"
17198
+ }
17199
+ ],
17200
+ "itemsTakeAction": [],
17201
+ "takesAction": [],
17202
+ "source": "@webority/ui-react",
17203
+ "role": "title",
17204
+ "usage": {
17205
+ "when": [
17206
+ "The first section of a public page.",
17207
+ "A campaign or product page that leads with one promise."
17208
+ ],
17209
+ "whenNot": [
17210
+ {
17211
+ "text": "The title of a portal screen.",
17212
+ "instead": "AppPageHeader"
17213
+ }
17214
+ ],
17215
+ "do": [],
17216
+ "dont": [],
17217
+ "a11y": [
17218
+ "The title is the page's h1 unless as says otherwise, so keep one h1 per page.",
17219
+ "The section is labelled by its heading, through aria-labelledby, when an id is passed.",
17220
+ "The eyebrow is plain text in a container, not a heading, so it stays out of the heading outline."
17221
+ ]
17222
+ }
17223
+ },
17224
+ {
17225
+ "name": "AppSectionLeadCapture",
17226
+ "marker": "AppSectionLeadCapture",
17227
+ "acceptsChildren": false,
17228
+ "props": [
17229
+ {
17230
+ "name": "align",
17231
+ "type": "enum",
17232
+ "enum": [
17233
+ "center",
17234
+ "start"
17235
+ ],
17236
+ "required": false,
17237
+ "description": "Where the copy and form sit in the panel.",
17238
+ "default": "center"
17239
+ },
17240
+ {
17241
+ "name": "as",
17242
+ "type": "enum",
17243
+ "enum": [
17244
+ "h1",
17245
+ "h2",
17246
+ "h3",
17247
+ "h4",
17248
+ "h5",
17249
+ "h6"
17250
+ ],
17251
+ "required": false,
17252
+ "description": "The heading element.",
17253
+ "default": "h2"
17254
+ },
17255
+ {
17256
+ "name": "className",
17257
+ "type": "string",
17258
+ "required": false,
17259
+ "description": "Extra class names for the root element.",
17260
+ "default": ""
17261
+ },
17262
+ {
17263
+ "name": "consent",
17264
+ "type": "node",
17265
+ "required": false,
17266
+ "description": "A line under the button, such as a privacy notice."
17267
+ },
17268
+ {
17269
+ "name": "eyebrow",
17270
+ "type": "node",
17271
+ "required": false,
17272
+ "description": "A short label above the heading."
17273
+ },
17274
+ {
17275
+ "name": "fields",
17276
+ "type": "array",
17277
+ "itemFields": [
17278
+ {
17279
+ "name": "label",
17280
+ "type": "string",
17281
+ "required": false,
17282
+ "description": "The field's label. Defaults to the name's usual label."
17283
+ },
17284
+ {
17285
+ "name": "name",
17286
+ "type": "enum",
17287
+ "enum": [
17288
+ "company",
17289
+ "email",
17290
+ "message",
17291
+ "name",
17292
+ "phone"
17293
+ ],
17294
+ "required": true,
17295
+ "description": "Which field this is; it sets the input type, autocomplete and the usual label."
17296
+ },
17297
+ {
17298
+ "name": "required",
17299
+ "type": "boolean",
17300
+ "required": false,
17301
+ "description": "The field must have a value to submit.",
17302
+ "default": false
17303
+ }
17304
+ ],
17305
+ "required": true,
17306
+ "description": "The fields in order: name, email, phone, company or message, each optionally labelled and required."
17307
+ },
17308
+ {
17309
+ "name": "leadSubmit",
17310
+ "type": "object",
17311
+ "fields": [],
17312
+ "required": false
17313
+ },
17314
+ {
17315
+ "name": "submitLabel",
17460
17316
  "type": "string",
17461
17317
  "required": false,
17462
- "description": "Extra class names for the root element.",
17463
- "default": ""
17318
+ "description": "The button's label.",
17319
+ "default": "Send"
17464
17320
  },
17465
17321
  {
17466
- "name": "eyebrow",
17322
+ "name": "subtitle",
17467
17323
  "type": "node",
17468
17324
  "required": false,
17469
- "description": "A short label above the heading: any node, including a styled container drawn as a pill."
17325
+ "description": "A sentence under the heading."
17470
17326
  },
17471
17327
  {
17472
- "name": "eyebrowTone",
17473
- "type": "enum",
17474
- "enum": [
17475
- "danger",
17476
- "info",
17477
- "neutral",
17478
- "primary",
17479
- "success",
17480
- "warning"
17481
- ],
17328
+ "name": "successText",
17329
+ "type": "node",
17482
17330
  "required": false,
17483
- "description": "Draws the eyebrow as a pill in this tone; unset keeps plain text."
17331
+ "description": "The sentence under the success heading."
17484
17332
  },
17485
17333
  {
17486
- "name": "media",
17334
+ "name": "successTitle",
17487
17335
  "type": "node",
17488
- "required": false,
17489
- "description": "An `<img>` with `width` and `height`, beside the copy."
17336
+ "required": true,
17337
+ "description": "The heading of the block shown after a successful send."
17490
17338
  },
17491
17339
  {
17492
- "name": "subtitle",
17340
+ "name": "text",
17493
17341
  "type": "node",
17494
17342
  "required": false,
17495
- "description": "One or two sentences under the heading."
17343
+ "description": "A paragraph above the form."
17496
17344
  },
17497
17345
  {
17498
17346
  "name": "title",
17499
17347
  "type": "node",
17500
17348
  "required": true,
17501
- "description": "The page's heading."
17349
+ "description": "The section's heading."
17502
17350
  },
17503
17351
  {
17504
17352
  "name": "variant",
@@ -17508,31 +17356,36 @@
17508
17356
  "muted"
17509
17357
  ],
17510
17358
  "required": false,
17511
- "description": "The section's background.",
17359
+ "description": "The section's background around the panel.",
17512
17360
  "default": "default"
17513
17361
  }
17514
17362
  ],
17515
17363
  "itemsTakeAction": [],
17516
- "takesAction": [],
17364
+ "takesAction": [
17365
+ "leadSubmit"
17366
+ ],
17517
17367
  "source": "@webority/ui-react",
17518
- "role": "title",
17519
17368
  "usage": {
17520
17369
  "when": [
17521
- "The first section of a public page.",
17522
- "A campaign or product page that leads with one promise."
17370
+ "A marketing page that asks for a lead: a demo, a quote or a callback.",
17371
+ "Up to five short fields, sent by a server action that rejects with a curated message, never a raw exception, because the visitor sees it."
17523
17372
  ],
17524
17373
  "whenNot": [
17525
17374
  {
17526
- "text": "The title of a portal screen.",
17527
- "instead": "AppPageHeader"
17375
+ "text": "A form with more than five fields, or with several steps.",
17376
+ "instead": "AppFormSection"
17377
+ },
17378
+ {
17379
+ "text": "A sign-in or account form.",
17380
+ "instead": "AppFormSection"
17528
17381
  }
17529
17382
  ],
17530
17383
  "do": [],
17531
17384
  "dont": [],
17532
17385
  "a11y": [
17533
- "The title is the page's h1 unless as says otherwise, so keep one h1 per page.",
17534
- "The section is labelled by its heading, through aria-labelledby, when an id is passed.",
17535
- "The eyebrow is plain text in a container, not a heading, so it stays out of the heading outline."
17386
+ "Each field has a visible label, and a required field is marked as required to the browser.",
17387
+ "The form is not validated by the browser, so the messages shown are the section's own, next to each field.",
17388
+ "A failed send is announced in an alert above the button, and a sent form is replaced by a success alert."
17536
17389
  ]
17537
17390
  }
17538
17391
  },
@@ -18129,6 +17982,13 @@
18129
17982
  "description": "Show a control that clears the chosen value.",
18130
17983
  "default": false
18131
17984
  },
17985
+ {
17986
+ "name": "compact",
17987
+ "type": "boolean",
17988
+ "required": false,
17989
+ "description": "Inline width, 32px control, 600 weight, menu sized to its options: the toolbar, sort and filter picker. Writes the element's compact attribute.",
17990
+ "default": false
17991
+ },
18132
17992
  {
18133
17993
  "name": "disabled",
18134
17994
  "type": "boolean",
@@ -18305,6 +18165,12 @@
18305
18165
  "type": "string",
18306
18166
  "required": false,
18307
18167
  "description": "The selected option's value. Leaving it out clears the control."
18168
+ },
18169
+ {
18170
+ "name": "valuePrefix",
18171
+ "type": "string",
18172
+ "required": false,
18173
+ "description": "Static text inside the control before the value, such as Sort:. Not prefix, which is the bordered affix box."
18308
18174
  }
18309
18175
  ],
18310
18176
  "itemsTakeAction": [],
@@ -18314,7 +18180,8 @@
18314
18180
  "when": [
18315
18181
  "The user picks one value from a known set of roughly 6 or more options.",
18316
18182
  "The options are a fixed list you can render up front, such as statuses, clients or categories.",
18317
- "You want a compact control that keeps the choices collapsed until opened."
18183
+ "You want a compact control that keeps the choices collapsed until opened.",
18184
+ "compact for toolbars, sort and filter pickers; a labelled form field omits compact."
18318
18185
  ],
18319
18186
  "whenNot": [
18320
18187
  {
@@ -18328,10 +18195,6 @@
18328
18195
  {
18329
18196
  "text": "The list is large or loaded from the server as the user types.",
18330
18197
  "instead": "AppAutocomplete"
18331
- },
18332
- {
18333
- "text": "It is a compact single-purpose picker like page size.",
18334
- "instead": "AppSelectMini"
18335
18198
  }
18336
18199
  ],
18337
18200
  "do": [
@@ -18500,292 +18363,133 @@
18500
18363
  {
18501
18364
  "component": "AppSelect",
18502
18365
  "props": {
18503
- "label": "Client",
18504
- "value": "",
18505
- "options": [
18506
- {
18507
- "value": "rpg",
18508
- "label": "RPG Bhiwadi DC"
18509
- },
18510
- {
18511
- "value": "tata",
18512
- "label": "Tata Power Mumbai"
18513
- },
18514
- {
18515
- "value": "adani",
18516
- "label": "Adani Green Gujarat"
18517
- },
18518
- {
18519
- "value": "lt",
18520
- "label": "L&T Construction"
18521
- }
18522
- ],
18523
- "required": true,
18524
- "error": "Required"
18525
- }
18526
- }
18527
- ]
18528
- }
18529
- ],
18530
- "a11y": [
18531
- "The visible label is the control's accessible name; a select with no visible label takes aria-label or aria-labelledby from the caller.",
18532
- "An error sets aria-invalid on the control and is linked by aria-describedby, as is the hint when there is no error.",
18533
- "required and disabled are passed to the control, and required also draws a required mark in the label."
18534
- ]
18535
- }
18536
- },
18537
- {
18538
- "name": "AppSelectMini",
18539
- "marker": "AppSelectMini",
18540
- "acceptsChildren": false,
18541
- "props": [
18542
- {
18543
- "name": "ariaLabel",
18544
- "type": "string",
18545
- "required": false,
18546
- "description": "Accessible name of the select."
18547
- },
18548
- {
18549
- "name": "className",
18550
- "type": "string",
18551
- "required": false,
18552
- "description": "Extra classes on the select, so a caller can position or space it."
18553
- },
18554
- {
18555
- "name": "disabled",
18556
- "type": "boolean",
18557
- "required": false,
18558
- "description": "Disables the select so its value cannot change."
18559
- },
18560
- {
18561
- "name": "icon",
18562
- "type": "icon",
18563
- "required": false,
18564
- "description": "A leading library icon, such as funnel or sort-down."
18565
- },
18566
- {
18567
- "name": "id",
18568
- "type": "string",
18569
- "required": false,
18570
- "description": "Element id of the select."
18571
- },
18572
- {
18573
- "name": "name",
18574
- "type": "string",
18575
- "required": false,
18576
- "description": "Form field name of the select."
18577
- },
18578
- {
18579
- "name": "options",
18580
- "type": "array",
18581
- "itemFields": [
18582
- {
18583
- "name": "icon",
18584
- "type": "icon",
18585
- "required": false,
18586
- "description": "A semantic icon name drawn before the label."
18587
- },
18588
- {
18589
- "name": "label",
18590
- "type": "node",
18591
- "required": false,
18592
- "description": "The option's text; a node renders as markup."
18593
- },
18594
- {
18595
- "name": "value",
18596
- "type": "string",
18597
- "required": true,
18598
- "description": "The option's value."
18599
- }
18600
- ],
18601
- "required": false,
18602
- "description": "The options. Omitted, the select has no options.",
18603
- "default": []
18604
- },
18605
- {
18606
- "name": "placeholder",
18607
- "type": "string",
18608
- "required": false,
18609
- "description": "Text shown while no value is selected.",
18610
- "default": "Select..."
18611
- },
18612
- {
18613
- "name": "prefix",
18614
- "type": "string",
18615
- "required": false,
18616
- "description": "Static text before the value, such as Sort:."
18617
- },
18618
- {
18619
- "name": "size",
18620
- "type": "enum",
18621
- "enum": [
18622
- "lg",
18623
- "sm"
18624
- ],
18625
- "required": false,
18626
- "description": "Compact size around the default 32px picker."
18627
- },
18628
- {
18629
- "name": "value",
18630
- "type": "string",
18631
- "required": false,
18632
- "description": "The selected option's value. Unset, the control is cleared."
18633
- }
18634
- ],
18635
- "itemsTakeAction": [],
18636
- "takesAction": [],
18637
- "source": "@webority/ui-react",
18638
- "usage": {
18639
- "when": [
18640
- "A compact, single-purpose picker in a toolbar or table header: page size, a status filter, a sort order.",
18641
- "The choice sits inline next to other controls and a full labelled field would be too heavy.",
18642
- "The option set is short and self-explanatory from the values alone."
18643
- ],
18644
- "whenNot": [
18645
- {
18646
- "text": "It is a form field that needs a label, hint, or validation.",
18647
- "instead": "AppSelect"
18648
- },
18649
- {
18650
- "text": "The list is long enough to need type-to-find.",
18651
- "instead": "AppSelect"
18652
- },
18653
- {
18654
- "text": "The user picks several values at once.",
18655
- "instead": "AppMultiSelect"
18656
- }
18657
- ],
18658
- "do": [
18659
- {
18660
- "note": "Option labels that carry their own unit, such as \"25 / page\", read clearly out of context.",
18661
- "example": [
18662
- {
18663
- "component": "AppSelectMini",
18664
- "props": {
18665
- "value": "25",
18666
- "ariaLabel": "Rows per page",
18667
- "options": [
18668
- {
18669
- "value": "10",
18670
- "label": "10 / page"
18671
- },
18672
- {
18673
- "value": "25",
18674
- "label": "25 / page"
18675
- },
18676
- {
18677
- "value": "50",
18678
- "label": "50 / page"
18679
- }
18680
- ]
18681
- }
18682
- }
18683
- ]
18684
- },
18685
- {
18686
- "note": "A short, self-explanatory set is exactly the mini picker's job.",
18687
- "example": [
18688
- {
18689
- "component": "AppSelectMini",
18690
- "props": {
18691
- "value": "all",
18692
- "ariaLabel": "Filter status",
18693
- "options": [
18694
- {
18695
- "value": "all",
18696
- "label": "All statuses"
18697
- },
18698
- {
18699
- "value": "draft",
18700
- "label": "Draft"
18701
- },
18702
- {
18703
- "value": "active",
18704
- "label": "Active"
18705
- },
18706
- {
18707
- "value": "done",
18708
- "label": "Complete"
18709
- }
18710
- ]
18711
- }
18712
- }
18713
- ]
18714
- }
18715
- ],
18716
- "dont": [
18717
- {
18718
- "note": "Bare numbers in a toolbar don't say what they change.",
18719
- "example": [
18720
- {
18721
- "component": "AppSelectMini",
18722
- "props": {
18723
- "value": "25",
18724
- "ariaLabel": "Rows per page",
18725
- "options": [
18726
- {
18727
- "value": "10",
18728
- "label": "10"
18729
- },
18730
- {
18731
- "value": "25",
18732
- "label": "25"
18733
- },
18734
- {
18735
- "value": "50",
18736
- "label": "50"
18737
- }
18738
- ]
18739
- }
18740
- }
18741
- ]
18742
- },
18743
- {
18744
- "note": "A long list belongs in AppSelect with searchable, not the compact picker.",
18745
- "example": [
18746
- {
18747
- "component": "AppSelectMini",
18748
- "props": {
18749
- "value": "c1",
18750
- "ariaLabel": "Category",
18366
+ "label": "Client",
18367
+ "value": "",
18751
18368
  "options": [
18752
18369
  {
18753
- "value": "c1",
18754
- "label": "Industrial DC"
18755
- },
18756
- {
18757
- "value": "c2",
18758
- "label": "Commercial rooftop"
18759
- },
18760
- {
18761
- "value": "c3",
18762
- "label": "Utility substation"
18763
- },
18764
- {
18765
- "value": "c4",
18766
- "label": "Telecom tower"
18370
+ "value": "rpg",
18371
+ "label": "RPG Bhiwadi DC"
18767
18372
  },
18768
18373
  {
18769
- "value": "c5",
18770
- "label": "Residential complex"
18374
+ "value": "tata",
18375
+ "label": "Tata Power Mumbai"
18771
18376
  },
18772
18377
  {
18773
- "value": "c6",
18774
- "label": "Data centre campus"
18378
+ "value": "adani",
18379
+ "label": "Adani Green Gujarat"
18775
18380
  },
18776
18381
  {
18777
- "value": "c7",
18778
- "label": "Wind farm"
18382
+ "value": "lt",
18383
+ "label": "L&T Construction"
18779
18384
  }
18780
- ]
18385
+ ],
18386
+ "required": true,
18387
+ "error": "Required"
18781
18388
  }
18782
18389
  }
18783
18390
  ]
18784
18391
  }
18785
18392
  ],
18786
18393
  "a11y": [
18787
- "The control has no visible label, so ariaLabel is its accessible name; without it a screen reader announces only a bare combobox.",
18788
- "Disabled sets the disabled attribute on the control, so its value cannot change."
18394
+ "The visible label is the control's accessible name; a select with no visible label takes aria-label or aria-labelledby from the caller.",
18395
+ "An error sets aria-invalid on the control and is linked by aria-describedby, as is the hint when there is no error.",
18396
+ "required and disabled are passed to the control, and required also draws a required mark in the label."
18397
+ ]
18398
+ }
18399
+ },
18400
+ {
18401
+ "name": "AppSeoHead",
18402
+ "marker": null,
18403
+ "acceptsChildren": false,
18404
+ "props": [
18405
+ {
18406
+ "name": "canonicalUrl",
18407
+ "type": "url",
18408
+ "required": true,
18409
+ "description": "The absolute address of the page, used for the canonical link and og:url."
18410
+ },
18411
+ {
18412
+ "name": "description",
18413
+ "type": "string",
18414
+ "required": true,
18415
+ "description": "The meta description shown in search results."
18416
+ },
18417
+ {
18418
+ "name": "image",
18419
+ "type": "url",
18420
+ "required": false,
18421
+ "description": "The absolute address of the social preview image."
18422
+ },
18423
+ {
18424
+ "name": "imageAlt",
18425
+ "type": "string",
18426
+ "required": false,
18427
+ "description": "The text description of the social preview image."
18428
+ },
18429
+ {
18430
+ "name": "jsonLd",
18431
+ "type": "object",
18432
+ "required": false,
18433
+ "description": "Structured data for the page, one object or an array of objects. Written into the page as JSON-LD, as an escaped text child, so it is for client-rendered portals only (React escapes script text under server rendering)."
18434
+ },
18435
+ {
18436
+ "name": "robots",
18437
+ "type": "string",
18438
+ "required": true,
18439
+ "description": "The robots directive the product picks per environment, such as \"index, follow\" or \"noindex, nofollow\"."
18440
+ },
18441
+ {
18442
+ "name": "siteName",
18443
+ "type": "string",
18444
+ "required": true,
18445
+ "description": "The name of the site, for og:site_name."
18446
+ },
18447
+ {
18448
+ "name": "title",
18449
+ "type": "string",
18450
+ "required": true,
18451
+ "description": "The page title, written in full by the product."
18452
+ },
18453
+ {
18454
+ "name": "twitterCard",
18455
+ "type": "enum",
18456
+ "enum": [
18457
+ "summary",
18458
+ "summary_large_image"
18459
+ ],
18460
+ "required": false,
18461
+ "description": "The Twitter card layout.",
18462
+ "default": "summary"
18463
+ },
18464
+ {
18465
+ "name": "type",
18466
+ "type": "enum",
18467
+ "enum": [
18468
+ "article",
18469
+ "website"
18470
+ ],
18471
+ "required": false,
18472
+ "description": "The Open Graph type of the page.",
18473
+ "default": "website"
18474
+ }
18475
+ ],
18476
+ "itemsTakeAction": [],
18477
+ "takesAction": [],
18478
+ "source": "@webority/ui-react",
18479
+ "usage": {
18480
+ "when": [
18481
+ "A public page needs its title, search description, social preview and structured data in the document head."
18482
+ ],
18483
+ "whenNot": [
18484
+ {
18485
+ "text": "The page is rendered by Razor.",
18486
+ "instead": "<seo-head> from Webority.Seo.AspNetCore"
18487
+ }
18488
+ ],
18489
+ "do": [],
18490
+ "dont": [],
18491
+ "a11y": [
18492
+ "The tags add no visible content; they describe the page to search engines and social previews."
18789
18493
  ]
18790
18494
  }
18791
18495
  },
@@ -19389,7 +19093,7 @@
19389
19093
  },
19390
19094
  {
19391
19095
  "text": "You need a temporary side panel, not the app's navigation.",
19392
- "instead": "AppSidebarMenu"
19096
+ "instead": "AppDrawer"
19393
19097
  },
19394
19098
  {
19395
19099
  "text": "The session has not resolved yet.",
@@ -19423,6 +19127,12 @@
19423
19127
  "required": false,
19424
19128
  "description": "CSS selector of the items that J and K move between, inside the scope."
19425
19129
  },
19130
+ {
19131
+ "name": "open",
19132
+ "type": "boolean",
19133
+ "required": false,
19134
+ "description": "Controlled open state of the sheet."
19135
+ },
19426
19136
  {
19427
19137
  "name": "search",
19428
19138
  "type": "string",
@@ -19433,6 +19143,12 @@
19433
19143
  "name": "shortcuts",
19434
19144
  "type": "array",
19435
19145
  "itemFields": [
19146
+ {
19147
+ "name": "group",
19148
+ "type": "string",
19149
+ "required": false,
19150
+ "description": "A heading the row sits under; rows sharing one are listed together."
19151
+ },
19436
19152
  {
19437
19153
  "name": "key",
19438
19154
  "type": "string",
@@ -19449,80 +19165,13 @@
19449
19165
  "required": false,
19450
19166
  "description": "The rows of the sheet, in order; the ? row is always last.",
19451
19167
  "default": []
19452
- }
19453
- ],
19454
- "itemsTakeAction": [],
19455
- "takesAction": [],
19456
- "source": "@webority/ui-react",
19457
- "usage": {
19458
- "when": [
19459
- "A queue or list someone clears every day.",
19460
- "A screen whose frequent actions have single-key shortcuts."
19461
- ],
19462
- "whenNot": [
19463
- {
19464
- "text": "Screens used now and then.",
19465
- "instead": "visible buttons only"
19466
- },
19467
- {
19468
- "text": "Phone-only screens (no keyboard).",
19469
- "instead": "visible buttons only"
19470
- }
19471
- ],
19472
- "do": [],
19473
- "dont": [],
19474
- "a11y": [
19475
- "A toggle button opens the sheet, which is a dialog; the button reports aria-haspopup, aria-expanded and aria-controls, and carries aria-keyshortcuts for the ? key.",
19476
- "Keys typed into a field, or held with Ctrl, Cmd or Alt, do nothing, so typing is never taken over.",
19477
- "Esc or a click outside closes the sheet, and the close button is named."
19478
- ]
19479
- }
19480
- },
19481
- {
19482
- "name": "AppShowMore",
19483
- "marker": "AppShowMore",
19484
- "acceptsChildren": true,
19485
- "props": [
19486
- {
19487
- "name": "className",
19488
- "type": "string",
19489
- "required": false,
19490
- "description": "Extra classes on the root.",
19491
- "default": ""
19492
19168
  },
19493
19169
  {
19494
- "name": "defaultExpanded",
19170
+ "name": "trigger",
19495
19171
  "type": "boolean",
19496
19172
  "required": false,
19497
- "description": "Start with the whole text showing; a change after mount is ignored.",
19498
- "default": false
19499
- },
19500
- {
19501
- "name": "id",
19502
- "type": "string",
19503
- "required": false,
19504
- "description": "The root's id; the text body's id is the root id plus -body. Generated when omitted."
19505
- },
19506
- {
19507
- "name": "lessLabel",
19508
- "type": "string",
19509
- "required": false,
19510
- "description": "The toggle's text while expanded.",
19511
- "default": "Show less"
19512
- },
19513
- {
19514
- "name": "lines",
19515
- "type": "number",
19516
- "required": false,
19517
- "description": "How many lines show while the text is collapsed.",
19518
- "default": 3
19519
- },
19520
- {
19521
- "name": "moreLabel",
19522
- "type": "string",
19523
- "required": false,
19524
- "description": "The toggle's text while collapsed.",
19525
- "default": "Show more"
19173
+ "description": "false renders no button; the sheet opens from ?, open, or a data-wui-shortcuts-open element.",
19174
+ "default": true
19526
19175
  }
19527
19176
  ],
19528
19177
  "itemsTakeAction": [],
@@ -19530,237 +19179,98 @@
19530
19179
  "source": "@webority/ui-react",
19531
19180
  "usage": {
19532
19181
  "when": [
19533
- "A description, note or comment that can run to many lines on a detail page."
19182
+ "A queue or list someone clears every day.",
19183
+ "A screen whose frequent actions have single-key shortcuts."
19534
19184
  ],
19535
19185
  "whenNot": [
19536
19186
  {
19537
- "text": "Hiding one line of a table cell or title with an ellipsis.",
19538
- "instead": "a truncated cell"
19539
- },
19540
- {
19541
- "text": "Several sections of content that belong behind headings.",
19542
- "instead": "AppAccordion"
19543
- }
19544
- ],
19545
- "do": [],
19546
- "dont": [],
19547
- "a11y": [
19548
- "The clamp is visual: the full text stays in the page for screen readers.",
19549
- "The toggle is a button that reports aria-expanded and points at the text with aria-controls.",
19550
- "The toggle shows only when the text overflows, and without script the text shows in full."
19551
- ]
19552
- }
19553
- },
19554
- {
19555
- "name": "AppSidebarMenu",
19556
- "marker": "AppSidebarMenu",
19557
- "acceptsChildren": true,
19558
- "props": [
19559
- {
19560
- "name": "ariaLabel",
19561
- "type": "string",
19562
- "required": false,
19563
- "description": "Accessible name of the dialog. Unset, a text title names it."
19564
- },
19565
- {
19566
- "name": "backdrop",
19567
- "type": "enum",
19568
- "enum": [
19569
- "off",
19570
- "on",
19571
- "static"
19572
- ],
19573
- "required": false,
19574
- "description": "The dimming backdrop: on shows it and a click outside closes the panel; static shows it and a click outside does not; off shows none.",
19575
- "default": "on"
19576
- },
19577
- {
19578
- "name": "bodyClassName",
19579
- "type": "string",
19580
- "required": false,
19581
- "description": "Classes on the scrollable body region.",
19582
- "default": ""
19583
- },
19584
- {
19585
- "name": "className",
19586
- "type": "string",
19587
- "required": false,
19588
- "description": "Extra classes on the panel.",
19589
- "default": ""
19590
- },
19591
- {
19592
- "name": "closeButton",
19593
- "type": "boolean",
19594
- "required": false,
19595
- "description": "Shows the header close button.",
19596
- "default": true
19597
- },
19598
- {
19599
- "name": "closeLabel",
19600
- "type": "string",
19601
- "required": false,
19602
- "description": "The close button's accessible name, for other languages.",
19603
- "default": "Close"
19604
- },
19605
- {
19606
- "name": "footer",
19607
- "type": "node",
19608
- "required": false,
19609
- "description": "A sticky footer for action buttons."
19610
- },
19611
- {
19612
- "name": "header",
19613
- "type": "node",
19614
- "required": false,
19615
- "description": "A custom header that replaces the default header bar entirely."
19616
- },
19617
- {
19618
- "name": "keyboard",
19619
- "type": "boolean",
19620
- "required": false,
19621
- "description": "Escape closes the panel.",
19622
- "default": true
19623
- },
19624
- {
19625
- "name": "maxWidth",
19626
- "type": "string",
19627
- "required": false,
19628
- "description": "Caps the panel width, such as 600px. Unset, the theme caps it at 92vw."
19629
- },
19187
+ "text": "Screens used now and then.",
19188
+ "instead": "visible buttons only"
19189
+ },
19190
+ {
19191
+ "text": "Phone-only screens (no keyboard).",
19192
+ "instead": "visible buttons only"
19193
+ }
19194
+ ],
19195
+ "do": [],
19196
+ "dont": [],
19197
+ "a11y": [
19198
+ "A toggle button opens the sheet, which is a dialog; the button reports aria-haspopup, aria-expanded and aria-controls, and carries aria-keyshortcuts for the ? key.",
19199
+ "Keys typed into a field, or held with Ctrl, Cmd or Alt, do nothing, so typing is never taken over.",
19200
+ "Esc or a click outside closes the sheet, and the close button is named."
19201
+ ]
19202
+ }
19203
+ },
19204
+ {
19205
+ "name": "AppShowMore",
19206
+ "marker": "AppShowMore",
19207
+ "acceptsChildren": true,
19208
+ "props": [
19630
19209
  {
19631
- "name": "responsive",
19210
+ "name": "className",
19632
19211
  "type": "string",
19633
19212
  "required": false,
19634
- "description": "Breakpoint, such as lg, below which the panel acts as an offcanvas and at or above which it renders inline."
19213
+ "description": "Extra classes on the root.",
19214
+ "default": ""
19635
19215
  },
19636
19216
  {
19637
- "name": "scroll",
19217
+ "name": "defaultExpanded",
19638
19218
  "type": "boolean",
19639
19219
  "required": false,
19640
- "description": "Allows the page behind the panel to scroll.",
19220
+ "description": "Start with the whole text showing; a change after mount is ignored.",
19641
19221
  "default": false
19642
19222
  },
19643
19223
  {
19644
- "name": "show",
19645
- "type": "boolean",
19646
- "required": true,
19647
- "description": "Whether the panel is open. The caller owns this state."
19648
- },
19649
- {
19650
- "name": "side",
19651
- "type": "enum",
19652
- "enum": [
19653
- "bottom",
19654
- "end",
19655
- "left",
19656
- "right",
19657
- "start",
19658
- "top"
19659
- ],
19224
+ "name": "id",
19225
+ "type": "string",
19660
19226
  "required": false,
19661
- "description": "The edge it opens from. left and start open from the start edge, right and end from the end edge.",
19662
- "default": "right"
19227
+ "description": "The root's id; the text body's id is the root id plus -body. Generated when omitted."
19663
19228
  },
19664
19229
  {
19665
- "name": "title",
19666
- "type": "node",
19230
+ "name": "lessLabel",
19231
+ "type": "string",
19667
19232
  "required": false,
19668
- "description": "Title of the default header bar. A text title also names the dialog, unless ariaLabel is set."
19233
+ "description": "The toggle's text while expanded.",
19234
+ "default": "Show less"
19669
19235
  },
19670
19236
  {
19671
- "name": "titleIcon",
19672
- "type": "icon",
19237
+ "name": "lines",
19238
+ "type": "number",
19673
19239
  "required": false,
19674
- "description": "Library icon beside the title in the default header bar."
19240
+ "description": "How many lines show while the text is collapsed.",
19241
+ "default": 3
19675
19242
  },
19676
19243
  {
19677
- "name": "width",
19244
+ "name": "moreLabel",
19678
19245
  "type": "string",
19679
19246
  "required": false,
19680
- "description": "Panel width for a left or right panel, such as 480px. Unset, it is 420px. On a phone a left or right panel opens at the full screen width, and maxWidth still caps it there."
19247
+ "description": "The toggle's text while collapsed.",
19248
+ "default": "Show more"
19681
19249
  }
19682
19250
  ],
19683
19251
  "itemsTakeAction": [],
19684
19252
  "takesAction": [],
19685
19253
  "source": "@webority/ui-react",
19686
- "role": "navigation",
19687
19254
  "usage": {
19688
19255
  "when": [
19689
- "A filter or details panel that slides in beside the current content (side=\"right\").",
19690
- "A navigation drawer, especially the collapsed mobile menu (side=\"left\").",
19691
- "You want a panel that behaves accessibly below a breakpoint and inline above it (responsive)."
19256
+ "A description, note or comment that can run to many lines on a detail page."
19692
19257
  ],
19693
19258
  "whenNot": [
19694
19259
  {
19695
- "text": "It's a self-contained task or form in a centred card.",
19696
- "instead": "AppModal"
19697
- },
19698
- {
19699
- "text": "It's a yes/no confirmation.",
19700
- "instead": "AppConfirmDialog"
19701
- },
19702
- {
19703
- "text": "It's a small menu of actions behind one trigger.",
19704
- "instead": "AppDropdown"
19705
- },
19706
- {
19707
- "text": "It's a transient message.",
19708
- "instead": "a toast"
19709
- }
19710
- ],
19711
- "do": [
19712
- {
19713
- "note": "A clear trigger opens a drawer with a title and a footer of actions, controlled by show and onHide.",
19714
- "example": [
19715
- {
19716
- "component": "AppButton",
19717
- "children": "Open filters"
19718
- }
19719
- ]
19720
- },
19721
- {
19722
- "note": "A left-edge drawer for navigation, a right-edge one for filters: the side matches the panel's job.",
19723
- "example": [
19724
- {
19725
- "component": "AppButton",
19726
- "props": {
19727
- "variant": "outline"
19728
- },
19729
- "children": "Menu"
19730
- }
19731
- ]
19732
- }
19733
- ],
19734
- "dont": [
19735
- {
19736
- "note": "A hand-rolled slide panel with no focus trap or Escape handling is inaccessible.",
19737
- "example": [
19738
- {
19739
- "component": "AppButton",
19740
- "props": {
19741
- "variant": "ghost"
19742
- },
19743
- "children": "Toggle panel"
19744
- }
19745
- ]
19260
+ "text": "Hiding one line of a table cell or title with an ellipsis.",
19261
+ "instead": "a truncated cell"
19746
19262
  },
19747
19263
  {
19748
- "note": "A drawer is the wrong home for a yes/no confirm; that belongs in AppConfirmDialog.",
19749
- "example": [
19750
- {
19751
- "component": "AppButton",
19752
- "props": {
19753
- "variant": "outline"
19754
- },
19755
- "children": "Delete account…"
19756
- }
19757
- ]
19264
+ "text": "Several sections of content that belong behind headings.",
19265
+ "instead": "AppAccordion"
19758
19266
  }
19759
19267
  ],
19268
+ "do": [],
19269
+ "dont": [],
19760
19270
  "a11y": [
19761
- "The panel is a dialog that traps focus and closes on Escape (while keyboard is on), on a click outside (unless the backdrop is static) and with the close button.",
19762
- "A text title names the dialog, and ariaLabel overrides it.",
19763
- "The close button is named by closeLabel."
19271
+ "The clamp is visual: the full text stays in the page for screen readers.",
19272
+ "The toggle is a button that reports aria-expanded and points at the text with aria-controls.",
19273
+ "The toggle shows only when the text overflows, and without script the text shows in full."
19764
19274
  ]
19765
19275
  }
19766
19276
  },
@@ -19814,7 +19324,7 @@
19814
19324
  },
19815
19325
  {
19816
19326
  "text": "A table query returned no rows.",
19817
- "instead": "AppTableEmptyState"
19327
+ "instead": "AppEmptyState variant=\"table\""
19818
19328
  },
19819
19329
  {
19820
19330
  "text": "A short, indeterminate action is running (a button submit).",
@@ -20020,7 +19530,7 @@
20020
19530
  },
20021
19531
  {
20022
19532
  "text": "A table query returned no rows.",
20023
- "instead": "AppTableEmptyState"
19533
+ "instead": "AppEmptyState variant=\"table\""
20024
19534
  }
20025
19535
  ],
20026
19536
  "do": [
@@ -21067,7 +20577,7 @@
21067
20577
  },
21068
20578
  {
21069
20579
  "text": "The detail is a quick peek from a table.",
21070
- "instead": "AppSidebarMenu"
20580
+ "instead": "AppDrawer"
21071
20581
  },
21072
20582
  {
21073
20583
  "text": "Each item is edited in a long form.",
@@ -21393,7 +20903,7 @@
21393
20903
  "acceptsChildren": false,
21394
20904
  "props": [
21395
20905
  {
21396
- "name": "activeStep",
20906
+ "name": "active",
21397
20907
  "type": "number",
21398
20908
  "required": false,
21399
20909
  "description": "The index of the current step. Steps before it are done, the one at it is active, the rest are pending; a step's own status still wins."
@@ -21500,7 +21010,7 @@
21500
21010
  "pending"
21501
21011
  ],
21502
21012
  "required": false,
21503
- "description": "The state of the step. A done step shows a tick and an error step an alert; an unset status follows activeStep."
21013
+ "description": "The state of the step. A done step shows a tick and an error step an alert; an unset status follows active."
21504
21014
  }
21505
21015
  ],
21506
21016
  "required": true,
@@ -21790,139 +21300,17 @@
21790
21300
  }
21791
21301
  },
21792
21302
  {
21793
- "name": "AppTableEmptyState",
21794
- "marker": "AppTableEmptyState",
21303
+ "name": "AppTablePagination",
21304
+ "marker": "AppTablePagination",
21795
21305
  "acceptsChildren": false,
21796
21306
  "props": [
21797
21307
  {
21798
- "name": "action",
21799
- "type": "node",
21800
- "required": false,
21801
- "description": "The next step, usually a small AppButton."
21802
- },
21803
- {
21804
- "name": "icon",
21805
- "type": "icon",
21806
- "required": false,
21807
- "description": "An icon name or a custom node shown in a round bubble. Needed unless illustration is set, which replaces it."
21808
- },
21809
- {
21810
- "name": "illustration",
21811
- "type": "node",
21812
- "required": false,
21813
- "description": "A named drawing (no-results, no-data, empty-inbox, no-notifications, no-files, no-access, offline or error) or your own decorative SVG node, drawn unboxed at up to 120 px. It replaces the icon bubble when set."
21814
- },
21815
- {
21816
- "name": "text",
21817
- "type": "node",
21308
+ "name": "ariaLabel",
21309
+ "type": "string",
21818
21310
  "required": false,
21819
- "description": "A supporting line of guidance below the title."
21311
+ "description": "The accessible name of the pager.",
21312
+ "default": "Pagination"
21820
21313
  },
21821
- {
21822
- "name": "title",
21823
- "type": "node",
21824
- "required": true,
21825
- "description": "The heading: what would appear here."
21826
- }
21827
- ],
21828
- "itemsTakeAction": [],
21829
- "takesAction": [],
21830
- "source": "@webority/ui-react",
21831
- "usage": {
21832
- "when": [
21833
- "A data table finished loading and returned zero rows.",
21834
- "A filtered or searched table has no matches and you want to say so in place.",
21835
- "The table has a natural first action (add / invite) worth surfacing when it's empty."
21836
- ],
21837
- "whenNot": [
21838
- {
21839
- "text": "The empty area is a card or section, not a table body.",
21840
- "instead": "AppEmptyState"
21841
- },
21842
- {
21843
- "text": "The table is still loading its first page.",
21844
- "instead": "AppSkeletonRows"
21845
- },
21846
- {
21847
- "text": "The rows failed to load because of an error.",
21848
- "instead": "AppAlert"
21849
- }
21850
- ],
21851
- "do": [
21852
- {
21853
- "note": "A filter-empty names the reason and suggests the fix. The user knows what to change.",
21854
- "example": [
21855
- {
21856
- "component": "AppTableEmptyState",
21857
- "props": {
21858
- "icon": "search",
21859
- "title": "No matches",
21860
- "text": "No assessments match these filters. Try widening the date range."
21861
- }
21862
- }
21863
- ]
21864
- },
21865
- {
21866
- "note": "When the table has an obvious next step, the empty state offers it right there.",
21867
- "example": [
21868
- {
21869
- "component": "AppTableEmptyState",
21870
- "props": {
21871
- "icon": "users",
21872
- "title": "No team members",
21873
- "text": "Invite colleagues to collaborate.",
21874
- "action": {
21875
- "component": "AppButton",
21876
- "props": {
21877
- "size": "sm",
21878
- "leftIcon": "plus"
21879
- },
21880
- "children": "Invite member"
21881
- }
21882
- }
21883
- }
21884
- ]
21885
- }
21886
- ],
21887
- "dont": [
21888
- {
21889
- "note": "A bare \"No data\" leaves the user unsure whether the table is empty, broken, or mis-filtered.",
21890
- "example": [
21891
- {
21892
- "component": "AppTableEmptyState",
21893
- "props": {
21894
- "icon": "file-text",
21895
- "title": "No data"
21896
- }
21897
- }
21898
- ]
21899
- },
21900
- {
21901
- "note": "Padding the text instead of offering the invite action wastes the moment.",
21902
- "example": [
21903
- {
21904
- "component": "AppTableEmptyState",
21905
- "props": {
21906
- "icon": "users",
21907
- "title": "No team members",
21908
- "text": "There are no team members. There are no team members to show in this list right now."
21909
- }
21910
- }
21911
- ]
21912
- }
21913
- ],
21914
- "a11y": [
21915
- "A named illustration is hidden from assistive technology (aria-hidden), and so is a custom illustration node, so only the title and text are read.",
21916
- "The title and text are plain text blocks, read in document order.",
21917
- "The action is whatever node is passed, so a button there keeps its own keyboard behaviour."
21918
- ]
21919
- }
21920
- },
21921
- {
21922
- "name": "AppTablePagination",
21923
- "marker": "AppTablePagination",
21924
- "acceptsChildren": false,
21925
- "props": [
21926
21314
  {
21927
21315
  "name": "className",
21928
21316
  "type": "string",
@@ -21950,8 +21338,8 @@
21950
21338
  {
21951
21339
  "name": "pageSize",
21952
21340
  "type": "number",
21953
- "required": true,
21954
- "description": "The rows per page. The page-size menu shows it as selected."
21341
+ "required": false,
21342
+ "description": "The rows per page. The page-size menu shows it as selected; without it, or without onPageSizeChange, no menu shows."
21955
21343
  },
21956
21344
  {
21957
21345
  "name": "pageSizes",
@@ -21966,6 +21354,24 @@
21966
21354
  "description": "Shows the page-size menu. Set it to false for a pager that pages but does not expose the page size.",
21967
21355
  "default": true
21968
21356
  },
21357
+ {
21358
+ "name": "siblings",
21359
+ "type": "number",
21360
+ "required": false,
21361
+ "description": "The pages shown either side of the current page in numbered mode.",
21362
+ "default": 2
21363
+ },
21364
+ {
21365
+ "name": "size",
21366
+ "type": "enum",
21367
+ "enum": [
21368
+ "md",
21369
+ "sm"
21370
+ ],
21371
+ "required": false,
21372
+ "description": "sm draws 28px page and arrow buttons with 12px text.",
21373
+ "default": "md"
21374
+ },
21969
21375
  {
21970
21376
  "name": "total",
21971
21377
  "type": "number",
@@ -21977,6 +21383,17 @@
21977
21383
  "type": "number",
21978
21384
  "required": false,
21979
21385
  "description": "The number of pages. It wins over total when both are given."
21386
+ },
21387
+ {
21388
+ "name": "variant",
21389
+ "type": "enum",
21390
+ "enum": [
21391
+ "footer",
21392
+ "standalone"
21393
+ ],
21394
+ "required": false,
21395
+ "description": "footer sits under a table, right aligned, with a top rule. standalone is centred with no rule, for cards and lists.",
21396
+ "default": "footer"
21980
21397
  }
21981
21398
  ],
21982
21399
  "itemsTakeAction": [],
@@ -23747,7 +23164,7 @@
23747
23164
  },
23748
23165
  {
23749
23166
  "text": "They are label/value facts with no time or step dimension.",
23750
- "instead": "AppInfoList"
23167
+ "instead": "AppDescriptions"
23751
23168
  },
23752
23169
  {
23753
23170
  "text": "There is nothing to show yet.",
@@ -24532,7 +23949,7 @@
24532
23949
  },
24533
23950
  {
24534
23951
  "text": "Site or app navigation.",
24535
- "instead": "AppSidebarMenu"
23952
+ "instead": "AppShell"
24536
23953
  }
24537
23954
  ],
24538
23955
  "do": [],
@@ -24699,7 +24116,7 @@
24699
24116
  "name": "date",
24700
24117
  "type": "string",
24701
24118
  "required": true,
24702
- "description": "The day it shipped, as YYYY-MM-DD. It shows as DD-MMM-YYYY."
24119
+ "description": "The day it shipped, as an ISO date (YYYY-MM-DD) or date-time. It shows as DD-MMM-YYYY."
24703
24120
  },
24704
24121
  {
24705
24122
  "name": "href",
@@ -24742,6 +24159,17 @@
24742
24159
  "description": "The release notes, shown in the order passed.",
24743
24160
  "default": []
24744
24161
  },
24162
+ {
24163
+ "name": "indicator",
24164
+ "type": "enum",
24165
+ "enum": [
24166
+ "count",
24167
+ "dot"
24168
+ ],
24169
+ "required": false,
24170
+ "description": "The unread mark on the trigger: a dot, or the number of unread entries.",
24171
+ "default": "dot"
24172
+ },
24745
24173
  {
24746
24174
  "name": "label",
24747
24175
  "type": "string",
@@ -24749,6 +24177,12 @@
24749
24177
  "description": "The trigger's name and the panel's heading.",
24750
24178
  "default": "What's new"
24751
24179
  },
24180
+ {
24181
+ "name": "readThrough",
24182
+ "type": "string",
24183
+ "required": false,
24184
+ "description": "An ISO date or date-time read on another device or saved on the server. Entries up to the later of it and the stored read state count as read."
24185
+ },
24752
24186
  {
24753
24187
  "name": "storageKey",
24754
24188
  "type": "string",
@@ -27016,6 +26450,7 @@
27016
26450
  "repeate-music",
27017
26451
  "repeate-one",
27018
26452
  "reserve",
26453
+ "robot",
27019
26454
  "rotate-ccw",
27020
26455
  "rotate-cw",
27021
26456
  "rotate-left",