@vuecs/forms 5.0.1 → 5.1.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 (25) hide show
  1. package/dist/components/form-checkbox/FormCheckbox.vue.d.ts.map +1 -1
  2. package/dist/components/form-checkbox-group/FormCheckboxGroup.vue.d.ts.map +1 -1
  3. package/dist/components/form-group/FormGroup.vue.d.ts.map +1 -1
  4. package/dist/components/form-group/context.d.ts +46 -0
  5. package/dist/components/form-group/context.d.ts.map +1 -0
  6. package/dist/components/form-group/index.d.ts +2 -0
  7. package/dist/components/form-group/index.d.ts.map +1 -1
  8. package/dist/components/form-input/FormInput.vue.d.ts +31 -7
  9. package/dist/components/form-input/FormInput.vue.d.ts.map +1 -1
  10. package/dist/components/form-number/FormNumber.vue.d.ts.map +1 -1
  11. package/dist/components/form-pin/FormPin.vue.d.ts.map +1 -1
  12. package/dist/components/form-radio/FormRadio.vue.d.ts.map +1 -1
  13. package/dist/components/form-radio-group/FormRadioGroup.vue.d.ts.map +1 -1
  14. package/dist/components/form-select/FormSelect.vue.d.ts.map +1 -1
  15. package/dist/components/form-select-search/FormSelectSearch.vue.d.ts.map +1 -1
  16. package/dist/components/form-slider/FormSlider.vue.d.ts.map +1 -1
  17. package/dist/components/form-switch/FormSwitch.vue.d.ts.map +1 -1
  18. package/dist/components/form-tags/FormTags.vue.d.ts.map +1 -1
  19. package/dist/components/form-textarea/FormTextarea.vue.d.ts +27 -7
  20. package/dist/components/form-textarea/FormTextarea.vue.d.ts.map +1 -1
  21. package/dist/components/validation-group/ValidationGroup.vue.d.ts +1 -1
  22. package/dist/components/validation-group/ValidationGroup.vue.d.ts.map +1 -1
  23. package/dist/index.mjs +91 -28
  24. package/dist/index.mjs.map +1 -1
  25. package/package.json +6 -6
package/dist/index.mjs CHANGED
@@ -1,7 +1,46 @@
1
- import { installDefaultsManager, installThemeManager, useComponentDefaults, useComponentTheme, useId } from "@vuecs/core";
1
+ import { installDefaultsManager, installThemeManager, useComponentDefaults, useComponentTheme, useId, useThemeProps } from "@vuecs/core";
2
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, h, inject, mergeProps, normalizeClass, openBlock, provide, ref, renderList, renderSlot, resolveComponent, toDisplayString, toRef, toValue, vModelText, vShow, watch, withCtx, withDirectives } from "vue";
2
3
  import { CheckboxGroupRoot, CheckboxIndicator, CheckboxRoot, NumberFieldDecrement, NumberFieldIncrement, NumberFieldInput, NumberFieldRoot, PinInputInput, PinInputRoot, RadioGroupIndicator, RadioGroupItem, RadioGroupRoot, SelectContent, SelectGroup, SelectIcon, SelectItem, SelectItemIndicator, SelectItemText, SelectLabel, SelectPortal, SelectRoot, SelectTrigger, SelectValue, SelectViewport, SliderRange, SliderRoot, SliderThumb, SliderTrack, SwitchRoot, SwitchThumb, TagsInputInput, TagsInputItem, TagsInputItemDelete, TagsInputItemText, TagsInputRoot } from "reka-ui";
3
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, h, mergeProps, normalizeClass, openBlock, ref, renderList, renderSlot, resolveComponent, toDisplayString, toRef, toValue, vModelText, vShow, watch, withCtx, withDirectives } from "vue";
4
4
  import { onClickOutside, useDebounceFn, useInfiniteScroll } from "@vueuse/core";
