@kubex/zinc 1.1.133 → 1.1.135

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.
@@ -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.133",
4
+ "version": "1.1.135",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -15,28 +15,6 @@
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
- },
40
18
  {
41
19
  "name": "zn-alert",
42
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.",
@@ -105,6 +83,28 @@
105
83
  ]
106
84
  }
107
85
  },
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",
@@ -1003,121 +1003,6 @@
1003
1003
  ]
1004
1004
  }
1005
1005
  },
1006
- {
1007
- "name": "zn-chat-message",
1008
- "description": "A single message in a chat-style conversation: avatar, sender,\ntime, optional badge, and a message bubble with optional actions. Also renders\nsystem events (connections, transfers, etc.) as a centred card.\n---\n\n\n### **Slots:**\n - _default_ - The message content. Ignored when the `message` attribute is set.\n- **badge** - Rendered in the header after the sender and time (e.g. an INTERNAL NOTE chip).\n- **attachments** - Attachments displayed beneath the message content. Use `zn-chat-message-attachment`, which auto-assigns itself to this slot.\n- **edit-dialog-trigger** - Action rendered at the end of the bubble (e.g. a remove icon button).\n- **edit-dialog** - Pass-through for an associated dialog element.\n\n### **CSS Properties:**\n - **--message-background** - The bubble's background color. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **avatar** - The avatar column.\n- **body** - The header and bubble column.\n- **header** - The sender/time/badge row.\n- **bubble** - The message bubble.\n- **content** - The message content within the bubble.\n- **attachments** - The attachments row beneath the message content.\n- **system-card** - The card rendered for system action types.",
1009
- "doc-url": "",
1010
- "attributes": [
1011
- {
1012
- "name": "sender",
1013
- "description": "The sender's name, also used for the avatar.",
1014
- "value": { "type": "string", "default": "''" }
1015
- },
1016
- {
1017
- "name": "message",
1018
- "description": "The message body as an HTML string. When set, it is sanitized (scripts and event\nhandlers stripped), newlines become line breaks and bare URLs become links. When\nomitted the default slot is rendered instead.",
1019
- "value": { "type": "string", "default": "''" }
1020
- },
1021
- {
1022
- "name": "time",
1023
- "description": "Unix timestamp (seconds) of the message, shown as HH:MM (with date if not today).",
1024
- "value": { "type": "string", "default": "''" }
1025
- },
1026
- {
1027
- "name": "avatar",
1028
- "description": "Overrides the avatar source. Defaults to `sender`.",
1029
- "value": { "type": "string", "default": "''" }
1030
- },
1031
- {
1032
- "name": "action-type",
1033
- "description": "The kind of message. Drives system-card rendering, the sending state and badges.",
1034
- "value": { "type": "ChatMessageActionType", "default": "''" }
1035
- },
1036
- {
1037
- "name": "customer-initiated",
1038
- "description": "Marks the message as initiated by the customer (affects styling and grouping).",
1039
- "value": { "type": "boolean", "default": "false" }
1040
- },
1041
- {
1042
- "name": "agent-initiated",
1043
- "description": "Marks the message as initiated by an agent (affects styling and grouping).",
1044
- "value": { "type": "boolean", "default": "false" }
1045
- },
1046
- {
1047
- "name": "hide-sender",
1048
- "description": "Hides the sender's name in the message header.",
1049
- "value": { "type": "boolean", "default": "false" }
1050
- }
1051
- ],
1052
- "slots": [
1053
- {
1054
- "name": "",
1055
- "description": "The message content. Ignored when the `message` attribute is set."
1056
- },
1057
- {
1058
- "name": "badge",
1059
- "description": "Rendered in the header after the sender and time (e.g. an INTERNAL NOTE chip)."
1060
- },
1061
- {
1062
- "name": "attachments",
1063
- "description": "Attachments displayed beneath the message content. Use `zn-chat-message-attachment`, which auto-assigns itself to this slot."
1064
- },
1065
- {
1066
- "name": "edit-dialog-trigger",
1067
- "description": "Action rendered at the end of the bubble (e.g. a remove icon button)."
1068
- },
1069
- {
1070
- "name": "edit-dialog",
1071
- "description": "Pass-through for an associated dialog element."
1072
- }
1073
- ],
1074
- "events": [],
1075
- "js": {
1076
- "properties": [
1077
- {
1078
- "name": "sender",
1079
- "description": "The sender's name, also used for the avatar.",
1080
- "type": "string"
1081
- },
1082
- {
1083
- "name": "message",
1084
- "description": "The message body as an HTML string. When set, it is sanitized (scripts and event\nhandlers stripped), newlines become line breaks and bare URLs become links. When\nomitted the default slot is rendered instead.",
1085
- "type": "string"
1086
- },
1087
- {
1088
- "name": "time",
1089
- "description": "Unix timestamp (seconds) of the message, shown as HH:MM (with date if not today).",
1090
- "type": "string"
1091
- },
1092
- {
1093
- "name": "avatar",
1094
- "description": "Overrides the avatar source. Defaults to `sender`.",
1095
- "type": "string"
1096
- },
1097
- {
1098
- "name": "actionType",
1099
- "description": "The kind of message. Drives system-card rendering, the sending state and badges.",
1100
- "type": "ChatMessageActionType"
1101
- },
1102
- {
1103
- "name": "customerInitiated",
1104
- "description": "Marks the message as initiated by the customer (affects styling and grouping).",
1105
- "type": "boolean"
1106
- },
1107
- {
1108
- "name": "agentInitiated",
1109
- "description": "Marks the message as initiated by an agent (affects styling and grouping).",
1110
- "type": "boolean"
1111
- },
1112
- {
1113
- "name": "hideSender",
1114
- "description": "Hides the sender's name in the message header.",
1115
- "type": "boolean"
1116
- }
1117
- ],
1118
- "events": []
1119
- }
1120
- },
1121
1006
  {
1122
1007
  "name": "zn-chart",
1123
1008
  "description": "Chart component powered by Apache ECharts.\n---\n\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
@@ -1232,68 +1117,114 @@
1232
1117
  }
1233
1118
  },
1234
1119
  {
1235
- "name": "zn-chat-message-attachment",
1236
- "description": "A single file or link attachment for a `zn-chat-message` or `zn-content-block`.\nRenders an icon and a label as a link, styled to match the message's attachments row. It is\nintended to be used only inside a `zn-chat-message` or `zn-content-block` and is automatically\nplaced in that component's `attachments` slot.\n---\n\n\n### **Slots:**\n - _default_ - The attachment label. Falls back to the `name` attribute when empty.\n\n### **CSS Parts:**\n - **base** - The attachment link.\n- **icon** - The leading icon.\n- **label** - The attachment label.",
1120
+ "name": "zn-chat-message",
1121
+ "description": "A single message in a chat-style conversation: avatar, sender,\ntime, optional badge, and a message bubble with optional actions. Also renders\nsystem events (connections, transfers, etc.) as a centred card.\n---\n\n\n### **Slots:**\n - _default_ - The message content. Ignored when the `message` attribute is set.\n- **badge** - Rendered in the header after the sender and time (e.g. an INTERNAL NOTE chip).\n- **attachments** - Attachments displayed beneath the message content. Use `zn-chat-message-attachment`, which auto-assigns itself to this slot.\n- **edit-dialog-trigger** - Action rendered at the end of the bubble (e.g. a remove icon button).\n- **edit-dialog** - Pass-through for an associated dialog element.\n\n### **CSS Properties:**\n - **--message-background** - The bubble's background color. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **avatar** - The avatar column.\n- **body** - The header and bubble column.\n- **header** - The sender/time/badge row.\n- **bubble** - The message bubble.\n- **content** - The message content within the bubble.\n- **attachments** - The attachments row beneath the message content.\n- **system-card** - The card rendered for system action types.",
1237
1122
  "doc-url": "",
1238
1123
  "attributes": [
1239
1124
  {
1240
- "name": "href",
1241
- "description": "The URL the attachment links to.",
1125
+ "name": "sender",
1126
+ "description": "The sender's name, also used for the avatar.",
1242
1127
  "value": { "type": "string", "default": "''" }
1243
1128
  },
1244
1129
  {
1245
- "name": "name",
1246
- "description": "The attachment label (e.g. the file name). Used when the default slot is empty.",
1130
+ "name": "message",
1131
+ "description": "The message body as an HTML string. When set, it is sanitized (scripts and event\nhandlers stripped), newlines become line breaks and bare URLs become links. When\nomitted the default slot is rendered instead.",
1247
1132
  "value": { "type": "string", "default": "''" }
1248
1133
  },
1249
1134
  {
1250
- "name": "icon",
1251
- "description": "The leading icon name.",
1252
- "value": { "type": "string", "default": "'paperclip@lu'" }
1135
+ "name": "time",
1136
+ "description": "Unix timestamp (seconds) of the message, shown as HH:MM (with date if not today).",
1137
+ "value": { "type": "string", "default": "''" }
1253
1138
  },
1254
1139
  {
1255
- "name": "target",
1256
- "description": "Where to open the link. Defaults to a new tab. Reflected so the console's\npagelet link interception (`[href]:not([target])`) skips the host and the\nbrowser handles the click natively (download / new tab) instead of\nloading the file URL as a pagelet.",
1257
- "value": { "type": "string", "default": "'_blank'" }
1140
+ "name": "avatar",
1141
+ "description": "Overrides the avatar source. Defaults to `sender`.",
1142
+ "value": { "type": "string", "default": "''" }
1258
1143
  },
1259
1144
  {
1260
- "name": "download",
1261
- "description": "Prompt a download rather than navigating to the link.",
1145
+ "name": "action-type",
1146
+ "description": "The kind of message. Drives system-card rendering, the sending state and badges.",
1147
+ "value": { "type": "ChatMessageActionType", "default": "''" }
1148
+ },
1149
+ {
1150
+ "name": "customer-initiated",
1151
+ "description": "Marks the message as initiated by the customer (affects styling and grouping).",
1152
+ "value": { "type": "boolean", "default": "false" }
1153
+ },
1154
+ {
1155
+ "name": "agent-initiated",
1156
+ "description": "Marks the message as initiated by an agent (affects styling and grouping).",
1157
+ "value": { "type": "boolean", "default": "false" }
1158
+ },
1159
+ {
1160
+ "name": "hide-sender",
1161
+ "description": "Hides the sender's name in the message header.",
1262
1162
  "value": { "type": "boolean", "default": "false" }
1263
1163
  }
1264
1164
  ],
1265
1165
  "slots": [
1266
1166
  {
1267
1167
  "name": "",
1268
- "description": "The attachment label. Falls back to the `name` attribute when empty."
1168
+ "description": "The message content. Ignored when the `message` attribute is set."
1169
+ },
1170
+ {
1171
+ "name": "badge",
1172
+ "description": "Rendered in the header after the sender and time (e.g. an INTERNAL NOTE chip)."
1173
+ },
1174
+ {
1175
+ "name": "attachments",
1176
+ "description": "Attachments displayed beneath the message content. Use `zn-chat-message-attachment`, which auto-assigns itself to this slot."
1177
+ },
1178
+ {
1179
+ "name": "edit-dialog-trigger",
1180
+ "description": "Action rendered at the end of the bubble (e.g. a remove icon button)."
1181
+ },
1182
+ {
1183
+ "name": "edit-dialog",
1184
+ "description": "Pass-through for an associated dialog element."
1269
1185
  }
1270
1186
  ],
1271
1187
  "events": [],
1272
1188
  "js": {
1273
1189
  "properties": [
1274
1190
  {
1275
- "name": "href",
1276
- "description": "The URL the attachment links to.",
1191
+ "name": "sender",
1192
+ "description": "The sender's name, also used for the avatar.",
1277
1193
  "type": "string"
1278
1194
  },
1279
1195
  {
1280
- "name": "name",
1281
- "description": "The attachment label (e.g. the file name). Used when the default slot is empty.",
1196
+ "name": "message",
1197
+ "description": "The message body as an HTML string. When set, it is sanitized (scripts and event\nhandlers stripped), newlines become line breaks and bare URLs become links. When\nomitted the default slot is rendered instead.",
1282
1198
  "type": "string"
1283
1199
  },
1284
1200
  {
1285
- "name": "icon",
1286
- "description": "The leading icon name.",
1201
+ "name": "time",
1202
+ "description": "Unix timestamp (seconds) of the message, shown as HH:MM (with date if not today).",
1287
1203
  "type": "string"
1288
1204
  },
1289
1205
  {
1290
- "name": "target",
1291
- "description": "Where to open the link. Defaults to a new tab. Reflected so the console's\npagelet link interception (`[href]:not([target])`) skips the host and the\nbrowser handles the click natively (download / new tab) instead of\nloading the file URL as a pagelet.",
1206
+ "name": "avatar",
1207
+ "description": "Overrides the avatar source. Defaults to `sender`.",
1292
1208
  "type": "string"
1293
1209
  },
1294
1210
  {
1295
- "name": "download",
1296
- "description": "Prompt a download rather than navigating to the link.",
1211
+ "name": "actionType",
1212
+ "description": "The kind of message. Drives system-card rendering, the sending state and badges.",
1213
+ "type": "ChatMessageActionType"
1214
+ },
1215
+ {
1216
+ "name": "customerInitiated",
1217
+ "description": "Marks the message as initiated by the customer (affects styling and grouping).",
1218
+ "type": "boolean"
1219
+ },
1220
+ {
1221
+ "name": "agentInitiated",
1222
+ "description": "Marks the message as initiated by an agent (affects styling and grouping).",
1223
+ "type": "boolean"
1224
+ },
1225
+ {
1226
+ "name": "hideSender",
1227
+ "description": "Hides the sender's name in the message header.",
1297
1228
  "type": "boolean"
1298
1229
  }
1299
1230
  ],
@@ -1301,7 +1232,76 @@
1301
1232
  }
1302
1233
  },
