@kubex/zinc 1.1.97 → 1.1.99

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 (85) hide show
  1. package/AGENTS.md +5 -0
  2. package/CLAUDE.md +5 -0
  3. package/dist/chunks/zn.R2EAU6OS.js +1 -0
  4. package/dist/custom-elements.json +14747 -12528
  5. package/dist/vscode.html-custom-data.json +386 -61
  6. package/dist/web-types.json +1232 -481
  7. package/dist/zn.d.ts +529 -11
  8. package/dist/zn.min.js +649 -478
  9. package/docs/pages/components/background.md +143 -0
  10. package/docs/pages/components/button.md +11 -1
  11. package/docs/pages/components/chart.md +165 -3
  12. package/docs/pages/components/checkbox-group.md +13 -1
  13. package/docs/pages/components/checkbox.md +59 -1
  14. package/docs/pages/components/icon-picker.md +8 -0
  15. package/docs/pages/components/radio-group.md +12 -0
  16. package/docs/pages/components/radio.md +188 -0
  17. package/docs/pages/components/remarkd-editor.md +22 -0
  18. package/docs/pages/components/scroll-container.md +14 -15
  19. package/docs/pages/components/thumbnail-group.md +216 -0
  20. package/docs/pages/components/thumbnail.md +349 -0
  21. package/docs/pages/components/well.md +34 -0
  22. package/package.json +1 -1
  23. package/src/components/background/background.component.ts +111 -0
  24. package/src/components/background/background.scss +236 -0
  25. package/src/components/background/background.test.ts +120 -0
  26. package/src/components/background/index.ts +12 -0
  27. package/src/components/button/button.component.ts +8 -0
  28. package/src/components/chart/builders.test.ts +190 -1
  29. package/src/components/chart/builders.ts +246 -4
  30. package/src/components/chart/chart.component.ts +33 -1
  31. package/src/components/chart/chart.test.ts +66 -1
  32. package/src/components/chart/echarts-loader.ts +10 -0
  33. package/src/components/checkbox/checkbox.component.ts +62 -6
  34. package/src/components/checkbox/checkbox.scss +1 -0
  35. package/src/components/checkbox/checkbox.test.ts +56 -0
  36. package/src/components/checkbox-group/checkbox-group.component.ts +15 -0
  37. package/src/components/checkbox-group/checkbox-group.scss +23 -5
  38. package/src/components/checkbox-group/checkbox-group.test.ts +15 -0
  39. package/src/components/collapsible/collapsible.component.ts +49 -4
  40. package/src/components/collapsible/collapsible.scss +33 -14
  41. package/src/components/confirm/confirm.component.ts +3 -3
  42. package/src/components/confirm/confirm.test.ts +15 -0
  43. package/src/components/dialog/dialog.component.ts +3 -2
  44. package/src/components/editor/editor.component.ts +7 -6
  45. package/src/components/header/header.scss +2 -2
  46. package/src/components/icon-picker/icon-picker.component.ts +3 -0
  47. package/src/components/icon-picker/lucide-icons.ts +1756 -0
  48. package/src/components/navbar/navbar.scss +11 -0
  49. package/src/components/page/page.scss +1 -1
  50. package/src/components/radio/radio.component.ts +63 -7
  51. package/src/components/radio/radio.scss +1 -0
  52. package/src/components/radio/radio.test.ts +56 -0
  53. package/src/components/radio-group/radio-group.component.ts +16 -3
  54. package/src/components/radio-group/radio-group.scss +23 -4
  55. package/src/components/radio-group/radio-group.test.ts +15 -0
  56. package/src/components/remarkd-editor/remarkd-editor.component.ts +118 -5
  57. package/src/components/remarkd-editor/remarkd-editor.scss +8 -1
  58. package/src/components/remarkd-editor/remarkd-editor.test.ts +135 -0
  59. package/src/components/scroll-container/scroll-container.component.ts +15 -1
  60. package/src/components/scroll-container/scroll-container.scss +4 -2
  61. package/src/components/scroll-container/scroll-container.test.ts +13 -0
  62. package/src/components/slideout/slideout.component.ts +3 -2
  63. package/src/components/split-pane/split-pane.scss +21 -15
  64. package/src/components/thumbnail/index.ts +12 -0
  65. package/src/components/thumbnail/thumbnail.component.ts +460 -0
  66. package/src/components/thumbnail/thumbnail.scss +360 -0
  67. package/src/components/thumbnail/thumbnail.test.ts +379 -0
  68. package/src/components/thumbnail-group/index.ts +12 -0
  69. package/src/components/thumbnail-group/thumbnail-group.component.ts +268 -0
  70. package/src/components/thumbnail-group/thumbnail-group.scss +86 -0
  71. package/src/components/thumbnail-group/thumbnail-group.test.ts +151 -0
  72. package/src/components/tile/tile.scss +4 -2
  73. package/src/components/translation-group/translation-group.test.ts +22 -0
  74. package/src/components/translations/translations.component.ts +18 -3
  75. package/src/components/well/well.component.ts +22 -4
  76. package/src/components/well/well.scss +24 -0
  77. package/src/components/well/well.test.ts +43 -0
  78. package/src/form-control.scss +3 -1
  79. package/src/internal/conditional.ts +2 -2
  80. package/src/internal/form.ts +2 -1
  81. package/src/internal/selection-card.ts +19 -0
  82. package/src/selection-card.scss +187 -0
  83. package/src/utilities/query.test.ts +18 -1
  84. package/src/utilities/query.ts +8 -0
  85. package/src/zinc.ts +3 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@kubex/zinc",
4
- "version": "1.1.97",
4
+ "version": "1.1.99",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -15,6 +15,28 @@
15
15
  "events": [],
16
16
  "js": { "properties": [], "events": [] }
17
17
  },
18
+ {
19
+ "name": "zn-action-bar",
20
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
21
+ "doc-url": "",
22
+ "attributes": [],
23
+ "slots": [
24
+ { "name": "", "description": "The default slot." },
25
+ { "name": "example", "description": "An example slot." }
26
+ ],
27
+ "events": [
28
+ { "name": "zn-event-name", "description": "Emitted as an example." }
29
+ ],
30
+ "js": {
31
+ "properties": [],
32
+ "events": [
33
+ {
34
+ "name": "zn-event-name",
35
+ "description": "Emitted as an example."
36
+ }
37
+ ]
38
+ }
39
+ },
18
40
  {
19
41
  "name": "zn-alert",
20
42
  "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
@@ -83,28 +105,6 @@
83
105
  ]
84
106
  }
85
107
  },
86
- {
87
- "name": "zn-action-bar",
88
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
89
- "doc-url": "",
90
- "attributes": [],
91
- "slots": [
92
- { "name": "", "description": "The default slot." },
93
- { "name": "example", "description": "An example slot." }
94
- ],
95
- "events": [
96
- { "name": "zn-event-name", "description": "Emitted as an example." }
97
- ],
98
- "js": {
99
- "properties": [],
100
- "events": [
101
- {
102
- "name": "zn-event-name",
103
- "description": "Emitted as an example."
104
- }
105
- ]
106
- }
107
- },
108
108
  {
109
109
  "name": "zn-animated-button",
110
110
  "description": "\n---\n\n\n### **Methods:**\n - **purchase(): _void_** - Programmatically trigger the purchase flow\n- **setSuccess(): _void_** - Set the button to success state manually\n- **setFailure(message): _void_** - Set the button to failure state manually with optional error message\n- **reset(): _void_** - Reset the button to idle state",
@@ -250,6 +250,108 @@
250
250
  "events": []
251
251
  }
252
252
  },
253
+ {
254
+ "name": "zn-background",
255
+ "description": "Composes a colour, decorative image, image strength, optional motion and contrast overlay behind slotted content.\n---\n\n\n### **Slots:**\n - _default_ - Content displayed above the background layers.\n\n### **CSS Properties:**\n - **--zn-background-color** - Fallback colour when the `color` attribute is not set. _(default: undefined)_\n- **--zn-background-image-position** - Position of the background image. Defaults to `center`. _(default: undefined)_\n- **--zn-background-overlay-angle** - Direction of the overlay gradient. Defaults to `110deg`. _(default: undefined)_\n- **--zn-background-floating-icon-color** - Colour of the floating icons. Defaults to `currentColor`. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's full-size background canvas.\n- **image** - The decorative background image.\n- **overlay** - The contrast overlay between the image and content.\n- **floating-icons** - The non-interactive layer containing the floating icons.\n- **floating-icon** - Each floating `zn-icon`.\n- **content** - The wrapper around the default slot.",
256
+ "doc-url": "",
257
+ "attributes": [
258
+ {
259
+ "name": "image",
260
+ "description": "URL of the decorative background image.",
261
+ "value": { "type": "string", "default": "''" }
262
+ },
263
+ {
264
+ "name": "color",
265
+ "description": "CSS colour painted beneath the image.",
266
+ "value": { "type": "string", "default": "''" }
267
+ },
268
+ {
269
+ "name": "image-strength",
270
+ "description": "Visibility of the image: `soft` (30%), `medium` (62%) or `full` (100%).",
271
+ "value": {
272
+ "type": "BackgroundImageStrength",
273
+ "default": "'full'"
274
+ }
275
+ },
276
+ {
277
+ "name": "motion",
278
+ "description": "Subtle animation applied to the image. Motion stops when reduced motion is requested.",
279
+ "value": { "type": "BackgroundMotion", "default": "'none'" }
280
+ },
281
+ {
282
+ "name": "overlay",
283
+ "description": "Strength of the contrast gradient above the image.",
284
+ "value": { "type": "BackgroundOverlay", "default": "'soft'" }
285
+ },
286
+ {
287
+ "name": "overlay-tone",
288
+ "description": "Whether the overlay uses a light or dark contrast treatment.",
289
+ "value": { "type": "BackgroundOverlayTone", "default": "'light'" }
290
+ },
291
+ {
292
+ "name": "floating-icons",
293
+ "description": "Comma-separated Zinc icon names placed as ambient decoration. At most eight are rendered.",
294
+ "value": { "type": "string", "default": "''" }
295
+ },
296
+ {
297
+ "name": "paused",
298
+ "description": "Pauses background motion without changing the selected motion treatment.",
299
+ "value": { "type": "boolean", "default": "false" }
300
+ }
301
+ ],
302
+ "slots": [
303
+ {
304
+ "name": "",
305
+ "description": "Content displayed above the background layers."
306
+ }
307
+ ],
308
+ "events": [],
309
+ "js": {
310
+ "properties": [
311
+ {
312
+ "name": "image",
313
+ "description": "URL of the decorative background image.",
314
+ "type": "string"
315
+ },
316
+ {
317
+ "name": "color",
318
+ "description": "CSS colour painted beneath the image.",
319
+ "type": "string"
320
+ },
321
+ {
322
+ "name": "imageStrength",
323
+ "description": "Visibility of the image: `soft` (30%), `medium` (62%) or `full` (100%).",
324
+ "type": "BackgroundImageStrength"
325
+ },
326
+ {
327
+ "name": "motion",
328
+ "description": "Subtle animation applied to the image. Motion stops when reduced motion is requested.",
329
+ "type": "BackgroundMotion"
330
+ },
331
+ {
332
+ "name": "overlay",
333
+ "description": "Strength of the contrast gradient above the image.",
334
+ "type": "BackgroundOverlay"
335
+ },
336
+ {
337
+ "name": "overlayTone",
338
+ "description": "Whether the overlay uses a light or dark contrast treatment.",
339
+ "type": "BackgroundOverlayTone"
340
+ },
341
+ {
342
+ "name": "floatingIcons",
343
+ "description": "Comma-separated Zinc icon names placed as ambient decoration. At most eight are rendered.",
344
+ "type": "string"
345
+ },
346
+ {
347
+ "name": "paused",
348
+ "description": "Pauses background motion without changing the selected motion treatment.",
349
+ "type": "boolean"
350
+ }
351
+ ],
352
+ "events": []
353
+ }
354
+ },
253
355
  {
254
356
  "name": "zn-bulk-actions",
255
357
  "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
@@ -408,6 +510,11 @@
408
510
  "value": { "type": "string", "default": "'noreferrer noopener'" }
409
511
  },
410
512
  { "name": "tooltip", "value": { "type": "string" } },
513
+ {
514
+ "name": "label",
515
+ "description": "Accessible name for the button. Icon-only buttons fall back to `tooltip`.",
516
+ "value": { "type": "string" }
517
+ },
411
518
  {
412
519
  "name": "auto-click",
413
520
  "value": { "type": "boolean", "default": "false" }
@@ -526,6 +633,11 @@
526
633
  { "name": "dataTarget", "type": "'modal' | 'slide' | string" },
527
634
  { "name": "rel", "type": "string" },
528
635
  { "name": "tooltip", "type": "string" },
636
+ {
637
+ "name": "label",
638
+ "description": "Accessible name for the button. Icon-only buttons fall back to `tooltip`.",
639
+ "type": "string"
640
+ },
529
641
  { "name": "autoClick", "type": "boolean" },
530
642
  { "name": "autoClickDelay", "type": "number" },
531
643
  { "name": "loadingText", "type": "string" },
@@ -898,6 +1010,14 @@
898
1010
  "name": "categories",
899
1011
  "value": { "type": "string[]", "default": "[]" }
900
1012
  },
1013
+ {
1014
+ "name": "y-categories",
1015
+ "value": { "type": "string[]", "default": "[]" }
1016
+ },
1017
+ {
1018
+ "name": "indicators",
1019
+ "value": { "type": "RadarIndicator[]", "default": "[]" }
1020
+ },
901
1021
  {
902
1022
  "name": "xaxis",
903
1023
  "value": { "type": "'datetime' | 'category' | 'numeric'" }
@@ -934,6 +1054,20 @@
934
1054
  "name": "smooth",
935
1055
  "value": { "type": "boolean", "default": "false" }
936
1056
  },
1057
+ {
1058
+ "name": "inner-radius",
1059
+ "value": { "type": "number | string | undefined" }
1060
+ },
1061
+ {
1062
+ "name": "outer-radius",
1063
+ "value": { "type": "number | string | undefined" }
1064
+ },
1065
+ {
1066
+ "name": "show-labels",
1067
+ "value": { "type": "boolean | undefined" }
1068
+ },
1069
+ { "name": "min-value", "value": { "type": "number | undefined" } },
1070
+ { "name": "max-value", "value": { "type": "number | undefined" } },
937
1071
  {
938
1072
  "name": "scale",
939
1073
  "value": { "type": "boolean | number", "default": "false" }
@@ -945,6 +1079,8 @@
945
1079
  { "name": "type", "type": "ChartType" },
946
1080
  { "name": "data", "type": "SeriesItem[]" },
947
1081
  { "name": "categories", "type": "string[]" },
1082
+ { "name": "yCategories", "type": "string[]" },
1083
+ { "name": "indicators", "type": "RadarIndicator[]" },
948
1084
  {
949
1085
  "name": "xAxis",
950
1086
  "type": "'datetime' | 'category' | 'numeric'"
@@ -960,6 +1096,11 @@
960
1096
  { "name": "colors", "type": "string[] | undefined" },
961
1097
  { "name": "syncGroup", "type": "string | undefined" },
962
1098
  { "name": "smooth", "type": "boolean" },
1099
+ { "name": "innerRadius", "type": "number | string | undefined" },
1100
+ { "name": "outerRadius", "type": "number | string | undefined" },
1101
+ { "name": "showLabels", "type": "boolean | undefined" },
1102
+ { "name": "minValue", "type": "number | undefined" },
1103
+ { "name": "maxValue", "type": "number | undefined" },
963
1104
  { "name": "scale", "type": "boolean | number" }
964
1105
  ],
965
1106
  "events": []
@@ -1151,7 +1292,7 @@
1151
1292
  },
