@shwfed/config 2.9.13 → 2.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/mcp.mjs +5020 -3637
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/{FieldGroup.vue_vue_type_script_setup_true_lang-DZ_H-YRf.js → FieldGroup.vue_vue_type_script_setup_true_lang-CuFusz5A.js} +1 -1
  4. package/dist/preview/assets/{badge-DoNuZh0A.js → badge-D5FPHSix.js} +1 -1
  5. package/dist/preview/assets/{config-DTEJOYqA.js → config-BHPiQ1lB.js} +1 -1
  6. package/dist/preview/assets/{config-C6Cm7DWx.js → config-BWC-Zw21.js} +1 -1
  7. package/dist/preview/assets/{config-YGBoSq6x.js → config-Bg94Z7XN.js} +1 -1
  8. package/dist/preview/assets/{config-CLsjWZz2.js → config-BqSL4UAL.js} +1 -1
  9. package/dist/preview/assets/{config-ugF_BOWz.js → config-CeRBpZbE.js} +1 -1
  10. package/dist/preview/assets/{config-BDDuqAht.js → config-CfjcFb_E.js} +1 -1
  11. package/dist/preview/assets/{config-Bhc_Vu67.js → config-DNUKa3lN.js} +1 -1
  12. package/dist/preview/assets/{config-D4rFsdGO.js → config-DVjZmomc.js} +1 -1
  13. package/dist/preview/assets/{config-tdZMdIN3.js → config-Djv6EQBY.js} +1 -1
  14. package/dist/preview/assets/{config-CIYui2J_.js → config-PNpa6ENz.js} +1 -1
  15. package/dist/preview/assets/{config-Cla0Qngs.js → config-ucxtM3wX.js} +1 -1
  16. package/dist/preview/assets/{config-BrNZsgV0.js → config-urZuasV7.js} +1 -1
  17. package/dist/preview/assets/{definition.vue_vue_type_script_setup_true_lang-CgNXv26P.js → definition.vue_vue_type_script_setup_true_lang-BzryfjdG.js} +1 -1
  18. package/dist/preview/assets/index-BE9O1XgB.js +1 -0
  19. package/dist/preview/assets/{index-CzzwZ7bp.css → index-BnJ5p1Mx.css} +1 -1
  20. package/dist/preview/assets/{index-C3FdepLE.js → index-DCRQGu0g.js} +1 -1
  21. package/dist/preview/assets/index-yvElpEK3.js +743 -0
  22. package/dist/preview/assets/{item-DecwNzYq.js → item-CTkdtkvl.js} +1 -1
  23. package/dist/preview/assets/{runtime-DtP98Km5.js → runtime-3rajYvjp.js} +1 -1
  24. package/dist/preview/assets/{runtime-C8Ufkmiw.js → runtime-4A3oiig9.js} +1 -1
  25. package/dist/preview/assets/{runtime-blb90Fhv.js → runtime-BOGZFWxF.js} +1 -1
  26. package/dist/preview/assets/{runtime-BK7KNEyN.js → runtime-BqroTX7H.js} +1 -1
  27. package/dist/preview/assets/{runtime-DSUjc0Pk.js → runtime-CBBae0-H.js} +1 -1
  28. package/dist/preview/assets/{runtime-CYpXd7Pq.js → runtime-CBuV3vwL.js} +1 -1
  29. package/dist/preview/assets/{runtime-CjPtRd-T.js → runtime-CI8yzwXd.js} +1 -1
  30. package/dist/preview/assets/{runtime-C5hqSHRW.js → runtime-CcyhgOum.js} +1 -1
  31. package/dist/preview/assets/{runtime-C3dmOj9s.js → runtime-CkQ-mNoH.js} +1 -1
  32. package/dist/preview/assets/{runtime-DZ_AwduQ.js → runtime-DmxKfudS.js} +1 -1
  33. package/dist/preview/assets/{schema-meta-DWUHNP8E.js → schema-meta-BFzIzGiN.js} +1 -1
  34. package/dist/preview/index.html +2 -2
  35. package/dist/runtime/components/actions/components/triggers-field.vue +12 -12
  36. package/dist/runtime/components/config/use-editor.js +1 -1
  37. package/dist/runtime/components/config/utils/validation-error.d.ts +1 -1
  38. package/dist/runtime/components/config/utils/validation-error.js +40 -7
  39. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.markdown/runtime.vue +3 -3
  40. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.text/runtime.vue +6 -5
  41. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.textarea/runtime.vue +6 -5
  42. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.combobox.single/runtime.vue +10 -8
  43. package/dist/runtime/components/form/fields/2026-04-27/com.shwfed.form.field.date/runtime.vue +8 -6
  44. package/dist/runtime/components/form/fields/2026-04-27/com.shwfed.form.field.daterange/runtime.vue +10 -8
  45. package/dist/runtime/components/form/fields/2026-04-27/com.shwfed.form.field.datetime/runtime.vue +8 -6
  46. package/dist/runtime/components/form/fields/2026-04-27/com.shwfed.form.field.datetimerange/runtime.vue +10 -8
  47. package/dist/runtime/components/form/fields/2026-04-27/com.shwfed.form.field.time/runtime.vue +7 -5
  48. package/dist/runtime/components/form/fields/2026-04-27/com.shwfed.form.field.timerange/runtime.vue +8 -6
  49. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.number/runtime.vue +7 -6
  50. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.numberrange/runtime.vue +9 -7
  51. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.switch/runtime.vue +4 -3
  52. package/dist/runtime/components/form/fields/2026-04-29/com.shwfed.form.field.combobox.single/runtime.vue +8 -6
  53. package/dist/runtime/components/form/fields/2026-05-12/com.shwfed.form.field.upload/runtime.vue +5 -4
  54. package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/runtime.vue +12 -10
  55. package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.list/runtime.vue +5 -4
  56. package/dist/runtime/components/form/fields/2026-05-17/com.shwfed.form.field.checkbox.group/runtime.vue +9 -7
  57. package/dist/runtime/components/form/fields/2026-05-17/com.shwfed.form.field.radio.group/runtime.vue +9 -7
  58. package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/runtime.vue +13 -15
  59. package/dist/runtime/components/form/fields/2026-05-24/com.shwfed.form.field.month/runtime.vue +8 -6
  60. package/dist/runtime/components/form/fields/2026-05-24/com.shwfed.form.field.monthrange/runtime.vue +10 -8
  61. package/dist/runtime/components/form/fields/2026-05-25/com.shwfed.form.field.combobox.multi/runtime.vue +10 -8
  62. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.multi/runtime.vue +13 -14
  63. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.single/runtime.vue +13 -14
  64. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/runtime.vue +14 -12
  65. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/runtime.vue +14 -12
  66. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/runtime.vue +13 -14
  67. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/runtime.vue +13 -14
  68. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/runtime.vue +13 -15
  69. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/runtime.vue +15 -16
  70. package/dist/runtime/components/form/fields/2026-06-09/com.shwfed.form.field.upload/runtime.vue +8 -7
  71. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.multi/config.d.vue.ts +175 -0
  72. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.multi/config.vue +782 -0
  73. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.multi/config.vue.d.ts +175 -0
  74. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.multi/runtime.d.vue.ts +8 -0
  75. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.multi/runtime.vue +413 -0
  76. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.multi/runtime.vue.d.ts +8 -0
  77. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.multi/schema.d.ts +214 -0
  78. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.multi/schema.js +191 -0
  79. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.single/config.d.vue.ts +175 -0
  80. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.single/config.vue +782 -0
  81. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.single/config.vue.d.ts +175 -0
  82. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.single/runtime.d.vue.ts +8 -0
  83. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.single/runtime.vue +426 -0
  84. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.single/runtime.vue.d.ts +8 -0
  85. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.single/schema.d.ts +214 -0
  86. package/dist/runtime/components/form/fields/2026-06-14/com.shwfed.form.field.combobox.single/schema.js +191 -0
  87. package/dist/runtime/components/form/fields/2026-06-14/combobox-migrate.d.ts +18 -0
  88. package/dist/runtime/components/form/fields/2026-06-14/combobox-migrate.js +36 -0
  89. package/dist/runtime/components/form/utils/state.d.ts +11 -0
  90. package/dist/runtime/components/form/utils/state.js +5 -0
  91. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.combobox-single/runtime.vue +5 -1
  92. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/runtime.vue +16 -3
  93. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch/runtime.vue +5 -1
  94. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/runtime.vue +5 -1
  95. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/runtime.vue +17 -3
  96. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/runtime.vue +5 -1
  97. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/runtime.vue +5 -1
  98. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi/runtime.vue +5 -1
  99. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/runtime.vue +5 -1
  100. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/runtime.vue +5 -1
  101. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi/runtime.vue +5 -1
  102. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/runtime.vue +5 -1
  103. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single/runtime.vue +5 -1
  104. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/runtime.vue +5 -1
  105. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/runtime.vue +5 -1
  106. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/runtime.vue +5 -1
  107. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/runtime.vue +5 -1
  108. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/runtime.vue +5 -1
  109. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/runtime.vue +5 -1
  110. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/runtime.vue +5 -1
  111. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.d.vue.ts +179 -0
  112. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue +942 -0
  113. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue.d.ts +179 -0
  114. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.d.vue.ts +9 -0
  115. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.vue +499 -0
  116. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.vue.d.ts +9 -0
  117. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.d.ts +223 -0
  118. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.js +276 -0
  119. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.d.vue.ts +179 -0
  120. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue +942 -0
  121. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue.d.ts +179 -0
  122. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.d.vue.ts +9 -0
  123. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.vue +438 -0
  124. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.vue.d.ts +9 -0
  125. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.d.ts +223 -0
  126. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.js +276 -0
  127. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.d.vue.ts +123 -0
  128. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue +646 -0
  129. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue.d.ts +123 -0
  130. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.d.vue.ts +9 -0
  131. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.vue +500 -0
  132. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.vue.d.ts +9 -0
  133. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.d.ts +83 -0
  134. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.js +179 -0
  135. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.d.vue.ts +121 -0
  136. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue +577 -0
  137. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue.d.ts +121 -0
  138. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.d.vue.ts +9 -0
  139. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.vue +465 -0
  140. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.vue.d.ts +9 -0
  141. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.d.ts +80 -0
  142. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.js +171 -0
  143. package/dist/runtime/components/table/columns/2026-06-14/combobox-migrate.d.ts +18 -0
  144. package/dist/runtime/components/table/columns/2026-06-14/combobox-migrate.js +36 -0
  145. package/dist/runtime/components/table/columns/2026-06-14/tree-combobox-shared.d.ts +35 -0
  146. package/dist/runtime/components/table/columns/2026-06-14/tree-combobox-shared.js +31 -0
  147. package/dist/runtime/components/table/index.d.vue.ts +2 -0
  148. package/dist/runtime/components/table/index.vue +24 -0
  149. package/dist/runtime/components/table/index.vue.d.ts +2 -0
  150. package/dist/runtime/components/table/utils/shared.d.ts +1 -0
  151. package/dist/runtime/components/table/utils/shared.js +7 -13
  152. package/dist/runtime/components/ui/input-group/InputGroupNumberField.vue +1 -1
  153. package/dist/runtime/share/expression.js +1 -0
  154. package/package.json +1 -1
  155. package/dist/preview/assets/index-B-QhiviS.js +0 -1
  156. package/dist/preview/assets/index-CWMhB7z4.js +0 -735