5
+ //#region src/components/form-group/context.ts
6
+ const FORM_GROUP_CONTEXT_KEY = Symbol("vcFormGroupContext");
7
+ function provideFormGroupContext(ctx) {
8
+ provide(FORM_GROUP_CONTEXT_KEY, ctx);
9
+ }
10
+ function useFormGroupContext() {
11
+ return inject(FORM_GROUP_CONTEXT_KEY, null);
12
+ }
13
+ /**
14
+ * Wrap a form-input component's props so that any inherited severity
15
+ * from the surrounding `<VCFormGroup>` flows into `themeVariant.severity`
16
+ * — lighting up the theme's `severity` variant on the input without
17
+ * the consumer wiring it per-instance.
18
+ *
19
+ * Per-instance values win: if the caller's `themeVariant` already has
20
+ * a `severity` key (even one set to `undefined`), the inherited value
21
+ * is ignored. Outside a `<VCFormGroup>` the helper is a pass-through.
22
+ *
23
+ * Pass directly to `useComponentTheme(name, useFormInputThemeProps(props), defaults)`.
24
+ */
25
+ function useFormInputThemeProps(props) {
26
+ const ctx = useFormGroupContext();
27
+ return {
28
+ get themeClass() {
29
+ return props.themeClass;
30
+ },
31
+ get themeVariant() {
32
+ const own = props.themeVariant;
33
+ if (own && "severity" in own) return own;
34
+ const inherited = ctx?.severity();
35
+ if (inherited === void 0) return own;
36
+ return {
37
+ ...own ?? {},
38
+ severity: inherited
39
+ };
40
+ }
41
+ };
42
+ }
43
+ //#endregion
5
44
  //#region src/components/form-checkbox/FormCheckbox.vue?vue&type=script&lang.ts