1303
1234
  {
1304
- "name": "zn-checkbox",
1235
+ "name": "zn-chat-message-attachment",
1236
+ "description": "A single file or link attachment for a `zn-chat-message` or `zn-content-block`.\nRenders an icon and a label as a link, styled to match the message's attachments row. It is\nintended to be used only inside a `zn-chat-message` or `zn-content-block` and is automatically\nplaced in that component's `attachments` slot.\n---\n\n\n### **Slots:**\n - _default_ - The attachment label. Falls back to the `name` attribute when empty.\n\n### **CSS Parts:**\n - **base** - The attachment link.\n- **icon** - The leading icon.\n- **label** - The attachment label.",
1237
+ "doc-url": "",
1238
+ "attributes": [
1239
+ {
1240
+ "name": "href",
1241
+ "description": "The URL the attachment links to.",
1242
+ "value": { "type": "string", "default": "''" }
1243
+ },
1244
+ {
1245
+ "name": "name",
1246
+ "description": "The attachment label (e.g. the file name). Used when the default slot is empty.",
1247
+ "value": { "type": "string", "default": "''" }
1248
+ },
1249
+ {
1250
+ "name": "icon",
1251
+ "description": "The leading icon name.",
1252
+ "value": { "type": "string", "default": "'paperclip@lu'" }
1253
+ },
1254
+ {
1255
+ "name": "target",
1256
+ "description": "Where to open the link. Defaults to a new tab. Reflected so the console's\npagelet link interception (`[href]:not([target])`) skips the host and the\nbrowser handles the click natively (download / new tab) instead of\nloading the file URL as a pagelet.",
1257
+ "value": { "type": "string", "default": "'_blank'" }
1258
+ },
1259
+ {
1260
+ "name": "download",
1261
+ "description": "Prompt a download rather than navigating to the link.",
1262
+ "value": { "type": "boolean", "default": "false" }
1263
+ }
1264
+ ],
1265
+ "slots": [
1266
+ {
1267
+ "name": "",
1268
+ "description": "The attachment label. Falls back to the `name` attribute when empty."
1269
+ }
1270
+ ],
1271
+ "events": [],
1272
+ "js": {
1273
+ "properties": [
1274
+ {
1275
+ "name": "href",
1276
+ "description": "The URL the attachment links to.",
1277
+ "type": "string"
1278
+ },
1279
+ {
1280
+ "name": "name",
1281
+ "description": "The attachment label (e.g. the file name). Used when the default slot is empty.",
1282
+ "type": "string"
1283
+ },
1284
+ {
1285
+ "name": "icon",
1286
+ "description": "The leading icon name.",
1287
+ "type": "string"
1288
+ },
1289
+ {
1290
+ "name": "target",
1291
+ "description": "Where to open the link. Defaults to a new tab. Reflected so the console's\npagelet link interception (`[href]:not([target])`) skips the host and the\nbrowser handles the click natively (download / new tab) instead of\nloading the file URL as a pagelet.",
1292
+ "type": "string"
1293
+ },
1294
+ {
1295
+ "name": "download",
1296
+ "description": "Prompt a download rather than navigating to the link.",
1297
+ "type": "boolean"
1298
+ }
1299
+ ],
1300
+ "events": []
1301
+ }
1302
+ },
1303
+ {
1304
+ "name": "zn-checkbox",
1305
1305
  "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.",
1306
1306
  "doc-url": "",
1307
1307
  "attributes": [
@@ -2515,6 +2515,11 @@
2515
2515
  {
2516
2516
  "name": "conditional",
2517
2517
  "value": { "type": "string", "default": "\"\"" }
2518
+ },
2519
+ {
2520
+ "name": "requires",
2521
+ "description": "Ids or names of controls that must have a value before this one becomes\nusable, comma separated. Forwarded to the underlying select.",
2522
+ "value": { "type": "string", "default": "\"\"" }
2518
2523
  }
2519
2524
  ],
2520
2525
  "slots": [
@@ -2642,6 +2647,11 @@
2642
2647
  { "name": "selectFirst", "type": "boolean" },
2643
2648
  { "name": "distinct", "type": "string" },
2644
2649
  { "name": "conditional", "type": "string" },
2650
+ {
2651
+ "name": "requires",
2652
+ "description": "Ids or names of controls that must have a value before this one becomes\nusable, comma separated. Forwarded to the underlying select.",
2653
+ "type": "string"
2654
+ },
2645
2655
  { "name": "validationMessage" },
2646
2656
  { "name": "validity", "type": "ValidityState" },
2647
2657
  { "name": "closeOnTab" },
@@ -4977,6 +4987,11 @@
4977
4987
  "name": "conditional",
4978
4988
  "value": { "type": "string", "default": "''" }
4979
4989
  },
4990
+ {
4991
+ "name": "requires",
4992
+ "description": "Ids or names of controls that must have a value before this one becomes\nusable, comma separated.",
4993
+ "value": { "type": "string", "default": "''" }
4994
+ },
4980
4995
  { "name": "disabled", "value": { "type": "boolean" } },
4981
4996
  { "name": "inline", "value": { "type": "boolean" } },
4982
4997
  { "name": "padded", "value": { "type": "boolean" } },
@@ -5111,6 +5126,11 @@
5111
5126
  "type": "boolean"
5112
5127
  },
5113
5128
  { "name": "conditional", "type": "string" },
5129
+ {
5130
+ "name": "requires",
5131
+ "description": "Ids or names of controls that must have a value before this one becomes\nusable, comma separated.",
5132
+ "type": "string"
5133
+ },
5114
5134
  { "name": "disabled", "type": "boolean" },
5115
5135
  { "name": "inline", "type": "boolean" },
5116
5136
  { "name": "padded", "type": "boolean" },
@@ -7300,588 +7320,588 @@
7300
7320
  }
7301
7321
  },
