@shwfed/config 2.9.9 → 2.9.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/mcp.mjs +10 -2
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/{FieldGroup.vue_vue_type_script_setup_true_lang-CdbT3cSj.js → FieldGroup.vue_vue_type_script_setup_true_lang-CN4xD2hQ.js} +1 -1
  4. package/dist/preview/assets/badge-CzfW1Ked.js +1 -0
  5. package/dist/preview/assets/config-BdX3zl4t.js +1 -0
  6. package/dist/preview/assets/{config-C8R7tsmC.js → config-Bzwfqv6w.js} +1 -1
  7. package/dist/preview/assets/config-C2y2XI2Q.js +1 -0
  8. package/dist/preview/assets/config-CCXJvpik.js +1 -0
  9. package/dist/preview/assets/config-CDYZN7EX.js +1 -0
  10. package/dist/preview/assets/config-CPuERNUd.js +1 -0
  11. package/dist/preview/assets/config-D37gWDMV.js +1 -0
  12. package/dist/preview/assets/config-DbNukLyq.js +1 -0
  13. package/dist/preview/assets/config-Op5IHwI_.js +1 -0
  14. package/dist/preview/assets/config-e5aOGFb2.js +1 -0
  15. package/dist/preview/assets/config-jJQ2fulH.js +1 -0
  16. package/dist/preview/assets/{config-DVk8b1Qf.js → config-jzfHh7bp.js} +1 -1
  17. package/dist/preview/assets/definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js +1 -0
  18. package/dist/preview/assets/index-0vF7XQ-J.js +1 -0
  19. package/dist/preview/assets/{index-Df0XE7Lz.js → index-CAIvIAWJ.js} +1 -1
  20. package/dist/preview/assets/index-Cyjm-GKs.js +734 -0
  21. package/dist/preview/assets/index-D0eGXK5P.css +1 -0
  22. package/dist/preview/assets/item-CUoRMMz1.js +1 -0
  23. package/dist/preview/assets/{runtime-DU0iHs9-.js → runtime-BALr-Cq0.js} +1 -1
  24. package/dist/preview/assets/runtime-BvcTYin8.js +1 -0
  25. package/dist/preview/assets/runtime-CHQwYQ80.js +1 -0
  26. package/dist/preview/assets/runtime-CU5fYNMI.js +1 -0
  27. package/dist/preview/assets/runtime-CWt21RRo.js +1 -0
  28. package/dist/preview/assets/runtime-C_epees8.js +1 -0
  29. package/dist/preview/assets/runtime-D3TnRYXn.js +1 -0
  30. package/dist/preview/assets/runtime-DWKqftSK.js +1 -0
  31. package/dist/preview/assets/runtime-V_usL1Fa.js +1 -0
  32. package/dist/preview/assets/runtime-wAz72cCJ.js +1 -0
  33. package/dist/preview/assets/schema-meta-DwWuSVqk.js +1 -0
  34. package/dist/preview/index.html +2 -2
  35. package/dist/runtime/components/actions/buttons/2026-04-18/com.shwfed.actions.button.http.request.json/config.d.vue.ts +10 -0
  36. package/dist/runtime/components/actions/buttons/2026-04-18/com.shwfed.actions.button.http.request.json/config.vue.d.ts +10 -0
  37. package/dist/runtime/components/actions/buttons/2026-04-18/com.shwfed.actions.button.http.request.json/schema.d.ts +5 -0
  38. package/dist/runtime/components/actions/buttons/2026-04-18/com.shwfed.actions.button.http.request.json.confirm/config.d.vue.ts +10 -0
  39. package/dist/runtime/components/actions/buttons/2026-04-18/com.shwfed.actions.button.http.request.json.confirm/config.vue.d.ts +10 -0
  40. package/dist/runtime/components/actions/buttons/2026-04-18/com.shwfed.actions.button.http.request.json.confirm/schema.d.ts +5 -0
  41. package/dist/runtime/components/actions/buttons/2026-05-11/com.shwfed.actions.button.modal.layout/config.vue +6 -1
  42. package/dist/runtime/components/actions/buttons/2026-05-15/com.shwfed.actions.button.event.dispatch/config.d.vue.ts +2 -0
  43. package/dist/runtime/components/actions/buttons/2026-05-15/com.shwfed.actions.button.event.dispatch/config.vue.d.ts +2 -0
  44. package/dist/runtime/components/actions/buttons/2026-05-15/com.shwfed.actions.button.event.dispatch/schema.d.ts +1 -0
  45. package/dist/runtime/components/actions/buttons/2026-05-21/com.shwfed.actions.button.http.download/config.d.vue.ts +8 -0
  46. package/dist/runtime/components/actions/buttons/2026-05-21/com.shwfed.actions.button.http.download/config.vue.d.ts +8 -0
  47. package/dist/runtime/components/actions/buttons/2026-05-21/com.shwfed.actions.button.http.download/schema.d.ts +4 -0
  48. package/dist/runtime/components/actions/buttons/2026-05-24/com.shwfed.actions.button.state.write/config.d.vue.ts +2 -0
  49. package/dist/runtime/components/actions/buttons/2026-05-24/com.shwfed.actions.button.state.write/config.vue.d.ts +2 -0
  50. package/dist/runtime/components/actions/buttons/2026-05-24/com.shwfed.actions.button.state.write/schema.d.ts +1 -0
  51. package/dist/runtime/components/actions/buttons/2026-06-08/com.shwfed.actions.button.http.request.json.batch/config.d.vue.ts +2 -0
  52. package/dist/runtime/components/actions/buttons/2026-06-08/com.shwfed.actions.button.http.request.json.batch/config.vue.d.ts +2 -0
  53. package/dist/runtime/components/actions/buttons/2026-06-08/com.shwfed.actions.button.http.request.json.batch/schema.d.ts +1 -0
  54. package/dist/runtime/components/actions/components/trigger-row-scope.d.vue.ts +17 -0
  55. package/dist/runtime/components/actions/components/trigger-row-scope.vue +15 -0
  56. package/dist/runtime/components/actions/components/trigger-row-scope.vue.d.ts +17 -0
  57. package/dist/runtime/components/actions/components/triggers-field.d.vue.ts +2 -0
  58. package/dist/runtime/components/actions/components/triggers-field.vue +29 -7
  59. package/dist/runtime/components/actions/components/triggers-field.vue.d.ts +2 -0
  60. package/dist/runtime/components/actions/config.d.vue.ts +1 -0
  61. package/dist/runtime/components/actions/config.vue +6 -2
  62. package/dist/runtime/components/actions/config.vue.d.ts +1 -0
  63. package/dist/runtime/components/block-layout-editor/index.vue +15 -2
  64. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.tabs/config.vue +5 -2
  65. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/config.vue +4 -1
  66. package/dist/runtime/components/config/config.d.vue.ts +1 -1
  67. package/dist/runtime/components/config/config.vue +2 -33
  68. package/dist/runtime/components/config/config.vue.d.ts +1 -1
  69. package/dist/runtime/components/config/index.vue +5 -1
  70. package/dist/runtime/components/config/schema.d.ts +5 -0
  71. package/dist/runtime/components/config/schema.js +10 -0
  72. package/dist/runtime/components/config/use-editor.d.ts +19 -0
  73. package/dist/runtime/components/config/use-editor.js +36 -0
  74. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.markdown/schema.d.ts +1 -0
  75. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.markdown/schema.js +1 -1
  76. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/config.d.vue.ts +2 -0
  77. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/config.vue +3 -2
  78. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/config.vue.d.ts +2 -0
  79. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/runtime.vue +1 -1
  80. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/schema.d.ts +3 -0
  81. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/schema.js +1 -1
  82. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.number/config.d.vue.ts +2 -2
  83. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.number/config.vue.d.ts +2 -2
  84. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.numberrange/config.d.vue.ts +2 -2
  85. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.numberrange/config.vue.d.ts +2 -2
  86. package/dist/runtime/components/operations/2026-06-11/com.shwfed.operation.http.request.json/config.d.vue.ts +33 -0
  87. package/dist/runtime/components/operations/2026-06-11/com.shwfed.operation.http.request.json/config.vue +130 -0
  88. package/dist/runtime/components/operations/2026-06-11/com.shwfed.operation.http.request.json/config.vue.d.ts +33 -0
  89. package/dist/runtime/components/operations/2026-06-11/com.shwfed.operation.http.request.json/runtime.d.ts +2 -0
  90. package/dist/runtime/components/operations/2026-06-11/com.shwfed.operation.http.request.json/runtime.js +55 -0
  91. package/dist/runtime/components/operations/2026-06-11/com.shwfed.operation.http.request.json/schema.d.ts +23 -0
  92. package/dist/runtime/components/operations/2026-06-11/com.shwfed.operation.http.request.json/schema.js +79 -0
  93. package/dist/runtime/components/operations/utils/resolve.d.ts +16 -1
  94. package/dist/runtime/components/operations/utils/resolve.js +1 -1
  95. package/dist/runtime/components/operations/utils/step-vars.d.ts +22 -0
  96. package/dist/runtime/components/operations/utils/step-vars.js +12 -0
  97. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.actions/config.vue +1 -0
  98. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch/schema.d.ts +1 -0
  99. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/schema.d.ts +1 -0
  100. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.d.vue.ts +2 -0
  101. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.vue.d.ts +2 -0
  102. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.d.ts +1 -0
  103. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.d.vue.ts +2 -0
  104. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.vue.d.ts +2 -0
  105. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/schema.d.ts +1 -0
  106. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.d.vue.ts +2 -0
  107. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.vue.d.ts +2 -0
  108. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.d.ts +1 -0
  109. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.d.vue.ts +2 -0
  110. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.vue.d.ts +2 -0
  111. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/schema.d.ts +1 -0
  112. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.d.vue.ts +2 -0
  113. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.vue.d.ts +2 -0
  114. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.d.ts +1 -0
  115. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.d.vue.ts +2 -0
  116. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.vue.d.ts +2 -0
  117. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.d.ts +1 -0
  118. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.d.vue.ts +2 -0
  119. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.vue.d.ts +2 -0
  120. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/schema.d.ts +2 -0
  121. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.d.vue.ts +2 -0
  122. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.vue.d.ts +2 -0
  123. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/schema.d.ts +2 -0
  124. package/dist/runtime/components/table/config.vue +1 -1
  125. package/dist/runtime/components/ui/expression-editor/CodeMirrorInput.d.vue.ts +2 -0
  126. package/dist/runtime/components/ui/expression-editor/CodeMirrorInput.vue +9 -1
  127. package/dist/runtime/components/ui/expression-editor/CodeMirrorInput.vue.d.ts +2 -0
  128. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.d.vue.ts +2 -2
  129. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.vue +33 -4
  130. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.vue.d.ts +2 -2
  131. package/dist/runtime/components/ui/expression-editor/picker-entries.d.ts +3 -2
  132. package/dist/runtime/components/ui/expression-editor/picker-entries.js +13 -2
  133. package/dist/runtime/components/ui/expression-editor/step-chip-extension.d.ts +5 -0
  134. package/dist/runtime/components/ui/expression-editor/step-chip-extension.js +132 -0
  135. package/dist/runtime/components/ui/expression-editor/step-refs.d.ts +17 -0
  136. package/dist/runtime/components/ui/expression-editor/step-refs.js +29 -0
  137. package/dist/runtime/share/event-bus.d.ts +34 -1
  138. package/dist/runtime/share/event-bus.js +28 -11
  139. package/dist/runtime/utils/cel-context.d.ts +35 -0
  140. package/dist/runtime/utils/cel-context.js +8 -0
  141. package/package.json +1 -1
  142. package/dist/preview/assets/badge-DL-wtgr8.js +0 -1
  143. package/dist/preview/assets/config-80OJWswM.js +0 -1
  144. package/dist/preview/assets/config-B8F7X1oF.js +0 -1
  145. package/dist/preview/assets/config-B9BcmOZt.js +0 -1
  146. package/dist/preview/assets/config-C-Ta4ALL.js +0 -1
  147. package/dist/preview/assets/config-CoObmLL2.js +0 -1
  148. package/dist/preview/assets/config-DBQ-1J66.js +0 -1
  149. package/dist/preview/assets/config-DjsQoLiy.js +0 -1
  150. package/dist/preview/assets/config-RmdB0dwp.js +0 -1
  151. package/dist/preview/assets/config-h_hDvpHt.js +0 -1
  152. package/dist/preview/assets/definition.vue_vue_type_script_setup_true_lang-SX94Z692.js +0 -1
  153. package/dist/preview/assets/index-BIwwDhfa.js +0 -1
  154. package/dist/preview/assets/index-C1h9lV52.css +0 -1
  155. package/dist/preview/assets/index-CsN0336H.js +0 -717
  156. package/dist/preview/assets/item-B9XcOWjy.js +0 -1
  157. package/dist/preview/assets/runtime-BBsXfAZm.js +0 -1
  158. package/dist/preview/assets/runtime-BHlUDfbv.js +0 -1
  159. package/dist/preview/assets/runtime-BrwIgXY3.js +0 -1
  160. package/dist/preview/assets/runtime-C--WPQ3o.js +0 -1
  161. package/dist/preview/assets/runtime-C0yBdMlV.js +0 -1
  162. package/dist/preview/assets/runtime-C6uebSDU.js +0 -1
  163. package/dist/preview/assets/runtime-Dqa4phvv.js +0 -1
  164. package/dist/preview/assets/runtime-Dr-MmEyE.js +0 -1
  165. package/dist/preview/assets/runtime-v_nJoD5I.js +0 -1