6
45
  const formCheckboxThemeDefaults = { classes: {
7
46
  root: "vc-form-checkbox",
@@ -79,7 +118,7 @@ var FormCheckbox_default = defineComponent({
79
118
  emits: ["update:modelValue"],
80
119
  slots: Object,
81
120
  setup(props, { attrs, emit, slots }) {
82
- const theme = useComponentTheme("formCheckbox", props, formCheckboxThemeDefaults);
121
+ const theme = useComponentTheme("formCheckbox", useFormInputThemeProps(props), formCheckboxThemeDefaults);
83
122
  const defaults = useComponentDefaults("formCheckbox", props, behavioralDefaults$3);
84
123
  const fallbackId = useId(void 0, "vc-form-checkbox");
85
124
  return () => {
@@ -165,7 +204,7 @@ var FormCheckboxGroup_default = defineComponent({
165
204
  },
166
205
  emits: ["update:modelValue"],
167
206
  setup(props, { attrs, emit, slots }) {
168
- const theme = useComponentTheme("formCheckboxGroup", props, formCheckboxGroupThemeDefaults);
207
+ const theme = useComponentTheme("formCheckboxGroup", useFormInputThemeProps(props), formCheckboxGroupThemeDefaults);
169
208
  return () => h(CheckboxGroupRoot, mergeProps(attrs, {
170
209
  name: props.name,
171
210
  orientation: props.orientation,
@@ -234,7 +273,7 @@ var ValidationGroup_default = defineComponent({
234
273
  },
235
274
  slots: Object,
236
275
  setup(props, { slots }) {
237
- const theme = useComponentTheme("validationGroup", props, validationGroupThemeDefaults);
276
+ const theme = useComponentTheme("validationGroup", useThemeProps(props, "severity"), validationGroupThemeDefaults);
238
277
  return () => {
239
278
  const resolved = theme.value;
240
279
  let errors;
@@ -358,6 +397,12 @@ var FormGroup_default = defineComponent({
358
397
  slots: Object,
359
398
  setup(props, { attrs, slots }) {
360
399
  const theme = useComponentTheme("formGroup", props, formGroupThemeDefaults);
400
+ provideFormGroupContext({ severity: () => {
401
+ if (props.validation != null) return props.validation.severity;
402
+ if (props.validationSeverity !== void 0) return props.validationSeverity;
403
+ const messages = props.validationMessages;
404
+ return !!messages && (Array.isArray(messages) ? messages.length > 0 : Object.keys(messages).length > 0) ? "error" : void 0;
405
+ } });
361
406
  return () => {
362
407
  const resolved = theme.value;
363
408
  const children = [];
@@ -397,6 +442,8 @@ var FormGroup_default = defineComponent({
397
442
  //#region src/components/form-input/FormInput.vue?vue&type=script&lang.ts
398
443
  const formInputThemeDefaults = { classes: {
399
444
  root: "vc-form-input",
445
+ rootGroupStart: "",
446
+ rootGroupEnd: "",
400
447
  group: "vc-form-input-group",
401
448
  groupAppend: "vc-form-input-group-append",
402
449
  groupPrepend: "vc-form-input-group-prepend"
@@ -407,11 +454,16 @@ var FormInput_default = defineComponent({
407
454
  name: "VCFormInput",
408
455
  inheritAttrs: false,
409
456
  props: {
410
- /** Controlled string value (v-model). `null` is the documented "unset" value. */
411
- modelValue: {
412
- type: [String, null],
413
- default: ""
414
- },
457
+ /**
458
+ * Controlled string value (v-model). `null` is the documented "unset" value.
459
+ *
460
+ * No `default` on purpose: vue-tsc strips `null`/`undefined` (via `NonNullable`)
461
+ * when folding a prop default into the emitted `DefaultProps`, which then
462
+ * intersects `$props['modelValue']` back down to `string` and breaks v-model
463
+ * against nullable entity fields (#1613). The render coerces `null`/`undefined`
464
+ * to `''`, so the empty-input behaviour is unchanged.
465
+ */
466
+ modelValue: { type: [String, null] },
415
467
  /** Native `<input type>` attribute. */
416
468
  type: {
417
469
  type: String,
@@ -461,7 +513,7 @@ var FormInput_default = defineComponent({
461
513
  emits: ["update:modelValue"],
462
514
  slots: Object,
463
515
  setup(props, { attrs, emit, slots }) {
464
- const theme = useComponentTheme("formInput", props, formInputThemeDefaults);
516
+ const theme = useComponentTheme("formInput", useFormInputThemeProps(props), formInputThemeDefaults);
465
517
  const localValue = ref(props.modelValue);
466
518
  watch(() => props.modelValue, (value) => {
467
519
  localValue.value = value;
@@ -479,6 +531,8 @@ var FormInput_default = defineComponent({
479
531
  return () => {
480
532
  const resolved = theme.value;
481
533
  const children = [];
534
+ const hasPrepend = !!(slots.groupPrepend || props.groupPrepend);
535
+ const hasAppend = !!(slots.groupAppend || props.groupAppend);
482
536
  if (slots.groupPrepend) children.push(slots.groupPrepend({
483
537
  class: resolved.groupPrepend,
484
538
  tag: "div"
@@ -486,7 +540,11 @@ var FormInput_default = defineComponent({
486
540
  else if (props.groupPrepend) children.push(h("div", { class: resolved.groupPrepend || void 0 }, [props.groupPrependContent]));
487
541
  children.push(h("input", mergeProps({
488
542
  type: props.type,
489
- class: resolved.root || void 0,
543
+ class: [
544
+ resolved.root,
545
+ hasPrepend ? resolved.rootGroupStart : void 0,
546
+ hasAppend ? resolved.rootGroupEnd : void 0
547
+ ],
490
548
  onInput,
491
549
  value: localValue.value
492
550
  }, attrs)));
@@ -592,7 +650,7 @@ var FormNumber_default = defineComponent({
592
650
  },
593
651
  emits: ["update:modelValue"],
594
652
  setup(props, { attrs, emit }) {
595
- const theme = useComponentTheme("formNumber", props, formNumberThemeDefaults);
653
+ const theme = useComponentTheme("formNumber", useFormInputThemeProps(props), formNumberThemeDefaults);
596
654
  return () => h(NumberFieldRoot, mergeProps(attrs, {
597
655
  focusOnChange: props.focusOnChange,
598
656
  name: props.name,
@@ -692,7 +750,7 @@ var FormPin_default = defineComponent({
692
750
  },
693
751
  emits: ["update:modelValue", "complete"],
694
752
  setup(props, { attrs, emit }) {
695
- const theme = useComponentTheme("formPin", props, formPinThemeDefaults);
753
+ const theme = useComponentTheme("formPin", useFormInputThemeProps(props), formPinThemeDefaults);
696
754
  return () => h(PinInputRoot, mergeProps(attrs, {
697
755
  name: props.name,
698
756
  id: props.id,
@@ -781,7 +839,7 @@ var FormRadio_default = defineComponent({
781
839
  },
782
840
  slots: Object,
783
841
  setup(props, { attrs, slots }) {
784
- const theme = useComponentTheme("formRadio", props, formRadioThemeDefaults);
842
+ const theme = useComponentTheme("formRadio", useFormInputThemeProps(props), formRadioThemeDefaults);
785
843
  const defaults = useComponentDefaults("formRadio", props, behavioralDefaults$2);
786
844
  const fallbackId = useId(void 0, "vc-form-radio");
787
845
  return () => {
@@ -870,7 +928,7 @@ var FormRadioGroup_default = defineComponent({
870
928
  },
871
929
  emits: ["update:modelValue"],
872
930
  setup(props, { attrs, emit, slots }) {
873
- const theme = useComponentTheme("formRadioGroup", props, formRadioGroupThemeDefaults);
931
+ const theme = useComponentTheme("formRadioGroup", useFormInputThemeProps(props), formRadioGroupThemeDefaults);
874
932
  return () => h(RadioGroupRoot, mergeProps(attrs, {
875
933
  name: props.name,
876
934
  orientation: props.orientation,
@@ -975,7 +1033,7 @@ var FormSelect_default = defineComponent({
975
1033
  },
976
1034
  emits: ["update:modelValue"],
977
1035
  setup(props, { attrs, emit }) {
978
- const theme = useComponentTheme("formSelect", props, formSelectThemeDefaults);
1036
+ const theme = useComponentTheme("formSelect", useFormInputThemeProps(props), formSelectThemeDefaults);
979
1037
  const defaults = useComponentDefaults("formSelect", props, behavioralDefaults$1);
980
1038
  return () => {
981
1039
  const resolved = theme.value;
@@ -1113,7 +1171,7 @@ var FormSelectSearch_vue_vue_type_script_lang_default = defineComponent({
1113
1171
  },
1114
1172
  emits: ["update:modelValue", "change"],
1115
1173
  setup(props, { emit }) {
1116
- const theme = useComponentTheme("formSelectSearch", props, formSelectSearchThemeDefaults);
1174
+ const theme = useComponentTheme("formSelectSearch", useFormInputThemeProps(props), formSelectSearchThemeDefaults);
1117
1175
  const listElement = ref(null);
1118
1176
  const inputElement = ref(null);
1119
1177
  const q = ref("");
@@ -1416,7 +1474,7 @@ var FormSlider_default = defineComponent({
1416
1474
  },
1417
1475
  emits: ["update:modelValue", "valueCommit"],
1418
1476
  setup(props, { attrs, emit }) {
1419
- const theme = useComponentTheme("formSlider", props, formSliderThemeDefaults);
1477
+ const theme = useComponentTheme("formSlider", useFormInputThemeProps(props), formSliderThemeDefaults);
1420
1478
  const isScalar = computed(() => typeof props.modelValue === "number");
1421
1479
  const internalValue = computed(() => {
1422
1480
  if (props.modelValue === void 0 || props.modelValue === null) return [props.min];
@@ -1519,7 +1577,7 @@ var FormSwitch_default = defineComponent({
1519
1577
  emits: ["update:modelValue"],
1520
1578
  slots: Object,
1521
1579
  setup(props, { attrs, emit, slots }) {
1522
- const theme = useComponentTheme("formSwitch", props, formSwitchThemeDefaults);
1580
+ const theme = useComponentTheme("formSwitch", useFormInputThemeProps(props), formSwitchThemeDefaults);
1523
1581
  const defaults = useComponentDefaults("formSwitch", props, behavioralDefaults);
1524
1582
  const fallbackId = useId(void 0, "vc-form-switch");
1525
1583
  return () => {
@@ -1636,7 +1694,7 @@ var FormTags_default = defineComponent({
1636
1694
  },
1637
1695
  emits: ["update:modelValue", "invalid"],
1638
1696
  setup(props, { attrs, emit }) {
1639
- const theme = useComponentTheme("formTags", props, formTagsThemeDefaults);
1697
+ const theme = useComponentTheme("formTags", useFormInputThemeProps(props), formTagsThemeDefaults);
1640
1698
  return () => h(TagsInputRoot, mergeProps(attrs, {
1641
1699
  placeholder: props.placeholder,
1642
1700
  addOnBlur: props.addOnBlur,
@@ -1671,11 +1729,16 @@ const formTextareaThemeDefaults = { classes: { root: "" } };
1671
1729
  var FormTextarea_default = defineComponent({
1672
1730
  name: "VCFormTextarea",
1673
1731
  props: {
1674
- /** Controlled string value (v-model). `null` is the documented "unset" value. */
1675
- modelValue: {
1676
- type: [String, null],
1677
- default: ""
1678
- },
1732
+ /**
1733
+ * Controlled string value (v-model). `null` is the documented "unset" value.
1734
+ *
1735
+ * No `default` on purpose: vue-tsc strips `null`/`undefined` (via `NonNullable`)
1736
+ * when folding a prop default into the emitted `DefaultProps`, which then
1737
+ * intersects `$props['modelValue']` back down to `string` and breaks v-model
1738
+ * against nullable entity fields (#1613). The render coerces `null`/`undefined`
1739
+ * to `''`, so the empty-textarea behaviour is unchanged.
1740
+ */
1741
+ modelValue: { type: [String, null] },
1679
1742
  /** Debounce window (ms) for `update:modelValue` emissions. `0` disables debouncing. */
1680
1743
  debounce: {
1681
1744
  type: Number,
@@ -1694,7 +1757,7 @@ var FormTextarea_default = defineComponent({
1694
1757
  },
1695
1758
  emits: ["update:modelValue"],
1696
1759
  setup(props, { attrs, emit }) {
1697
- const theme = useComponentTheme("formTextarea", props, formTextareaThemeDefaults);
1760
+ const theme = useComponentTheme("formTextarea", useFormInputThemeProps(props), formTextareaThemeDefaults);
1698
1761
  const localValue = ref(props.modelValue);
1699
1762
  watch(() => props.modelValue, (value) => {
1700
1763
  localValue.value = value;
@@ -1794,6 +1857,6 @@ function install(instance, options = {}) {
1794
1857
  }
1795
1858
  var src_default = { install };
1796
1859
  //#endregion
1797
- export { FormCheckbox_default as VCFormCheckbox, FormCheckboxGroup_default as VCFormCheckboxGroup, FormGroup_default as VCFormGroup, FormInput_default as VCFormInput, FormNumber_default as VCFormNumber, FormPin_default as VCFormPin, FormRadio_default as VCFormRadio, FormRadioGroup_default as VCFormRadioGroup, FormSelect_default as VCFormSelect, FormSelectSearch_default as VCFormSelectSearch, FormSlider_default as VCFormSlider, FormSwitch_default as VCFormSwitch, FormTags_default as VCFormTags, FormTextarea_default as VCFormTextarea, ValidationGroup_default as VCValidationGroup, ValidationSeverity, src_default as default, formCheckboxGroupThemeDefaults, formCheckboxThemeDefaults, formGroupThemeDefaults, formInputThemeDefaults, formNumberThemeDefaults, formPinThemeDefaults, formRadioGroupThemeDefaults, formRadioThemeDefaults, formSelectSearchThemeDefaults, formSelectThemeDefaults, formSliderThemeDefaults, formSwitchThemeDefaults, formTagsThemeDefaults, formTextareaThemeDefaults, install, isFormOptionGroup, useSubmitButton, validationGroupThemeDefaults };
1860
+ export { FormCheckbox_default as VCFormCheckbox, FormCheckboxGroup_default as VCFormCheckboxGroup, FormGroup_default as VCFormGroup, FormInput_default as VCFormInput, FormNumber_default as VCFormNumber, FormPin_default as VCFormPin, FormRadio_default as VCFormRadio, FormRadioGroup_default as VCFormRadioGroup, FormSelect_default as VCFormSelect, FormSelectSearch_default as VCFormSelectSearch, FormSlider_default as VCFormSlider, FormSwitch_default as VCFormSwitch, FormTags_default as VCFormTags, FormTextarea_default as VCFormTextarea, ValidationGroup_default as VCValidationGroup, ValidationSeverity, src_default as default, formCheckboxGroupThemeDefaults, formCheckboxThemeDefaults, formGroupThemeDefaults, formInputThemeDefaults, formNumberThemeDefaults, formPinThemeDefaults, formRadioGroupThemeDefaults, formRadioThemeDefaults, formSelectSearchThemeDefaults, formSelectThemeDefaults, formSliderThemeDefaults, formSwitchThemeDefaults, formTagsThemeDefaults, formTextareaThemeDefaults, install, isFormOptionGroup, provideFormGroupContext, useFormGroupContext, useFormInputThemeProps, useSubmitButton, validationGroupThemeDefaults };
1798
1861
 
1799
1862
  //# sourceMappingURL=index.mjs.map