7302
7322
  {
7303
- "name": "zn-popup",
7304
- "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 - **reposition()** - Forces the popup to recalculate and reposition itself.\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.",
7323
+ "name": "zn-preview-frame",
7324
+ "description": "Embeds a live preview iframe and drives the hp-preview postMessage\nprotocol: answers the frame's ready handshake with a config payload fetched\nfrom data-uri, auto-saves watched forms on change, refreshes the preview\nafter each save (its own, or a shell-driven save of a `refresh-on` form),\naccepts a theme payload via setTheme() that is retained and replayed\nafter every ready handshake, and grows the frame to a content height the\nembed reports so the panel scrolls an overflowing page.\n---\n\n\n### **Events:**\n - **zn-error** - Emitted when the preview reports a render error or a save fails.\n\n### **Methods:**\n - **refresh()** - Re-fetches the payload and pushes a fresh config to the preview.\n- **setTheme(theme: _Record<string, unknown>_)** - Pushes a theme payload into the preview. The payload is retained and\nre-posted after every ready handshake, so a frame reload doesn't drop an\nin-progress theme.\n\n### **CSS Properties:**\n - **--zn-preview-frame-dot-spacing** - Spacing of the backdrop dot grid (`backdrop=\"dots\"`). Defaults to 20px. _(default: undefined)_\n- **--zn-preview-frame-dot-opacity** - Opacity of the backdrop dots (`backdrop=\"dots\"`). Defaults to 0.08. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **stage** - The device-width wrapper around the iframe.\n- **iframe** - The preview iframe.\n- **error** - The error overlay.",
7305
7325
  "doc-url": "",
7306
7326
  "attributes": [
7307
7327
  {
7308
- "name": "anchor",
7309
- "description": "The element the popup will be anchored to. If the anchor lives outside of the popup, you can provide the anchor\nelement `id`, a DOM element reference, or a `VirtualElement`. If the anchor lives inside the popup, use the\n`anchor` slot instead.",
7310
- "value": { "type": "Element | string | VirtualElement" }
7311
- },
7312
- {
7313
- "name": "active",
7314
- "description": "Activates the positioning logic and shows the popup. When this attribute is removed, the positioning logic is torn\ndown and the popup will be hidden.",
7315
- "value": { "type": "boolean", "default": "false" }
7316
- },
7317
- {
7318
- "name": "placement",
7319
- "description": "The preferred placement of the popup. Note that the actual placement will vary as configured to keep the\npanel inside of the viewport.",
7320
- "value": {
7321
- "type": "| 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end'",
7322
- "default": "'top'"
7323
- }
7324
- },
7325
- {
7326
- "name": "strategy",
7327
- "description": "Determines how the popup is positioned. The `absolute` strategy works well in most cases, but if overflow is\nclipped, using a `fixed` position strategy can often workaround it.",
7328
- "value": { "type": "'absolute' | 'fixed'", "default": "'fixed'" }
7329
- },
7330
- {
7331
- "name": "distance",
7332
- "description": "The distance in pixels from which to offset the panel away from its anchor.",
7333
- "value": { "type": "number", "default": "0" }
7334
- },
7335
- {
7336
- "name": "skidding",
7337
- "description": "The distance in pixels from which to offset the panel along its anchor.",
7338
- "value": { "type": "number", "default": "0" }
7339
- },
7340
- {
7341
- "name": "arrow",
7342
- "description": "Attaches an arrow to the popup. The arrow's size and color can be customized using the `--arrow-size` and\n`--arrow-color` custom properties. For additional customizations, you can also target the arrow using\n`::part(arrow)` in your stylesheet.",
7343
- "value": { "type": "boolean", "default": "false" }
7344
- },
7345
- {
7346
- "name": "arrow-placement",
7347
- "description": "The placement of the arrow. The default is `anchor`, which will align the arrow as close to the center of the\nanchor as possible, considering available space and `arrow-padding`. A value of `start`, `end`, or `center` will\nalign the arrow to the start, end, or center of the popover instead.",
7348
- "value": {
7349
- "type": "'start' | 'end' | 'center' | 'anchor'",
7350
- "default": "'anchor'"
7351
- }
7352
- },
7353
- {
7354
- "name": "arrow-padding",
7355
- "description": "The amount of padding between the arrow and the edges of the popup. If the popup has a border-radius, for example,\nthis will prevent it from overflowing the corners.",
7356
- "value": { "type": "number", "default": "10" }
7357
- },
7358
- {
7359
- "name": "flip",
7360
- "description": "When set, placement of the popup will flip to the opposite site to keep it in view. You can use\n`flipFallbackPlacements` to further configure how the fallback placement is determined.",
7361
- "value": { "type": "boolean", "default": "false" }
7362
- },
7363
- {
7364
- "name": "flip-fallback-placements",
7365
- "description": "If the preferred placement doesn't fit, popup will be tested in these fallback placements until one fits. Must be a\nstring of any number of placements separated by a space, e.g. \"top bottom left\". If no placement fits, the flip\nfallback strategy will be used instead.",
7328
+ "name": "src",
7329
+ "description": "URL of the preview shell page (tokened embed URL).",
7366
7330
  "value": { "type": "string", "default": "''" }
7367
7331
  },
7368
7332
  {
7369
- "name": "flip-fallback-strategy",
7370
- "description": "When neither the preferred placement nor the fallback placements fit, this value will be used to determine whether\nthe popup should be positioned using the best available fit based on available space or as it was initially\npreferred.",
7371
- "value": {
7372
- "type": "'best-fit' | 'initial'",
7373
- "default": "'best-fit'"
7374
- }
7333
+ "name": "frame-origin",
7334
+ "description": "Expected origin of the iframe; all postMessage traffic is checked against it.",
7335
+ "value": { "type": "string", "default": "''" }
7375
7336
  },
7376
7337
  {
7377
- "name": "flipBoundary",
7378
- "description": "The flip boundary describes clipping element(s) that overflow will be checked relative to when flipping. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7379
- "value": { "type": "Element | Element[]" }
7338
+ "name": "data-uri",
7339
+ "description": "Endpoint returning the hp-preview:config payload JSON. The console proxy rewrites this attribute to an app-prefixed path for proper fetch resolution.",
7340
+ "value": { "type": "string", "default": "''" }
7380
7341
  },
7381
7342
  {
7382
- "name": "flip-padding",
7383
- "description": "The amount of padding, in pixels, to exceed before the flip behavior will occur.",
7384
- "value": { "type": "number", "default": "0" }
7343
+ "name": "watch",
7344
+ "description": "Selector (resolved against the component's root node) for the forms to watch.\nDefaults to only forms explicitly opted in via a `data-auto-save` attribute —\nunmarked forms keep normal submit behavior and are never intercepted,\nauto-saved, or used to trigger a preview refresh. Override to widen the scope.",
7345
+ "value": { "type": "string", "default": "'form[data-auto-save]'" }
7385
7346
  },
7386
7347
  {
7387
- "name": "shift",
7388
- "description": "Moves the popup along the axis to keep it in view when clipped.",
7389
- "value": { "type": "boolean", "default": "false" }
7348
+ "name": "refresh-on",
7349
+ "description": "Selector for forms whose saves are left to the shell but should still\nrefresh the preview. These are never intercepted: the shell submits them\n(so its own response handling — alerts, refreshes — runs as normal) and the\npreview re-fetches its config once the shell reports the save complete.\nMatched by delegation on the shell's bubbled `complete` event rather than\nby attaching to the forms themselves, so a save anywhere on the page\nrefreshes the preview — including forms in a different DOM root, e.g. a\npage-level form saved while the preview sits inside a tab panel's shadow\nroot (a page's Template select lives on one tab, its preview on another).\nSet empty to disable.",
7350
+ "value": { "type": "string", "default": "'form'" }
7390
7351
  },
7391
7352
  {
7392
- "name": "shiftBoundary",
7393
- "description": "The shift boundary describes clipping element(s) that overflow will be checked relative to when shifting. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7394
- "value": { "type": "Element | Element[]" }
7353
+ "name": "debounce",
7354
+ "description": "Debounce in ms between a form change and its auto-save.",
7355
+ "value": { "type": "number", "default": "400" }
7395
7356
  },
7396
7357
  {
7397
- "name": "shift-padding",
7398
- "description": "The amount of padding, in pixels, to exceed before the shift behavior will occur.",
7399
- "value": { "type": "number", "default": "0" }
7358
+ "name": "zoom",
7359
+ "description": "Zooms the previewed page out (0–1]. The frame always fills the panel;\nzoom shrinks the content browser-style, so 0.4 shows the page at 40%\nsize with correspondingly more of it visible. 1 = natural size.\nIgnored when `fill` is set.",
7360
+ "value": { "type": "number", "default": "1" }
7400
7361
  },
7401
7362
  {
7402
- "name": "auto-size",
7403
- "description": "When set, this will cause the popup to automatically resize itself to prevent it from overflowing.",
7404
- "value": { "type": "'horizontal' | 'vertical' | 'both'" }
7363
+ "name": "min-height",
7364
+ "description": "The visible height (in CSS pixels) of the preview panel. Fixed rather\nthan measured, because a measured height would feed back into the\nscaled iframe's layout box and grow unbounded. With `fill` set, this\nbecomes a `min-height` floor instead of the height.",
7365
+ "value": { "type": "number", "default": "480" }
7405
7366
  },
7406
7367
  {
7407
- "name": "sync",
7408
- "description": "Syncs the popup's width or height to that of the anchor element.",
7409
- "value": { "type": "'width' | 'height' | 'both'" }
7368
+ "name": "fill",
7369
+ "description": "Fills the panel's own column height instead of using a fixed\n`min-height` pixel height — for hosts (like zn-theme-editor) whose\nlayout already stretches the column to match a taller sibling.\n`zoom` is ignored when set: its oversize maths depends on a known\npixel height, which `fill` deliberately doesn't have.",
7370
+ "value": { "type": "boolean", "default": "false" }
7410
7371
  },
7411
7372
  {
7412
- "name": "autoSizeBoundary",
7413
- "description": "The auto-size boundary describes clipping element(s) that overflow will be checked relative to when resizing. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7414
- "value": { "type": "Element | Element[]" }
7373
+ "name": "device",
7374
+ "description": "Constrains and centres the preview to a device width: `desktop` (100%),\n`tablet` (768px) or `mobile` (390px). The iframe element itself is\nnarrowed, so the embedded page's own media queries fire.",
7375
+ "value": { "type": "PreviewFrameDevice", "default": "'desktop'" }
7415
7376
  },
7416
7377
  {
7417
- "name": "auto-size-padding",
7418
- "description": "The amount of padding, in pixels, to exceed before the auto-size behavior will occur.",
7419
- "value": { "type": "number", "default": "0" }
7378
+ "name": "backdrop",
7379
+ "description": "Backdrop behind the stage: `dots` (default) is the canvas dot grid; `panel` is a plain `rgb(var(--zn-panel))` fill.",
7380
+ "value": { "type": "'dots' | 'panel'", "default": "'dots'" }
7420
7381
  },
7421
7382
  {
7422
- "name": "hover-bridge",
7423
- "description": "When a gap exists between the anchor and the popup element, this option will add a \"hover bridge\" that fills the\ngap using an invisible element. This makes listening for events such as `mouseenter` and `mouseleave` more sane\nbecause the pointer never technically leaves the element. The hover bridge will only be drawn when the popover is\nactive.",
7383
+ "name": "interactive",
7384
+ "description": "Lets pointer input through to the embedded page. The preview is inert by\ndefault: clicks never reach the frame, so the previewed page can't be\nnavigated or submitted from inside the preview. Cross-origin content can't\nbe reached from here to cancel its own handlers, so this blocks pointer\ninput entirely — hover goes with it. Scrolling doesn't: an overflowing\npage is scrolled by the panel rather than by the frame (see _contentHeight).\n\nSet, the frame becomes a real viewport instead: it stays the panel's own\nheight and the embed scrolls itself, so there is one scrollbar rather than\na panel scrolling an oversized frame, and the embed's viewport-relative\nlayout (`100vh`, `position: fixed`, sticky headers) sizes to what's on\nscreen. _contentHeight is ignored while this is set.",
7424
7385
  "value": { "type": "boolean", "default": "false" }
7425
7386
  }
7426
7387
  ],
7427
- "slots": [
7428
- { "name": "", "description": "The default slot." },
7429
- { "name": "example", "description": "An example slot." }
7430
- ],
7431
7388
  "events": [
7432
- { "name": "zn-event-name", "description": "Emitted as an example." }
7389
+ {
7390
+ "name": "zn-error",
7391
+ "description": "Emitted when the preview reports a render error or a save fails."
7392
+ }
7433
7393
  ],
7434
7394
  "js": {
7435
7395
  "properties": [
7436
7396
  {
7437
- "name": "popup",
7438
- "description": "A reference to the internal popup container. Useful for animating and styling the popup with JavaScript.",
7439
- "type": "HTMLElement"
7397
+ "name": "src",
7398
+ "description": "URL of the preview shell page (tokened embed URL).",
7399
+ "type": "string"
7440
7400
  },
7441
7401
  {
7442
- "name": "anchor",
7443
- "description": "The element the popup will be anchored to. If the anchor lives outside of the popup, you can provide the anchor\nelement `id`, a DOM element reference, or a `VirtualElement`. If the anchor lives inside the popup, use the\n`anchor` slot instead.",
7444
- "type": "Element | string | VirtualElement"
7402
+ "name": "frameOrigin",
7403
+ "description": "Expected origin of the iframe; all postMessage traffic is checked against it.",
7404
+ "type": "string"
7445
7405
  },
7446
7406
  {
7447
- "name": "active",
7448
- "description": "Activates the positioning logic and shows the popup. When this attribute is removed, the positioning logic is torn\ndown and the popup will be hidden.",
7449
- "type": "boolean"
7407
+ "name": "dataUri",
7408
+ "description": "Endpoint returning the hp-preview:config payload JSON. The console proxy rewrites this attribute to an app-prefixed path for proper fetch resolution.",
7409
+ "type": "string"
7450
7410
  },
7451
7411
  {
7452
- "name": "placement",
7453
- "description": "The preferred placement of the popup. Note that the actual placement will vary as configured to keep the\npanel inside of the viewport.",
7454
- "type": "| 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end'"
7412
+ "name": "watch",
7413
+ "description": "Selector (resolved against the component's root node) for the forms to watch.\nDefaults to only forms explicitly opted in via a `data-auto-save` attribute —\nunmarked forms keep normal submit behavior and are never intercepted,\nauto-saved, or used to trigger a preview refresh. Override to widen the scope.",
7414
+ "type": "string"
7455
7415
  },
7456
7416
  {
7457
- "name": "strategy",
7458
- "description": "Determines how the popup is positioned. The `absolute` strategy works well in most cases, but if overflow is\nclipped, using a `fixed` position strategy can often workaround it.",
7459
- "type": "'absolute' | 'fixed'"
7417
+ "name": "refreshOn",
7418
+ "description": "Selector for forms whose saves are left to the shell but should still\nrefresh the preview. These are never intercepted: the shell submits them\n(so its own response handling — alerts, refreshes — runs as normal) and the\npreview re-fetches its config once the shell reports the save complete.\nMatched by delegation on the shell's bubbled `complete` event rather than\nby attaching to the forms themselves, so a save anywhere on the page\nrefreshes the preview — including forms in a different DOM root, e.g. a\npage-level form saved while the preview sits inside a tab panel's shadow\nroot (a page's Template select lives on one tab, its preview on another).\nSet empty to disable.",
7419
+ "type": "string"
7460
7420
  },
7461
7421
  {
7462
- "name": "distance",
7463
- "description": "The distance in pixels from which to offset the panel away from its anchor.",
7422
+ "name": "debounce",
7423
+ "description": "Debounce in ms between a form change and its auto-save.",
7464
7424
  "type": "number"
7465
7425
  },
7466
7426
  {
7467
- "name": "skidding",
7468
- "description": "The distance in pixels from which to offset the panel along its anchor.",
7469
- "type": "number"
7470
- },
7471
- {
7472
- "name": "arrow",
7473
- "description": "Attaches an arrow to the popup. The arrow's size and color can be customized using the `--arrow-size` and\n`--arrow-color` custom properties. For additional customizations, you can also target the arrow using\n`::part(arrow)` in your stylesheet.",
7474
- "type": "boolean"
7475
- },
7476
- {
7477
- "name": "arrowPlacement",
7478
- "description": "The placement of the arrow. The default is `anchor`, which will align the arrow as close to the center of the\nanchor as possible, considering available space and `arrow-padding`. A value of `start`, `end`, or `center` will\nalign the arrow to the start, end, or center of the popover instead.",
7479
- "type": "'start' | 'end' | 'center' | 'anchor'"
7480
- },
7481
- {
7482
- "name": "arrowPadding",
7483
- "description": "The amount of padding between the arrow and the edges of the popup. If the popup has a border-radius, for example,\nthis will prevent it from overflowing the corners.",
7427
+ "name": "zoom",
7428
+ "description": "Zooms the previewed page out (0–1]. The frame always fills the panel;\nzoom shrinks the content browser-style, so 0.4 shows the page at 40%\nsize with correspondingly more of it visible. 1 = natural size.\nIgnored when `fill` is set.",
7484
7429
  "type": "number"
7485
7430
  },
7486
7431
  {
7487
- "name": "flip",
7488
- "description": "When set, placement of the popup will flip to the opposite site to keep it in view. You can use\n`flipFallbackPlacements` to further configure how the fallback placement is determined.",
7489
- "type": "boolean"
7490
- },
7491
- {
7492
- "name": "flipFallbackPlacements",
7493
- "description": "If the preferred placement doesn't fit, popup will be tested in these fallback placements until one fits. Must be a\nstring of any number of placements separated by a space, e.g. \"top bottom left\". If no placement fits, the flip\nfallback strategy will be used instead.",
7494
- "type": "string"
7495
- },
7496
- {
7497
- "name": "flipFallbackStrategy",
7498
- "description": "When neither the preferred placement nor the fallback placements fit, this value will be used to determine whether\nthe popup should be positioned using the best available fit based on available space or as it was initially\npreferred.",
7499
- "type": "'best-fit' | 'initial'"
7500
- },
7501
- {
7502
- "name": "flipBoundary",
7503
- "description": "The flip boundary describes clipping element(s) that overflow will be checked relative to when flipping. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7504
- "type": "Element | Element[]"
7505
- },
7506
- {
7507
- "name": "flipPadding",
7508
- "description": "The amount of padding, in pixels, to exceed before the flip behavior will occur.",
7432
+ "name": "minHeight",
7433
+ "description": "The visible height (in CSS pixels) of the preview panel. Fixed rather\nthan measured, because a measured height would feed back into the\nscaled iframe's layout box and grow unbounded. With `fill` set, this\nbecomes a `min-height` floor instead of the height.",
7509
7434
  "type": "number"
7510
7435
  },
7511
7436
  {
7512
- "name": "shift",
7513
- "description": "Moves the popup along the axis to keep it in view when clipped.",
7437
+ "name": "fill",
7438
+ "description": "Fills the panel's own column height instead of using a fixed\n`min-height` pixel height — for hosts (like zn-theme-editor) whose\nlayout already stretches the column to match a taller sibling.\n`zoom` is ignored when set: its oversize maths depends on a known\npixel height, which `fill` deliberately doesn't have.",
7514
7439
  "type": "boolean"
7515
7440
  },
7516
7441
  {
7517
- "name": "shiftBoundary",
7518
- "description": "The shift boundary describes clipping element(s) that overflow will be checked relative to when shifting. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7519
- "type": "Element | Element[]"
7520
- },
7521
- {
7522
- "name": "shiftPadding",
7523
- "description": "The amount of padding, in pixels, to exceed before the shift behavior will occur.",
7524
- "type": "number"
7525
- },
7526
- {
7527
- "name": "autoSize",
7528
- "description": "When set, this will cause the popup to automatically resize itself to prevent it from overflowing.",
7529
- "type": "'horizontal' | 'vertical' | 'both'"
7530
- },
7531
- {
7532
- "name": "sync",
7533
- "description": "Syncs the popup's width or height to that of the anchor element.",
7534
- "type": "'width' | 'height' | 'both'"
7535
- },
7536
- {
7537
- "name": "autoSizeBoundary",
7538
- "description": "The auto-size boundary describes clipping element(s) that overflow will be checked relative to when resizing. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7539
- "type": "Element | Element[]"
7442
+ "name": "device",
7443
+ "description": "Constrains and centres the preview to a device width: `desktop` (100%),\n`tablet` (768px) or `mobile` (390px). The iframe element itself is\nnarrowed, so the embedded page's own media queries fire.",
7444
+ "type": "PreviewFrameDevice"
7540
7445
  },
7541
7446
  {
7542
- "name": "autoSizePadding",
7543
- "description": "The amount of padding, in pixels, to exceed before the auto-size behavior will occur.",
7544
- "type": "number"
7447
+ "name": "backdrop",
7448
+ "description": "Backdrop behind the stage: `dots` (default) is the canvas dot grid; `panel` is a plain `rgb(var(--zn-panel))` fill.",
7449
+ "type": "'dots' | 'panel'"
7545
7450
  },
7546
7451
  {
7547
- "name": "hoverBridge",
7548
- "description": "When a gap exists between the anchor and the popup element, this option will add a \"hover bridge\" that fills the\ngap using an invisible element. This makes listening for events such as `mouseenter` and `mouseleave` more sane\nbecause the pointer never technically leaves the element. The hover bridge will only be drawn when the popover is\nactive.",
7452
+ "name": "interactive",
7453
+ "description": "Lets pointer input through to the embedded page. The preview is inert by\ndefault: clicks never reach the frame, so the previewed page can't be\nnavigated or submitted from inside the preview. Cross-origin content can't\nbe reached from here to cancel its own handlers, so this blocks pointer\ninput entirely — hover goes with it. Scrolling doesn't: an overflowing\npage is scrolled by the panel rather than by the frame (see _contentHeight).\n\nSet, the frame becomes a real viewport instead: it stays the panel's own\nheight and the embed scrolls itself, so there is one scrollbar rather than\na panel scrolling an oversized frame, and the embed's viewport-relative\nlayout (`100vh`, `position: fixed`, sticky headers) sizes to what's on\nscreen. _contentHeight is ignored while this is set.",
7549
7454
  "type": "boolean"
7550
7455
  },
7551
- { "name": "handleAnchorHover" }
7456
+ { "name": "frame", "type": "HTMLIFrameElement" }
7552
7457
  ],
7553
7458
  "events": [
7554
7459
  {
7555
- "name": "zn-event-name",
7556
- "description": "Emitted as an example."
7460
+ "name": "zn-error",
7461
+ "description": "Emitted when the preview reports a render error or a save fails."
7557
7462
  }
7558
7463
  ]
7559
7464
  }
7560
7465
  },