@@ -3,6 +3,7 @@ import { computed, ref } from "vue";
3
3
  import { Icon } from "@iconify/vue";
4
4
  import { useEventAncestry } from "../../../share/event-bus";
5
5
  import { findOperation } from "../../operations/utils/resolve";
6
+ import TriggerRowScope from "./trigger-row-scope.vue";
6
7
  import {
7
8
  useTreeDnd
8
9
  } from "../../../composables/useTreeDnd";
@@ -60,6 +61,7 @@ function addTrigger(option) {
60
61
  emit("update:triggers", [
61
62
  ...props.triggers,
62
63
  {
64
+ id: crypto.randomUUID(),
63
65
  target: option.target,
64
66
  operation: option.operation,
65
67
  compatibilityDate: option.compatibilityDate,
@@ -70,7 +72,7 @@ function addTrigger(option) {
70
72
  }
71
73
  emit("update:triggers", [
72
74
  ...props.triggers,
73
- { target: option.target, operation: option.operation }
75
+ { id: crypto.randomUUID(), target: option.target, operation: option.operation }
74
76
  ]);
75
77
  }
76
78
  function updateParams(index, params) {
@@ -88,6 +90,22 @@ function opConfigFor(trigger) {
88
90
  function removeTrigger(index) {
89
91
  emit("update:triggers", props.triggers.filter((_, i) => i !== index));
90
92
  }
93
+ const publishingSteps = computed(
94
+ () => props.triggers.flatMap((trigger, index) => {
95
+ if (!trigger.id || !trigger.compatibilityDate) return [];
96
+ const output = findOperation(trigger.operation, trigger.compatibilityDate)?.metadata.output;
97
+ if (!output) return [];
98
+ return [{ id: trigger.id, index, output }];
99
+ })
100
+ );
101
+ function stepRosterFor(index) {
102
+ return publishingSteps.value.map((step) => ({
103
+ id: step.id,
104
+ label: `\u7B2C ${step.index + 1} \u6B65`,
105
+ valid: step.index < index,
106
+ description: step.output
107
+ }));
108
+ }
91
109
  const ROW_KIND = "shwfed-trigger-row";
92
110
  function moveTrigger(from, to) {
93
111
  if (from === to) return;
@@ -210,17 +228,21 @@ function rowConfig(rowKey) {
210
228
  <!-- Parameterized op: its own `config.vue`, bound to the trigger's
211
229
  `params`. Param-less ops and dangling rows render nothing here.
212
230
  `v-show` (not `v-if`) so the editor stays mounted while collapsed —
213
- its draft state and continuous validation keep running. -->
231
+ its draft state and continuous validation keep running. The
232
+ row-scope wrapper provides this row's step roster (earlier rows'
233
+ outputs) to the param editor's ExpressionEditors. -->
214
234
  <div
215
235
  v-if="opConfigFor(row.trigger)"
216
236
  v-show="!collapsed.has(row.key)"
217
237
  class="mt-2 rounded-md border border-zinc-200 bg-zinc-50/50 p-3"
218
238
  >
219
- <component
220
- :is="opConfigFor(row.trigger)"
221
- :model-value="row.trigger.params ?? {}"
222
- @update:model-value="(v) => updateParams(index, v)"
223
- />
239
+ <TriggerRowScope :roster="stepRosterFor(index)">
240
+ <component
241
+ :is="opConfigFor(row.trigger)"
242
+ :model-value="row.trigger.params ?? {}"
243
+ @update:model-value="(v) => updateParams(index, v)"
244
+ />
245
+ </TriggerRowScope>
224
246
  </div>
225
247
  </div>
226
248
 
@@ -4,6 +4,7 @@ type __VLS_Props = {
4
4
  };
5
5
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
6
  "update:triggers": (triggers: readonly {
7
+ readonly id?: string | undefined;
7
8
  readonly params?: unknown;
8
9
  readonly compatibilityDate?: string | undefined;
9
10
  readonly target: string;
@@ -11,6 +12,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
11
12
  }[]) => any;
12
13
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
13
14
  "onUpdate:triggers"?: ((triggers: readonly {
15
+ readonly id?: string | undefined;
14
16
  readonly params?: unknown;
15
17
  readonly compatibilityDate?: string | undefined;
16
18
  readonly target: string;
@@ -2,6 +2,7 @@ import { type ActionsConfigValue, type RegistryItemValue, type RegistrySubItemVa
2
2
  import { Environment } from '../../vendor/cel-js/lib/index.js';
3
3
  type __VLS_Props = {
4
4
  configure?: (env: Environment) => void;
5
+ hideSize?: boolean;
5
6
  };
6
7
  type __VLS_ModelProps = {
7
8
  'modelValue': ActionsConfigValue;
@@ -49,7 +49,8 @@ import {
49
49
  } from "../../share/event-bus";
50
50
  defineOptions({ name: "ShwfedActionsConfig" });
51
51
  const props = defineProps({
52
- configure: { type: Function, required: false }
52
+ configure: { type: Function, required: false },
53
+ hideSize: { type: Boolean, required: false }
53
54
  });
54
55
  const config = defineModel("modelValue", { type: null, ...{ required: true } });
55
56
  const configure = props.configure ?? (() => {
@@ -1202,7 +1203,10 @@ const newGroupZoneId = (insertIndex) => `new-group-${insertIndex}`;
1202
1203
  <slot name="general-extra" />
1203
1204
 
1204
1205
  <div class="grid grid-cols-2 gap-4">
1205
- <Field orientation="vertical">
1206
+ <Field
1207
+ v-if="!hideSize"
1208
+ orientation="vertical"
1209
+ >
1206
1210
  <FieldLabel class="text-xs text-zinc-500">
1207
1211
  <template
1208
1212
  v-if="generalFieldDescription('size')"
@@ -2,6 +2,7 @@ import { type ActionsConfigValue, type RegistryItemValue, type RegistrySubItemVa
2
2
  import { Environment } from '../../vendor/cel-js/lib/index.js';
3
3
  type __VLS_Props = {
4
4
  configure?: (env: Environment) => void;
5
+ hideSize?: boolean;
5
6
  };
6
7
  type __VLS_ModelProps = {
7
8
  'modelValue': ActionsConfigValue;
@@ -413,6 +413,13 @@ function confirmDelete() {
413
413
  if (ids.length === 1) emit("delete-item", ids[0]);
414
414
  else emitDeleteMany(ids);
415
415
  }
416
+ const deleteConfirmRef = ref(null);
417
+ async function focusDeleteConfirm(event) {
418
+ event.preventDefault();
419
+ await nextTick();
420
+ await nextTick();
421
+ deleteConfirmRef.value?.$el?.focus({ preventScroll: true });
422
+ }
416
423
  function hideItems(itemIds) {
417
424
  const i = activeIndex.value;
418
425
  const ls = layouts.value[i];
@@ -1501,7 +1508,10 @@ function onCanvasKeydown(e) {
1501
1508
  deleteDialogOpen = open;
1502
1509
  }"
1503
1510
  >
1504
- <AlertDialogContent class="sm:px-12 sm:py-8 flex flex-col gap-12">
1511
+ <AlertDialogContent
1512
+ class="sm:px-12 sm:py-8 flex flex-col gap-12"
1513
+ @open-auto-focus="focusDeleteConfirm"
1514
+ >
1505
1515
  <AlertDialogHeader class="sr-only">
1506
1516
  <AlertDialogTitle>彻底删除{{ itemNoun }}</AlertDialogTitle>
1507
1517
  <AlertDialogDescription>Confirmation dialog</AlertDialogDescription>
@@ -1518,7 +1528,10 @@ function onCanvasKeydown(e) {
1518
1528
  <Icon icon="fluent:dismiss-20-regular" />
1519
1529
  取消
1520
1530
  </AlertDialogCancel>
1521
- <AlertDialogAction @click="confirmDelete">
1531
+ <AlertDialogAction
1532
+ ref="deleteConfirmRef"
1533
+ @click="confirmDelete"
1534
+ >
1522
1535
  <Icon icon="fluent:checkmark-20-regular" />
1523
1536
  确认
1524
1537
  </AlertDialogAction>
@@ -20,7 +20,7 @@ import {
20
20
  } from "../../../../../composables/useTreeDnd";
21
21
  import { BREADCRUMB_EXTENSION_KEY } from "../../../breadcrumb-extension";
22
22
  import { findBlock } from "../../../utils/resolve";
23
- import { useSlotEditor } from "../../../use-editor";
23
+ import { useSlotClipboard, useSlotEditor } from "../../../use-editor";
24
24
  import { TabPaneMeta, getStructFieldDescription, getStructFieldTitle } from "./schema";
25
25
  defineOptions({ name: "ShwfedBlockTabsConfig" });
26
26
  const block = defineModel({ type: null, ...{ required: true } });
@@ -84,7 +84,8 @@ function buildShell(id) {
84
84
  set value(next) {
85
85
  editor.selectedBlockIds.value = next;
86
86
  }
87
- }
87
+ },
88
+ clipboard: useSlotClipboard(editor)
88
89
  };
89
90
  }
90
91
  function ensureShell(id) {
@@ -554,6 +555,8 @@ function deleteBlocksFromActive(ids) {
554
555
  @drill-down="onDrillDown"
555
556
  @delete-item="deleteBlockFromActive"
556
557
  @delete-items="deleteBlocksFromActive"
558
+ @copy-items="activeShell.clipboard.copy"
559
+ @paste="activeShell.clipboard.paste"
557
560
  />
558
561
  </div>
559
562
  </template>
@@ -23,7 +23,7 @@ import { Separator } from "../../../../ui/separator";
23
23
  import { Switch } from "../../../../ui/switch";
24
24
  import { BREADCRUMB_EXTENSION_KEY } from "../../../breadcrumb-extension";
25
25
  import { findBlock } from "../../../utils/resolve";
26
- import { useSlotEditor } from "../../../use-editor";
26
+ import { useSlotEditor, useSlotClipboard } from "../../../use-editor";
27
27
  import {
28
28
  BADGE_VARIANTS,
29
29
  badgeSchema,
@@ -60,6 +60,7 @@ const slotAccessor = computed({
60
60
  }
61
61
  });
62
62
  const editor = useSlotEditor(slotAccessor, { configure: configure.value });
63
+ const { copy: copyBlocks, paste: pasteBlocks } = useSlotClipboard(editor);
63
64
  const viewMode = ref("general");
64
65
  function selectContent() {
65
66
  viewMode.value = "content";
@@ -539,6 +540,8 @@ if (breadcrumbExt) {
539
540
  @drill-down="onDrillDown"
540
541
  @delete-item="(id) => editor.removeBlock(id)"
541
542
  @delete-items="(ids) => editor.removeBlocks(ids)"
543
+ @copy-items="copyBlocks"
544
+ @paste="pasteBlocks"
542
545
  />
543
546
  </div>
544
547
  </template>
@@ -1,4 +1,4 @@
1
- import type { ConfigEditorState } from './use-editor.js';
1
+ import { type ConfigEditorState } from './use-editor.js';
2
2
  type __VLS_Props = {
3
3
  state: ConfigEditorState;
4
4
  };
@@ -1,8 +1,6 @@
1
1
  <script setup>
2
2
  import { computed, provide, ref, toRef, useTemplateRef } from "vue";
3
3
  import { Icon } from "@iconify/vue";
4
- import { toast } from "vue-sonner";
5
- import { readClip, reidFragment, writeClip } from "../../share/clipboard";
6
4
  import BlockLayoutEditor from "../block-layout-editor/index.vue";
7
5
  import LayoutsSidebar from "../block-layout-editor/sidebar.vue";
8
6
  import LayoutMetaStrip from "../block-layout-editor/meta-strip.vue";
@@ -16,6 +14,7 @@ import { Separator } from "../ui/separator";
16
14
  import { provideEventAncestor } from "../../share/event-bus";
17
15
  import { BREADCRUMB_EXTENSION_KEY } from "./breadcrumb-extension";
18
16
  import { PAGE_TARGET_ID, PageConfig, getStructFieldDescription, getStructFieldTitle, metadata as pageMetadata } from "./schema";
17
+ import { useSlotClipboard } from "./use-editor";
19
18
  defineOptions({ name: "ShwfedConfigConfig" });
20
19
  const props = defineProps({
21
20
  state: { type: Object, required: true }
@@ -100,37 +99,7 @@ function addBlock(entry, options) {
100
99
  function onDrillDown(id) {
101
100
  props.state.onDrillDown(id);
102
101
  }
103
- async function copyBlocks(ids) {
104
- const want = new Set(ids);
105
- const items = props.state.blocks.value.filter((b) => want.has(b.id));
106
- if (items.length === 0) return;
107
- const ls = layouts.value[activeLayoutIndex.value];
108
- const placements = {};
109
- if (ls) {
110
- for (const id of ids) {
111
- const p = ls.layout.placements[id];
112
- if (p) placements[id] = p;
113
- }
114
- }
115
- if (!await writeClip("block", items, placements)) {
116
- toast.error("\u590D\u5236\u5931\u8D25");
117
- return;
118
- }
119
- toast.success(`\u5DF2\u590D\u5236 ${items.length} \u4E2A\u5757`);
120
- }
121
- async function pasteBlocks(target) {
122
- const payload = await readClip();
123
- if (!payload || payload.surface !== "block") return;
124
- const { items, placements } = reidFragment(payload.items, payload.placements);
125
- const pasted = items;
126
- if (pasted.length === 0) return;
127
- if (placements && Object.keys(placements).length > 0) {
128
- props.state.addBlocksWithPlacements(pasted, placements, target);
129
- } else {
130
- props.state.addBlocks(pasted);
131
- }
132
- toast.success(`\u5DF2\u7C98\u8D34 ${pasted.length} \u4E2A\u5757`);
133
- }
102
+ const { copy: copyBlocks, paste: pasteBlocks } = useSlotClipboard(props.state);
134
103
  function updateActiveBlock(next) {
135
104
  props.state.updateActiveBlock(next);
136
105
  }
@@ -1,4 +1,4 @@
1
- import type { ConfigEditorState } from './use-editor.js';
1
+ import { type ConfigEditorState } from './use-editor.js';
2
2
  type __VLS_Props = {
3
3
  state: ConfigEditorState;
4
4
  };
@@ -15,6 +15,7 @@ import EditorFooter from "./footer.vue";
15
15
  import { provideEventTarget } from "../../share/event-bus";
16
16
  import { operationHandlers } from "../operations/utils/resolve";
17
17
  import * as alertOperation from "../operations/2026-06-09/com.shwfed.operation.alert/schema";
18
+ import * as httpRequestOperation from "../operations/2026-06-11/com.shwfed.operation.http.request.json/schema";
18
19
  import { PAGE_TARGET_ID, createPageConfig } from "./schema";
19
20
  import { useConfigEditor } from "./use-editor";
20
21
  import { findBlock } from "./utils/resolve";
@@ -52,7 +53,10 @@ provideEventTarget(PAGE_TARGET_ID, {
52
53
  return yield* Effect.die(new PageClosed());
53
54
  }),
54
55
  ...operationHandlers(
55
- [{ type: alertOperation.type, compatibilityDate: alertOperation.compatibilityDate }],
56
+ [
57
+ { type: alertOperation.type, compatibilityDate: alertOperation.compatibilityDate },
58
+ { type: httpRequestOperation.type, compatibilityDate: httpRequestOperation.compatibilityDate }
59
+ ],
56
60
  { cel: $cel, locale: () => locale.value }
57
61
  )
58
62
  });
@@ -22,6 +22,11 @@ export declare const metadata: {
22
22
  readonly compatibilityDate: "2026-06-09";
23
23
  readonly name: "确认弹窗";
24
24
  readonly icon: "fluent:chat-warning-20-regular";
25
+ }, {
26
+ readonly id: "com.shwfed.operation.http.request.json";
27
+ readonly compatibilityDate: "2026-06-11";
28
+ readonly name: "发送请求";
29
+ readonly icon: "fluent:cloud-arrow-up-20-regular";
25
30
  }];
26
31
  };
27
32
  export declare function PageConfig(configure: (env: Environment) => void): Schema.Struct<{
@@ -2,6 +2,7 @@ import { Schema } from "effect";
2
2
  import { Expression, Slot, defaultSlot } from "../../share/layout.js";
3
3
  import { Locale } from "../../share/locale.js";
4
4
  import * as alertOperation from "../operations/2026-06-09/com.shwfed.operation.alert/schema.js";
5
+ import * as httpRequestOperation from "../operations/2026-06-11/com.shwfed.operation.http.request.json/schema.js";
5
6
  import { blockRef } from "./utils/resolve.js";
6
7
  export { getStructFieldDescription, getStructFieldTitle } from "../table/utils/schema-meta.js";
7
8
  const KIND = "shwfed.component.page";
@@ -19,6 +20,15 @@ export const metadata = {
19
20
  compatibilityDate: alertOperation.compatibilityDate,
20
21
  name: alertOperation.metadata.name,
21
22
  icon: alertOperation.metadata.icon
23
+ },
24
+ // Ambient HTTP request — one step of a trigger chain, so a button can
25
+ // sequence several requests (each failure halts the rest). The page hosts
26
+ // it because the request acts on nothing instance-specific.
27
+ {
28
+ id: httpRequestOperation.type,
29
+ compatibilityDate: httpRequestOperation.compatibilityDate,
30
+ name: httpRequestOperation.metadata.name,
31
+ icon: httpRequestOperation.metadata.icon
22
32
  }
23
33
  ]
24
34
  };
@@ -59,6 +59,25 @@ export interface SlotEditor {
59
59
  configure: (env: Environment) => void;
60
60
  }
61
61
  export declare function useSlotEditor(slot: WritableComputedRef<SlotValue> | Ref<SlotValue>, options?: SlotEditorOptions): SlotEditor;
62
+ export interface SlotClipboardTarget {
63
+ blocks: ComputedRef<ReadonlyArray<BlockValue>>;
64
+ layouts: {
65
+ value: LayoutSetValue[];
66
+ };
67
+ activeLayoutIndex: Ref<number>;
68
+ addBlocks: (blocks: ReadonlyArray<BlockValue>) => void;
69
+ addBlocksWithPlacements: (blocks: ReadonlyArray<BlockValue>, placements: Readonly<Record<string, PlacementValue>>, target: {
70
+ x: number;
71
+ y: number;
72
+ } | null) => void;
73
+ }
74
+ export declare function useSlotClipboard(target: SlotClipboardTarget): {
75
+ copy: (ids: string[]) => Promise<void>;
76
+ paste: (anchor: {
77
+ x: number;
78
+ y: number;
79
+ } | null) => Promise<void>;
80
+ };
62
81
  export interface ConfigEditorState {
63
82
  draft: Ref<PageConfigValue>;
64
83
  stack: Ref<StackEntry[]>;
@@ -1,6 +1,8 @@
1
1
  import { Schema } from "effect";
2
2
  import { computed, ref, shallowRef, watch } from "vue";
3
+ import { toast } from "vue-sonner";
3
4
  import { findFreePlacement, normalizeLayoutSet, placeGroupAt } from "../../share/layout.js";
5
+ import { readClip, reidFragment, writeClip } from "../../share/clipboard.js";
4
6
  import { PageConfig } from "./schema.js";
5
7
  import { BLOCKS, findBlock } from "./utils/resolve.js";
6
8
  import { formatValidationError } from "./utils/validation-error.js";
@@ -180,6 +182,40 @@ export function useSlotEditor(slot, options = {}) {
180
182
  configure
181
183
  };
182
184
  }
185
+ export function useSlotClipboard(target) {
186
+ async function copy(ids) {
187
+ const want = new Set(ids);
188
+ const items = target.blocks.value.filter((b) => want.has(b.id));
189
+ if (items.length === 0) return;
190
+ const ls = target.layouts.value[target.activeLayoutIndex.value];
191
+ const placements = {};
192
+ if (ls) {
193
+ for (const id of ids) {
194
+ const p = ls.layout.placements[id];
195
+ if (p) placements[id] = p;
196
+ }
197
+ }
198
+ if (!await writeClip("block", items, placements)) {
199
+ toast.error("\u590D\u5236\u5931\u8D25");
200
+ return;
201
+ }
202
+ toast.success(`\u5DF2\u590D\u5236 ${items.length} \u4E2A\u5757`);
203
+ }
204
+ async function paste(anchor) {
205
+ const payload = await readClip();
206
+ if (!payload || payload.surface !== "block") return;
207
+ const { items, placements } = reidFragment(payload.items, payload.placements);
208
+ const pasted = items;
209
+ if (pasted.length === 0) return;
210
+ if (placements && Object.keys(placements).length > 0) {
211
+ target.addBlocksWithPlacements(pasted, placements, anchor);
212
+ } else {
213
+ target.addBlocks(pasted);
214
+ }
215
+ toast.success(`\u5DF2\u7C98\u8D34 ${pasted.length} \u4E2A\u5757`);
216
+ }
217
+ return { copy, paste };
218
+ }
183
219
  export function useConfigEditor(model, options = {}) {
184
220
  const configure = options.configure ?? (() => {
185
221
  });
@@ -14,6 +14,7 @@ export declare const metadata: {
14
14
  readonly initial: 2;
15
15
  readonly min: 2;
16
16
  readonly max: number;
17
+ readonly grow: true;
17
18
  };
18
19
  };
19
20
  export declare function schema(configure: (env: Environment) => void): Schema.Struct<{
@@ -7,7 +7,7 @@ export const metadata = {
7
7
  name: "Markdown",
8
8
  icon: "fluent:markdown-20-regular",
9
9
  w: { initial: 8, min: 2, max: Infinity },
10
- h: { initial: 2, min: 2, max: Infinity }
10
+ h: { initial: 2, min: 2, max: Infinity, grow: true }
11
11
  };
12
12
  export function schema(configure) {
13
13
  return Schema.Struct({
@@ -4,6 +4,7 @@ type __VLS_ModelProps = {
4
4
  };
5
5
  declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
6
  "update:modelValue": (value: {
7
+ readonly size: "default" | "sm" | "xs";
7
8
  readonly type: "com.shwfed.form.field.actions";
8
9
  readonly style?: string | undefined;
9
10
  readonly id: string;
@@ -88,6 +89,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
88
89
  }) => any;
89
90
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
90
91
  "onUpdate:modelValue"?: ((value: {
92
+ readonly size: "default" | "sm" | "xs";
91
93
  readonly type: "com.shwfed.form.field.actions";
92
94
  readonly style?: string | undefined;
93
95
  readonly id: string;
@@ -24,17 +24,18 @@ onBeforeUnmount(() => {
24
24
  const actionValue = computed({
25
25
  get: () => ({
26
26
  kind: "shwfed.component.action",
27
- size: "default",
27
+ size: value.value.size ?? "default",
28
28
  gap: value.value.gap ?? 4,
29
29
  style: value.value.style,
30
30
  groups: value.value.groups ?? [],
31
31
  items: value.value.items ?? []
32
32
  }),
33
33
  set: (next) => {
34
- const { gap, style, groups, items } = next;
34
+ const { size, gap, style, groups, items } = next;
35
35
  const { style: _drop, ...rest } = value.value;
36
36
  value.value = {
37
37
  ...rest,
38
+ size,
38
39
  gap,
39
40
  groups,
40
41
  items,
@@ -4,6 +4,7 @@ type __VLS_ModelProps = {
4
4
  };
5
5
  declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
6
  "update:modelValue": (value: {
7
+ readonly size: "default" | "sm" | "xs";
7
8
  readonly type: "com.shwfed.form.field.actions";
8
9
  readonly style?: string | undefined;
9
10
  readonly id: string;
@@ -88,6 +89,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
88
89
  }) => any;
89
90
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
90
91
  "onUpdate:modelValue"?: ((value: {
92
+ readonly size: "default" | "sm" | "xs";
91
93
  readonly type: "com.shwfed.form.field.actions";
92
94
  readonly style?: string | undefined;
93
95
  readonly id: string;
@@ -8,7 +8,7 @@ const props = defineProps({
8
8
  });
9
9
  const actionsConfig = computed(() => ({
10
10
  kind: "shwfed.component.action",
11
- size: "default",
11
+ size: props.config.size ?? "default",
12
12
  gap: props.config.gap,
13
13
  style: props.config.style,
14
14
  groups: props.config.groups.map((group) => ({
@@ -141,6 +141,9 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
141
141
  }, never>>, {
142
142
  default: () => never[];
143
143
  }>;
144
+ size: Schema.optionalWith<Schema.Literal<["default", "sm", "xs"]>, {
145
+ default: () => "default";
146
+ }>;
144
147
  gap: Schema.optionalWith<Schema.filter<Schema.filter<typeof Schema.Number>>, {
145
148
  default: () => number;
146
149
  }>;
@@ -14,7 +14,7 @@ export const metadata = {
14
14
  };
15
15
  export function schema(configure) {
16
16
  const { fields: actionFields } = ActionSchemaFields(configure);
17
- const { size: _size, groups, items, ...rest } = actionFields;
17
+ const { groups, items, ...rest } = actionFields;
18
18
  return Schema.Struct({
19
19
  type: Schema.Literal(type),
20
20
  compatibilityDate: Schema.Literal(compatibilityDate),
@@ -26,6 +26,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
26
26
  readonly displayName?: string | undefined;
27
27
  readonly max?: string | undefined;
28
28
  readonly compatibilityDate: "2026-04-28";
29
+ readonly step?: number | undefined;
29
30
  readonly orientation?: "vertical" | "floating" | undefined;
30
31
  readonly placeholder?: readonly [{
31
32
  readonly locale: "zh";
@@ -35,7 +36,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
35
36
  readonly message: string;
36
37
  }[]] | undefined;
37
38
  readonly min?: string | undefined;
38
- readonly step?: number | undefined;
39
39
  readonly readonly?: string | undefined;
40
40
  readonly binding?: string | undefined;
41
41
  readonly derived?: {
@@ -81,6 +81,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
81
81
  readonly displayName?: string | undefined;
82
82
  readonly max?: string | undefined;
83
83
  readonly compatibilityDate: "2026-04-28";
84
+ readonly step?: number | undefined;
84
85
  readonly orientation?: "vertical" | "floating" | undefined;
85
86
  readonly placeholder?: readonly [{
86
87
  readonly locale: "zh";
@@ -90,7 +91,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
90
91
  readonly message: string;
91
92
  }[]] | undefined;
92
93
  readonly min?: string | undefined;
93
- readonly step?: number | undefined;
94
94
  readonly readonly?: string | undefined;
95
95
  readonly binding?: string | undefined;
96
96
  readonly derived?: {
@@ -26,6 +26,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
26
26
  readonly displayName?: string | undefined;
27
27
  readonly max?: string | undefined;
28
28
  readonly compatibilityDate: "2026-04-28";
29
+ readonly step?: number | undefined;
29
30
  readonly orientation?: "vertical" | "floating" | undefined;
30
31
  readonly placeholder?: readonly [{
31
32
  readonly locale: "zh";
@@ -35,7 +36,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
35
36
  readonly message: string;
36
37
  }[]] | undefined;
37
38
  readonly min?: string | undefined;
38
- readonly step?: number | undefined;
39
39
  readonly readonly?: string | undefined;
40
40
  readonly binding?: string | undefined;
41
41
  readonly derived?: {
@@ -81,6 +81,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
81
81
  readonly displayName?: string | undefined;
82
82
  readonly max?: string | undefined;
83
83
  readonly compatibilityDate: "2026-04-28";
84
+ readonly step?: number | undefined;
84
85
  readonly orientation?: "vertical" | "floating" | undefined;
85
86
  readonly placeholder?: readonly [{
86
87
  readonly locale: "zh";
@@ -90,7 +91,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
90
91
  readonly message: string;
91
92
  }[]] | undefined;
92
93
  readonly min?: string | undefined;
93
- readonly step?: number | undefined;
94
94
  readonly readonly?: string | undefined;
95
95
  readonly binding?: string | undefined;
96
96
  readonly derived?: {
@@ -26,9 +26,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
26
26
  readonly displayName?: string | undefined;
27
27
  readonly max?: string | undefined;
28
28
  readonly compatibilityDate: "2026-04-28";
29
+ readonly step?: number | undefined;
29
30
  readonly orientation?: "vertical" | "floating" | undefined;
30
31
  readonly min?: string | undefined;
31
- readonly step?: number | undefined;
32
32
  readonly readonly?: string | undefined;
33
33
  readonly binding?: string | readonly [string, string] | undefined;
34
34
  readonly derived?: {
@@ -89,9 +89,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
89
89
  readonly displayName?: string | undefined;
90
90
  readonly max?: string | undefined;
91
91
  readonly compatibilityDate: "2026-04-28";
92
+ readonly step?: number | undefined;
92
93
  readonly orientation?: "vertical" | "floating" | undefined;
93
94
  readonly min?: string | undefined;
94
- readonly step?: number | undefined;
95
95
  readonly readonly?: string | undefined;
96
96
  readonly binding?: string | readonly [string, string] | undefined;
97
97
  readonly derived?: {
@@ -26,9 +26,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
26
26
  readonly displayName?: string | undefined;
27
27
  readonly max?: string | undefined;
28
28
  readonly compatibilityDate: "2026-04-28";
29
+ readonly step?: number | undefined;
29
30
  readonly orientation?: "vertical" | "floating" | undefined;
30
31
  readonly min?: string | undefined;
31
- readonly step?: number | undefined;
32
32
  readonly readonly?: string | undefined;
33
33
  readonly binding?: string | readonly [string, string] | undefined;
34
34
  readonly derived?: {
@@ -89,9 +89,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
89
89
  readonly displayName?: string | undefined;
90
90
  readonly max?: string | undefined;
91
91
  readonly compatibilityDate: "2026-04-28";
92
+ readonly step?: number | undefined;
92
93
  readonly orientation?: "vertical" | "floating" | undefined;
93
94
  readonly min?: string | undefined;
94
- readonly step?: number | undefined;
95
95
  readonly readonly?: string | undefined;
96
96
  readonly binding?: string | readonly [string, string] | undefined;
97
97
  readonly derived?: {