1152
1293
  {
1153
1294
  "name": "zn-checkbox",
1154
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-blur** - Emitted when the checkbox loses focus.\n- **zn-change** - Emitted when the checked state changes.\n- **zn-focus** - Emitted when the checkbox gains focus.\n- **zn-input** - Emitted when the checkbox receives input.\n- **zn-invalid** - Emitted when the form control has been checked for validity and its constraints aren't satisfied.\n\n### **Methods:**\n - **click()** - Simulates a click on the checkbox.\n- **focus(options: _FocusOptions_)** - Sets focus on the checkbox.\n- **blur()** - Removes focus from the checkbox.\n- **checkValidity()** - Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity()** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(message: _string_)** - Sets a custom validation message. The value provided will be shown to the user when the form is submitted. To clear\nthe custom validation message, call this method with an empty string.\n\n### **Slots:**\n - _default_ - The checkbox's label.\n- **description** - A description of the checkbox's label. Serves as help text for a checkbox item. Alternatively, you can use the `description` attribute.\n- **selected-content** - Use to nest rich content (like an input) inside a selected checkbox item. Use only with the contained style.\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **control** - The square container that wraps the checkbox's checked state.\n- **control--checked** - Matches the control part when the checkbox is checked.\n- **control--indeterminate** - Matches the control part when the checkbox is indeterminate.\n- **checked-icon** - The checked icon, an `<zn-icon>` element.\n- **unchecked-icon** - The unchecked icon, an `<zn-icon>` element.\n- **indeterminate-icon** - The indeterminate icon, an `<zn-icon>` element.\n- **label** - The container that wraps the checkbox's label.\n- **description** - The container that wraps the checkbox's description.\n- **selected-content** - The container that wraps optional content that appears when a checkbox is checked.",
1295
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-blur** - Emitted when the checkbox loses focus.\n- **zn-change** - Emitted when the checked state changes.\n- **zn-focus** - Emitted when the checkbox gains focus.\n- **zn-input** - Emitted when the checkbox receives input.\n- **zn-invalid** - Emitted when the form control has been checked for validity and its constraints aren't satisfied.\n\n### **Methods:**\n - **click()** - Simulates a click on the checkbox.\n- **focus(options: _FocusOptions_)** - Sets focus on the checkbox.\n- **blur()** - Removes focus from the checkbox.\n- **checkValidity()** - Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity()** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(message: _string_)** - Sets a custom validation message. The value provided will be shown to the user when the form is submitted. To clear\nthe custom validation message, call this method with an empty string.\n\n### **Slots:**\n - _default_ - The checkbox's label.\n- **image** - Replaces the built-in image used by contained checkboxes.\n- **description** - A description of the checkbox's label. Serves as help text for a checkbox item. Alternatively, you can use the `description` attribute.\n- **selected-content** - Use to nest rich content (like an input) inside a selected checkbox item. Use only with the contained style.\n\n### **CSS Properties:**\n - **--zn-selection-card-image-width** - Width of the built-in card image. _(default: undefined)_\n- **--zn-selection-card-image-height** - Height of the built-in card image. _(default: undefined)_\n- **--zn-selection-card-min-height** - Minimum height of a contained checkbox with an image. _(default: undefined)_\n- **--zn-selection-card-content-min-width** - Width the card text keeps before it wraps below the image. _(default: undefined)_\n- **--zn-selection-card-title-font-size** - Font size of a selection card title. _(default: undefined)_\n- **--zn-selection-card-padding** - Equal inset around the contents of a selection card. _(default: undefined)_\n- **--zn-selection-card-gap** - Space between the image, title, and indicator gutter. _(default: undefined)_\n- **--zn-selection-card-control-offset** - Distance between a positioned control and the card edge. _(default: undefined)_\n- **--zn-selection-card-border-radius** - Corner radius of a contained container. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **control** - The square container that wraps the checkbox's checked state.\n- **control--checked** - Matches the control part when the checkbox is checked.\n- **control--indeterminate** - Matches the control part when the checkbox is indeterminate.\n- **checked-icon** - The checked icon, an `<zn-icon>` element.\n- **unchecked-icon** - The unchecked icon, an `<zn-icon>` element.\n- **indeterminate-icon** - The indeterminate icon, an `<zn-icon>` element.\n- **image-container** - The wrapper around the built-in image or image slot.\n- **image** - The built-in image.\n- **card-title** - The title inside a selection card.\n- **label** - The container that wraps the checkbox's label.\n- **description** - The container that wraps the checkbox's description.\n- **selected-content** - The container that wraps optional content that appears when a checkbox is checked.",
1155
1296
  "doc-url": "",
1156
1297
  "attributes": [
1157
1298
  { "name": "title", "value": { "type": "string", "default": "''" } },
@@ -1165,6 +1306,11 @@
1165
1306
  "description": "The current value of the checkbox, submitted as a name/value pair with form data.",
1166
1307
  "value": { "type": "string" }
1167
1308
  },
1309
+ {
1310
+ "name": "card-title",
1311
+ "description": "Title rendered inside the card. The default slot takes precedence when provided.",
1312
+ "value": { "type": "string", "default": "''" }
1313
+ },
1168
1314
  {
1169
1315
  "name": "unchecked-value",
1170
1316
  "description": "The unchecked value of the checkbox, submitted as a name/value pair with form data.",
@@ -1198,6 +1344,37 @@
1198
1344
  "description": "Draws a container around the checkbox.",
1199
1345
  "value": { "type": "boolean", "default": "false" }
1200
1346
  },
1347
+ {
1348
+ "name": "square",
1349
+ "description": "Squares off the corners of the container drawn by `contained`, which is rounded by default.",
1350
+ "value": { "type": "boolean", "default": "false" }
1351
+ },
1352
+ {
1353
+ "name": "src",
1354
+ "description": "URL for the image shown in a contained checkbox.",
1355
+ "value": { "type": "string", "default": "''" }
1356
+ },
1357
+ {
1358
+ "name": "image-alt",
1359
+ "description": "Accessible text for the built-in image. Leave empty when the image is decorative.",
1360
+ "value": { "type": "string", "default": "''" }
1361
+ },
1362
+ {
1363
+ "name": "image-position",
1364
+ "description": "Places the image above, beside, or below the checkbox's text. Requires `contained`.",
1365
+ "value": {
1366
+ "type": "SelectionCardImagePosition",
1367
+ "default": "'left'"
1368
+ }
1369
+ },
1370
+ {
1371
+ "name": "control-position",
1372
+ "description": "Places the checkbox indicator within a contained card. Use `none` to hide the indicator so the card itself\nshows the selected state. Requires `contained`.",
1373
+ "value": {
1374
+ "type": "SelectionCardControlPosition",
1375
+ "default": "'start'"
1376
+ }
1377
+ },
1201
1378
  {
1202
1379
  "name": "borderless",
1203
1380
  "description": "Removes a container around the checkbox.",
@@ -1258,6 +1435,10 @@
1258
1435
  ],
1259
1436
  "slots": [
1260
1437
  { "name": "", "description": "The checkbox's label." },
1438
+ {
1439
+ "name": "image",
1440
+ "description": "Replaces the built-in image used by contained checkboxes."
1441
+ },
1261
1442
  {
1262
1443
  "name": "description",
1263
1444
  "description": "A description of the checkbox's label. Serves as help text for a checkbox item. Alternatively, you can use the `description` attribute."
@@ -1303,6 +1484,11 @@
1303
1484
  "description": "The current value of the checkbox, submitted as a name/value pair with form data.",
1304
1485
  "type": "string"
1305
1486
  },
1487
+ {
1488
+ "name": "cardTitle",
1489
+ "description": "Title rendered inside the card. The default slot takes precedence when provided.",
1490
+ "type": "string"
1491
+ },
1306
1492
  {
1307
1493
  "name": "uncheckedValue",
1308
1494
  "description": "The unchecked value of the checkbox, submitted as a name/value pair with form data.",
@@ -1333,6 +1519,31 @@
1333
1519
  "description": "Draws a container around the checkbox.",
1334
1520
  "type": "boolean"
1335
1521
  },
1522
+ {
1523
+ "name": "square",
1524
+ "description": "Squares off the corners of the container drawn by `contained`, which is rounded by default.",
1525
+ "type": "boolean"
1526
+ },
1527
+ {
1528
+ "name": "src",
1529
+ "description": "URL for the image shown in a contained checkbox.",
1530
+ "type": "string"
1531
+ },
1532
+ {
1533
+ "name": "imageAlt",
1534
+ "description": "Accessible text for the built-in image. Leave empty when the image is decorative.",
1535
+ "type": "string"
1536
+ },
1537
+ {
1538
+ "name": "imagePosition",
1539
+ "description": "Places the image above, beside, or below the checkbox's text. Requires `contained`.",
1540
+ "type": "SelectionCardImagePosition"
1541
+ },
1542
+ {
1543
+ "name": "controlPosition",
1544
+ "description": "Places the checkbox indicator within a contained card. Use `none` to hide the indicator so the card itself\nshows the selected state. Requires `contained`.",
1545
+ "type": "SelectionCardControlPosition"
1546
+ },
1336
1547
  {
1337
1548
  "name": "borderless",
1338
1549
  "description": "Removes a container around the checkbox.",
@@ -1431,7 +1642,7 @@
1431
1642
  },
1432
1643
  {
1433
1644
  "name": "zn-checkbox-group",
1434
- "description": "Shotrt summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-change** - Emitted when the checkbox group's selected value changes.\n- **zn-input** - Emitted when the checkbox group receives user input.\n- **zn-invalid** - Emitted when the form control has been checked for validity and its constraints aren't satisfied.\n\n### **Methods:**\n - **checkValidity()** - Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity(): _boolean_** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(message)** - Sets a custom validation message. Pass an empty string to restore validity.\n\n### **Slots:**\n - _default_ - The default slot where `<zn-checkbox>` elements are placed.\n- **label** - The checkbox group's label. Required for proper accessibility. Alternatively, you can use the `label` attribute.\n- **label-tooltip** - Used to add text that is displayed in a tooltip next to the label. Alternatively, you can use the `label-tooltip` attribute.\n- **help-text** - Text that describes how to use the checkbox group. Alternatively, you can use the `help-text` attribute.\n\n### **CSS Parts:**\n - **form-control** - The form control that wraps the label, input, and help text.\n- **form-control-label** - The label's wrapper.\n- **form-control-input** - The input's wrapper.\n- **form-control-help-text** - The help text's wrapper.",
1645
+ "description": "Shotrt summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-change** - Emitted when the checkbox group's selected value changes.\n- **zn-input** - Emitted when the checkbox group receives user input.\n- **zn-invalid** - Emitted when the form control has been checked for validity and its constraints aren't satisfied.\n\n### **Methods:**\n - **checkValidity()** - Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity(): _boolean_** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(message)** - Sets a custom validation message. Pass an empty string to restore validity.\n\n### **Slots:**\n - _default_ - The default slot where `<zn-checkbox>` elements are placed.\n- **label** - The checkbox group's label. Required for proper accessibility. Alternatively, you can use the `label` attribute.\n- **label-tooltip** - Used to add text that is displayed in a tooltip next to the label. Alternatively, you can use the `label-tooltip` attribute.\n- **help-text** - Text that describes how to use the checkbox group. Alternatively, you can use the `help-text` attribute.\n\n### **CSS Properties:**\n - **--zn-checkbox-group-column-width** - Minimum column width used by the horizontal contained grid, or the card basis when `wrap` is set. _(default: undefined)_\n\n### **CSS Parts:**\n - **form-control** - The form control that wraps the label, input, and help text.\n- **form-control-label** - The label's wrapper.\n- **form-control-input** - The input's wrapper.\n- **form-control-help-text** - The help text's wrapper.",
1435
1646
  "doc-url": "",
1436
1647
  "attributes": [
1437
1648
  {
@@ -1477,6 +1688,16 @@
1477
1688
  "description": "The checkbox group's style. Changes the group's style from the default (plain) style to the 'contained' style. This style will be applied to all child checkboxes.",
1478
1689
  "value": { "type": "boolean", "default": "false" }
1479
1690
  },
1691
+ {
1692
+ "name": "square",
1693
+ "description": "Squares off the corners of every contained checkbox in the group, which are rounded by default.",
1694
+ "value": { "type": "boolean", "default": "false" }
1695
+ },
1696
+ {
1697
+ "name": "wrap",
1698
+ "description": "Lays horizontal contained checkboxes out as a wrapping row instead of an equal-width grid, so each one sizes from\n`--zn-checkbox-group-column-width` (set it to `auto` to size from content) and wraps onto a new line when needed.",
1699
+ "value": { "type": "boolean", "default": "false" }
1700
+ },
1480
1701
  {
1481
1702
  "name": "form",
1482
1703
  "description": "By default, form controls are associated with the nearest containing `<form>` element. This attribute allows you\nto place the form control outside of a form and associate it with the form that has this `id`. The form must be in\nthe same document or shadow root for this to work.",
@@ -1564,6 +1785,16 @@
1564
1785
  "description": "The checkbox group's style. Changes the group's style from the default (plain) style to the 'contained' style. This style will be applied to all child checkboxes.",
1565
1786
  "type": "boolean"
1566
1787
  },
1788
+ {
1789
+ "name": "square",
1790
+ "description": "Squares off the corners of every contained checkbox in the group, which are rounded by default.",
1791
+ "type": "boolean"
1792
+ },
1793
+ {
1794
+ "name": "wrap",
1795
+ "description": "Lays horizontal contained checkboxes out as a wrapping row instead of an equal-width grid, so each one sizes from\n`--zn-checkbox-group-column-width` (set it to `auto` to size from content) and wraps onto a new line when needed.",
1796
+ "type": "boolean"
1797
+ },
1567
1798
  {
1568
1799
  "name": "form",
1569
1800
  "description": "By default, form controls are associated with the nearest containing `<form>` element. This attribute allows you\nto place the form control outside of a form and associate it with the form that has this `id`. The form must be in\nthe same document or shadow root for this to work.",
@@ -6364,204 +6595,62 @@
6364
6595
  }
6365
6596
  },
6366
6597
  {
6367
- "name": "zn-page",
6368
- "description": "Combines a page header with tab navigation and tab panels.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Methods:**\n \n\n\n### **Slots:**\n - _default_ - Page content. Use zn-tab for named tabs and header-action/header-actions for header actions.\n- **description** - Rich subtitle/description content. Falls back to the `summary` attribute when empty.\n- **bottom** - Content rendered below the navbar row (e.g. chips, filters). Forwarded to the navbar's bottom slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
6598
+ "name": "zn-page-builder",
6599
+ "description": "A config-driven page composer: a palette of predefined section types, a linear\ncanvas of section cards, and an inspector for editing each section's content.\n---\n\n\n### **Events:**\n - **zn-page-change** - Emitted whenever the page state changes. `event.detail.state` is the new PageState.\n- **zn-page-selection-change** - Emitted when the selected section changes. `event.detail.sectionId`.\n\n### **Methods:**\n - **checkValidity(): _boolean_** - Checks for validity but does not show a validation message.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity(): _boolean_** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(_message)** - Sets a custom validation message. Pass an empty string to restore validity.\n- **addSection(type: _string_, index: _number_): _PageSection | null_** - Adds a section of a registered type at `index` (default: end). Returns null for unknown types.\n- **addSectionToSlot(type: _string_, containerId: _string_, slotIndex: _number_): _PageSection | null_** - Adds a new section of a registered type into a container's slot. Returns null if not allowed.\n\n### **Slots:**\n - **config** - `<template type=\"…\">` declarations; never displayed. Each template's attributes (type, label, icon, icon-library, color, category, description, slots, accepts) declare a palette entry and its content declares the inspector form for that type. `slots` makes the section a container with that many child slots; `accepts` is a comma-separated list of the type keys its slots allow.\n- **header-left** - Actions shown on the left of the header bar.\n- **header-right** - Actions shown on the right of the header bar.\n\n### **CSS Parts:**\n - **base** - The grid wrapper.\n- **header** - The full-width header action bar (only rendered when header slots are filled).\n- **palette** - The left palette panel.\n- **canvas** - The centre section-card canvas.\n- **inspector** - The right panel while a section is selected.\n- **inspector-header** - The inspector's fixed header (icon, section name, type, close).\n- **inspector-body** - The inspector's scrolling form area.",
6369
6600
  "doc-url": "",
6370
6601
  "attributes": [
6371
- { "name": "caption", "value": { "type": "string" } },
6372
- { "name": "entity-id", "value": { "type": "string" } },
6373
- { "name": "entity-id-show", "value": { "type": "boolean" } },
6374
- { "name": "full-location", "value": { "type": "string" } },
6375
- {
6376
- "name": "modal",
6377
- "value": { "type": "boolean", "default": "false" }
6378
- },
6379
- {
6380
- "name": "nested",
6381
- "value": { "type": "boolean", "default": "false" }
6382
- },
6383
6602
  {
6384
- "name": "primary",
6385
- "value": { "type": "boolean", "default": "false" }
6603
+ "name": "name",
6604
+ "description": "The name of the control, submitted as a name/value pair with form data.",
6605
+ "value": { "type": "string", "default": "''" }
6386
6606
  },
6387
- { "name": "previous-path", "value": { "type": "string" } },
6388
- { "name": "previous-target", "value": { "type": "string" } },
6389
- { "name": "summary", "value": { "type": "string" } },
6390
- { "name": "master-id", "value": { "type": "string" } },
6391
6607
  {
6392
- "name": "default-uri",
6608
+ "name": "form",
6609
+ "description": "Associates the control with a form by id. The form must be in the same document or shadow root.",
6393
6610
  "value": { "type": "string", "default": "''" }
6394
6611
  },
6395
6612
  {
6396
- "name": "active",
6613
+ "name": "config",
6614
+ "description": "The page state as a JSON string. Parsed on set; invalid JSON is ignored with a warning.",
6397
6615
  "value": { "type": "string", "default": "''" }
6398
6616
  },
6399
- { "name": "split", "value": { "type": "number" } },
6400
6617
  {
6401
- "name": "split-min",
6402
- "value": { "type": "number", "default": "60" }
6618
+ "name": "heading",
6619
+ "value": { "type": "string", "default": "''" }
6403
6620
  },
6404
- { "name": "split-min-secondary", "value": { "type": "number" } },
6405
- { "name": "split-max", "value": { "type": "number" } },
6406
6621
  {
6407
- "name": "primary-caption",
6408
- "value": { "type": "string", "default": "'Navigation'" }
6622
+ "name": "subheading",
6623
+ "value": { "type": "string", "default": "''" }
6409
6624
  },
6410
6625
  {
6411
- "name": "secondary-caption",
6412
- "value": { "type": "string", "default": "'Content'" }
6626
+ "name": "required-first",
6627
+ "description": "Section type key that must lead the page. The builder hoists an existing section of\nthat type to the top, or inserts an empty one, and pins it there: it can't be\nremoved, reordered or dragged into a slot, and nothing can be dropped above it.\nIts content stays fully editable in the inspector.",
6628
+ "value": { "type": "string", "default": "''" }
6413
6629
  },
6414
6630
  {
6415
- "name": "no-prefetch",
6631
+ "name": "palette-collapsed",
6632
+ "description": "Collapses the left palette. Auto-set when the builder becomes narrow.",
6416
6633
  "value": { "type": "boolean", "default": "false" }
6417
6634
  },
6418
6635
  {
6419
- "name": "no-cache",
6636
+ "name": "inspector-collapsed",
6637
+ "description": "Collapses the inspector while a section is selected.",
6420
6638
  "value": { "type": "boolean", "default": "false" }
6421
6639
  },
6422
- { "name": "local-storage", "value": { "type": "boolean" } },
6423
- { "name": "store-key", "value": { "type": "string" } },
6424
- {
6425
- "name": "store-ttl",
6426
- "value": { "type": "number", "default": "0" }
6427
- },
6428
6640
  {
6429
- "name": "padded",
6430
- "value": { "type": "boolean", "default": "false" }
6431
- },
6641
+ "name": "auto-save",
6642
+ "description": "Auto-save the page to localStorage (1-day TTL). Omit to disable. A bare\n`auto-save` saves every 5 minutes; a numeric value sets the interval in\nminutes (`auto-save=\"2\"`). Restore with `restoreAutoSave()`.",
6643
+ "value": { "type": "number | null", "default": "null" }
6644
+ }
6645
+ ],
6646
+ "slots": [
6432
6647
  {
6433
- "name": "fetch-style",
6434
- "value": { "type": "string", "default": "\"\"" }
6648
+ "name": "config",
6649
+ "description": "`<template type=\"…\">` declarations; never displayed. Each template's attributes (type, label, icon, icon-library, color, category, description, slots, accepts) declare a palette entry and its content declares the inspector form for that type. `slots` makes the section a container with that many child slots; `accepts` is a comma-separated list of the type keys its slots allow."
6435
6650
  },
6436
6651
  {
6437
- "name": "full-width",
6438
- "value": { "type": "boolean", "default": "false" }
6439
- },
6440
- {
6441
- "name": "padded-right",
6442
- "value": { "type": "boolean", "default": "false" }
6443
- },
6444
- { "name": "monitor", "value": { "type": "string" } },
6445
- { "name": "description", "value": { "type": "string" } }
6446
- ],
6447
- "slots": [
6448
- {
6449
- "name": "",
6450
- "description": "Page content. Use zn-tab for named tabs and header-action/header-actions for header actions."
6451
- },
6452
- {
6453
- "name": "description",
6454
- "description": "Rich subtitle/description content. Falls back to the `summary` attribute when empty."
6455
- },
6456
- {
6457
- "name": "bottom",
6458
- "description": "Content rendered below the navbar row (e.g. chips, filters). Forwarded to the navbar's bottom slot."
6459
- },
6460
- { "name": "example", "description": "An example slot." }
6461
- ],
6462
- "events": [
6463
- { "name": "zn-event-name", "description": "Emitted as an example." }
6464
- ],
6465
- "js": {
6466
- "properties": [
6467
- { "name": "caption", "type": "string" },
6468
- { "name": "entityId", "type": "string" },
6469
- { "name": "entityIdShow", "type": "boolean" },
6470
- { "name": "fullLocation", "type": "string" },
6471
- { "name": "modal", "type": "boolean" },
6472
- { "name": "nested", "type": "boolean" },
6473
- { "name": "primary", "type": "boolean" },
6474
- { "name": "previousPath", "type": "string" },
6475
- { "name": "previousTarget", "type": "string" },
6476
- { "name": "summary", "type": "string" },
6477
- { "name": "_registerTabs" },
6478
- { "name": "masterId", "type": "string" },
6479
- { "name": "defaultUri", "type": "string" },
6480
- { "name": "_current", "type": "string" },
6481
- { "name": "_split", "type": "number" },
6482
- { "name": "_splitMin", "type": "number" },
6483
- { "name": "_splitMinSecondary", "type": "number" },
6484
- { "name": "_splitMax", "type": "number" },
6485
- { "name": "primaryCaption", "type": "string" },
6486
- { "name": "secondaryCaption", "type": "string" },
6487
- { "name": "noPrefetch", "type": "boolean" },
6488
- { "name": "noCache", "type": "boolean" },
6489
- { "name": "localStorage", "type": "boolean" },
6490
- { "name": "storeKey", "type": "string" },
6491
- { "name": "storeTtl", "type": "number" },
6492
- { "name": "padded", "type": "boolean" },
6493
- { "name": "fetchStyle", "type": "string" },
6494
- { "name": "fullWidth", "type": "boolean" },
6495
- { "name": "paddedRight", "type": "boolean" },
6496
- { "name": "monitor", "type": "string" },
6497
- { "name": "description", "type": "string" },
6498
- { "name": "reRegisterTabs" }
6499
- ],
6500
- "events": [
6501
- {
6502
- "name": "zn-event-name",
6503
- "description": "Emitted as an example."
6504
- }
6505
- ]
6506
- }
6507
- },
6508
- {
6509
- "name": "zn-page-builder",
6510
- "description": "A config-driven page composer: a palette of predefined section types, a linear\ncanvas of section cards, and an inspector for editing each section's content.\n---\n\n\n### **Events:**\n - **zn-page-change** - Emitted whenever the page state changes. `event.detail.state` is the new PageState.\n- **zn-page-selection-change** - Emitted when the selected section changes. `event.detail.sectionId`.\n\n### **Methods:**\n - **checkValidity(): _boolean_** - Checks for validity but does not show a validation message.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity(): _boolean_** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(_message)** - Sets a custom validation message. Pass an empty string to restore validity.\n- **addSection(type: _string_, index: _number_): _PageSection | null_** - Adds a section of a registered type at `index` (default: end). Returns null for unknown types.\n- **addSectionToSlot(type: _string_, containerId: _string_, slotIndex: _number_): _PageSection | null_** - Adds a new section of a registered type into a container's slot. Returns null if not allowed.\n\n### **Slots:**\n - **config** - `<template type=\"…\">` declarations; never displayed. Each template's attributes (type, label, icon, icon-library, color, category, description, slots, accepts) declare a palette entry and its content declares the inspector form for that type. `slots` makes the section a container with that many child slots; `accepts` is a comma-separated list of the type keys its slots allow.\n- **header-left** - Actions shown on the left of the header bar.\n- **header-right** - Actions shown on the right of the header bar.\n\n### **CSS Parts:**\n - **base** - The grid wrapper.\n- **header** - The full-width header action bar (only rendered when header slots are filled).\n- **palette** - The left palette panel.\n- **canvas** - The centre section-card canvas.\n- **inspector** - The right panel while a section is selected.\n- **inspector-header** - The inspector's fixed header (icon, section name, type, close).\n- **inspector-body** - The inspector's scrolling form area.",
6511
- "doc-url": "",
6512
- "attributes": [
6513
- {
6514
- "name": "name",
6515
- "description": "The name of the control, submitted as a name/value pair with form data.",
6516
- "value": { "type": "string", "default": "''" }
6517
- },
6518
- {
6519
- "name": "form",
6520
- "description": "Associates the control with a form by id. The form must be in the same document or shadow root.",
6521
- "value": { "type": "string", "default": "''" }
6522
- },
6523
- {
6524
- "name": "config",
6525
- "description": "The page state as a JSON string. Parsed on set; invalid JSON is ignored with a warning.",
6526
- "value": { "type": "string", "default": "''" }
6527
- },
6528
- {
6529
- "name": "heading",
6530
- "value": { "type": "string", "default": "''" }
6531
- },
6532
- {
6533
- "name": "subheading",
6534
- "value": { "type": "string", "default": "''" }
6535
- },
6536
- {
6537
- "name": "required-first",
6538
- "description": "Section type key that must lead the page. The builder hoists an existing section of\nthat type to the top, or inserts an empty one, and pins it there: it can't be\nremoved, reordered or dragged into a slot, and nothing can be dropped above it.\nIts content stays fully editable in the inspector.",
6539
- "value": { "type": "string", "default": "''" }
6540
- },
6541
- {
6542
- "name": "palette-collapsed",
6543
- "description": "Collapses the left palette. Auto-set when the builder becomes narrow.",
6544
- "value": { "type": "boolean", "default": "false" }
6545
- },
6546
- {
6547
- "name": "inspector-collapsed",
6548
- "description": "Collapses the inspector while a section is selected.",
6549
- "value": { "type": "boolean", "default": "false" }
6550
- },
6551
- {
6552
- "name": "auto-save",
6553
- "description": "Auto-save the page to localStorage (1-day TTL). Omit to disable. A bare\n`auto-save` saves every 5 minutes; a numeric value sets the interval in\nminutes (`auto-save=\"2\"`). Restore with `restoreAutoSave()`.",
6554
- "value": { "type": "number | null", "default": "null" }
6555
- }
6556
- ],
6557
- "slots": [
6558
- {
6559
- "name": "config",
6560
- "description": "`<template type=\"…\">` declarations; never displayed. Each template's attributes (type, label, icon, icon-library, color, category, description, slots, accepts) declare a palette entry and its content declares the inspector form for that type. `slots` makes the section a container with that many child slots; `accepts` is a comma-separated list of the type keys its slots allow."
6561
- },
6562
- {
6563
- "name": "header-left",
6564
- "description": "Actions shown on the left of the header bar."
6652
+ "name": "header-left",
6653
+ "description": "Actions shown on the left of the header bar."
6565
6654
  },
6566
6655
  {
6567
6656
  "name": "header-right",
@@ -6666,11 +6755,29 @@
6666
6755
  }
6667
6756
  },
6668
6757
  {
6669
- "name": "zn-page-nav",
6670
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Methods:**\n \n\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
6758
+ "name": "zn-page",
6759
+ "description": "Combines a page header with tab navigation and tab panels.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Methods:**\n \n\n\n### **Slots:**\n - _default_ - Page content. Use zn-tab for named tabs and header-action/header-actions for header actions.\n- **description** - Rich subtitle/description content. Falls back to the `summary` attribute when empty.\n- **bottom** - Content rendered below the navbar row (e.g. chips, filters). Forwarded to the navbar's bottom slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
6671
6760
  "doc-url": "",
6672
6761
  "attributes": [
6673
- { "name": "navigation", "value": { "type": "PageNavData" } },
6762
+ { "name": "caption", "value": { "type": "string" } },
6763
+ { "name": "entity-id", "value": { "type": "string" } },
6764
+ { "name": "entity-id-show", "value": { "type": "boolean" } },
6765
+ { "name": "full-location", "value": { "type": "string" } },
6766
+ {
6767
+ "name": "modal",
6768
+ "value": { "type": "boolean", "default": "false" }
6769
+ },
6770
+ {
6771
+ "name": "nested",
6772
+ "value": { "type": "boolean", "default": "false" }
6773
+ },
6774
+ {
6775
+ "name": "primary",
6776
+ "value": { "type": "boolean", "default": "false" }
6777
+ },
6778
+ { "name": "previous-path", "value": { "type": "string" } },
6779
+ { "name": "previous-target", "value": { "type": "string" } },
6780
+ { "name": "summary", "value": { "type": "string" } },
6674
6781
  { "name": "master-id", "value": { "type": "string" } },
6675
6782
  {
6676
6783
  "name": "default-uri",
@@ -6726,11 +6833,21 @@
6726
6833
  "value": { "type": "boolean", "default": "false" }
6727
6834
  },
6728
6835
  { "name": "monitor", "value": { "type": "string" } },
6729
- { "name": "caption", "value": { "type": "string" } },
6730
6836
  { "name": "description", "value": { "type": "string" } }
6731
6837
  ],
6732
6838
  "slots": [
6733
- { "name": "", "description": "The default slot." },
6839
+ {
6840
+ "name": "",
6841
+ "description": "Page content. Use zn-tab for named tabs and header-action/header-actions for header actions."
6842
+ },
6843
+ {
6844
+ "name": "description",
6845
+ "description": "Rich subtitle/description content. Falls back to the `summary` attribute when empty."
6846
+ },
6847
+ {
6848
+ "name": "bottom",
6849
+ "description": "Content rendered below the navbar row (e.g. chips, filters). Forwarded to the navbar's bottom slot."
6850
+ },
6734
6851
  { "name": "example", "description": "An example slot." }
6735
6852
  ],
6736
6853
  "events": [
@@ -6738,8 +6855,17 @@
6738
6855
  ],
6739
6856
  "js": {
6740
6857
  "properties": [
6741
- { "name": "navigation", "type": "PageNavData" },
6742
- { "name": "breadcrumb", "type": "string" },
6858
+ { "name": "caption", "type": "string" },
6859
+ { "name": "entityId", "type": "string" },
6860
+ { "name": "entityIdShow", "type": "boolean" },
6861
+ { "name": "fullLocation", "type": "string" },
6862
+ { "name": "modal", "type": "boolean" },
6863
+ { "name": "nested", "type": "boolean" },
6864
+ { "name": "primary", "type": "boolean" },
6865
+ { "name": "previousPath", "type": "string" },
6866
+ { "name": "previousTarget", "type": "string" },
6867
+ { "name": "summary", "type": "string" },
6868
+ { "name": "_registerTabs" },
6743
6869
  { "name": "masterId", "type": "string" },
6744
6870
  { "name": "defaultUri", "type": "string" },
6745
6871
  { "name": "_current", "type": "string" },
@@ -6759,54 +6885,9 @@
6759
6885
  { "name": "fullWidth", "type": "boolean" },
6760
6886
  { "name": "paddedRight", "type": "boolean" },
6761
6887
  { "name": "monitor", "type": "string" },
6762
- { "name": "caption", "type": "string" },
6763
6888
  { "name": "description", "type": "string" },
6764
- { "name": "reRegisterTabs" },
6765
- { "name": "_registerTabs" }
6766
- ],
6767
- "events": [
6768
- {
6769
- "name": "zn-event-name",
6770
- "description": "Emitted as an example."
6771
- }
6772
- ]
6773
- }
6774
- },
6775
- {
6776
- "name": "zn-pagination",
6777
- "description": "Pagination component for navigating through pages of content.\n---\n",
6778
- "doc-url": "",
6779
- "attributes": [
6780
- { "name": "limit", "value": { "type": "number", "default": "10" } },
6781
- { "name": "total", "value": { "type": "number", "default": "0" } },
6782
- { "name": "page", "value": { "type": "number", "default": "1" } },
6783
- { "name": "uri", "value": { "type": "string", "default": "\"\"" } }
6784
- ],
6785
- "events": [],
6786
- "js": {
6787
- "properties": [
6788
- { "name": "limit", "type": "number" },
6789
- { "name": "total", "type": "number" },
6790
- { "name": "page", "type": "number" },
6791
- { "name": "uri", "type": "string" }
6889
+ { "name": "reRegisterTabs" }
6792
6890
  ],
6793
- "events": []
6794
- }
6795
- },
6796
- {
6797
- "name": "zn-pane",
6798
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
6799
- "doc-url": "",
6800
- "attributes": [{ "name": "flush", "value": { "type": "boolean" } }],
6801
- "slots": [
6802
- { "name": "", "description": "The default slot." },
6803
- { "name": "example", "description": "An example slot." }
6804
- ],
6805
- "events": [
6806
- { "name": "zn-event-name", "description": "Emitted as an example." }
6807
- ],
6808
- "js": {
6809
- "properties": [{ "name": "flush", "type": "boolean" }],
6810
6891
  "events": [
6811
6892
  {
6812
6893
  "name": "zn-event-name",
@@ -6816,38 +6897,188 @@
6816
6897
  }
6817
6898
  },
6818
6899
  {
6819
- "name": "zn-panel",
6820
- "description": "Panels are versatile containers that provide structure for organizing content with optional headers and footers.\n---\n\n\n### **Slots:**\n - _default_ - The panel's main content.\n- **actions** - Actions displayed in the panel header (buttons, chips, etc).\n- **footer** - Content displayed in the panel footer.\n\n### **CSS Properties:**\n - **--zn-panel-basis** - The flex-basis of the panel. Can be set using the basis-px attribute. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
6900
+ "name": "zn-page-nav",
6901
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Methods:**\n \n\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
6821
6902
  "doc-url": "",
6822
6903
  "attributes": [
6823
- { "name": "basis-px", "value": { "type": "number" } },
6824
- { "name": "caption", "value": { "type": "string" } },
6825
- { "name": "icon", "value": { "type": "string" } },
6826
- { "name": "tabbed", "value": { "type": "boolean" } },
6827
- { "name": "header-borderless", "value": { "type": "boolean" } },
6828
- { "name": "cosmic", "value": { "type": "boolean" } },
6829
- { "name": "flush", "value": { "type": "boolean" } },
6830
- { "name": "flush-x", "value": { "type": "boolean" } },
6831
- { "name": "flush-y", "value": { "type": "boolean" } },
6832
- { "name": "flush-footer", "value": { "type": "boolean" } },
6833
- { "name": "transparent", "value": { "type": "boolean" } },
6834
- { "name": "shadow", "value": { "type": "boolean" } }
6835
- ],
6836
- "slots": [
6837
- { "name": "", "description": "The panel's main content." },
6904
+ { "name": "navigation", "value": { "type": "PageNavData" } },
6905
+ { "name": "master-id", "value": { "type": "string" } },
6838
6906
  {
6839
- "name": "actions",
6840
- "description": "Actions displayed in the panel header (buttons, chips, etc)."
6907
+ "name": "default-uri",
6908
+ "value": { "type": "string", "default": "''" }
6841
6909
  },
6842
6910
  {
6843
- "name": "footer",
6844
- "description": "Content displayed in the panel footer."
6845
- }
6846
- ],
6847
- "events": [],
6848
- "js": {
6849
- "properties": [
6850
- { "name": "basis", "type": "number" },
6911
+ "name": "active",
6912
+ "value": { "type": "string", "default": "''" }
6913
+ },
6914
+ { "name": "split", "value": { "type": "number" } },
6915
+ {
6916
+ "name": "split-min",
6917
+ "value": { "type": "number", "default": "60" }
6918
+ },
6919
+ { "name": "split-min-secondary", "value": { "type": "number" } },
6920
+ { "name": "split-max", "value": { "type": "number" } },
6921
+ {
6922
+ "name": "primary-caption",
6923
+ "value": { "type": "string", "default": "'Navigation'" }
6924
+ },
6925
+ {
6926
+ "name": "secondary-caption",
6927
+ "value": { "type": "string", "default": "'Content'" }
6928
+ },
6929
+ {
6930
+ "name": "no-prefetch",
6931
+ "value": { "type": "boolean", "default": "false" }
6932
+ },
6933
+ {
6934
+ "name": "no-cache",
6935
+ "value": { "type": "boolean", "default": "false" }
6936
+ },
6937
+ { "name": "local-storage", "value": { "type": "boolean" } },
6938
+ { "name": "store-key", "value": { "type": "string" } },
6939
+ {
6940
+ "name": "store-ttl",
6941
+ "value": { "type": "number", "default": "0" }
6942
+ },
6943
+ {
6944
+ "name": "padded",
6945
+ "value": { "type": "boolean", "default": "false" }
6946
+ },
6947
+ {
6948
+ "name": "fetch-style",
6949
+ "value": { "type": "string", "default": "\"\"" }
6950
+ },
6951
+ {
6952
+ "name": "full-width",
6953
+ "value": { "type": "boolean", "default": "false" }
6954
+ },
6955
+ {
6956
+ "name": "padded-right",
6957
+ "value": { "type": "boolean", "default": "false" }
6958
+ },
6959
+ { "name": "monitor", "value": { "type": "string" } },
6960
+ { "name": "caption", "value": { "type": "string" } },
6961
+ { "name": "description", "value": { "type": "string" } }
6962
+ ],
6963
+ "slots": [
6964
+ { "name": "", "description": "The default slot." },
6965
+ { "name": "example", "description": "An example slot." }
6966
+ ],
6967
+ "events": [
6968
+ { "name": "zn-event-name", "description": "Emitted as an example." }
6969
+ ],
6970
+ "js": {
6971
+ "properties": [
6972
+ { "name": "navigation", "type": "PageNavData" },
6973
+ { "name": "breadcrumb", "type": "string" },
6974
+ { "name": "masterId", "type": "string" },
6975
+ { "name": "defaultUri", "type": "string" },
6976
+ { "name": "_current", "type": "string" },
6977
+ { "name": "_split", "type": "number" },
6978
+ { "name": "_splitMin", "type": "number" },
6979
+ { "name": "_splitMinSecondary", "type": "number" },
6980
+ { "name": "_splitMax", "type": "number" },
6981
+ { "name": "primaryCaption", "type": "string" },
6982
+ { "name": "secondaryCaption", "type": "string" },
6983
+ { "name": "noPrefetch", "type": "boolean" },
6984
+ { "name": "noCache", "type": "boolean" },
6985
+ { "name": "localStorage", "type": "boolean" },
6986
+ { "name": "storeKey", "type": "string" },
6987
+ { "name": "storeTtl", "type": "number" },
6988
+ { "name": "padded", "type": "boolean" },
6989
+ { "name": "fetchStyle", "type": "string" },
6990
+ { "name": "fullWidth", "type": "boolean" },
6991
+ { "name": "paddedRight", "type": "boolean" },
6992
+ { "name": "monitor", "type": "string" },
6993
+ { "name": "caption", "type": "string" },
6994
+ { "name": "description", "type": "string" },
6995
+ { "name": "reRegisterTabs" },
6996
+ { "name": "_registerTabs" }
6997
+ ],
6998
+ "events": [
6999
+ {
7000
+ "name": "zn-event-name",
7001
+ "description": "Emitted as an example."
7002
+ }
7003
+ ]
7004
+ }
7005
+ },
7006
+ {
7007
+ "name": "zn-pagination",
7008
+ "description": "Pagination component for navigating through pages of content.\n---\n",
7009
+ "doc-url": "",
7010
+ "attributes": [
7011
+ { "name": "limit", "value": { "type": "number", "default": "10" } },
7012
+ { "name": "total", "value": { "type": "number", "default": "0" } },
7013
+ { "name": "page", "value": { "type": "number", "default": "1" } },
7014
+ { "name": "uri", "value": { "type": "string", "default": "\"\"" } }
7015
+ ],
7016
+ "events": [],
7017
+ "js": {
7018
+ "properties": [
7019
+ { "name": "limit", "type": "number" },
7020
+ { "name": "total", "type": "number" },
7021
+ { "name": "page", "type": "number" },
7022
+ { "name": "uri", "type": "string" }
7023
+ ],
7024
+ "events": []
7025
+ }
7026
+ },
7027
+ {
7028
+ "name": "zn-pane",
7029
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
7030
+ "doc-url": "",
7031
+ "attributes": [{ "name": "flush", "value": { "type": "boolean" } }],
7032
+ "slots": [
7033
+ { "name": "", "description": "The default slot." },
7034
+ { "name": "example", "description": "An example slot." }
7035
+ ],
7036
+ "events": [
7037
+ { "name": "zn-event-name", "description": "Emitted as an example." }
7038
+ ],
7039
+ "js": {
7040
+ "properties": [{ "name": "flush", "type": "boolean" }],
7041
+ "events": [
7042
+ {
7043
+ "name": "zn-event-name",
7044
+ "description": "Emitted as an example."
7045
+ }
7046
+ ]
7047
+ }
7048
+ },
7049
+ {
7050
+ "name": "zn-panel",
7051
+ "description": "Panels are versatile containers that provide structure for organizing content with optional headers and footers.\n---\n\n\n### **Slots:**\n - _default_ - The panel's main content.\n- **actions** - Actions displayed in the panel header (buttons, chips, etc).\n- **footer** - Content displayed in the panel footer.\n\n### **CSS Properties:**\n - **--zn-panel-basis** - The flex-basis of the panel. Can be set using the basis-px attribute. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
7052
+ "doc-url": "",
7053
+ "attributes": [
7054
+ { "name": "basis-px", "value": { "type": "number" } },
7055
+ { "name": "caption", "value": { "type": "string" } },
7056
+ { "name": "icon", "value": { "type": "string" } },
7057
+ { "name": "tabbed", "value": { "type": "boolean" } },
7058
+ { "name": "header-borderless", "value": { "type": "boolean" } },
7059
+ { "name": "cosmic", "value": { "type": "boolean" } },
7060
+ { "name": "flush", "value": { "type": "boolean" } },
7061
+ { "name": "flush-x", "value": { "type": "boolean" } },
7062
+ { "name": "flush-y", "value": { "type": "boolean" } },
7063
+ { "name": "flush-footer", "value": { "type": "boolean" } },
7064
+ { "name": "transparent", "value": { "type": "boolean" } },
7065
+ { "name": "shadow", "value": { "type": "boolean" } }
7066
+ ],
7067
+ "slots": [
7068
+ { "name": "", "description": "The panel's main content." },
7069
+ {
7070
+ "name": "actions",
7071
+ "description": "Actions displayed in the panel header (buttons, chips, etc)."
7072
+ },
7073
+ {
7074
+ "name": "footer",
7075
+ "description": "Content displayed in the panel footer."
7076
+ }
7077
+ ],
7078
+ "events": [],
7079
+ "js": {
7080
+ "properties": [
7081
+ { "name": "basis", "type": "number" },
6851
7082
  { "name": "caption", "type": "string" },
6852
7083
  { "name": "icon", "type": "string" },
6853
7084
  { "name": "tabbed", "type": "boolean" },
@@ -7570,7 +7801,7 @@
7570
7801
  },
7571
7802
  {
7572
7803
  "name": "zn-radio",
7573
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-blur** - Emitted when the radio loses focus.\n- **zn-change** - Emitted when the checked state changes.\n- **zn-focus** - Emitted when the radio gains focus.\n- **zn-input** - Emitted when the radio receives input.\n- **zn-invalid** - Emitted when the form control has been checked for validity and its constraints aren't satisfied.\n\n### **Methods:**\n - **click()** - Simulates a click on the radio.\n- **focus(options: _FocusOptions_)** - Sets focus on the radio.\n- **blur()** - Removes focus from the radio.\n- **checkValidity()** - Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity()** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(message: _string_)** - Sets a custom validation message. The value provided will be shown to the user when the form is submitted. To clear\nthe custom validation message, call this method with an empty string.\n\n### **Slots:**\n - _default_ - The radio's label.\n- **description** - A description of the radio's label. Serves as help text for a radio item. Alternatively, you can use the `description` attribute.\n- **selected-content** - Use to nest rich content (like an input) inside a selected radio item. Use only with the contained style.\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **control** - The square container that wraps the radio's checked state.\n- **control--checked** - Matches the control part when the radio is checked.\n- **checked-icon** - The checked icon, an `<zn-icon>` element.\n- **label** - The container that wraps the radio's label.\n- **description** - The container that wraps the radio's description.\n- **selected-content** - The container that wraps optional content that appears when a radio is checked.",
7804
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-blur** - Emitted when the radio loses focus.\n- **zn-change** - Emitted when the checked state changes.\n- **zn-focus** - Emitted when the radio gains focus.\n- **zn-input** - Emitted when the radio receives input.\n- **zn-invalid** - Emitted when the form control has been checked for validity and its constraints aren't satisfied.\n\n### **Methods:**\n - **click()** - Simulates a click on the radio.\n- **focus(options: _FocusOptions_)** - Sets focus on the radio.\n- **blur()** - Removes focus from the radio.\n- **checkValidity()** - Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity()** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(message: _string_)** - Sets a custom validation message. The value provided will be shown to the user when the form is submitted. To clear\nthe custom validation message, call this method with an empty string.\n\n### **Slots:**\n - _default_ - The radio's label.\n- **image** - Replaces the built-in image used by contained radios.\n- **description** - A description of the radio's label. Serves as help text for a radio item. Alternatively, you can use the `description` attribute.\n- **selected-content** - Use to nest rich content (like an input) inside a selected radio item. Use only with the contained style.\n\n### **CSS Properties:**\n - **--zn-selection-card-image-width** - Width of the built-in card image. _(default: undefined)_\n- **--zn-selection-card-image-height** - Height of the built-in card image. _(default: undefined)_\n- **--zn-selection-card-min-height** - Minimum height of a contained radio with an image. _(default: undefined)_\n- **--zn-selection-card-content-min-width** - Width the card text keeps before it wraps below the image. _(default: undefined)_\n- **--zn-selection-card-title-font-size** - Font size of a selection card title. _(default: undefined)_\n- **--zn-selection-card-padding** - Equal inset around the contents of a selection card. _(default: undefined)_\n- **--zn-selection-card-gap** - Space between the image, title, and indicator gutter. _(default: undefined)_\n- **--zn-selection-card-control-offset** - Distance between a positioned control and the card edge. _(default: undefined)_\n- **--zn-selection-card-border-radius** - Corner radius of a contained container. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **control** - The square container that wraps the radio's checked state.\n- **control--checked** - Matches the control part when the radio is checked.\n- **checked-icon** - The checked icon, an `<zn-icon>` element.\n- **image-container** - The wrapper around the built-in image or image slot.\n- **image** - The built-in image.\n- **card-title** - The title inside a selection card.\n- **label** - The container that wraps the radio's label.\n- **description** - The container that wraps the radio's description.\n- **selected-content** - The container that wraps optional content that appears when a radio is checked.",
7574
7805
  "doc-url": "",
7575
7806
  "attributes": [
7576
7807
  { "name": "title", "value": { "type": "string", "default": "''" } },
@@ -7584,6 +7815,11 @@
7584
7815
  "description": "The current value of the radio, submitted as a name/value pair with form data.",
7585
7816
  "value": { "type": "string" }
7586
7817
  },
7818
+ {
7819
+ "name": "card-title",
7820
+ "description": "Title rendered inside the card. The default slot takes precedence when provided.",
7821
+ "value": { "type": "string", "default": "''" }
7822
+ },
7587
7823
  {
7588
7824
  "name": "size",
7589
7825
  "description": "The radio's size.",
@@ -7607,6 +7843,37 @@
7607
7843
  "description": "Draws a container around the radio.",
7608
7844
  "value": { "type": "boolean", "default": "false" }
7609
7845
  },
7846
+ {
7847
+ "name": "square",
7848
+ "description": "Squares off the corners of the container drawn by `contained`, which is rounded by default.",
7849
+ "value": { "type": "boolean", "default": "false" }
7850
+ },
7851
+ {
7852
+ "name": "src",
7853
+ "description": "URL for the image shown in a contained radio.",
7854
+ "value": { "type": "string", "default": "''" }
7855
+ },
7856
+ {
7857
+ "name": "image-alt",
7858
+ "description": "Accessible text for the built-in image. Leave empty when the image is decorative.",
7859
+ "value": { "type": "string", "default": "''" }
7860
+ },
7861
+ {
7862
+ "name": "image-position",
7863
+ "description": "Places the image above, beside, or below the radio's text. Requires `contained`.",
7864
+ "value": {
7865
+ "type": "SelectionCardImagePosition",
7866
+ "default": "'left'"
7867
+ }
7868
+ },
7869
+ {
7870
+ "name": "control-position",
7871
+ "description": "Places the radio indicator within a contained card. Use `none` to hide the indicator so the card itself\nshows the selected state. Requires `contained`.",
7872
+ "value": {
7873
+ "type": "SelectionCardControlPosition",
7874
+ "default": "'start'"
7875
+ }
7876
+ },
7610
7877
  {
7611
7878
  "name": "horizontal",
7612
7879
  "description": "Applies styles relevant to radios in a horizontal layout.",
@@ -7632,6 +7899,10 @@
7632
7899
  ],
7633
7900
  "slots": [
7634
7901
  { "name": "", "description": "The radio's label." },
7902
+ {
7903
+ "name": "image",
7904
+ "description": "Replaces the built-in image used by contained radios."
7905
+ },
7635
7906
  {
7636
7907
  "name": "description",
7637
7908
  "description": "A description of the radio's label. Serves as help text for a radio item. Alternatively, you can use the `description` attribute."
@@ -7677,6 +7948,11 @@
7677
7948
  "description": "The current value of the radio, submitted as a name/value pair with form data.",
7678
7949
  "type": "string"
7679
7950
  },
7951
+ {
7952
+ "name": "cardTitle",
7953
+ "description": "Title rendered inside the card. The default slot takes precedence when provided.",
7954
+ "type": "string"
7955
+ },
7680
7956
  {
7681
7957
  "name": "size",
7682
7958
  "description": "The radio's size.",
@@ -7697,6 +7973,31 @@
7697
7973
  "description": "Draws a container around the radio.",
7698
7974
  "type": "boolean"
7699
7975
  },
7976
+ {
7977
+ "name": "square",
7978
+ "description": "Squares off the corners of the container drawn by `contained`, which is rounded by default.",
7979
+ "type": "boolean"
7980
+ },
7981
+ {
7982
+ "name": "src",
7983
+ "description": "URL for the image shown in a contained radio.",
7984
+ "type": "string"
7985
+ },
7986
+ {
7987
+ "name": "imageAlt",
7988
+ "description": "Accessible text for the built-in image. Leave empty when the image is decorative.",
7989
+ "type": "string"
7990
+ },
7991
+ {
7992
+ "name": "imagePosition",
7993
+ "description": "Places the image above, beside, or below the radio's text. Requires `contained`.",
7994
+ "type": "SelectionCardImagePosition"
7995
+ },
7996
+ {
7997
+ "name": "controlPosition",
7998
+ "description": "Places the radio indicator within a contained card. Use `none` to hide the indicator so the card itself\nshows the selected state. Requires `contained`.",
7999
+ "type": "SelectionCardControlPosition"
8000
+ },
7700
8001
  {
7701
8002
  "name": "horizontal",
7702
8003
  "description": "Applies styles relevant to radios in a horizontal layout.",
@@ -7759,7 +8060,7 @@
7759
8060
  },
7760
8061
  {
7761
8062
  "name": "zn-radio-group",
7762
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Methods:**\n - **checkValidity()** - Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity(): _boolean_** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(message)** - Sets a custom validation message. Pass an empty string to restore validity.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
8063
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Methods:**\n - **checkValidity()** - Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n- **getForm(): _HTMLFormElement | null_** - Gets the associated form, if one exists.\n- **reportValidity(): _boolean_** - Checks for validity and shows the browser's validation message if the control is invalid.\n- **setCustomValidity(message)** - Sets a custom validation message. Pass an empty string to restore validity.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--zn-radio-group-column-width** - Minimum column width used by the horizontal contained grid, or the card basis when `wrap` is set. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
7763
8064
  "doc-url": "",
7764
8065
  "attributes": [
7765
8066
  {
@@ -7797,12 +8098,22 @@
7797
8098
  },
7798
8099
  {
7799
8100
  "name": "horizontal",
7800
- "description": "The checkbox group's orientation. Changes the group's layout from the default (vertical) to horizontal.",
8101
+ "description": "The radio group's orientation. Changes the group's layout from the default (vertical) to horizontal.",
7801
8102
  "value": { "type": "boolean", "default": "false" }
7802
8103
  },
7803
8104
  {
7804
8105
  "name": "contained",
7805
- "description": "The checkbox group's style. Changes the group's style from the default (plain) style to the 'contained' style. This style will be applied to all child checkboxes.",
8106
+ "description": "The radio group's style. Changes the group's style from the default (plain) style to the 'contained' style. This style will be applied to all child radios.",
8107
+ "value": { "type": "boolean", "default": "false" }
8108
+ },
8109
+ {
8110
+ "name": "square",
8111
+ "description": "Squares off the corners of every contained radio in the group, which are rounded by default.",
8112
+ "value": { "type": "boolean", "default": "false" }
8113
+ },
8114
+ {
8115
+ "name": "wrap",
8116
+ "description": "Lays horizontal contained radios out as a wrapping row instead of an equal-width grid, so each one sizes from\n`--zn-radio-group-column-width` (set it to `auto` to size from content) and wraps onto a new line when needed.",
7806
8117
  "value": { "type": "boolean", "default": "false" }
7807
8118
  },
7808
8119
  {
@@ -7860,12 +8171,22 @@
7860
8171
  },
7861
8172
  {
7862
8173
  "name": "horizontal",
7863
- "description": "The checkbox group's orientation. Changes the group's layout from the default (vertical) to horizontal.",
8174
+ "description": "The radio group's orientation. Changes the group's layout from the default (vertical) to horizontal.",
7864
8175
  "type": "boolean"
7865
8176
  },
7866
8177
  {
7867
8178
  "name": "contained",
7868
- "description": "The checkbox group's style. Changes the group's style from the default (plain) style to the 'contained' style. This style will be applied to all child checkboxes.",
8179
+ "description": "The radio group's style. Changes the group's style from the default (plain) style to the 'contained' style. This style will be applied to all child radios.",
8180
+ "type": "boolean"
8181
+ },
8182
+ {
8183
+ "name": "square",
8184
+ "description": "Squares off the corners of every contained radio in the group, which are rounded by default.",
8185
+ "type": "boolean"
8186
+ },
8187
+ {
8188
+ "name": "wrap",
8189
+ "description": "Lays horizontal contained radios out as a wrapping row instead of an equal-width grid, so each one sizes from\n`--zn-radio-group-column-width` (set it to `auto` to size from content) and wraps onto a new line when needed.",
7869
8190
  "type": "boolean"
7870
8191
  },
7871
8192
  {
@@ -7988,7 +8309,7 @@
7988
8309
  },
7989
8310
  {
7990
8311
  "name": "zn-remarkd-editor",
7991
- "description": "A Notion-style block editor for remarkd content. Blocks render inline; click one to edit its source.\n---\n\n\n### **Events:**\n - **zn-input** - Emitted on each keystroke while editing a block.\n- **zn-change** - Emitted when a block edit is committed and the value changes.\n\n### **Methods:**\n - **focus()** - Starts editing the first block, or a new block if the document is empty.\n- **blur()** - Commits any in-progress block or raw edit.\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **toolbar** - The always-visible block-insert toolbar.\n- **raw-toggle** - The button that switches between the block view and the raw source view.\n- **block** - A rendered block wrapper.\n- **rendered** - The rendered remarkd output of a block.\n- **input** - The textarea shown while editing a block.\n- **raw** - The full-document textarea shown in raw source mode.\n- **slash-menu** - The `zn-slash-menu` opened by typing \"/\" in an empty block.\n- **image-controls** - The caption / alignment / size panel shown when an image block is clicked.\n- **include** - The chip rendered in place of an `include::` directive.\n- **include-picker** - The inline Include picker opened from the toolbar or \"/include\".",
8312
+ "description": "A Notion-style block editor for remarkd content. Blocks render inline; click one to edit its source.\n---\n\n\n### **Events:**\n - **zn-input** - Emitted on each keystroke while editing a block.\n- **zn-change** - Emitted when a block edit is committed and the value changes.\n\n### **Methods:**\n - **focus()** - Starts editing the first block, or a new block if the document is empty.\n- **blur()** - Commits any in-progress block or raw edit.\n\n### **CSS Properties:**\n - **--remarkd-editor-max-height** - The tallest the editor grows before its body scrolls. Defaults to `100dvh`. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **toolbar** - The always-visible block-insert toolbar.\n- **raw-toggle** - The button that switches between the block view and the raw source view.\n- **block** - A rendered block wrapper.\n- **rendered** - The rendered remarkd output of a block.\n- **input** - The textarea shown while editing a block.\n- **raw** - The full-document textarea shown in raw source mode.\n- **slash-menu** - The `zn-slash-menu` opened by typing \"/\" in an empty block.\n- **image-controls** - The caption / alignment / size panel shown when an image block is clicked.\n- **include** - The chip rendered in place of an `include::` directive.\n- **include-picker** - The inline Include picker opened from the toolbar or \"/include\".",
7992
8313
  "doc-url": "",
7993
8314
  "attributes": [
7994
8315
  {
@@ -8473,9 +8794,14 @@
8473
8794
  },
8474
8795
  {
8475
8796
  "name": "zn-scroll-container",
8476
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
8797
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--zn-scroll-container-height** - The height and maximum height of the scroll container. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
8477
8798
  "doc-url": "",
8478
8799
  "attributes": [
8800
+ {
8801
+ "name": "height",
8802
+ "description": "The height and maximum height of the scroll container.",
8803
+ "value": { "type": "string", "default": "''" }
8804
+ },
8479
8805
  {
8480
8806
  "name": "start-scrolled",
8481
8807
  "value": { "type": "boolean", "default": "false" }
@@ -8489,7 +8815,14 @@
8489
8815
  { "name": "zn-event-name", "description": "Emitted as an example." }
8490
8816
  ],
8491
8817
  "js": {
8492
- "properties": [{ "name": "startScrolled", "type": "boolean" }],
8818
+ "properties": [
8819
+ {
8820
+ "name": "height",
8821
+ "description": "The height and maximum height of the scroll container.",
8822
+ "type": "string"
8823
+ },
8824
+ { "name": "startScrolled", "type": "boolean" }
8825
+ ],
8493
8826
  "events": [
8494
8827
  {
8495
8828
  "name": "zn-event-name",
@@ -10642,325 +10975,717 @@
10642
10975
  "type": "SlashMenuItem[]"
10643
10976
  },
10644
10977
  {
10645
- "name": "slashPreset",
10646
- "description": "Names of item sets registered with `registerSlashMenuPreset`, comma separated.",
10978
+ "name": "slashPreset",
10979
+ "description": "Names of item sets registered with `registerSlashMenuPreset`, comma separated.",
10980
+ "type": "string"
10981
+ },
10982
+ {
10983
+ "name": "slashTrigger",
10984
+ "description": "The characters that open the slash menu.",
10985
+ "type": "string"
10986
+ },
10987
+ {
10988
+ "name": "slashHeading",
10989
+ "description": "The name the slash menu's list is announced by.",
10990
+ "type": "string"
10991
+ },
10992
+ {
10993
+ "name": "slashHideKeys",
10994
+ "description": "Hides the insertion keys normally shown against the slash menu's items.",
10995
+ "type": "boolean"
10996
+ },
10997
+ {
10998
+ "name": "slashRecentKey",
10999
+ "description": "Lists the items most recently chosen here above the rest, remembered in `localStorage` under this\nkey. Share a key between the fields that should share a history; leave unset to offer no such list.",
11000
+ "type": "string"
11001
+ },
11002
+ {
11003
+ "name": "slashItemsProvider",
11004
+ "description": "Resolves additional items each time the menu opens, for lists that come from elsewhere (e.g. an\nAPI). Receives the current query and may return a promise. JavaScript only.",
11005
+ "type": "(query: string) => SlashMenuItem[] | Promise<SlashMenuItem[]> | undefined"
11006
+ },
11007
+ {
11008
+ "name": "defaultValue",
11009
+ "description": "The default value of the form control. Primarily used for resetting the form control.",
11010
+ "type": "string"
11011
+ },
11012
+ { "name": "transparent", "type": "boolean" },
11013
+ {
11014
+ "name": "validity",
11015
+ "description": "Gets the validity state object"
11016
+ },
11017
+ {
11018
+ "name": "validationMessage",
11019
+ "description": "Gets the validation message"
11020
+ }
11021
+ ],
11022
+ "events": [
11023
+ {
11024
+ "name": "zn-blur",
11025
+ "description": "Emitted when the control loses focus."
11026
+ },
11027
+ {
11028
+ "name": "zn-change",
11029
+ "description": "Emitted when an alteration to the control's value is committed by the user."
11030
+ },
11031
+ {
11032
+ "name": "zn-focus",
11033
+ "description": "Emitted when the control gains focus."
11034
+ },
11035
+ {
11036
+ "name": "zn-input",
11037
+ "description": "Emitted when the control receives input."
11038
+ },
11039
+ {
11040
+ "name": "zn-invalid",
11041
+ "description": "Emitted when the form control has been checked for validity and its constraints aren't satisfied."
11042
+ },
11043
+ {
11044
+ "name": "zn-slash-select",
11045
+ "description": "Emitted when a slash menu item is chosen. Cancelable — call `preventDefault()` to suppress the insertion and handle the item yourself."
11046
+ },
11047
+ {
11048
+ "name": "zn-slash-insert",
11049
+ "description": "Emitted after a slash menu item's value has been inserted."
11050
+ }
11051
+ ]
11052
+ }
11053
+ },
11054
+ {
11055
+ "name": "zn-theme-editor",
11056
+ "description": "A theme editor: slotted form controls drive a live preview frame,\nwith a toolbar for the preview's light/dark mode and device width.\n---\n\n\n### **Events:**\n - **zn-theme-change** - Emitted when the values, mode or device change.\n- **zn-theme-submit** - Emitted on submit (button click), carrying the current values. With `action` set, only fires after a successful save.\n- **zn-error** - Emitted when a save fails. Also seen for preview render failures: the frame's zn-error is composed and not stopped, so it bubbles out through the editor too.\n\n### **Slots:**\n - _default_ - Ungrouped theme controls, rendered above any sections. Controls assigned `slot=\"<name>\"` matching a `sections` entry (or, when nested, a `groups` entry) render inside that section/group instead. Harvesting and change detection walk every slot's full assigned subtree, not just direct children. With `sections` left unset, the structure is instead derived from the controls' own attributes: `group=\"<label>\"` becomes a tab and `category=\"<label>\"` a collapsible within it, and the control is slotted into that collapsible automatically. Either attribute works alone - a control with only `group` sits directly in its tab, and one with only `category` becomes its own top-level section. Setting `sections` explicitly disables the derivation entirely.\n- **toolbar** - Actions in the toolbar, right-aligned beside the device controls. Where a save button belongs.\n- **footer** - Actions pinned beneath the controls. The built-in submit button lives in the toolbar, not here.\n\n### **CSS Properties:**\n - **--zn-theme-editor-controls-width** - Width of the controls column. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **controls** - The left-hand controls column, full height.\n- **controls-header** - The controls column's header row: `controls-caption` on the left, the light/dark mode toggle on the right.\n- **toolbar** - The preview column's header row: `preview-caption` on the left, the device switcher (and sources/submit) on the right. Spans the preview column only.\n- **section** - A rendered section's or group's collapsible (`section-layout=\"collapsible\"`, or any nested group).\n- **footer** - The footer wrapper beneath the controls.\n- **preview** - The preview column.\n- **error** - The inline error strip.\n- **preview__base** - The frame's base wrapper (forwarded from zn-preview-frame).\n- **preview__stage** - The frame's device-width wrapper (forwarded from zn-preview-frame).\n- **preview__iframe** - The frame's iframe (forwarded from zn-preview-frame).\n- **preview__error** - The frame's own error overlay (forwarded from zn-preview-frame).",
11057
+ "doc-url": "",
11058
+ "attributes": [
11059
+ {
11060
+ "name": "src",
11061
+ "description": "URL of the preview shell page; forwarded to the frame.",
11062
+ "value": { "type": "string", "default": "''" }
11063
+ },
11064
+ {
11065
+ "name": "frame-origin",
11066
+ "description": "Expected origin of the iframe; forwarded to the frame.",
11067
+ "value": { "type": "string", "default": "''" }
11068
+ },
11069
+ {
11070
+ "name": "data-uri",
11071
+ "description": "Optional endpoint returning the base hp-preview:config payload.",
11072
+ "value": { "type": "string", "default": "''" }
11073
+ },
11074
+ {
11075
+ "name": "mode",
11076
+ "description": "Which mode the preview renders in. Travels in the theme payload.",
11077
+ "value": { "type": "ThemeEditorMode", "default": "'light'" }
11078
+ },
11079
+ {
11080
+ "name": "device",
11081
+ "description": "Preview viewport width. Resizes the frame only; not part of the payload.",
11082
+ "value": { "type": "ThemeEditorDevice", "default": "'desktop'" }
11083
+ },
11084
+ {
11085
+ "name": "min-height",
11086
+ "description": "Minimum height of the preview row, in pixels; forwarded to the frame as its own floor.",
11087
+ "value": { "type": "number", "default": "480" }
11088
+ },
11089
+ {
11090
+ "name": "debounce",
11091
+ "description": "Debounce in ms between a control change and the push to the preview.",
11092
+ "value": { "type": "number", "default": "150" }
11093
+ },
11094
+ {
11095
+ "name": "action",
11096
+ "description": "Optional endpoint the values are POSTed to. Empty = no persistence.",
11097
+ "value": { "type": "string", "default": "''" }
11098
+ },
11099
+ {
11100
+ "name": "save-debounce",
11101
+ "description": "Debounce in ms between a control change and the save POST.",
11102
+ "value": { "type": "number", "default": "1000" }
11103
+ },
11104
+ {
11105
+ "name": "sections",
11106
+ "description": "Groups controls into named sections. Empty/unset falls back to deriving the\nstructure from the controls' own `group`/`category` attributes, and renders\none ungrouped column when they carry neither. A section with a non-empty\n`groups` nests a collapsible per group inside a `zn-tabs` tab for that\nsection - see `groups` on `ThemeEditorSection`.",
11107
+ "value": { "type": "ThemeEditorSection[]", "default": "[]" }
11108
+ },
11109
+ {
11110
+ "name": "section-layout",
11111
+ "description": "Presentation for flat, group-less `sections`: stacked `zn-collapsible`s\n(default) or a `zn-tabs` strip. Ignored once any section has `groups` -\nnested sections always render as tabs.",
11112
+ "value": {
11113
+ "type": "'collapsible' | 'tabs'",
11114
+ "default": "'collapsible'"
11115
+ }
11116
+ },
11117
+ {
11118
+ "name": "sources",
11119
+ "description": "Dropdown of preview sources, `{label, src}`, rendered in the toolbar. Empty/unset renders no dropdown; the first entry wins over an explicit `src` when non-empty.",
11120
+ "value": { "type": "ThemeEditorSource[]", "default": "[]" }
11121
+ },
11122
+ {
11123
+ "name": "controls-collapsed",
11124
+ "description": "Collapses the controls column.",
11125
+ "value": { "type": "boolean", "default": "false" }
11126
+ },
11127
+ {
11128
+ "name": "standalone",
11129
+ "description": "Presents the editor as its own bordered, rounded panel with a plain preview backdrop, rather than embedded in a dotted canvas.",
11130
+ "value": { "type": "boolean", "default": "false" }
11131
+ },
11132
+ {
11133
+ "name": "controls-caption",
11134
+ "description": "Caption in the controls column's header row. Empty (default) renders no text; the row itself always renders.",
11135
+ "value": { "type": "string", "default": "''" }
11136
+ },
11137
+ {
11138
+ "name": "preview-caption",
11139
+ "description": "Caption at the left of the toolbar, opposite the device and mode controls. Empty (default) renders no text.",
11140
+ "value": { "type": "string", "default": "''" }
11141
+ },
11142
+ {
11143
+ "name": "submit-label",
11144
+ "description": "Label for the built-in submit button. Empty (default) renders no button.",
11145
+ "value": { "type": "string", "default": "''" }
11146
+ },
11147
+ {
11148
+ "name": "manual",
11149
+ "description": "Disables the debounced auto-save; saving then happens only via submit. Preview pushes are unaffected.",
11150
+ "value": { "type": "boolean", "default": "false" }
11151
+ }
11152
+ ],
11153
+ "slots": [
11154
+ {
11155
+ "name": "",
11156
+ "description": "Ungrouped theme controls, rendered above any sections. Controls assigned `slot=\"<name>\"` matching a `sections` entry (or, when nested, a `groups` entry) render inside that section/group instead. Harvesting and change detection walk every slot's full assigned subtree, not just direct children. With `sections` left unset, the structure is instead derived from the controls' own attributes: `group=\"<label>\"` becomes a tab and `category=\"<label>\"` a collapsible within it, and the control is slotted into that collapsible automatically. Either attribute works alone - a control with only `group` sits directly in its tab, and one with only `category` becomes its own top-level section. Setting `sections` explicitly disables the derivation entirely."
11157
+ },
11158
+ {
11159
+ "name": "toolbar",
11160
+ "description": "Actions in the toolbar, right-aligned beside the device controls. Where a save button belongs."
11161
+ },
11162
+ {
11163
+ "name": "footer",
11164
+ "description": "Actions pinned beneath the controls. The built-in submit button lives in the toolbar, not here."
11165
+ }
11166
+ ],
11167
+ "events": [
11168
+ {
11169
+ "name": "zn-theme-change",
11170
+ "description": "Emitted when the values, mode or device change."
11171
+ },
11172
+ {
11173
+ "name": "zn-theme-submit",
11174
+ "description": "Emitted on submit (button click), carrying the current values. With `action` set, only fires after a successful save."
11175
+ },
11176
+ {
11177
+ "name": "zn-error",
11178
+ "description": "Emitted when a save fails. Also seen for preview render failures: the frame's zn-error is composed and not stopped, so it bubbles out through the editor too."
11179
+ }
11180
+ ],
11181
+ "js": {
11182
+ "properties": [
11183
+ {
11184
+ "name": "src",
11185
+ "description": "URL of the preview shell page; forwarded to the frame.",
11186
+ "type": "string"
11187
+ },
11188
+ {
11189
+ "name": "frameOrigin",
11190
+ "description": "Expected origin of the iframe; forwarded to the frame.",
11191
+ "type": "string"
11192
+ },
11193
+ {
11194
+ "name": "dataUri",
11195
+ "description": "Optional endpoint returning the base hp-preview:config payload.",
11196
+ "type": "string"
11197
+ },
11198
+ {
11199
+ "name": "mode",
11200
+ "description": "Which mode the preview renders in. Travels in the theme payload.",
11201
+ "type": "ThemeEditorMode"
11202
+ },
11203
+ {
11204
+ "name": "device",
11205
+ "description": "Preview viewport width. Resizes the frame only; not part of the payload.",
11206
+ "type": "ThemeEditorDevice"
11207
+ },
11208
+ {
11209
+ "name": "minHeight",
11210
+ "description": "Minimum height of the preview row, in pixels; forwarded to the frame as its own floor.",
11211
+ "type": "number"
11212
+ },
11213
+ {
11214
+ "name": "debounce",
11215
+ "description": "Debounce in ms between a control change and the push to the preview.",
11216
+ "type": "number"
11217
+ },
11218
+ {
11219
+ "name": "action",
11220
+ "description": "Optional endpoint the values are POSTed to. Empty = no persistence.",
11221
+ "type": "string"
11222
+ },
11223
+ {
11224
+ "name": "saveDebounce",
11225
+ "description": "Debounce in ms between a control change and the save POST.",
11226
+ "type": "number"
11227
+ },
11228
+ {
11229
+ "name": "sections",
11230
+ "description": "Groups controls into named sections. Empty/unset falls back to deriving the\nstructure from the controls' own `group`/`category` attributes, and renders\none ungrouped column when they carry neither. A section with a non-empty\n`groups` nests a collapsible per group inside a `zn-tabs` tab for that\nsection - see `groups` on `ThemeEditorSection`.",
11231
+ "type": "ThemeEditorSection[]"
11232
+ },
11233
+ {
11234
+ "name": "sectionLayout",
11235
+ "description": "Presentation for flat, group-less `sections`: stacked `zn-collapsible`s\n(default) or a `zn-tabs` strip. Ignored once any section has `groups` -\nnested sections always render as tabs.",
11236
+ "type": "'collapsible' | 'tabs'"
11237
+ },
11238
+ {
11239
+ "name": "sources",
11240
+ "description": "Dropdown of preview sources, `{label, src}`, rendered in the toolbar. Empty/unset renders no dropdown; the first entry wins over an explicit `src` when non-empty.",
11241
+ "type": "ThemeEditorSource[]"
11242
+ },
11243
+ {
11244
+ "name": "controlsCollapsed",
11245
+ "description": "Collapses the controls column.",
11246
+ "type": "boolean"
11247
+ },
11248
+ {
11249
+ "name": "standalone",
11250
+ "description": "Presents the editor as its own bordered, rounded panel with a plain preview backdrop, rather than embedded in a dotted canvas.",
11251
+ "type": "boolean"
11252
+ },
11253
+ {
11254
+ "name": "controlsCaption",
11255
+ "description": "Caption in the controls column's header row. Empty (default) renders no text; the row itself always renders.",
11256
+ "type": "string"
11257
+ },
11258
+ {
11259
+ "name": "previewCaption",
11260
+ "description": "Caption at the left of the toolbar, opposite the device and mode controls. Empty (default) renders no text.",
11261
+ "type": "string"
11262
+ },
11263
+ {
11264
+ "name": "submitLabel",
11265
+ "description": "Label for the built-in submit button. Empty (default) renders no button.",
11266
+ "type": "string"
11267
+ },
11268
+ {
11269
+ "name": "manual",
11270
+ "description": "Disables the debounced auto-save; saving then happens only via submit. Preview pushes are unaffected.",
11271
+ "type": "boolean"
11272
+ },
11273
+ { "name": "frame", "type": "ZnPreviewFrame" },
11274
+ {
11275
+ "name": "values",
11276
+ "description": "The current per-mode value sets. Returns copies.",
11277
+ "type": "{ light: Record<string, unknown>; dark: Record<string, unknown> }"
11278
+ },
11279
+ {
11280
+ "name": "activeValues",
11281
+ "description": "The active mode's values - what gets pushed to the preview frame.",
11282
+ "type": "Record<string, unknown>"
11283
+ }
11284
+ ],
11285
+ "events": [
11286
+ {
11287
+ "name": "zn-theme-change",
11288
+ "description": "Emitted when the values, mode or device change."
11289
+ },
11290
+ {
11291
+ "name": "zn-theme-submit",
11292
+ "description": "Emitted on submit (button click), carrying the current values. With `action` set, only fires after a successful save."
11293
+ },
11294
+ {
11295
+ "name": "zn-error",
11296
+ "description": "Emitted when a save fails. Also seen for preview render failures: the frame's zn-error is composed and not stopped, so it bubbles out through the editor too."
11297
+ }
11298
+ ]
11299
+ }
11300
+ },
11301
+ {
11302
+ "name": "zn-thumbnail",
11303
+ "description": "A captioned image tile — a fixed aspect-ratio preview with a title beneath it, optional\ncorner badges and actions, and an optional full-screen preview that grows out of the thumbnail.\n---\n\n\n### **Events:**\n - **zn-select** - Emitted when an enabled thumbnail is activated by click or keyboard. Cancelable — call `preventDefault()` to stop the preview from opening and to stop a parent `zn-thumbnail-group` from changing its selection.\n- **zn-show** - Emitted when the preview overlay starts opening.\n- **zn-close** - Emitted once the preview overlay has finished closing.\n\n### **Methods:**\n - **showPreview()** - Opens the preview overlay.\n- **hidePreview()** - Closes the preview overlay.\n\n### **Slots:**\n - _default_ - Fallback content rendered in place of the media when no `src` is set.\n- **image** - Replaces the built-in `<img>` (e.g. a video, canvas or `zn-icon`).\n- **caption** - Replaces the caption text.\n- **badge** - Content pinned to the bottom-left of the media (e.g. a play indicator). Badges take no pointer events and are held back on opacity, so they read as information about the asset rather than as something to click.\n- **actions** - Controls pinned to the bottom-right of the media (e.g. a download button). Each slotted element becomes its own chip, so several actions read as separate icons on the thumbnail rather than one grouped pill. This sits outside the thumbnail's link, so buttons and links here behave normally and never select the thumbnail or follow its `href`.\n- **preview** - Replaces the preview media (e.g. a `<video>` for the full-size asset).\n\n### **CSS Properties:**\n - **--zn-thumbnail-aspect-ratio** - Aspect ratio of the media frame. Defaults to 16 / 9. The `aspect-ratio` attribute sets this on the thumbnail itself; set the property on any ancestor (including a `zn-thumbnail-group`) to apply it to every thumbnail beneath it. _(default: undefined)_\n- **--zn-thumbnail-radius** - Corner radius of the media frame. _(default: undefined)_\n- **--zn-thumbnail-preview-aspect-ratio** - Overrides the measured aspect ratio of the preview panel. By default the panel takes the asset's own ratio so it wraps the image exactly. _(default: undefined)_\n- **--zn-thumbnail-preview-max-width** - Largest width the preview may take. Defaults to 70vw. _(default: undefined)_\n- **--zn-thumbnail-preview-max-height** - Largest height the preview may take. Defaults to 70vh. _(default: undefined)_\n- **--zn-thumbnail-preview-radius** - Corner radius of the preview panel. _(default: undefined)_\n- **--zn-thumbnail-chip-radius** - Corner radius of a badge, action or preview chip. _(default: undefined)_\n- **--zn-thumbnail-chip-background** - Background of a badge, action or preview chip. _(default: undefined)_\n- **--zn-thumbnail-chip-background-hover** - Hover background of an action or preview chip. _(default: undefined)_\n- **--zn-thumbnail-chip-color** - Foreground colour of a badge, action or preview chip. _(default: undefined)_\n- **--zn-thumbnail-chip-gap** - Gap between adjacent chips. _(default: undefined)_\n- **--zn-thumbnail-badge-opacity** - Opacity of a badge, holding it back from the action chips beside it. Defaults to 0.65. _(default: undefined)_\n- **--zn-thumbnail-selected-color** - Ring colour for the selected state. _(default: undefined)_\n- **--zn-thumbnail-active-color** - Ring colour for the active state. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **link** - The anchor (or div) covering the media and caption.\n- **media** - The fixed aspect-ratio media frame.\n- **image** - The built-in image element.\n- **overlay** - The layer holding the badge, actions and preview button.\n- **badge** - The bottom-left badge container.\n- **actions** - The bottom-right actions container.\n- **preview-button** - The built-in preview trigger, when `preview-trigger=\"button\"`.\n- **caption** - The caption beneath the media.\n- **preview** - The preview `<dialog>`.\n- **preview-backdrop** - The full-screen backdrop behind the preview.\n- **preview-frame** - The rounded panel the preview media sits in.\n- **preview-image** - The full-size image inside the preview.\n- **preview-close** - The preview's close button.",
11304
+ "doc-url": "",
11305
+ "attributes": [
11306
+ {
11307
+ "name": "src",
11308
+ "description": "Image URL for the built-in `<img>`.",
11309
+ "value": { "type": "string" }
11310
+ },
11311
+ {
11312
+ "name": "alt",
11313
+ "description": "Alternative text for the built-in image. Falls back to the caption.",
11314
+ "value": { "type": "string" }
11315
+ },
11316
+ {
11317
+ "name": "caption",
11318
+ "description": "The title shown beneath the media.",
11319
+ "value": { "type": "string", "default": "''" }
11320
+ },
11321
+ {
11322
+ "name": "aspect-ratio",
11323
+ "description": "Aspect ratio of the media frame, as any CSS `aspect-ratio` value (e.g. `1 / 1`, `4 / 3`).\nTakes precedence over an inherited `--zn-thumbnail-aspect-ratio`. Defaults to `16 / 9`.",
11324
+ "value": { "type": "string", "default": "''" }
11325
+ },
11326
+ {
11327
+ "name": "href",
11328
+ "description": "Renders the thumbnail as a link to this URL.",
11329
+ "value": { "type": "string" }
11330
+ },
11331
+ {
11332
+ "name": "target",
11333
+ "description": "Where to open `href` (e.g. `_blank`).",
11334
+ "value": { "type": "string" }
11335
+ },
11336
+ {
11337
+ "name": "full-uri",
11338
+ "description": "URL of the full-size asset. Setting this enables the preview overlay, which grows out of the\nthumbnail's position over a full-screen backdrop.",
11339
+ "value": { "type": "string", "default": "''" }
11340
+ },
11341
+ {
11342
+ "name": "preview-trigger",
11343
+ "description": "How the preview opens. `click` (the default) opens it when the thumbnail is activated; `button`\nadds a dedicated expand control to the media instead, leaving clicks for selection or the link.",
11344
+ "value": { "type": "'click' | 'button'", "default": "'click'" }
11345
+ },
11346
+ {
11347
+ "name": "preview-label",
11348
+ "description": "Accessible label for the built-in preview trigger and the preview overlay.",
11349
+ "value": { "type": "string", "default": "'Preview'" }
11350
+ },
11351
+ {
11352
+ "name": "value",
11353
+ "description": "Identifier reported in the `zn-select` event detail and used for group selection.",
11354
+ "value": { "type": "string", "default": "''" }
11355
+ },
11356
+ {
11357
+ "name": "selected",
11358
+ "description": "Draws the selected ring. Managed automatically inside a `selectable` `zn-thumbnail-group`.",
11359
+ "value": { "type": "boolean", "default": "false" }
11360
+ },
11361
+ {
11362
+ "name": "active",
11363
+ "description": "Draws the active ring — for the thumbnail currently in use (playing, open, being edited), as\ndistinct from the user's selection. Takes the ring colour when a thumbnail is both active and\nselected. Recolour it with `--zn-thumbnail-active-color`.",
11364
+ "value": { "type": "boolean", "default": "false" }
11365
+ },
11366
+ {
11367
+ "name": "selectable",
11368
+ "description": "Set by `zn-thumbnail-group` when it manages selection, so the thumbnail reads as clickable.",
11369
+ "value": { "type": "boolean", "default": "false" }
11370
+ },
11371
+ {
11372
+ "name": "disabled",
11373
+ "description": "Dims the thumbnail and blocks selection, navigation and preview.",
11374
+ "value": { "type": "boolean", "default": "false" }
11375
+ },
11376
+ {
11377
+ "name": "icon",
11378
+ "description": "Icon rendered in the bottom-left badge when the `badge` slot is empty.",
11379
+ "value": { "type": "string", "default": "''" }
11380
+ },
11381
+ {
11382
+ "name": "hide-caption",
11383
+ "description": "Hides the caption row, leaving just the media frame.",
11384
+ "value": { "type": "boolean", "default": "false" }
11385
+ }
11386
+ ],
11387
+ "slots": [
11388
+ {
11389
+ "name": "",
11390
+ "description": "Fallback content rendered in place of the media when no `src` is set."
11391
+ },
11392
+ {
11393
+ "name": "image",
11394
+ "description": "Replaces the built-in `<img>` (e.g. a video, canvas or `zn-icon`)."
11395
+ },
11396
+ { "name": "caption", "description": "Replaces the caption text." },
11397
+ {
11398
+ "name": "badge",
11399
+ "description": "Content pinned to the bottom-left of the media (e.g. a play indicator). Badges take no pointer events and are held back on opacity, so they read as information about the asset rather than as something to click."
11400
+ },
11401
+ {
11402
+ "name": "actions",
11403
+ "description": "Controls pinned to the bottom-right of the media (e.g. a download button). Each slotted element becomes its own chip, so several actions read as separate icons on the thumbnail rather than one grouped pill. This sits outside the thumbnail's link, so buttons and links here behave normally and never select the thumbnail or follow its `href`."
11404
+ },
11405
+ {
11406
+ "name": "preview",
11407
+ "description": "Replaces the preview media (e.g. a `<video>` for the full-size asset)."
11408
+ }
11409
+ ],
11410
+ "events": [
11411
+ {
11412
+ "name": "zn-select",
11413
+ "description": "Emitted when an enabled thumbnail is activated by click or keyboard. Cancelable — call `preventDefault()` to stop the preview from opening and to stop a parent `zn-thumbnail-group` from changing its selection."
11414
+ },
11415
+ {
11416
+ "name": "zn-show",
11417
+ "description": "Emitted when the preview overlay starts opening."
11418
+ },
11419
+ {
11420
+ "name": "zn-close",
11421
+ "description": "Emitted once the preview overlay has finished closing."
11422
+ }
11423
+ ],
11424
+ "js": {
11425
+ "properties": [
11426
+ {
11427
+ "name": "src",
11428
+ "description": "Image URL for the built-in `<img>`.",
11429
+ "type": "string"
11430
+ },
11431
+ {
11432
+ "name": "alt",
11433
+ "description": "Alternative text for the built-in image. Falls back to the caption.",
11434
+ "type": "string"
11435
+ },
11436
+ {
11437
+ "name": "caption",
11438
+ "description": "The title shown beneath the media.",
10647
11439
  "type": "string"
10648
11440
  },
10649
11441
  {
10650
- "name": "slashTrigger",
10651
- "description": "The characters that open the slash menu.",
11442
+ "name": "aspectRatio",
11443
+ "description": "Aspect ratio of the media frame, as any CSS `aspect-ratio` value (e.g. `1 / 1`, `4 / 3`).\nTakes precedence over an inherited `--zn-thumbnail-aspect-ratio`. Defaults to `16 / 9`.",
10652
11444
  "type": "string"
10653
11445
  },
10654
11446
  {
10655
- "name": "slashHeading",
10656
- "description": "The name the slash menu's list is announced by.",
11447
+ "name": "href",
11448
+ "description": "Renders the thumbnail as a link to this URL.",
10657
11449
  "type": "string"
10658
11450
  },
10659
11451
  {
10660
- "name": "slashHideKeys",
10661
- "description": "Hides the insertion keys normally shown against the slash menu's items.",
10662
- "type": "boolean"
11452
+ "name": "target",
11453
+ "description": "Where to open `href` (e.g. `_blank`).",
11454
+ "type": "string"
10663
11455
  },
10664
11456
  {
10665
- "name": "slashRecentKey",
10666
- "description": "Lists the items most recently chosen here above the rest, remembered in `localStorage` under this\nkey. Share a key between the fields that should share a history; leave unset to offer no such list.",
11457
+ "name": "fullUri",
11458
+ "description": "URL of the full-size asset. Setting this enables the preview overlay, which grows out of the\nthumbnail's position over a full-screen backdrop.",
10667
11459
  "type": "string"
10668
11460
  },
10669
11461
  {
10670
- "name": "slashItemsProvider",
10671
- "description": "Resolves additional items each time the menu opens, for lists that come from elsewhere (e.g. an\nAPI). Receives the current query and may return a promise. JavaScript only.",
10672
- "type": "(query: string) => SlashMenuItem[] | Promise<SlashMenuItem[]> | undefined"
11462
+ "name": "previewTrigger",
11463
+ "description": "How the preview opens. `click` (the default) opens it when the thumbnail is activated; `button`\nadds a dedicated expand control to the media instead, leaving clicks for selection or the link.",
11464
+ "type": "'click' | 'button'"
10673
11465
  },
10674
11466
  {
10675
- "name": "defaultValue",
10676
- "description": "The default value of the form control. Primarily used for resetting the form control.",
11467
+ "name": "previewLabel",
11468
+ "description": "Accessible label for the built-in preview trigger and the preview overlay.",
10677
11469
  "type": "string"
10678
11470
  },
10679
- { "name": "transparent", "type": "boolean" },
10680
11471
  {
10681
- "name": "validity",
10682
- "description": "Gets the validity state object"
11472
+ "name": "value",
11473
+ "description": "Identifier reported in the `zn-select` event detail and used for group selection.",
11474
+ "type": "string"
10683
11475
  },
10684
11476
  {
10685
- "name": "validationMessage",
10686
- "description": "Gets the validation message"
10687
- }
10688
- ],
10689
- "events": [
11477
+ "name": "selected",
11478
+ "description": "Draws the selected ring. Managed automatically inside a `selectable` `zn-thumbnail-group`.",
11479
+ "type": "boolean"
11480
+ },
10690
11481
  {
10691
- "name": "zn-blur",
10692
- "description": "Emitted when the control loses focus."
11482
+ "name": "active",
11483
+ "description": "Draws the active ring — for the thumbnail currently in use (playing, open, being edited), as\ndistinct from the user's selection. Takes the ring colour when a thumbnail is both active and\nselected. Recolour it with `--zn-thumbnail-active-color`.",
11484
+ "type": "boolean"
10693
11485
  },
10694
11486
  {
10695
- "name": "zn-change",
10696
- "description": "Emitted when an alteration to the control's value is committed by the user."
11487
+ "name": "selectable",
11488
+ "description": "Set by `zn-thumbnail-group` when it manages selection, so the thumbnail reads as clickable.",
11489
+ "type": "boolean"
10697
11490
  },
10698
11491
  {
10699
- "name": "zn-focus",
10700
- "description": "Emitted when the control gains focus."
11492
+ "name": "disabled",
11493
+ "description": "Dims the thumbnail and blocks selection, navigation and preview.",
11494
+ "type": "boolean"
10701
11495
  },
10702
11496
  {
10703
- "name": "zn-input",
10704
- "description": "Emitted when the control receives input."
11497
+ "name": "icon",
11498
+ "description": "Icon rendered in the bottom-left badge when the `badge` slot is empty.",
11499
+ "type": "string"
10705
11500
  },
10706
11501
  {
10707
- "name": "zn-invalid",
10708
- "description": "Emitted when the form control has been checked for validity and its constraints aren't satisfied."
11502
+ "name": "hideCaption",
11503
+ "description": "Hides the caption row, leaving just the media frame.",
11504
+ "type": "boolean"
11505
+ }
11506
+ ],
11507
+ "events": [
11508
+ {
11509
+ "name": "zn-select",
11510
+ "description": "Emitted when an enabled thumbnail is activated by click or keyboard. Cancelable — call `preventDefault()` to stop the preview from opening and to stop a parent `zn-thumbnail-group` from changing its selection."
10709
11511
  },
10710
11512
  {
10711
- "name": "zn-slash-select",
10712
- "description": "Emitted when a slash menu item is chosen. Cancelable — call `preventDefault()` to suppress the insertion and handle the item yourself."
11513
+ "name": "zn-show",
11514
+ "description": "Emitted when the preview overlay starts opening."
10713
11515
  },
10714
11516
  {
10715
- "name": "zn-slash-insert",
10716
- "description": "Emitted after a slash menu item's value has been inserted."
11517
+ "name": "zn-close",
11518
+ "description": "Emitted once the preview overlay has finished closing."
10717
11519
  }
10718
11520
  ]
10719
11521
  }
10720
11522
  },
10721
11523
  {
10722
- "name": "zn-theme-editor",
10723
- "description": "A theme editor: slotted form controls drive a live preview frame,\nwith a toolbar for the preview's light/dark mode and device width.\n---\n\n\n### **Events:**\n - **zn-theme-change** - Emitted when the values, mode or device change.\n- **zn-theme-submit** - Emitted on submit (button click), carrying the current values. With `action` set, only fires after a successful save.\n- **zn-error** - Emitted when a save fails. Also seen for preview render failures: the frame's zn-error is composed and not stopped, so it bubbles out through the editor too.\n\n### **Slots:**\n - _default_ - Ungrouped theme controls, rendered above any sections. Controls assigned `slot=\"<name>\"` matching a `sections` entry (or, when nested, a `groups` entry) render inside that section/group instead. Harvesting and change detection walk every slot's full assigned subtree, not just direct children. With `sections` left unset, the structure is instead derived from the controls' own attributes: `group=\"<label>\"` becomes a tab and `category=\"<label>\"` a collapsible within it, and the control is slotted into that collapsible automatically. Either attribute works alone - a control with only `group` sits directly in its tab, and one with only `category` becomes its own top-level section. Setting `sections` explicitly disables the derivation entirely.\n- **toolbar** - Actions in the toolbar, right-aligned beside the device controls. Where a save button belongs.\n- **footer** - Actions pinned beneath the controls. The built-in submit button lives in the toolbar, not here.\n\n### **CSS Properties:**\n - **--zn-theme-editor-controls-width** - Width of the controls column. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **controls** - The left-hand controls column, full height.\n- **controls-header** - The controls column's header row: `controls-caption` on the left, the light/dark mode toggle on the right.\n- **toolbar** - The preview column's header row: `preview-caption` on the left, the device switcher (and sources/submit) on the right. Spans the preview column only.\n- **section** - A rendered section's or group's collapsible (`section-layout=\"collapsible\"`, or any nested group).\n- **footer** - The footer wrapper beneath the controls.\n- **preview** - The preview column.\n- **error** - The inline error strip.\n- **preview__base** - The frame's base wrapper (forwarded from zn-preview-frame).\n- **preview__stage** - The frame's device-width wrapper (forwarded from zn-preview-frame).\n- **preview__iframe** - The frame's iframe (forwarded from zn-preview-frame).\n- **preview__error** - The frame's own error overlay (forwarded from zn-preview-frame).",
11524
+ "name": "zn-thumbnail-group",
11525
+ "description": "Lays a set of `zn-thumbnail` elements out as a single scrollable row, with a\n\"Show All\" toggle that expands them into a wrapping grid.\n---\n\n\n### **Events:**\n - **zn-expand** - Emitted when the group expands into the full grid.\n- **zn-collapse** - Emitted when the group collapses back to a single row.\n- **zn-change** - Emitted when the selected thumbnail changes (`selectable` groups only).\n\n### **Methods:**\n - **show()** - Expands the group into the full grid.\n- **hide()** - Collapses the group back to a single row.\n\n### **Slots:**\n - _default_ - One or more `zn-thumbnail` elements.\n- **caption** - Replaces the heading text.\n- **actions** - Extra content in the header, before the toggle.\n\n### **CSS Properties:**\n - **--zn-thumbnail-width** - Track width of a thumbnail. Defaults to 180px. Also settable with the `thumbnail-width` attribute. _(default: undefined)_\n- **--zn-thumbnail-gap** - Gap between thumbnails. Also settable with the `gap` attribute. _(default: undefined)_\n- **--zn-thumbnail-aspect-ratio** - Aspect ratio of every thumbnail in the group. Also settable with the `aspect-ratio` attribute. Any `zn-thumbnail` custom property set here is inherited by the slotted thumbnails. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **header** - The header row holding the caption and toggle.\n- **caption** - The heading text.\n- **toggle** - The show all / show less button.\n- **items** - The scrolling row / expanded grid that holds the thumbnails.",
10724
11526
  "doc-url": "",
10725
11527
  "attributes": [
10726
11528
  {
10727
- "name": "src",
10728
- "description": "URL of the preview shell page; forwarded to the frame.",
10729
- "value": { "type": "string", "default": "''" }
10730
- },
10731
- {
10732
- "name": "frame-origin",
10733
- "description": "Expected origin of the iframe; forwarded to the frame.",
10734
- "value": { "type": "string", "default": "''" }
10735
- },
10736
- {
10737
- "name": "data-uri",
10738
- "description": "Optional endpoint returning the base hp-preview:config payload.",
11529
+ "name": "caption",
11530
+ "description": "The heading shown at the top left of the group.",
10739
11531
  "value": { "type": "string", "default": "''" }
10740
11532
  },
10741
11533
  {
10742
- "name": "mode",
10743
- "description": "Which mode the preview renders in. Travels in the theme payload.",
10744
- "value": { "type": "ThemeEditorMode", "default": "'light'" }
10745
- },
10746
- {
10747
- "name": "device",
10748
- "description": "Preview viewport width. Resizes the frame only; not part of the payload.",
10749
- "value": { "type": "ThemeEditorDevice", "default": "'desktop'" }
10750
- },
10751
- {
10752
- "name": "min-height",
10753
- "description": "Minimum height of the preview row, in pixels; forwarded to the frame as its own floor.",
10754
- "value": { "type": "number", "default": "480" }
10755
- },
10756
- {
10757
- "name": "debounce",
10758
- "description": "Debounce in ms between a control change and the push to the preview.",
10759
- "value": { "type": "number", "default": "150" }
10760
- },
10761
- {
10762
- "name": "action",
10763
- "description": "Optional endpoint the values are POSTed to. Empty = no persistence.",
10764
- "value": { "type": "string", "default": "''" }
11534
+ "name": "expanded",
11535
+ "description": "Expands the group into the full wrapping grid.",
11536
+ "value": { "type": "boolean", "default": "false" }
10765
11537
  },
10766
11538
  {
10767
- "name": "save-debounce",
10768
- "description": "Debounce in ms between a control change and the save POST.",
10769
- "value": { "type": "number", "default": "1000" }
11539
+ "name": "total",
11540
+ "description": "Total number of thumbnails in the underlying set, shown in the \"Show All (n)\" label. Set this when\nthe row only holds the first page of a larger set; otherwise the slotted thumbnails are counted.",
11541
+ "value": { "type": "number", "default": "0" }
10770
11542
  },
10771
11543
  {
10772
- "name": "sections",
10773
- "description": "Groups controls into named sections. Empty/unset falls back to deriving the\nstructure from the controls' own `group`/`category` attributes, and renders\none ungrouped column when they carry neither. A section with a non-empty\n`groups` nests a collapsible per group inside a `zn-tabs` tab for that\nsection - see `groups` on `ThemeEditorSection`.",
10774
- "value": { "type": "ThemeEditorSection[]", "default": "[]" }
11544
+ "name": "show-all-label",
11545
+ "description": "Label of the expand toggle. The count is appended in brackets.",
11546
+ "value": { "type": "string", "default": "'Show All'" }
10775
11547
  },
10776
11548
  {
10777
- "name": "section-layout",
10778
- "description": "Presentation for flat, group-less `sections`: stacked `zn-collapsible`s\n(default) or a `zn-tabs` strip. Ignored once any section has `groups` -\nnested sections always render as tabs.",
10779
- "value": {
10780
- "type": "'collapsible' | 'tabs'",
10781
- "default": "'collapsible'"
10782
- }
11549
+ "name": "show-less-label",
11550
+ "description": "Label of the collapse toggle.",
11551
+ "value": { "type": "string", "default": "'Show Less'" }
10783
11552
  },
10784
11553
  {
10785
- "name": "sources",
10786
- "description": "Dropdown of preview sources, `{label, src}`, rendered in the toolbar. Empty/unset renders no dropdown; the first entry wins over an explicit `src` when non-empty.",
10787
- "value": { "type": "ThemeEditorSource[]", "default": "[]" }
11554
+ "name": "hide-toggle",
11555
+ "description": "Never render the toggle, even when the row overflows.",
11556
+ "value": { "type": "boolean", "default": "false" }
10788
11557
  },
10789
11558
  {
10790
- "name": "controls-collapsed",
10791
- "description": "Collapses the controls column.",
11559
+ "name": "always-toggle",
11560
+ "description": "Always render the toggle, even when every thumbnail already fits on the row.",
10792
11561
  "value": { "type": "boolean", "default": "false" }
10793
11562
  },
10794
11563
  {
10795
- "name": "standalone",
10796
- "description": "Presents the editor as its own bordered, rounded panel with a plain preview backdrop, rather than embedded in a dotted canvas.",
11564
+ "name": "selectable",
11565
+ "description": "Manages single selection across the slotted thumbnails.",
10797
11566
  "value": { "type": "boolean", "default": "false" }
10798
11567
  },
10799
11568
  {
10800
- "name": "controls-caption",
10801
- "description": "Caption in the controls column's header row. Empty (default) renders no text; the row itself always renders.",
11569
+ "name": "aspect-ratio",
11570
+ "description": "Aspect ratio for every thumbnail in the group, as any CSS `aspect-ratio` value (e.g. `1 / 1`).\nShorthand for setting `--zn-thumbnail-aspect-ratio` on the group. A thumbnail's own\n`aspect-ratio` attribute still wins.",
10802
11571
  "value": { "type": "string", "default": "''" }
10803
11572
  },
10804
11573
  {
10805
- "name": "preview-caption",
10806
- "description": "Caption at the left of the toolbar, opposite the device and mode controls. Empty (default) renders no text.",
11574
+ "name": "thumbnail-width",
11575
+ "description": "Track width of each thumbnail (e.g. `140px`). Shorthand for `--zn-thumbnail-width`.",
10807
11576
  "value": { "type": "string", "default": "''" }
10808
11577
  },
10809
11578
  {
10810
- "name": "submit-label",
10811
- "description": "Label for the built-in submit button. Empty (default) renders no button.",
11579
+ "name": "gap",
11580
+ "description": "Gap between thumbnails (e.g. `8px`). Shorthand for `--zn-thumbnail-gap`.",
10812
11581
  "value": { "type": "string", "default": "''" }
10813
11582
  },
10814
11583
  {
10815
- "name": "manual",
10816
- "description": "Disables the debounced auto-save; saving then happens only via submit. Preview pushes are unaffected.",
10817
- "value": { "type": "boolean", "default": "false" }
11584
+ "name": "value",
11585
+ "description": "The `value` of the selected thumbnail (`selectable` groups only).",
11586
+ "value": { "type": "string", "default": "''" }
10818
11587
  }
10819
11588
  ],
10820
11589
  "slots": [
10821
11590
  {
10822
11591
  "name": "",
10823
- "description": "Ungrouped theme controls, rendered above any sections. Controls assigned `slot=\"<name>\"` matching a `sections` entry (or, when nested, a `groups` entry) render inside that section/group instead. Harvesting and change detection walk every slot's full assigned subtree, not just direct children. With `sections` left unset, the structure is instead derived from the controls' own attributes: `group=\"<label>\"` becomes a tab and `category=\"<label>\"` a collapsible within it, and the control is slotted into that collapsible automatically. Either attribute works alone - a control with only `group` sits directly in its tab, and one with only `category` becomes its own top-level section. Setting `sections` explicitly disables the derivation entirely."
10824
- },
10825
- {
10826
- "name": "toolbar",
10827
- "description": "Actions in the toolbar, right-aligned beside the device controls. Where a save button belongs."
11592
+ "description": "One or more `zn-thumbnail` elements."
10828
11593
  },
11594
+ { "name": "caption", "description": "Replaces the heading text." },
10829
11595
  {
10830
- "name": "footer",
10831
- "description": "Actions pinned beneath the controls. The built-in submit button lives in the toolbar, not here."
11596
+ "name": "actions",
11597
+ "description": "Extra content in the header, before the toggle."
10832
11598
  }
10833
11599
  ],
10834
11600
  "events": [
10835
11601
  {
10836
- "name": "zn-theme-change",
10837
- "description": "Emitted when the values, mode or device change."
11602
+ "name": "zn-expand",
11603
+ "description": "Emitted when the group expands into the full grid."
10838
11604
  },
10839
11605
  {
10840
- "name": "zn-theme-submit",
10841
- "description": "Emitted on submit (button click), carrying the current values. With `action` set, only fires after a successful save."
11606
+ "name": "zn-collapse",
11607
+ "description": "Emitted when the group collapses back to a single row."
10842
11608
  },
10843
11609
  {
10844
- "name": "zn-error",
10845
- "description": "Emitted when a save fails. Also seen for preview render failures: the frame's zn-error is composed and not stopped, so it bubbles out through the editor too."
11610
+ "name": "zn-change",
11611
+ "description": "Emitted when the selected thumbnail changes (`selectable` groups only)."
10846
11612
  }
10847
11613
  ],
10848
11614
  "js": {
10849
11615
  "properties": [
10850
11616
  {
10851
- "name": "src",
10852
- "description": "URL of the preview shell page; forwarded to the frame.",
10853
- "type": "string"
10854
- },
10855
- {
10856
- "name": "frameOrigin",
10857
- "description": "Expected origin of the iframe; forwarded to the frame.",
10858
- "type": "string"
10859
- },
10860
- {
10861
- "name": "dataUri",
10862
- "description": "Optional endpoint returning the base hp-preview:config payload.",
11617
+ "name": "caption",
11618
+ "description": "The heading shown at the top left of the group.",
10863
11619
  "type": "string"
10864
11620
  },
10865
11621
  {
10866
- "name": "mode",
10867
- "description": "Which mode the preview renders in. Travels in the theme payload.",
10868
- "type": "ThemeEditorMode"
10869
- },
10870
- {
10871
- "name": "device",
10872
- "description": "Preview viewport width. Resizes the frame only; not part of the payload.",
10873
- "type": "ThemeEditorDevice"
10874
- },
10875
- {
10876
- "name": "minHeight",
10877
- "description": "Minimum height of the preview row, in pixels; forwarded to the frame as its own floor.",
10878
- "type": "number"
11622
+ "name": "expanded",
11623
+ "description": "Expands the group into the full wrapping grid.",
11624
+ "type": "boolean"
10879
11625
  },
10880
11626
  {
10881
- "name": "debounce",
10882
- "description": "Debounce in ms between a control change and the push to the preview.",
11627
+ "name": "total",
11628
+ "description": "Total number of thumbnails in the underlying set, shown in the \"Show All (n)\" label. Set this when\nthe row only holds the first page of a larger set; otherwise the slotted thumbnails are counted.",
10883
11629
  "type": "number"
10884
11630
  },
10885
11631
  {
10886
- "name": "action",
10887
- "description": "Optional endpoint the values are POSTed to. Empty = no persistence.",
11632
+ "name": "showAllLabel",
11633
+ "description": "Label of the expand toggle. The count is appended in brackets.",
10888
11634
  "type": "string"
10889
11635
  },
10890
11636
  {
10891
- "name": "saveDebounce",
10892
- "description": "Debounce in ms between a control change and the save POST.",
10893
- "type": "number"
10894
- },
10895
- {
10896
- "name": "sections",
10897
- "description": "Groups controls into named sections. Empty/unset falls back to deriving the\nstructure from the controls' own `group`/`category` attributes, and renders\none ungrouped column when they carry neither. A section with a non-empty\n`groups` nests a collapsible per group inside a `zn-tabs` tab for that\nsection - see `groups` on `ThemeEditorSection`.",
10898
- "type": "ThemeEditorSection[]"
10899
- },
10900
- {
10901
- "name": "sectionLayout",
10902
- "description": "Presentation for flat, group-less `sections`: stacked `zn-collapsible`s\n(default) or a `zn-tabs` strip. Ignored once any section has `groups` -\nnested sections always render as tabs.",
10903
- "type": "'collapsible' | 'tabs'"
11637
+ "name": "showLessLabel",
11638
+ "description": "Label of the collapse toggle.",
11639
+ "type": "string"
10904
11640
  },
10905
11641
  {
10906
- "name": "sources",
10907
- "description": "Dropdown of preview sources, `{label, src}`, rendered in the toolbar. Empty/unset renders no dropdown; the first entry wins over an explicit `src` when non-empty.",
10908
- "type": "ThemeEditorSource[]"
11642
+ "name": "hideToggle",
11643
+ "description": "Never render the toggle, even when the row overflows.",
11644
+ "type": "boolean"
10909
11645
  },
10910
11646
  {
10911
- "name": "controlsCollapsed",
10912
- "description": "Collapses the controls column.",
11647
+ "name": "alwaysToggle",
11648
+ "description": "Always render the toggle, even when every thumbnail already fits on the row.",
10913
11649
  "type": "boolean"
10914
11650
  },
10915
11651
  {
10916
- "name": "standalone",
10917
- "description": "Presents the editor as its own bordered, rounded panel with a plain preview backdrop, rather than embedded in a dotted canvas.",
11652
+ "name": "selectable",
11653
+ "description": "Manages single selection across the slotted thumbnails.",
10918
11654
  "type": "boolean"
10919
11655
  },
10920
11656
  {
10921
- "name": "controlsCaption",
10922
- "description": "Caption in the controls column's header row. Empty (default) renders no text; the row itself always renders.",
11657
+ "name": "aspectRatio",
11658
+ "description": "Aspect ratio for every thumbnail in the group, as any CSS `aspect-ratio` value (e.g. `1 / 1`).\nShorthand for setting `--zn-thumbnail-aspect-ratio` on the group. A thumbnail's own\n`aspect-ratio` attribute still wins.",
10923
11659
  "type": "string"
10924
11660
  },
10925
11661
  {
10926
- "name": "previewCaption",
10927
- "description": "Caption at the left of the toolbar, opposite the device and mode controls. Empty (default) renders no text.",
11662
+ "name": "thumbnailWidth",
11663
+ "description": "Track width of each thumbnail (e.g. `140px`). Shorthand for `--zn-thumbnail-width`.",
10928
11664
  "type": "string"
10929
11665
  },
10930
11666
  {
10931
- "name": "submitLabel",
10932
- "description": "Label for the built-in submit button. Empty (default) renders no button.",
11667
+ "name": "gap",
11668
+ "description": "Gap between thumbnails (e.g. `8px`). Shorthand for `--zn-thumbnail-gap`.",
10933
11669
  "type": "string"
10934
11670
  },
10935
11671
  {
10936
- "name": "manual",
10937
- "description": "Disables the debounced auto-save; saving then happens only via submit. Preview pushes are unaffected.",
10938
- "type": "boolean"
10939
- },
10940
- { "name": "frame", "type": "ZnPreviewFrame" },
10941
- {
10942
- "name": "values",
10943
- "description": "The current per-mode value sets. Returns copies.",
10944
- "type": "{ light: Record<string, unknown>; dark: Record<string, unknown> }"
10945
- },
10946
- {
10947
- "name": "activeValues",
10948
- "description": "The active mode's values - what gets pushed to the preview frame.",
10949
- "type": "Record<string, unknown>"
11672
+ "name": "value",
11673
+ "description": "The `value` of the selected thumbnail (`selectable` groups only).",
11674
+ "type": "string"
10950
11675
  }
10951
11676
  ],
10952
11677
  "events": [
10953
11678
  {
10954
- "name": "zn-theme-change",
10955
- "description": "Emitted when the values, mode or device change."
11679
+ "name": "zn-expand",
11680
+ "description": "Emitted when the group expands into the full grid."
10956
11681
  },
10957
11682
  {
10958
- "name": "zn-theme-submit",
10959
- "description": "Emitted on submit (button click), carrying the current values. With `action` set, only fires after a successful save."
11683
+ "name": "zn-collapse",
11684
+ "description": "Emitted when the group collapses back to a single row."
10960
11685
  },
10961
11686
  {
10962
- "name": "zn-error",
10963
- "description": "Emitted when a save fails. Also seen for preview render failures: the frame's zn-error is composed and not stopped, so it bubbles out through the editor too."
11687
+ "name": "zn-change",
11688
+ "description": "Emitted when the selected thumbnail changes (`selectable` groups only)."
10964
11689
  }
10965
11690
  ]
10966
11691
  }
@@ -11654,18 +12379,44 @@
11654
12379
  },
11655
12380
  {
11656
12381
  "name": "zn-well",
11657
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Slots:**\n - _default_ - The default slot.",
12382
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Slots:**\n - _default_ - The default slot.\n- **action** - Content displayed on the right hand side of the well.",
11658
12383
  "doc-url": "",
11659
12384
  "attributes": [
11660
12385
  { "name": "icon", "value": { "type": "string", "default": "''" } },
11661
- { "name": "inline", "value": { "type": "boolean" } }
12386
+ { "name": "inline", "value": { "type": "boolean" } },
12387
+ {
12388
+ "name": "pre",
12389
+ "description": "Renders the default slot inside a `pre` element, preserving whitespace using a monospace font.",
12390
+ "value": { "type": "boolean" }
12391
+ },
12392
+ {
12393
+ "name": "break-long",
12394
+ "description": "Breaks long unbroken words, so they wrap instead of forcing the well wider.",
12395
+ "value": { "type": "boolean" }
12396
+ }
12397
+ ],
12398
+ "slots": [
12399
+ { "name": "", "description": "The default slot." },
12400
+ {
12401
+ "name": "action",
12402
+ "description": "Content displayed on the right hand side of the well."
12403
+ }
11662
12404
  ],
11663
- "slots": [{ "name": "", "description": "The default slot." }],
11664
12405
  "events": [],
11665
12406
  "js": {
11666
12407
  "properties": [
11667
12408
  { "name": "icon", "type": "string" },
11668
- { "name": "inline", "type": "boolean" }
12409
+ { "name": "inline", "type": "boolean" },
12410
+ {
12411
+ "name": "pre",
12412
+ "description": "Renders the default slot inside a `pre` element, preserving whitespace using a monospace font.",
12413
+ "type": "boolean"
12414
+ },
12415
+ {
12416
+ "name": "breakLong",
12417
+ "description": "Breaks long unbroken words, so they wrap instead of forcing the well wider.",
12418
+ "type": "boolean"
12419
+ }
11669
12420
  ],
11670
12421
  "events": []
11671
12422
  }