7561
7466
  {
7562
- "name": "zn-preview-frame",
7563
- "description": "Embeds a live preview iframe and drives the hp-preview postMessage\nprotocol: answers the frame's ready handshake with a config payload fetched\nfrom data-uri, auto-saves watched forms on change, refreshes the preview\nafter each save (its own, or a shell-driven save of a `refresh-on` form),\naccepts a theme payload via setTheme() that is retained and replayed\nafter every ready handshake, and grows the frame to a content height the\nembed reports so the panel scrolls an overflowing page.\n---\n\n\n### **Events:**\n - **zn-error** - Emitted when the preview reports a render error or a save fails.\n\n### **Methods:**\n - **refresh()** - Re-fetches the payload and pushes a fresh config to the preview.\n- **setTheme(theme: _Record<string, unknown>_)** - Pushes a theme payload into the preview. The payload is retained and\nre-posted after every ready handshake, so a frame reload doesn't drop an\nin-progress theme.\n\n### **CSS Properties:**\n - **--zn-preview-frame-dot-spacing** - Spacing of the backdrop dot grid (`backdrop=\"dots\"`). Defaults to 20px. _(default: undefined)_\n- **--zn-preview-frame-dot-opacity** - Opacity of the backdrop dots (`backdrop=\"dots\"`). Defaults to 0.08. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.\n- **stage** - The device-width wrapper around the iframe.\n- **iframe** - The preview iframe.\n- **error** - The error overlay.",
7467
+ "name": "zn-priority-list",
7468
+ "description": "A reorderable list where each item receives a numerical priority based on its position. Supports drag-and-drop\nand keyboard reordering. Priority values are submitted as form data via hidden inputs.\n---\n\n\n### **Events:**\n - **zn-change** - Emitted when the order of items changes.\n- **zn-reorder** - Emitted when items are reordered. Call `getPriorityMap()` on the component to get the updated `{ key: string, priority: number }[]` array.\n\n### **Methods:**\n - **getPriorityMap(): _PriorityItem[]_** - Returns the priority map: an array of { key, priority } objects.\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\n### **Slots:**\n - _default_ - The default slot where list items are placed. Each slotted element must have a `value` attribute that uniquely identifies the item. The component automatically assigns slot names to project each item into the correct position. The item's position in the list determines its priority (top = `priority-start`, incrementing).\n- **label** - The component's label. Required for proper accessibility. Alternatively, use the `label` attribute.\n- **label-tooltip** - Used to add text displayed in a tooltip next to the label.\n- **help-text** - Text that describes how to use the component. Alternatively, use the `help-text` attribute.\n\n### **CSS Properties:**\n - **--zn-priority-list-item-gap** - The gap between list items. Defaults to `var(--zn-spacing-2x-small)`. _(default: undefined)_\n- **--zn-priority-list-item-padding** - The padding inside each item. Defaults to `var(--zn-spacing-small) var(--zn-spacing-medium)`. _(default: undefined)_\n- **--zn-priority-list-actions-gap** - The gap between an item's slotted actions. Defaults to `var(--zn-spacing-x-small)`. _(default: undefined)_\n- **--zn-priority-list-handle-color** - The color of the drag handle. Defaults to `var(--zn-color-neutral-500)`. _(default: undefined)_\n- **--zn-priority-list-priority-color** - The color of the priority number. Defaults to `var(--zn-color-neutral-600)`. _(default: undefined)_\n\n### **CSS Parts:**\n - **form-control** - The form control wrapper.\n- **form-control-label** - The label wrapper.\n- **form-control-input** - The input area wrapper.\n- **form-control-help-text** - The help text wrapper.\n- **list** - The list container.\n- **item** - An individual list item row.\n- **drag-handle** - The drag handle icon.\n- **priority** - The priority number badge.\n- **content** - The content area of an item.",
7564
7469
  "doc-url": "",
7565
7470
  "attributes": [
7566
7471
  {
7567
- "name": "src",
7568
- "description": "URL of the preview shell page (tokened embed URL).",
7472
+ "name": "name",
7473
+ "description": "The name prefix for form submission. Each item generates a hidden input named `{name}[{itemValue}]`\nwith the priority number as its value.",
7569
7474
  "value": { "type": "string", "default": "''" }
7570
7475
  },
7571
7476
  {
7572
- "name": "frame-origin",
7573
- "description": "Expected origin of the iframe; all postMessage traffic is checked against it.",
7477
+ "name": "value",
7478
+ "description": "The current ordered list of item keys, reflecting the visual order. This is the source of truth for ordering.\nEach entry should match a `value` attribute on a slotted child element.",
7479
+ "value": { "type": "string[]" }
7480
+ },
7481
+ {
7482
+ "name": "label",
7483
+ "description": "The component's label. Required for proper accessibility.",
7574
7484
  "value": { "type": "string", "default": "''" }
7575
7485
  },
7576
7486
  {
7577
- "name": "data-uri",
7578
- "description": "Endpoint returning the hp-preview:config payload JSON. The console proxy rewrites this attribute to an app-prefixed path for proper fetch resolution.",
7487
+ "name": "label-tooltip",
7488
+ "description": "Text that appears in a tooltip next to the label.",
7579
7489
  "value": { "type": "string", "default": "''" }
7580
7490
  },
7581
7491
  {
7582
- "name": "watch",
7583
- "description": "Selector (resolved against the component's root node) for the forms to watch.\nDefaults to only forms explicitly opted in via a `data-auto-save` attribute —\nunmarked forms keep normal submit behavior and are never intercepted,\nauto-saved, or used to trigger a preview refresh. Override to widen the scope.",
7584
- "value": { "type": "string", "default": "'form[data-auto-save]'" }
7492
+ "name": "help-text",
7493
+ "description": "Help text that describes how to use the component.",
7494
+ "value": { "type": "string", "default": "''" }
7585
7495
  },
7586
7496
  {
7587
- "name": "refresh-on",
7588
- "description": "Selector for forms whose saves are left to the shell but should still\nrefresh the preview. These are never intercepted: the shell submits them\n(so its own response handling — alerts, refreshes — runs as normal) and the\npreview re-fetches its config once the shell reports the save complete.\nMatched by delegation on the shell's bubbled `complete` event rather than\nby attaching to the forms themselves, so a save anywhere on the page\nrefreshes the preview — including forms in a different DOM root, e.g. a\npage-level form saved while the preview sits inside a tab panel's shadow\nroot (a page's Template select lives on one tab, its preview on another).\nSet empty to disable.",
7589
- "value": { "type": "string", "default": "'form'" }
7497
+ "name": "form",
7498
+ "description": "Associates the control with a form by id. The form must be in the same document or shadow root.",
7499
+ "value": { "type": "string", "default": "''" }
7590
7500
  },
7591
7501
  {
7592
- "name": "debounce",
7593
- "description": "Debounce in ms between a form change and its auto-save.",
7594
- "value": { "type": "number", "default": "400" }
7502
+ "name": "size",
7503
+ "description": "The size of the list items.",
7504
+ "value": {
7505
+ "type": "'small' | 'medium' | 'large'",
7506
+ "default": "'medium'"
7507
+ }
7595
7508
  },
7596
7509
  {
7597
- "name": "zoom",
7598
- "description": "Zooms the previewed page out (0–1]. The frame always fills the panel;\nzoom shrinks the content browser-style, so 0.4 shows the page at 40%\nsize with correspondingly more of it visible. 1 = natural size.\nIgnored when `fill` is set.",
7510
+ "name": "disabled",
7511
+ "description": "Whether the priority list is disabled.",
7512
+ "value": { "type": "boolean", "default": "false" }
7513
+ },
7514
+ {
7515
+ "name": "required",
7516
+ "description": "Ensures the form control has a value before allowing submission.",
7517
+ "value": { "type": "boolean", "default": "false" }
7518
+ },
7519
+ {
7520
+ "name": "priority-start",
7521
+ "description": "The starting priority number. Defaults to 1.",
7599
7522
  "value": { "type": "number", "default": "1" }
7600
7523
  },
7601
7524
  {
7602
- "name": "min-height",
7603
- "description": "The visible height (in CSS pixels) of the preview panel. Fixed rather\nthan measured, because a measured height would feed back into the\nscaled iframe's layout box and grow unbounded. With `fill` set, this\nbecomes a `min-height` floor instead of the height.",
7604
- "value": { "type": "number", "default": "480" }
7525
+ "name": "formaction",
7526
+ "description": "When set, the associated form will be submitted with the given action URL whenever items are reordered.\nIf set to an empty string, the form will be submitted using its existing action.",
7527
+ "value": { "type": "string" }
7605
7528
  },
7606
7529
  {
7607
- "name": "fill",
7608
- "description": "Fills the panel's own column height instead of using a fixed\n`min-height` pixel height — for hosts (like zn-theme-editor) whose\nlayout already stretches the column to match a taller sibling.\n`zoom` is ignored when set: its oversize maths depends on a known\npixel height, which `fill` deliberately doesn't have.",
7609
- "value": { "type": "boolean", "default": "false" }
7530
+ "name": "order",
7531
+ "description": "A comma-separated list of item keys defining the initial display order.\nKeys must match the `value` attributes on slotted children.\nAny slotted items not listed are appended at the end in DOM order.",
7532
+ "value": { "type": "string", "default": "''" }
7533
+ }
7534
+ ],
7535
+ "slots": [
7536
+ {
7537
+ "name": "",
7538
+ "description": "The default slot where list items are placed. Each slotted element must have a `value` attribute that uniquely identifies the item. The component automatically assigns slot names to project each item into the correct position. The item's position in the list determines its priority (top = `priority-start`, incrementing)."
7610
7539
  },
7611
7540
  {
7612
- "name": "device",
7613
- "description": "Constrains and centres the preview to a device width: `desktop` (100%),\n`tablet` (768px) or `mobile` (390px). The iframe element itself is\nnarrowed, so the embedded page's own media queries fire.",
7614
- "value": { "type": "PreviewFrameDevice", "default": "'desktop'" }
7541
+ "name": "label",
7542
+ "description": "The component's label. Required for proper accessibility. Alternatively, use the `label` attribute."
7615
7543
  },
7616
7544
  {
7617
- "name": "backdrop",
7618
- "description": "Backdrop behind the stage: `dots` (default) is the canvas dot grid; `panel` is a plain `rgb(var(--zn-panel))` fill.",
7619
- "value": { "type": "'dots' | 'panel'", "default": "'dots'" }
7545
+ "name": "label-tooltip",
7546
+ "description": "Used to add text displayed in a tooltip next to the label."
7620
7547
  },
7621
7548
  {
7622
- "name": "interactive",
7623
- "description": "Lets pointer input through to the embedded page. The preview is inert by\ndefault: clicks never reach the frame, so the previewed page can't be\nnavigated or submitted from inside the preview. Cross-origin content can't\nbe reached from here to cancel its own handlers, so this blocks pointer\ninput entirely — hover goes with it. Scrolling doesn't: an overflowing\npage is scrolled by the panel rather than by the frame (see _contentHeight).\n\nSet, the frame becomes a real viewport instead: it stays the panel's own\nheight and the embed scrolls itself, so there is one scrollbar rather than\na panel scrolling an oversized frame, and the embed's viewport-relative\nlayout (`100vh`, `position: fixed`, sticky headers) sizes to what's on\nscreen. _contentHeight is ignored while this is set.",
7624
- "value": { "type": "boolean", "default": "false" }
7549
+ "name": "help-text",
7550
+ "description": "Text that describes how to use the component. Alternatively, use the `help-text` attribute."
7625
7551
  }
7626
7552
  ],
7627
7553
  "events": [
7628
7554
  {
7629
- "name": "zn-error",
7630
- "description": "Emitted when the preview reports a render error or a save fails."
7555
+ "name": "zn-change",
7556
+ "description": "Emitted when the order of items changes."
7557
+ },
7558
+ {
7559
+ "name": "zn-reorder",
7560
+ "description": "Emitted when items are reordered. Call `getPriorityMap()` on the component to get the updated `{ key: string, priority: number }[]` array."
7631
7561
  }
7632
7562
  ],
7633
7563
  "js": {
7634
7564
  "properties": [
7565
+ { "name": "hiddenInputsContainer", "type": "HTMLDivElement" },
7635
7566
  {
7636
- "name": "src",
7637
- "description": "URL of the preview shell page (tokened embed URL).",
7567
+ "name": "name",
7568
+ "description": "The name prefix for form submission. Each item generates a hidden input named `{name}[{itemValue}]`\nwith the priority number as its value.",
7638
7569
  "type": "string"
7639
7570
  },
7640
7571
  {
7641
- "name": "frameOrigin",
7642
- "description": "Expected origin of the iframe; all postMessage traffic is checked against it.",
7643
- "type": "string"
7572
+ "name": "value",
7573
+ "description": "The current ordered list of item keys, reflecting the visual order. This is the source of truth for ordering.\nEach entry should match a `value` attribute on a slotted child element.",
7574
+ "type": "string[]"
7644
7575
  },
7576
+ { "name": "defaultValue", "type": "string[]" },
7645
7577
  {
7646
- "name": "dataUri",
7647
- "description": "Endpoint returning the hp-preview:config payload JSON. The console proxy rewrites this attribute to an app-prefixed path for proper fetch resolution.",
7578
+ "name": "label",
7579
+ "description": "The component's label. Required for proper accessibility.",
7648
7580
  "type": "string"
7649
7581
  },
7650
7582
  {
7651
- "name": "watch",
7652
- "description": "Selector (resolved against the component's root node) for the forms to watch.\nDefaults to only forms explicitly opted in via a `data-auto-save` attribute —\nunmarked forms keep normal submit behavior and are never intercepted,\nauto-saved, or used to trigger a preview refresh. Override to widen the scope.",
7583
+ "name": "labelTooltip",
7584
+ "description": "Text that appears in a tooltip next to the label.",
7653
7585
  "type": "string"
7654
7586
  },
7655
7587
  {
7656
- "name": "refreshOn",
7657
- "description": "Selector for forms whose saves are left to the shell but should still\nrefresh the preview. These are never intercepted: the shell submits them\n(so its own response handling — alerts, refreshes — runs as normal) and the\npreview re-fetches its config once the shell reports the save complete.\nMatched by delegation on the shell's bubbled `complete` event rather than\nby attaching to the forms themselves, so a save anywhere on the page\nrefreshes the preview — including forms in a different DOM root, e.g. a\npage-level form saved while the preview sits inside a tab panel's shadow\nroot (a page's Template select lives on one tab, its preview on another).\nSet empty to disable.",
7588
+ "name": "helpText",
7589
+ "description": "Help text that describes how to use the component.",
7658
7590
  "type": "string"
7659
7591
  },
7660
7592
  {
7661
- "name": "debounce",
7662
- "description": "Debounce in ms between a form change and its auto-save.",
7663
- "type": "number"
7593
+ "name": "form",
7594
+ "description": "Associates the control with a form by id. The form must be in the same document or shadow root.",
7595
+ "type": "string"
7664
7596
  },
7665
7597
  {
7666
- "name": "zoom",
7667
- "description": "Zooms the previewed page out (0–1]. The frame always fills the panel;\nzoom shrinks the content browser-style, so 0.4 shows the page at 40%\nsize with correspondingly more of it visible. 1 = natural size.\nIgnored when `fill` is set.",
7668
- "type": "number"
7598
+ "name": "size",
7599
+ "description": "The size of the list items.",
7600
+ "type": "'small' | 'medium' | 'large'"
7669
7601
  },
7670
7602
  {
7671
- "name": "minHeight",
7672
- "description": "The visible height (in CSS pixels) of the preview panel. Fixed rather\nthan measured, because a measured height would feed back into the\nscaled iframe's layout box and grow unbounded. With `fill` set, this\nbecomes a `min-height` floor instead of the height.",
7673
- "type": "number"
7603
+ "name": "disabled",
7604
+ "description": "Whether the priority list is disabled.",
7605
+ "type": "boolean"
7674
7606
  },
7675
7607
  {
7676
- "name": "fill",
7677
- "description": "Fills the panel's own column height instead of using a fixed\n`min-height` pixel height — for hosts (like zn-theme-editor) whose\nlayout already stretches the column to match a taller sibling.\n`zoom` is ignored when set: its oversize maths depends on a known\npixel height, which `fill` deliberately doesn't have.",
7608
+ "name": "required",
7609
+ "description": "Ensures the form control has a value before allowing submission.",
7678
7610
  "type": "boolean"
7679
7611
  },
7680
7612
  {
7681
- "name": "device",
7682
- "description": "Constrains and centres the preview to a device width: `desktop` (100%),\n`tablet` (768px) or `mobile` (390px). The iframe element itself is\nnarrowed, so the embedded page's own media queries fire.",
7683
- "type": "PreviewFrameDevice"
7613
+ "name": "priorityStart",
7614
+ "description": "The starting priority number. Defaults to 1.",
7615
+ "type": "number"
7684
7616
  },
7685
7617
  {
7686
- "name": "backdrop",
7687
- "description": "Backdrop behind the stage: `dots` (default) is the canvas dot grid; `panel` is a plain `rgb(var(--zn-panel))` fill.",
7688
- "type": "'dots' | 'panel'"
7618
+ "name": "formAction",
7619
+ "description": "When set, the associated form will be submitted with the given action URL whenever items are reordered.\nIf set to an empty string, the form will be submitted using its existing action.",
7620
+ "type": "string"
7689
7621
  },
7690
7622
  {
7691
- "name": "interactive",
7692
- "description": "Lets pointer input through to the embedded page. The preview is inert by\ndefault: clicks never reach the frame, so the previewed page can't be\nnavigated or submitted from inside the preview. Cross-origin content can't\nbe reached from here to cancel its own handlers, so this blocks pointer\ninput entirely — hover goes with it. Scrolling doesn't: an overflowing\npage is scrolled by the panel rather than by the frame (see _contentHeight).\n\nSet, the frame becomes a real viewport instead: it stays the panel's own\nheight and the embed scrolls itself, so there is one scrollbar rather than\na panel scrolling an oversized frame, and the embed's viewport-relative\nlayout (`100vh`, `position: fixed`, sticky headers) sizes to what's on\nscreen. _contentHeight is ignored while this is set.",
7693
- "type": "boolean"
7623
+ "name": "order",
7624
+ "description": "A comma-separated list of item keys defining the initial display order.\nKeys must match the `value` attributes on slotted children.\nAny slotted items not listed are appended at the end in DOM order.",
7625
+ "type": "string"
7694
7626
  },
7695
- { "name": "frame", "type": "HTMLIFrameElement" }
7627
+ {
7628
+ "name": "validity",
7629
+ "description": "Gets the validity state object.",
7630
+ "type": "ValidityState"
7631
+ },
7632
+ {
7633
+ "name": "validationMessage",
7634
+ "description": "Gets the validation message.",
7635
+ "type": "string"
7636
+ }
7696
7637
  ],
7697
7638
  "events": [
7698
7639
  {
7699
- "name": "zn-error",
7700
- "description": "Emitted when the preview reports a render error or a save fails."
7640
+ "name": "zn-change",
7641
+ "description": "Emitted when the order of items changes."
7642
+ },
7643
+ {
7644
+ "name": "zn-reorder",
7645
+ "description": "Emitted when items are reordered. Call `getPriorityMap()` on the component to get the updated `{ key: string, priority: number }[]` array."
7701
7646
  }
7702
7647
  ]
7703
7648
  }
7704
7649
  },