@@ -0,0 +1,782 @@
1
+ <script setup>
2
+ import { Icon } from "@iconify/vue";
3
+ import { computed } from "vue";
4
+ import { Button } from "../../../../ui/button";
5
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../../../../ui/dropdown-menu";
6
+ import { ExpressionEditor } from "../../../../ui/expression-editor";
7
+ import DerivedValueEditor from "../../../DerivedValueEditor.vue";
8
+ import ValidationRulesField from "../../../ValidationRulesField.vue";
9
+ import { Field, FieldLabel } from "../../../../ui/field";
10
+ import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupNumberField } from "../../../../ui/input-group";
11
+ import { Locale as LocaleField } from "../../../../ui/locale";
12
+ import { Markdown } from "../../../../ui/markdown";
13
+ import {
14
+ Select,
15
+ SelectContent,
16
+ SelectItem,
17
+ SelectTrigger,
18
+ SelectValue
19
+ } from "../../../../ui/select";
20
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../../../ui/tabs";
21
+ import { Textarea } from "../../../../ui/textarea";
22
+ import { getStructFieldDescription, getStructFieldTitle } from "../../../schema";
23
+ import { DEFAULT_FIELD_ORIENTATION, FIELD_ORIENTATION_OPTIONS } from "../../../utils/common";
24
+ import { itemSchema, remoteOptionsSchema, schema } from "./schema";
25
+ defineOptions({ name: "ShwfedComboboxSingleFieldConfig" });
26
+ const value = defineModel({ type: null, ...{ required: true } });
27
+ const fieldSchema = schema(() => {
28
+ });
29
+ const fieldTitle = (f) => getStructFieldTitle(fieldSchema, f) ?? f;
30
+ const fieldDescription = (f) => getStructFieldDescription(fieldSchema, f);
31
+ const itemFieldSchema = itemSchema(() => {
32
+ });
33
+ const itemFieldTitle = (f) => getStructFieldTitle(itemFieldSchema, f) ?? f;
34
+ const itemFieldDescription = (f) => getStructFieldDescription(itemFieldSchema, f);
35
+ const remoteSchema = remoteOptionsSchema(() => {
36
+ });
37
+ const remoteFieldTitle = (f) => getStructFieldTitle(remoteSchema, f) ?? f;
38
+ const remoteFieldDescription = (f) => getStructFieldDescription(remoteSchema, f);
39
+ const OPTION_VARS = {
40
+ option: { type: "dyn", label: "\u5F53\u524D\u9009\u9879" }
41
+ };
42
+ const JSON_VARS = {
43
+ json: { type: "dyn", label: "HTTP \u54CD\u5E94\u4F53\uFF08\u5DF2\u89E3\u6790 JSON\uFF09" }
44
+ };
45
+ const pathText = computed({
46
+ get: () => value.value.binding ?? "",
47
+ set: (next) => {
48
+ const trimmed = next.trim();
49
+ if (trimmed.length === 0) {
50
+ const { binding: _omit, ...rest } = value.value;
51
+ value.value = rest;
52
+ } else {
53
+ value.value = { ...value.value, binding: trimmed };
54
+ }
55
+ }
56
+ });
57
+ const optionsKind = computed(() => value.value.options.kind);
58
+ function emptyStatic() {
59
+ return { kind: "static", items: [] };
60
+ }
61
+ function emptyRemote() {
62
+ return {
63
+ kind: "remote",
64
+ request: "",
65
+ options: "",
66
+ optionValue: "option",
67
+ optionLabel: ""
68
+ };
69
+ }
70
+ function setKind(kind) {
71
+ if (value.value.options.kind === kind) return;
72
+ value.value = {
73
+ ...value.value,
74
+ options: kind === "static" ? emptyStatic() : emptyRemote()
75
+ };
76
+ }
77
+ function patchStatic(patch) {
78
+ if (value.value.options.kind !== "static") return;
79
+ value.value = { ...value.value, options: { ...value.value.options, ...patch } };
80
+ }
81
+ function patchRemote(patch) {
82
+ if (value.value.options.kind !== "remote") return;
83
+ value.value = { ...value.value, options: { ...value.value.options, ...patch } };
84
+ }
85
+ const requestModel = computed({
86
+ get: () => value.value.options.kind === "remote" ? value.value.options.request ?? "" : "",
87
+ set: (v) => {
88
+ if (value.value.options.kind !== "remote") return;
89
+ if (v === "") {
90
+ const { request: _omit, ...rest } = value.value.options;
91
+ value.value = { ...value.value, options: rest };
92
+ } else {
93
+ patchRemote({ request: v });
94
+ }
95
+ }
96
+ });
97
+ const optionsExprModel = computed({
98
+ get: () => value.value.options.kind === "remote" ? value.value.options.options : "",
99
+ set: (v) => patchRemote({ options: v })
100
+ });
101
+ const optionValueModel = computed({
102
+ get: () => value.value.options.kind === "remote" ? value.value.options.optionValue : "option",
103
+ set: (v) => patchRemote({ optionValue: v })
104
+ });
105
+ const optionLabelModel = computed({
106
+ get: () => value.value.options.kind === "remote" ? value.value.options.optionLabel : "",
107
+ set: (v) => patchRemote({ optionLabel: v })
108
+ });
109
+ const optionKeywordsModel = computed({
110
+ get: () => value.value.options.kind === "remote" ? value.value.options.optionKeywords ?? "" : "",
111
+ set: (v) => {
112
+ if (value.value.options.kind !== "remote") return;
113
+ if (v === "") {
114
+ const { optionKeywords: _omit, ...rest } = value.value.options;
115
+ value.value = { ...value.value, options: rest };
116
+ } else {
117
+ patchRemote({ optionKeywords: v });
118
+ }
119
+ }
120
+ });
121
+ const items = computed(
122
+ () => value.value.options.kind === "static" ? value.value.options.items : []
123
+ );
124
+ function newId() {
125
+ return typeof crypto !== "undefined" && "randomUUID" in crypto ? crypto.randomUUID() : "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
126
+ const r = Math.random() * 16 | 0;
127
+ const v = c === "x" ? r : r & 3 | 8;
128
+ return v.toString(16);
129
+ });
130
+ }
131
+ function newItem() {
132
+ return {
133
+ id: newId(),
134
+ label: [{ locale: "zh", message: "" }],
135
+ value: { kind: "text", value: "" }
136
+ };
137
+ }
138
+ function patchItem(index, patch) {
139
+ if (value.value.options.kind !== "static") return;
140
+ const next = [...value.value.options.items];
141
+ const cur = next[index];
142
+ if (!cur) return;
143
+ next[index] = { ...cur, ...patch };
144
+ patchStatic({ items: next });
145
+ }
146
+ function addItem() {
147
+ if (value.value.options.kind !== "static") return;
148
+ patchStatic({ items: [...value.value.options.items, newItem()] });
149
+ }
150
+ function removeItem(index) {
151
+ if (value.value.options.kind !== "static") return;
152
+ const next = [...value.value.options.items];
153
+ next.splice(index, 1);
154
+ patchStatic({ items: next });
155
+ }
156
+ function setItemKind(index, kind) {
157
+ if (value.value.options.kind !== "static") return;
158
+ const cur = value.value.options.items[index];
159
+ if (!cur || cur.value.kind === kind) return;
160
+ patchItem(index, {
161
+ value: kind === "text" ? { kind: "text", value: "" } : { kind: "number", value: 0 }
162
+ });
163
+ }
164
+ function setItemTextValue(index, text) {
165
+ patchItem(index, { value: { kind: "text", value: text } });
166
+ }
167
+ function setItemNumberValue(index, n) {
168
+ patchItem(index, {
169
+ value: {
170
+ kind: "number",
171
+ value: typeof n === "number" && Number.isFinite(n) ? n : 0
172
+ }
173
+ });
174
+ }
175
+ function setItemLabel(index, label) {
176
+ patchItem(index, { label });
177
+ }
178
+ function setItemTooltip(index, tooltip) {
179
+ if (value.value.options.kind !== "static") return;
180
+ const isEmpty = !tooltip || tooltip.every((l) => l.message.trim().length === 0);
181
+ if (isEmpty) {
182
+ const cur = value.value.options.items[index];
183
+ if (!cur) return;
184
+ const { tooltip: _omit, ...rest } = cur;
185
+ const next = [...value.value.options.items];
186
+ next[index] = rest;
187
+ patchStatic({ items: next });
188
+ } else {
189
+ patchItem(index, { tooltip });
190
+ }
191
+ }
192
+ function keywordsText(item) {
193
+ return (item.keywords ?? []).join("\n");
194
+ }
195
+ function setItemKeywords(index, text) {
196
+ if (value.value.options.kind !== "static") return;
197
+ const terms = text.split("\n").map((s) => s.trim()).filter(Boolean);
198
+ if (terms.length === 0) {
199
+ const cur = value.value.options.items[index];
200
+ if (!cur) return;
201
+ const { keywords: _omit, ...rest } = cur;
202
+ const next = [...value.value.options.items];
203
+ next[index] = rest;
204
+ patchStatic({ items: next });
205
+ } else {
206
+ patchItem(index, { keywords: terms });
207
+ }
208
+ }
209
+ </script>
210
+
211
+ <template>
212
+ <div class="flex flex-col gap-3">
213
+ <div class="grid grid-cols-2 gap-3">
214
+ <Field orientation="vertical">
215
+ <FieldLabel class="text-xs text-zinc-500">
216
+ <template
217
+ v-if="fieldDescription('displayName')"
218
+ #tooltip
219
+ >
220
+ <Markdown
221
+ :source="fieldDescription('displayName')"
222
+ block
223
+ class="prose prose-sm prose-zinc"
224
+ />
225
+ </template>
226
+ {{ fieldTitle("displayName") }}
227
+ </FieldLabel>
228
+ <InputGroup>
229
+ <InputGroupInput
230
+ :model-value="value.displayName ?? ''"
231
+ placeholder="例:用户角色"
232
+ @update:model-value="(v) => {
233
+ const s = String(v ?? '');
234
+ value = { ...value, displayName: s.length > 0 ? s : void 0 };
235
+ }"
236
+ />
237
+ </InputGroup>
238
+ </Field>
239
+
240
+ <Field orientation="vertical">
241
+ <FieldLabel class="text-xs text-zinc-500">
242
+ <template #tooltip>
243
+ <Markdown
244
+ source="写入表单状态的嵌套键路径,使用 `.` 分隔,例如 `user.role`"
245
+ block
246
+ class="prose prose-sm prose-zinc"
247
+ />
248
+ </template>
249
+ {{ fieldTitle("binding") }}
250
+ </FieldLabel>
251
+ <InputGroup>
252
+ <InputGroupInput
253
+ v-model="pathText"
254
+ placeholder="例:user.role"
255
+ class="font-mono"
256
+ />
257
+ </InputGroup>
258
+ </Field>
259
+ </div>
260
+
261
+ <div class="grid grid-cols-3 gap-3">
262
+ <Field orientation="vertical">
263
+ <FieldLabel class="text-xs text-zinc-500">
264
+ <template
265
+ v-if="fieldDescription('label')"
266
+ #tooltip
267
+ >
268
+ <Markdown
269
+ :source="fieldDescription('label')"
270
+ block
271
+ class="prose prose-sm prose-zinc"
272
+ />
273
+ </template>
274
+ {{ fieldTitle("label") }}
275
+ </FieldLabel>
276
+ <LocaleField
277
+ translate-hint="form field label"
278
+ :model-value="value.label"
279
+ @update:model-value="(v) => value = { ...value, label: v }"
280
+ />
281
+ </Field>
282
+
283
+ <Field orientation="vertical">
284
+ <FieldLabel class="text-xs text-zinc-500">
285
+ <template
286
+ v-if="fieldDescription('placeholder')"
287
+ #tooltip
288
+ >
289
+ <Markdown
290
+ :source="fieldDescription('placeholder')"
291
+ block
292
+ class="prose prose-sm prose-zinc"
293
+ />
294
+ </template>
295
+ {{ fieldTitle("placeholder") }}
296
+ </FieldLabel>
297
+ <LocaleField
298
+ translate-hint="form field placeholder"
299
+ :model-value="value.placeholder"
300
+ @update:model-value="(v) => value = { ...value, placeholder: v }"
301
+ />
302
+ </Field>
303
+
304
+ <Field orientation="vertical">
305
+ <FieldLabel class="text-xs text-zinc-500">
306
+ <template
307
+ v-if="fieldDescription('tooltip')"
308
+ #tooltip
309
+ >
310
+ <Markdown
311
+ :source="fieldDescription('tooltip')"
312
+ block
313
+ class="prose prose-sm prose-zinc"
314
+ />
315
+ </template>
316
+ {{ fieldTitle("tooltip") }}
317
+ </FieldLabel>
318
+ <LocaleField
319
+ markdown
320
+ translate-hint="form field tooltip"
321
+ :model-value="value.tooltip"
322
+ @update:model-value="(v) => value = { ...value, tooltip: v }"
323
+ />
324
+ </Field>
325
+ </div>
326
+
327
+ <div class="grid grid-cols-3 gap-3">
328
+ <Field orientation="vertical">
329
+ <FieldLabel class="text-xs text-zinc-500">
330
+ <template
331
+ v-if="fieldDescription('orientation')"
332
+ #tooltip
333
+ >
334
+ <Markdown
335
+ :source="fieldDescription('orientation')"
336
+ block
337
+ class="prose prose-sm prose-zinc"
338
+ />
339
+ </template>
340
+ {{ fieldTitle("orientation") }}
341
+ </FieldLabel>
342
+ <Select
343
+ :model-value="value.orientation ?? DEFAULT_FIELD_ORIENTATION"
344
+ @update:model-value="(v) => value = { ...value, orientation: v }"
345
+ >
346
+ <SelectTrigger class="w-full">
347
+ <SelectValue />
348
+ </SelectTrigger>
349
+ <SelectContent>
350
+ <SelectItem
351
+ v-for="opt in FIELD_ORIENTATION_OPTIONS"
352
+ :key="opt.value"
353
+ :value="opt.value"
354
+ >
355
+ {{ opt.label }}
356
+ </SelectItem>
357
+ </SelectContent>
358
+ </Select>
359
+ </Field>
360
+ </div>
361
+
362
+ <Field orientation="vertical">
363
+ <FieldLabel class="text-xs text-zinc-500">
364
+ <template #tooltip>
365
+ <Markdown
366
+ source="选项可以是静态配置的固定列表,也可以由 CEL 表达式或远程接口产出"
367
+ block
368
+ class="prose prose-sm prose-zinc"
369
+ />
370
+ </template>
371
+ 选项来源
372
+ </FieldLabel>
373
+
374
+ <Tabs
375
+ :model-value="optionsKind"
376
+ @update:model-value="(v) => {
377
+ if (v === 'static' || v === 'remote') setKind(v);
378
+ }"
379
+ >
380
+ <TabsList>
381
+ <TabsTrigger value="static">
382
+ 静态
383
+ </TabsTrigger>
384
+ <TabsTrigger value="remote">
385
+ 远程
386
+ </TabsTrigger>
387
+ </TabsList>
388
+ <TabsContent
389
+ value="static"
390
+ class="outline-none"
391
+ >
392
+ <div class="flex flex-col gap-3 pt-3">
393
+ <div
394
+ v-for="(item, index) in items"
395
+ :key="item.id"
396
+ data-slot="combobox-single-item"
397
+ class="relative pt-8 grid grid-cols-2 gap-3 rounded border border-zinc-200 bg-zinc-50/40 p-3"
398
+ >
399
+ <InputGroupButton
400
+ variant="destructive"
401
+ size="icon-xs"
402
+ data-slot="combobox-single-item-delete"
403
+ aria-label="删除选项"
404
+ class="absolute right-2 top-2 z-10"
405
+ @click="removeItem(index)"
406
+ >
407
+ <Icon icon="fluent:delete-20-regular" />
408
+ </InputGroupButton>
409
+
410
+ <Field orientation="vertical">
411
+ <FieldLabel class="text-xs text-zinc-500">
412
+ <template
413
+ v-if="itemFieldDescription('label')"
414
+ #tooltip
415
+ >
416
+ <Markdown
417
+ :source="itemFieldDescription('label')"
418
+ block
419
+ class="prose prose-sm prose-zinc"
420
+ />
421
+ </template>
422
+ {{ itemFieldTitle("label") }}
423
+ </FieldLabel>
424
+ <LocaleField
425
+ translate-hint="combobox option label"
426
+ :model-value="item.label"
427
+ @update:model-value="(v) => setItemLabel(index, v)"
428
+ />
429
+ </Field>
430
+
431
+ <Field orientation="vertical">
432
+ <FieldLabel class="text-xs text-zinc-500">
433
+ <template
434
+ v-if="itemFieldDescription('value')"
435
+ #tooltip
436
+ >
437
+ <Markdown
438
+ :source="itemFieldDescription('value')"
439
+ block
440
+ class="prose prose-sm prose-zinc"
441
+ />
442
+ </template>
443
+ {{ itemFieldTitle("value") }}
444
+ </FieldLabel>
445
+ <InputGroup>
446
+ <InputGroupAddon align="inline-start">
447
+ <DropdownMenu>
448
+ <DropdownMenuTrigger as-child>
449
+ <InputGroupButton
450
+ size="icon-sm"
451
+ as-child
452
+ >
453
+ <button
454
+ type="button"
455
+ data-slot="combobox-single-item-kind-trigger"
456
+ class="text-zinc-500 transition-colors hover:text-zinc-700 [&_svg:not([class*='size-'])]:size-3.5"
457
+ aria-label="切换值类型"
458
+ >
459
+ <Icon
460
+ :icon="item.value.kind === 'number' ? 'fluent:number-symbol-20-regular' : 'fluent:textbox-20-regular'"
461
+ />
462
+ </button>
463
+ </InputGroupButton>
464
+ </DropdownMenuTrigger>
465
+ <DropdownMenuContent align="start">
466
+ <DropdownMenuItem @select="setItemKind(index, 'text')">
467
+ <Icon icon="fluent:textbox-20-regular" />
468
+ <span>文本</span>
469
+ </DropdownMenuItem>
470
+ <DropdownMenuItem @select="setItemKind(index, 'number')">
471
+ <Icon icon="fluent:number-symbol-20-regular" />
472
+ <span>数字</span>
473
+ </DropdownMenuItem>
474
+ </DropdownMenuContent>
475
+ </DropdownMenu>
476
+ </InputGroupAddon>
477
+
478
+ <InputGroupInput
479
+ v-if="item.value.kind === 'text'"
480
+ :model-value="item.value.value"
481
+ placeholder="例:admin"
482
+ @update:model-value="(v) => setItemTextValue(index, String(v ?? ''))"
483
+ />
484
+ <InputGroupNumberField
485
+ v-else
486
+ :model-value="item.value.value"
487
+ @update:model-value="(v) => setItemNumberValue(index, v)"
488
+ />
489
+ </InputGroup>
490
+ </Field>
491
+
492
+ <Field orientation="vertical">
493
+ <FieldLabel class="text-xs text-zinc-500">
494
+ <template
495
+ v-if="itemFieldDescription('tooltip')"
496
+ #tooltip
497
+ >
498
+ <Markdown
499
+ :source="itemFieldDescription('tooltip')"
500
+ block
501
+ class="prose prose-sm prose-zinc"
502
+ />
503
+ </template>
504
+ {{ itemFieldTitle("tooltip") }}
505
+ </FieldLabel>
506
+ <LocaleField
507
+ markdown
508
+ translate-hint="combobox option tooltip"
509
+ :model-value="item.tooltip"
510
+ @update:model-value="(v) => setItemTooltip(index, v)"
511
+ />
512
+ </Field>
513
+
514
+ <Field orientation="vertical">
515
+ <FieldLabel class="text-xs text-zinc-500">
516
+ <template
517
+ v-if="itemFieldDescription('keywords')"
518
+ #tooltip
519
+ >
520
+ <Markdown
521
+ :source="itemFieldDescription('keywords')"
522
+ block
523
+ class="prose prose-sm prose-zinc"
524
+ />
525
+ </template>
526
+ {{ itemFieldTitle("keywords") }}
527
+ </FieldLabel>
528
+ <Textarea
529
+ data-slot="combobox-single-item-keywords"
530
+ placeholder="每行一个关键词"
531
+ :model-value="keywordsText(item)"
532
+ @update:model-value="(v) => setItemKeywords(index, String(v ?? ''))"
533
+ />
534
+ </Field>
535
+ </div>
536
+
537
+ <Button
538
+ type="button"
539
+ data-slot="combobox-single-add-item"
540
+ class="w-full justify-center"
541
+ @click="addItem"
542
+ >
543
+ <Icon icon="fluent:add-20-regular" />
544
+ <span>增加选项</span>
545
+ </Button>
546
+ </div>
547
+ </TabsContent>
548
+ <TabsContent
549
+ value="remote"
550
+ class="outline-none"
551
+ >
552
+ <div class="grid grid-cols-2 gap-x-6 gap-y-4 pt-3">
553
+ <Field orientation="vertical">
554
+ <FieldLabel class="text-xs text-zinc-500">
555
+ <template
556
+ v-if="remoteFieldDescription('request')"
557
+ #tooltip
558
+ >
559
+ <Markdown
560
+ :source="remoteFieldDescription('request')"
561
+ block
562
+ class="prose prose-sm prose-zinc"
563
+ />
564
+ </template>
565
+ {{ remoteFieldTitle("request") }}
566
+ </FieldLabel>
567
+ <ExpressionEditor
568
+ v-model="requestModel"
569
+ placeholder="如 http.get('/api/roles');留空则不发起请求"
570
+ result-type="HttpRequest"
571
+ multiline
572
+ />
573
+ </Field>
574
+ <Field orientation="vertical">
575
+ <FieldLabel class="text-xs text-zinc-500">
576
+ <template
577
+ v-if="remoteFieldDescription('options')"
578
+ #tooltip
579
+ >
580
+ <Markdown
581
+ :source="remoteFieldDescription('options')"
582
+ block
583
+ class="prose prose-sm prose-zinc"
584
+ />
585
+ </template>
586
+ {{ remoteFieldTitle("options") }}
587
+ </FieldLabel>
588
+ <ExpressionEditor
589
+ v-model="optionsExprModel"
590
+ placeholder="如 json.data 或 [{value: 'a', label: 'A'}]"
591
+ result-type="dyn"
592
+ :extra-vars="JSON_VARS"
593
+ multiline
594
+ />
595
+ </Field>
596
+ <Field orientation="vertical">
597
+ <FieldLabel class="text-xs text-zinc-500">
598
+ <template
599
+ v-if="remoteFieldDescription('optionValue')"
600
+ #tooltip
601
+ >
602
+ <Markdown
603
+ :source="remoteFieldDescription('optionValue')"
604
+ block
605
+ class="prose prose-sm prose-zinc"
606
+ />
607
+ </template>
608
+ {{ remoteFieldTitle("optionValue") }}
609
+ </FieldLabel>
610
+ <ExpressionEditor
611
+ v-model="optionValueModel"
612
+ placeholder="如 option.value"
613
+ result-type="dyn"
614
+ :extra-vars="OPTION_VARS"
615
+ />
616
+ </Field>
617
+ <Field orientation="vertical">
618
+ <FieldLabel class="text-xs text-zinc-500">
619
+ <template
620
+ v-if="remoteFieldDescription('optionLabel')"
621
+ #tooltip
622
+ >
623
+ <Markdown
624
+ :source="remoteFieldDescription('optionLabel')"
625
+ block
626
+ class="prose prose-sm prose-zinc"
627
+ />
628
+ </template>
629
+ {{ remoteFieldTitle("optionLabel") }}
630
+ </FieldLabel>
631
+ <ExpressionEditor
632
+ v-model="optionLabelModel"
633
+ placeholder="如 option.name"
634
+ result-type="dyn"
635
+ :extra-vars="OPTION_VARS"
636
+ />
637
+ </Field>
638
+ <Field orientation="vertical">
639
+ <FieldLabel class="text-xs text-zinc-500">
640
+ <template
641
+ v-if="remoteFieldDescription('optionKeywords')"
642
+ #tooltip
643
+ >
644
+ <Markdown
645
+ :source="remoteFieldDescription('optionKeywords')"
646
+ block
647
+ class="prose prose-sm prose-zinc"
648
+ />
649
+ </template>
650
+ {{ remoteFieldTitle("optionKeywords") }}
651
+ </FieldLabel>
652
+ <ExpressionEditor
653
+ v-model="optionKeywordsModel"
654
+ placeholder="如 [option.code, option.pinyin]"
655
+ result-type="list"
656
+ :extra-vars="OPTION_VARS"
657
+ />
658
+ </Field>
659
+ </div>
660
+ </TabsContent>
661
+ </Tabs>
662
+ </Field>
663
+
664
+ <div class="grid grid-cols-3 gap-3">
665
+ <Field orientation="vertical">
666
+ <FieldLabel class="text-xs text-zinc-500">
667
+ <template #tooltip>
668
+ <Markdown
669
+ :source="fieldDescription('required') ?? '\u8FD4\u56DE `true` \u65F6\u663E\u793A\u5FC5\u586B\u661F\u53F7\u5E76\u8981\u6C42\u975E\u7A7A'"
670
+ block
671
+ class="prose prose-sm prose-zinc"
672
+ />
673
+ </template>
674
+ {{ fieldTitle("required") }}
675
+ </FieldLabel>
676
+ <ExpressionEditor
677
+ :model-value="value.required ?? ''"
678
+ placeholder="例:form.type == 'company'"
679
+ result-type="bool"
680
+ class="min-h-10"
681
+ @update:model-value="(v) => value = { ...value, required: v.length > 0 ? v : void 0 }"
682
+ />
683
+ </Field>
684
+
685
+ <Field orientation="vertical">
686
+ <FieldLabel class="text-xs text-zinc-500">
687
+ <template #tooltip>
688
+ <Markdown
689
+ :source="fieldDescription('hidden') ?? '\u8FD4\u56DE `true` \u65F6\u5B57\u6BB5\u5728\u6240\u6709\u5E03\u5C40\u4E2D\u90FD\u4E0D\u6E32\u67D3'"
690
+ block
691
+ class="prose prose-sm prose-zinc"
692
+ />
693
+ </template>
694
+ {{ fieldTitle("hidden") }}
695
+ </FieldLabel>
696
+ <ExpressionEditor
697
+ :model-value="value.hidden ?? ''"
698
+ placeholder="例:form.role == 'guest'"
699
+ result-type="bool"
700
+ class="min-h-10"
701
+ @update:model-value="(v) => value = { ...value, hidden: v.length > 0 ? v : void 0 }"
702
+ />
703
+ </Field>
704
+
705
+ <Field orientation="vertical">
706
+ <FieldLabel class="text-xs text-zinc-500">
707
+ <template #tooltip>
708
+ <Markdown
709
+ :source="fieldDescription('disabled') ?? '\u8FD4\u56DE `true` \u65F6\u4E0B\u62C9\u6846\u4ECD\u7136\u6E32\u67D3\u4F46\u4E0D\u53EF\u9009\u62E9'"
710
+ block
711
+ class="prose prose-sm prose-zinc"
712
+ />
713
+ </template>
714
+ {{ fieldTitle("disabled") }}
715
+ </FieldLabel>
716
+ <ExpressionEditor
717
+ :model-value="value.disabled ?? ''"
718
+ placeholder="例:form.status == 'locked'"
719
+ result-type="bool"
720
+ class="min-h-10"
721
+ @update:model-value="(v) => value = { ...value, disabled: v.length > 0 ? v : void 0 }"
722
+ />
723
+ </Field>
724
+
725
+ <Field orientation="vertical">
726
+ <FieldLabel class="text-xs text-zinc-500">
727
+ <template #tooltip>
728
+ <Markdown
729
+ :source="fieldDescription('readonly') ?? '\u8FD4\u56DE `true` \u65F6\u4EC5\u4EE5\u7EAF\u6587\u672C\u5C55\u793A\u5F53\u524D\u9009\u9879\u7684\u6807\u7B7E'"
730
+ block
731
+ class="prose prose-sm prose-zinc"
732
+ />
733
+ </template>
734
+ {{ fieldTitle("readonly") }}
735
+ </FieldLabel>
736
+ <ExpressionEditor
737
+ :model-value="value.readonly ?? ''"
738
+ placeholder="例:form.id != null"
739
+ result-type="bool"
740
+ class="min-h-10"
741
+ @update:model-value="(v) => value = { ...value, readonly: v.length > 0 ? v : void 0 }"
742
+ />
743
+ </Field>
744
+ </div>
745
+
746
+ <Field orientation="vertical">
747
+ <FieldLabel class="text-xs text-zinc-500">
748
+ <template #tooltip>
749
+ <Markdown
750
+ :source="fieldDescription('derived')"
751
+ block
752
+ class="prose prose-sm prose-zinc"
753
+ />
754
+ </template>
755
+ {{ fieldTitle("derived") }}
756
+ </FieldLabel>
757
+ <DerivedValueEditor
758
+ :model-value="value.derived"
759
+ result-type="dyn"
760
+ placeholder="例:form.category"
761
+ @update:model-value="(v) => value = { ...value, derived: v }"
762
+ />
763
+ </Field>
764
+
765
+ <Field orientation="vertical">
766
+ <FieldLabel class="text-xs text-zinc-500">
767
+ <template #tooltip>
768
+ <Markdown
769
+ :source="fieldDescription('validations')"
770
+ block
771
+ class="prose prose-sm prose-zinc"
772
+ />
773
+ </template>
774
+ {{ fieldTitle("validations") }}
775
+ </FieldLabel>
776
+ <ValidationRulesField
777
+ :model-value="value.validations"
778
+ @update:model-value="(v) => value = { ...value, validations: v.length > 0 ? v : void 0 }"
779
+ />
780
+ </Field>
781
+ </div>
782
+ </template>