7705
7650
  {
7706
- "name": "zn-priority-list",
7707
- "description": "A reorderable list where each item receives a numerical priority based on its position. Supports drag-and-drop\nand keyboard reordering. Priority values are submitted as form data via hidden inputs.\n---\n\n\n### **Events:**\n - **zn-change** - Emitted when the order of items changes.\n- **zn-reorder** - Emitted when items are reordered. Call `getPriorityMap()` on the component to get the updated `{ key: string, priority: number }[]` array.\n\n### **Methods:**\n - **getPriorityMap(): _PriorityItem[]_** - Returns the priority map: an array of { key, priority } objects.\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\n### **Slots:**\n - _default_ - The default slot where list items are placed. Each slotted element must have a `value` attribute that uniquely identifies the item. The component automatically assigns slot names to project each item into the correct position. The item's position in the list determines its priority (top = `priority-start`, incrementing).\n- **label** - The component's label. Required for proper accessibility. Alternatively, use the `label` attribute.\n- **label-tooltip** - Used to add text displayed in a tooltip next to the label.\n- **help-text** - Text that describes how to use the component. Alternatively, use the `help-text` attribute.\n\n### **CSS Properties:**\n - **--zn-priority-list-item-gap** - The gap between list items. Defaults to `var(--zn-spacing-2x-small)`. _(default: undefined)_\n- **--zn-priority-list-item-padding** - The padding inside each item. Defaults to `var(--zn-spacing-small) var(--zn-spacing-medium)`. _(default: undefined)_\n- **--zn-priority-list-actions-gap** - The gap between an item's slotted actions. Defaults to `var(--zn-spacing-x-small)`. _(default: undefined)_\n- **--zn-priority-list-handle-color** - The color of the drag handle. Defaults to `var(--zn-color-neutral-500)`. _(default: undefined)_\n- **--zn-priority-list-priority-color** - The color of the priority number. Defaults to `var(--zn-color-neutral-600)`. _(default: undefined)_\n\n### **CSS Parts:**\n - **form-control** - The form control wrapper.\n- **form-control-label** - The label wrapper.\n- **form-control-input** - The input area wrapper.\n- **form-control-help-text** - The help text wrapper.\n- **list** - The list container.\n- **item** - An individual list item row.\n- **drag-handle** - The drag handle icon.\n- **priority** - The priority number badge.\n- **content** - The content area of an item.",
7651
+ "name": "zn-popup",
7652
+ "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 - **reposition()** - Forces the popup to recalculate and reposition itself.\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.",
7708
7653
  "doc-url": "",
7709
7654
  "attributes": [
7710
7655
  {
7711
- "name": "name",
7712
- "description": "The name prefix for form submission. Each item generates a hidden input named `{name}[{itemValue}]`\nwith the priority number as its value.",
7713
- "value": { "type": "string", "default": "''" }
7656
+ "name": "anchor",
7657
+ "description": "The element the popup will be anchored to. If the anchor lives outside of the popup, you can provide the anchor\nelement `id`, a DOM element reference, or a `VirtualElement`. If the anchor lives inside the popup, use the\n`anchor` slot instead.",
7658
+ "value": { "type": "Element | string | VirtualElement" }
7659
+ },
7660
+ {
7661
+ "name": "active",
7662
+ "description": "Activates the positioning logic and shows the popup. When this attribute is removed, the positioning logic is torn\ndown and the popup will be hidden.",
7663
+ "value": { "type": "boolean", "default": "false" }
7664
+ },
7665
+ {
7666
+ "name": "placement",
7667
+ "description": "The preferred placement of the popup. Note that the actual placement will vary as configured to keep the\npanel inside of the viewport.",
7668
+ "value": {
7669
+ "type": "| 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end'",
7670
+ "default": "'top'"
7671
+ }
7672
+ },
7673
+ {
7674
+ "name": "strategy",
7675
+ "description": "Determines how the popup is positioned. The `absolute` strategy works well in most cases, but if overflow is\nclipped, using a `fixed` position strategy can often workaround it.",
7676
+ "value": { "type": "'absolute' | 'fixed'", "default": "'fixed'" }
7677
+ },
7678
+ {
7679
+ "name": "distance",
7680
+ "description": "The distance in pixels from which to offset the panel away from its anchor.",
7681
+ "value": { "type": "number", "default": "0" }
7714
7682
  },
7715
7683
  {
7716
- "name": "value",
7717
- "description": "The current ordered list of item keys, reflecting the visual order. This is the source of truth for ordering.\nEach entry should match a `value` attribute on a slotted child element.",
7718
- "value": { "type": "string[]" }
7684
+ "name": "skidding",
7685
+ "description": "The distance in pixels from which to offset the panel along its anchor.",
7686
+ "value": { "type": "number", "default": "0" }
7719
7687
  },
7720
7688
  {
7721
- "name": "label",
7722
- "description": "The component's label. Required for proper accessibility.",
7723
- "value": { "type": "string", "default": "''" }
7689
+ "name": "arrow",
7690
+ "description": "Attaches an arrow to the popup. The arrow's size and color can be customized using the `--arrow-size` and\n`--arrow-color` custom properties. For additional customizations, you can also target the arrow using\n`::part(arrow)` in your stylesheet.",
7691
+ "value": { "type": "boolean", "default": "false" }
7724
7692
  },
7725
7693
  {
7726
- "name": "label-tooltip",
7727
- "description": "Text that appears in a tooltip next to the label.",
7728
- "value": { "type": "string", "default": "''" }
7694
+ "name": "arrow-placement",
7695
+ "description": "The placement of the arrow. The default is `anchor`, which will align the arrow as close to the center of the\nanchor as possible, considering available space and `arrow-padding`. A value of `start`, `end`, or `center` will\nalign the arrow to the start, end, or center of the popover instead.",
7696
+ "value": {
7697
+ "type": "'start' | 'end' | 'center' | 'anchor'",
7698
+ "default": "'anchor'"
7699
+ }
7729
7700
  },
7730
7701
  {
7731
- "name": "help-text",
7732
- "description": "Help text that describes how to use the component.",
7733
- "value": { "type": "string", "default": "''" }
7702
+ "name": "arrow-padding",
7703
+ "description": "The amount of padding between the arrow and the edges of the popup. If the popup has a border-radius, for example,\nthis will prevent it from overflowing the corners.",
7704
+ "value": { "type": "number", "default": "10" }
7734
7705
  },
7735
7706
  {
7736
- "name": "form",
7737
- "description": "Associates the control with a form by id. The form must be in the same document or shadow root.",
7707
+ "name": "flip",
7708
+ "description": "When set, placement of the popup will flip to the opposite site to keep it in view. You can use\n`flipFallbackPlacements` to further configure how the fallback placement is determined.",
7709
+ "value": { "type": "boolean", "default": "false" }
7710
+ },
7711
+ {
7712
+ "name": "flip-fallback-placements",
7713
+ "description": "If the preferred placement doesn't fit, popup will be tested in these fallback placements until one fits. Must be a\nstring of any number of placements separated by a space, e.g. \"top bottom left\". If no placement fits, the flip\nfallback strategy will be used instead.",
7738
7714
  "value": { "type": "string", "default": "''" }
7739
7715
  },
7740
7716
  {
7741
- "name": "size",
7742
- "description": "The size of the list items.",
7717
+ "name": "flip-fallback-strategy",
7718
+ "description": "When neither the preferred placement nor the fallback placements fit, this value will be used to determine whether\nthe popup should be positioned using the best available fit based on available space or as it was initially\npreferred.",
7743
7719
  "value": {
7744
- "type": "'small' | 'medium' | 'large'",
7745
- "default": "'medium'"
7720
+ "type": "'best-fit' | 'initial'",
7721
+ "default": "'best-fit'"
7746
7722
  }
7747
7723
  },
7748
7724
  {
7749
- "name": "disabled",
7750
- "description": "Whether the priority list is disabled.",
7751
- "value": { "type": "boolean", "default": "false" }
7725
+ "name": "flipBoundary",
7726
+ "description": "The flip boundary describes clipping element(s) that overflow will be checked relative to when flipping. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7727
+ "value": { "type": "Element | Element[]" }
7752
7728
  },
7753
7729
  {
7754
- "name": "required",
7755
- "description": "Ensures the form control has a value before allowing submission.",
7730
+ "name": "flip-padding",
7731
+ "description": "The amount of padding, in pixels, to exceed before the flip behavior will occur.",
7732
+ "value": { "type": "number", "default": "0" }
7733
+ },
7734
+ {
7735
+ "name": "shift",
7736
+ "description": "Moves the popup along the axis to keep it in view when clipped.",
7756
7737
  "value": { "type": "boolean", "default": "false" }
7757
7738
  },
7758
7739
  {
7759
- "name": "priority-start",
7760
- "description": "The starting priority number. Defaults to 1.",
7761
- "value": { "type": "number", "default": "1" }
7740
+ "name": "shiftBoundary",
7741
+ "description": "The shift boundary describes clipping element(s) that overflow will be checked relative to when shifting. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7742
+ "value": { "type": "Element | Element[]" }
7762
7743
  },
7763
7744
  {
7764
- "name": "formaction",
7765
- "description": "When set, the associated form will be submitted with the given action URL whenever items are reordered.\nIf set to an empty string, the form will be submitted using its existing action.",
7766
- "value": { "type": "string" }
7745
+ "name": "shift-padding",
7746
+ "description": "The amount of padding, in pixels, to exceed before the shift behavior will occur.",
7747
+ "value": { "type": "number", "default": "0" }
7767
7748
  },
7768
7749
  {
7769
- "name": "order",
7770
- "description": "A comma-separated list of item keys defining the initial display order.\nKeys must match the `value` attributes on slotted children.\nAny slotted items not listed are appended at the end in DOM order.",
7771
- "value": { "type": "string", "default": "''" }
7772
- }
7773
- ],
7774
- "slots": [
7750
+ "name": "auto-size",
7751
+ "description": "When set, this will cause the popup to automatically resize itself to prevent it from overflowing.",
7752
+ "value": { "type": "'horizontal' | 'vertical' | 'both'" }
7753
+ },
7775
7754
  {
7776
- "name": "",
7777
- "description": "The default slot where list items are placed. Each slotted element must have a `value` attribute that uniquely identifies the item. The component automatically assigns slot names to project each item into the correct position. The item's position in the list determines its priority (top = `priority-start`, incrementing)."
7755
+ "name": "sync",
7756
+ "description": "Syncs the popup's width or height to that of the anchor element.",
7757
+ "value": { "type": "'width' | 'height' | 'both'" }
7778
7758
  },
7779
7759
  {
7780
- "name": "label",
7781
- "description": "The component's label. Required for proper accessibility. Alternatively, use the `label` attribute."
7760
+ "name": "autoSizeBoundary",
7761
+ "description": "The auto-size boundary describes clipping element(s) that overflow will be checked relative to when resizing. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7762
+ "value": { "type": "Element | Element[]" }
7782
7763
  },
7783
7764
  {
7784
- "name": "label-tooltip",
7785
- "description": "Used to add text displayed in a tooltip next to the label."
7765
+ "name": "auto-size-padding",
7766
+ "description": "The amount of padding, in pixels, to exceed before the auto-size behavior will occur.",
7767
+ "value": { "type": "number", "default": "0" }
7786
7768
  },
7787
7769
  {
7788
- "name": "help-text",
7789
- "description": "Text that describes how to use the component. Alternatively, use the `help-text` attribute."
7770
+ "name": "hover-bridge",
7771
+ "description": "When a gap exists between the anchor and the popup element, this option will add a \"hover bridge\" that fills the\ngap using an invisible element. This makes listening for events such as `mouseenter` and `mouseleave` more sane\nbecause the pointer never technically leaves the element. The hover bridge will only be drawn when the popover is\nactive.",
7772
+ "value": { "type": "boolean", "default": "false" }
7790
7773
  }
7791
7774
  ],
7775
+ "slots": [
7776
+ { "name": "", "description": "The default slot." },
7777
+ { "name": "example", "description": "An example slot." }
7778
+ ],
7792
7779
  "events": [
7793
- {
7794
- "name": "zn-change",
7795
- "description": "Emitted when the order of items changes."
7796
- },
7797
- {
7798
- "name": "zn-reorder",
7799
- "description": "Emitted when items are reordered. Call `getPriorityMap()` on the component to get the updated `{ key: string, priority: number }[]` array."
7800
- }
7780
+ { "name": "zn-event-name", "description": "Emitted as an example." }
7801
7781
  ],
7802
7782
  "js": {
7803
7783
  "properties": [
7804
- { "name": "hiddenInputsContainer", "type": "HTMLDivElement" },
7805
7784
  {
7806
- "name": "name",
7807
- "description": "The name prefix for form submission. Each item generates a hidden input named `{name}[{itemValue}]`\nwith the priority number as its value.",
7808
- "type": "string"
7785
+ "name": "popup",
7786
+ "description": "A reference to the internal popup container. Useful for animating and styling the popup with JavaScript.",
7787
+ "type": "HTMLElement"
7809
7788
  },
7810
7789
  {
7811
- "name": "value",
7812
- "description": "The current ordered list of item keys, reflecting the visual order. This is the source of truth for ordering.\nEach entry should match a `value` attribute on a slotted child element.",
7813
- "type": "string[]"
7790
+ "name": "anchor",
7791
+ "description": "The element the popup will be anchored to. If the anchor lives outside of the popup, you can provide the anchor\nelement `id`, a DOM element reference, or a `VirtualElement`. If the anchor lives inside the popup, use the\n`anchor` slot instead.",
7792
+ "type": "Element | string | VirtualElement"
7814
7793
  },
7815
- { "name": "defaultValue", "type": "string[]" },
7816
7794
  {
7817
- "name": "label",
7818
- "description": "The component's label. Required for proper accessibility.",
7819
- "type": "string"
7795
+ "name": "active",
7796
+ "description": "Activates the positioning logic and shows the popup. When this attribute is removed, the positioning logic is torn\ndown and the popup will be hidden.",
7797
+ "type": "boolean"
7820
7798
  },
7821
7799
  {
7822
- "name": "labelTooltip",
7823
- "description": "Text that appears in a tooltip next to the label.",
7824
- "type": "string"
7800
+ "name": "placement",
7801
+ "description": "The preferred placement of the popup. Note that the actual placement will vary as configured to keep the\npanel inside of the viewport.",
7802
+ "type": "| 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end'"
7825
7803
  },
7826
7804
  {
7827
- "name": "helpText",
7828
- "description": "Help text that describes how to use the component.",
7829
- "type": "string"
7805
+ "name": "strategy",
7806
+ "description": "Determines how the popup is positioned. The `absolute` strategy works well in most cases, but if overflow is\nclipped, using a `fixed` position strategy can often workaround it.",
7807
+ "type": "'absolute' | 'fixed'"
7830
7808
  },
7831
7809
  {
7832
- "name": "form",
7833
- "description": "Associates the control with a form by id. The form must be in the same document or shadow root.",
7834
- "type": "string"
7810
+ "name": "distance",
7811
+ "description": "The distance in pixels from which to offset the panel away from its anchor.",
7812
+ "type": "number"
7835
7813
  },
7836
7814
  {
7837
- "name": "size",
7838
- "description": "The size of the list items.",
7839
- "type": "'small' | 'medium' | 'large'"
7815
+ "name": "skidding",
7816
+ "description": "The distance in pixels from which to offset the panel along its anchor.",
7817
+ "type": "number"
7840
7818
  },
7841
7819
  {
7842
- "name": "disabled",
7843
- "description": "Whether the priority list is disabled.",
7820
+ "name": "arrow",
7821
+ "description": "Attaches an arrow to the popup. The arrow's size and color can be customized using the `--arrow-size` and\n`--arrow-color` custom properties. For additional customizations, you can also target the arrow using\n`::part(arrow)` in your stylesheet.",
7844
7822
  "type": "boolean"
7845
7823
  },
7846
7824
  {
7847
- "name": "required",
7848
- "description": "Ensures the form control has a value before allowing submission.",
7849
- "type": "boolean"
7825
+ "name": "arrowPlacement",
7826
+ "description": "The placement of the arrow. The default is `anchor`, which will align the arrow as close to the center of the\nanchor as possible, considering available space and `arrow-padding`. A value of `start`, `end`, or `center` will\nalign the arrow to the start, end, or center of the popover instead.",
7827
+ "type": "'start' | 'end' | 'center' | 'anchor'"
7850
7828
  },
7851
7829
  {
7852
- "name": "priorityStart",
7853
- "description": "The starting priority number. Defaults to 1.",
7830
+ "name": "arrowPadding",
7831
+ "description": "The amount of padding between the arrow and the edges of the popup. If the popup has a border-radius, for example,\nthis will prevent it from overflowing the corners.",
7854
7832
  "type": "number"
7855
7833
  },
7856
7834
  {
7857
- "name": "formAction",
7858
- "description": "When set, the associated form will be submitted with the given action URL whenever items are reordered.\nIf set to an empty string, the form will be submitted using its existing action.",
7859
- "type": "string"
7835
+ "name": "flip",
7836
+ "description": "When set, placement of the popup will flip to the opposite site to keep it in view. You can use\n`flipFallbackPlacements` to further configure how the fallback placement is determined.",
7837
+ "type": "boolean"
7860
7838
  },
7861
7839
  {
7862
- "name": "order",
7863
- "description": "A comma-separated list of item keys defining the initial display order.\nKeys must match the `value` attributes on slotted children.\nAny slotted items not listed are appended at the end in DOM order.",
7840
+ "name": "flipFallbackPlacements",
7841
+ "description": "If the preferred placement doesn't fit, popup will be tested in these fallback placements until one fits. Must be a\nstring of any number of placements separated by a space, e.g. \"top bottom left\". If no placement fits, the flip\nfallback strategy will be used instead.",
7864
7842
  "type": "string"
7865
7843
  },
7866
7844
  {
7867
- "name": "validity",
7868
- "description": "Gets the validity state object.",
7869
- "type": "ValidityState"
7845
+ "name": "flipFallbackStrategy",
7846
+ "description": "When neither the preferred placement nor the fallback placements fit, this value will be used to determine whether\nthe popup should be positioned using the best available fit based on available space or as it was initially\npreferred.",
7847
+ "type": "'best-fit' | 'initial'"
7870
7848
  },
7871
7849
  {
7872
- "name": "validationMessage",
7873
- "description": "Gets the validation message.",
7874
- "type": "string"
7875
- }
7876
- ],
7877
- "events": [
7850
+ "name": "flipBoundary",
7851
+ "description": "The flip boundary describes clipping element(s) that overflow will be checked relative to when flipping. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7852
+ "type": "Element | Element[]"
7853
+ },
7878
7854
  {
7879
- "name": "zn-change",
7880
- "description": "Emitted when the order of items changes."
7855
+ "name": "flipPadding",
7856
+ "description": "The amount of padding, in pixels, to exceed before the flip behavior will occur.",
7857
+ "type": "number"
7881
7858
  },
7882
7859
  {
7883
- "name": "zn-reorder",
7884
- "description": "Emitted when items are reordered. Call `getPriorityMap()` on the component to get the updated `{ key: string, priority: number }[]` array."
7860
+ "name": "shift",
7861
+ "description": "Moves the popup along the axis to keep it in view when clipped.",
7862
+ "type": "boolean"
7863
+ },
7864
+ {
7865
+ "name": "shiftBoundary",
7866
+ "description": "The shift boundary describes clipping element(s) that overflow will be checked relative to when shifting. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7867
+ "type": "Element | Element[]"
7868
+ },
7869
+ {
7870
+ "name": "shiftPadding",
7871
+ "description": "The amount of padding, in pixels, to exceed before the shift behavior will occur.",
7872
+ "type": "number"
7873
+ },
7874
+ {
7875
+ "name": "autoSize",
7876
+ "description": "When set, this will cause the popup to automatically resize itself to prevent it from overflowing.",
7877
+ "type": "'horizontal' | 'vertical' | 'both'"
7878
+ },
7879
+ {
7880
+ "name": "sync",
7881
+ "description": "Syncs the popup's width or height to that of the anchor element.",
7882
+ "type": "'width' | 'height' | 'both'"
7883
+ },
7884
+ {
7885
+ "name": "autoSizeBoundary",
7886
+ "description": "The auto-size boundary describes clipping element(s) that overflow will be checked relative to when resizing. By\ndefault, the boundary includes overflow ancestors that will cause the element to be clipped. If needed, you can\nchange the boundary by passing a reference to one or more elements to this property.",
7887
+ "type": "Element | Element[]"
7888
+ },
7889
+ {
7890
+ "name": "autoSizePadding",
7891
+ "description": "The amount of padding, in pixels, to exceed before the auto-size behavior will occur.",
7892
+ "type": "number"
7893
+ },
7894
+ {
7895
+ "name": "hoverBridge",
7896
+ "description": "When a gap exists between the anchor and the popup element, this option will add a \"hover bridge\" that fills the\ngap using an invisible element. This makes listening for events such as `mouseenter` and `mouseleave` more sane\nbecause the pointer never technically leaves the element. The hover bridge will only be drawn when the popover is\nactive.",
7897
+ "type": "boolean"
7898
+ },
7899
+ { "name": "handleAnchorHover" }
7900
+ ],
7901
+ "events": [
7902
+ {
7903
+ "name": "zn-event-name",
7904
+ "description": "Emitted as an example."
7885
7905
  }
7886
7906
  ]
7887
7907
  }
@@ -9196,6 +9216,11 @@
9196
9216
  "name": "conditional",
9197
9217
  "value": { "type": "string", "default": "\"\"" }
9198
9218
  },
9219
+ {
9220
+ "name": "requires",
9221
+ "description": "Ids or names of controls that must have a value before this one becomes\nusable, comma separated. The control stays disabled until every one of them\nis filled, and is disabled again if any is cleared.",
9222
+ "value": { "type": "string", "default": "\"\"" }
9223
+ },
9199
9224
  {
9200
9225
  "name": "data-uri",
9201
9226
  "description": "The URL to fetch options from. When set, the component fetches JSON from this URL and renders the results as\noptions. The expected format is an array of objects with `key` and `value` properties:\n`[{\"key\": \"us\", \"value\": \"United States\"}, ...]`\nWhen not set, the component works exactly as before using slotted `<zn-option>` elements.",
@@ -9450,6 +9475,11 @@
9450
9475
  },
9451
9476
  { "name": "distinct", "type": "string" },
9452
9477
  { "name": "conditional", "type": "string" },
9478
+ {
9479
+ "name": "requires",
9480
+ "description": "Ids or names of controls that must have a value before this one becomes\nusable, comma separated. The control stays disabled until every one of them\nis filled, and is disabled again if any is cleared.",
9481
+ "type": "string"
9482
+ },
9453
9483
  {
9454
9484
  "name": "dataUri",
9455
9485
  "description": "The URL to fetch options from. When set, the component fetches JSON from this URL and renders the results as\noptions. The expected format is an array of objects with `key` and `value` properties:\n`[{\"key\": \"us\", \"value\": \"United States\"}, ...]`\nWhen not set, the component works exactly as before using slotted `<zn-option>` elements.",