ropav 0.1.5 → 0.1.6

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 (100) hide show
  1. package/README.md +4 -0
  2. package/dist/accordion.js +11 -8
  3. package/dist/alert.css +18 -18
  4. package/dist/alert.js +18 -17
  5. package/dist/avatar.js +2 -2
  6. package/dist/badge.js +2 -2
  7. package/dist/base.css +18 -13
  8. package/dist/button-group.js +1 -1
  9. package/dist/button-link.js +10 -12
  10. package/dist/button.css +32 -27
  11. package/dist/button.js +10 -12
  12. package/dist/{useButtonColor.js → button.scss_vue_type_style_index_0_src_true_lang.js} +2 -1
  13. package/dist/card.js +1 -1
  14. package/dist/checkbox.css +32 -32
  15. package/dist/checkbox.js +6 -6
  16. package/dist/collapse.css +6 -6
  17. package/dist/collapse.js +4 -4
  18. package/dist/collectionNavigation.js +2 -2
  19. package/dist/color-input.css +19 -19
  20. package/dist/color-input.js +5 -5
  21. package/dist/color-picker.css +7 -7
  22. package/dist/color-picker.js +4 -5
  23. package/dist/color-swatch.js +1 -1
  24. package/dist/componentColors.js +42 -2
  25. package/dist/components/checkbox/useCheckbox.d.ts +1 -1
  26. package/dist/components/color-input/color-input.d.ts +2 -2
  27. package/dist/components/color-input/useColorInput.d.ts +1 -1
  28. package/dist/components/dialog/dialog-core.d.ts +1 -1
  29. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +2 -2
  30. package/dist/components/dropdown-menu/dropdown-menu-primitive-core.d.ts +1 -1
  31. package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +2 -2
  32. package/dist/components/dropdown-menu/dropdown-menu.d.ts +3 -3
  33. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +3 -4
  34. package/dist/components/input/useInput.d.ts +1 -1
  35. package/dist/components/number-input/useNumberInput.d.ts +1 -1
  36. package/dist/components/progress/useProgress.d.ts +1 -1
  37. package/dist/components/radio/useRadio.d.ts +2 -2
  38. package/dist/components/scroll-area/scrollAreaCore.d.ts +5 -0
  39. package/dist/components/scroll-area/types.d.ts +4 -0
  40. package/dist/components/scroll-area/useScrollArea.d.ts +1 -0
  41. package/dist/components/scroll-area/useScrollAreaMetrics.d.ts +3 -0
  42. package/dist/components/scroll-area/useScrollAreaPresentation.d.ts +3 -0
  43. package/dist/components/select/useSelect.d.ts +2 -1
  44. package/dist/components/select/useSelectNativeValue.d.ts +1 -7
  45. package/dist/components/slider/sliderCore.d.ts +2 -1
  46. package/dist/components/slider/useRangeSlider.d.ts +1 -1
  47. package/dist/components/slider/useSlider.d.ts +1 -1
  48. package/dist/components/switch/useSwitch.d.ts +1 -1
  49. package/dist/components/textarea/useTextarea.d.ts +1 -1
  50. package/dist/composables/index.d.ts +2 -0
  51. package/dist/composables/index.js +2 -0
  52. package/dist/composables/useControllableValue.d.ts +14 -0
  53. package/dist/dialog.js +8 -5
  54. package/dist/dropdown-menu.js +43 -29
  55. package/dist/field.js +1 -1
  56. package/dist/floating.js +19 -7
  57. package/dist/icon-button.css +12 -173
  58. package/dist/icon-button.js +5 -5
  59. package/dist/index.d.ts +5 -4
  60. package/dist/index.js +7 -5
  61. package/dist/input.css +24 -24
  62. package/dist/input.js +5 -5
  63. package/dist/modal.js +11 -7
  64. package/dist/number-input.css +18 -18
  65. package/dist/number-input.js +7 -7
  66. package/dist/overlay.js +1 -1
  67. package/dist/pagination.js +3 -3
  68. package/dist/popover.js +9 -6
  69. package/dist/progress.css +29 -21
  70. package/dist/progress.js +17 -10
  71. package/dist/radio.js +3 -3
  72. package/dist/scroll-area.css +10 -1
  73. package/dist/scroll-area.js +82 -25
  74. package/dist/select.css +45 -45
  75. package/dist/select.js +48 -26
  76. package/dist/slider.css +142 -142
  77. package/dist/slider.js +32 -38
  78. package/dist/switch.css +17 -17
  79. package/dist/switch.js +6 -6
  80. package/dist/tabs.css +3 -3
  81. package/dist/tabs.js +25 -15
  82. package/dist/textarea.css +26 -26
  83. package/dist/textarea.js +4 -4
  84. package/dist/toast.css +26 -26
  85. package/dist/toast.js +24 -19
  86. package/dist/tooltip.js +11 -8
  87. package/dist/useCollapse.js +12 -7
  88. package/dist/useControlState.js +1 -1
  89. package/dist/useControllableValue.js +8 -2
  90. package/dist/useFloatingPosition.js +4 -1140
  91. package/dist/useFormControl.js +3 -2
  92. package/dist/useOverlayZIndex.js +1 -1
  93. package/dist/useRequiredInject.js +1 -1
  94. package/docs/public-composables-api.md +52 -0
  95. package/package.json +45 -38
  96. package/src/styles/_mixins.scss +4 -0
  97. package/src/styles/_tokens.scss +12 -12
  98. package/src/styles/_variables.scss +1 -1
  99. package/dist/button-link.css +0 -167
  100. /package/dist/{composables → internal/composables}/useOverlayLayer.d.ts +0 -0
package/dist/toast.css CHANGED
@@ -1,5 +1,5 @@
1
1
  @layer ropav.components {
2
- .rp-toast[data-v-a830edcc] {
2
+ .rp-toast[data-v-782b93e5] {
3
3
  --_rp-toast-bg: var(--rp-color-default);
4
4
  --_rp-toast-fg: var(--rp-color-text);
5
5
  --_rp-toast-title-fg: var(--rp-color-text);
@@ -24,25 +24,25 @@
24
24
  box-shadow: var(--rp-shadow-md);
25
25
  transition: background-color var(--rp-transition-fast), color var(--rp-transition-fast), border-color var(--rp-transition-fast);
26
26
  }
27
- .rp-toast--radius-none[data-v-a830edcc] {
27
+ .rp-toast--radius-none[data-v-782b93e5] {
28
28
  --_rp-toast-radius: var(--rp-radius-none);
29
29
  }
30
- .rp-toast--radius-xs[data-v-a830edcc] {
30
+ .rp-toast--radius-xs[data-v-782b93e5] {
31
31
  --_rp-toast-radius: var(--rp-radius-xs);
32
32
  }
33
- .rp-toast--radius-sm[data-v-a830edcc] {
33
+ .rp-toast--radius-sm[data-v-782b93e5] {
34
34
  --_rp-toast-radius: var(--rp-radius-sm);
35
35
  }
36
- .rp-toast--radius-md[data-v-a830edcc] {
36
+ .rp-toast--radius-md[data-v-782b93e5] {
37
37
  --_rp-toast-radius: var(--rp-radius-md);
38
38
  }
39
- .rp-toast--radius-lg[data-v-a830edcc] {
39
+ .rp-toast--radius-lg[data-v-782b93e5] {
40
40
  --_rp-toast-radius: var(--rp-radius-lg);
41
41
  }
42
- .rp-toast--radius-xl[data-v-a830edcc] {
42
+ .rp-toast--radius-xl[data-v-782b93e5] {
43
43
  --_rp-toast-radius: var(--rp-radius-xl);
44
44
  }
45
- .rp-toast__icon[data-v-a830edcc] {
45
+ .rp-toast__icon[data-v-782b93e5] {
46
46
  display: inline-flex;
47
47
  flex: 0 0 auto;
48
48
  align-items: center;
@@ -51,37 +51,37 @@
51
51
  color: var(--_rp-toast-icon-fg);
52
52
  line-height: 0;
53
53
  }
54
- .rp-toast__icon[data-v-a830edcc] > svg {
54
+ .rp-toast__icon[data-v-782b93e5] > svg {
55
55
  display: block;
56
56
  width: 1rem;
57
57
  height: 1rem;
58
58
  }
59
- .rp-toast__content[data-v-a830edcc] {
59
+ .rp-toast__content[data-v-782b93e5] {
60
60
  display: grid;
61
61
  flex: 1 1 auto;
62
62
  min-width: 0;
63
63
  gap: var(--rp-spacing-1);
64
64
  }
65
- .rp-toast__title[data-v-a830edcc] {
65
+ .rp-toast__title[data-v-782b93e5] {
66
66
  color: var(--_rp-toast-title-fg);
67
67
  font-size: var(--rp-font-size-md);
68
68
  font-weight: var(--rp-font-weight-semibold);
69
69
  line-height: var(--rp-line-height-xs);
70
70
  }
71
- .rp-toast__description[data-v-a830edcc] {
71
+ .rp-toast__description[data-v-782b93e5] {
72
72
  margin: 0;
73
73
  }
74
- .rp-toast__body[data-v-a830edcc], .rp-toast__description[data-v-a830edcc] {
74
+ .rp-toast__body[data-v-782b93e5], .rp-toast__description[data-v-782b93e5] {
75
75
  min-width: 0;
76
76
  color: var(--_rp-toast-fg);
77
77
  }
78
- .rp-toast__action[data-v-a830edcc] {
78
+ .rp-toast__action[data-v-782b93e5] {
79
79
  display: inline-flex;
80
80
  flex: 0 0 auto;
81
81
  align-items: center;
82
82
  margin-left: auto;
83
83
  }
84
- .rp-toast__close[data-v-a830edcc] {
84
+ .rp-toast__close[data-v-782b93e5] {
85
85
  box-sizing: border-box;
86
86
  display: inline-flex;
87
87
  flex: 0 0 auto;
@@ -98,36 +98,36 @@
98
98
  cursor: pointer;
99
99
  transition: background-color var(--rp-transition-fast), color var(--rp-transition-fast);
100
100
  }
101
- .rp-toast__close[data-v-a830edcc]:hover {
101
+ .rp-toast__close[data-v-782b93e5]:hover {
102
102
  background-color: color-mix(in srgb, var(--_rp-toast-icon-fg) 12%, transparent);
103
103
  }
104
- .rp-toast__close[data-v-a830edcc]:focus-visible {
104
+ .rp-toast__close[data-v-782b93e5]:focus-visible {
105
105
  outline: var(--rp-border-width-medium) solid var(--rp-color-focus-ring);
106
106
  outline-offset: 2px;
107
107
  }
108
- .rp-toast__close[data-v-a830edcc] > svg {
108
+ .rp-toast__close[data-v-782b93e5] > svg {
109
109
  display: block;
110
110
  width: 1rem;
111
111
  height: 1rem;
112
112
  }
113
- .rp-toast-enter-active[data-v-a830edcc],
114
- .rp-toast-leave-active[data-v-a830edcc] {
113
+ .rp-toast-enter-active[data-v-782b93e5],
114
+ .rp-toast-leave-active[data-v-782b93e5] {
115
115
  will-change: opacity, transform;
116
116
  }
117
- .rp-toast-enter-active[data-v-a830edcc] {
117
+ .rp-toast-enter-active[data-v-782b93e5] {
118
118
  transition: opacity 180ms ease-out, transform 240ms cubic-bezier(0.16, 1, 0.3, 1);
119
119
  }
120
- .rp-toast-leave-active[data-v-a830edcc] {
120
+ .rp-toast-leave-active[data-v-782b93e5] {
121
121
  transition: opacity 120ms ease-in, transform 180ms cubic-bezier(0.4, 0, 1, 1);
122
122
  }
123
- .rp-toast-enter-from[data-v-a830edcc],
124
- .rp-toast-leave-to[data-v-a830edcc] {
123
+ .rp-toast-enter-from[data-v-782b93e5],
124
+ .rp-toast-leave-to[data-v-782b93e5] {
125
125
  opacity: 0;
126
126
  transform: translate3d(0, calc(var(--rp-spacing-2) * -1), 0) scale(0.98);
127
127
  }
128
128
  @media (prefers-reduced-motion: reduce) {
129
- .rp-toast-enter-active[data-v-a830edcc],
130
- .rp-toast-leave-active[data-v-a830edcc] {
129
+ .rp-toast-enter-active[data-v-782b93e5],
130
+ .rp-toast-leave-active[data-v-782b93e5] {
131
131
  transition: none;
132
132
  }
133
133
  }
package/dist/toast.js CHANGED
@@ -1,9 +1,10 @@
1
1
  import './toast.css';
2
- import { t as x_default } from "./x.js";
3
- import { t as bem } from "./bem.js";
2
+ import { t as useControllableValue } from "./useControllableValue.js";
4
3
  import { n as useStylesApi } from "./styles-api.js";
5
- import { i as getComponentVariantColorRoles, t as componentColors } from "./componentColors.js";
4
+ import { t as bem } from "./bem.js";
6
5
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
6
+ import { t as x_default } from "./x.js";
7
+ import { a as getComponentVariantColorRoles, t as componentColors } from "./componentColors.js";
7
8
  import { n as useOverlayZIndex } from "./useOverlayZIndex.js";
8
9
  import { r as useTeleportTarget } from "./useTeleportTarget.js";
9
10
  import { VaporTeleport, VaporTransition, VaporTransitionGroup, computed, createComponent, createFor, createIf, createInvoker, createSlot, defineVaporComponent, delegateEvents, extend, inject, nextTick, onBeforeUnmount, onMounted, provide, ref, renderEffect, setDynamicProps, setInsertionState, setText, template, toDisplayString, toValue, txt, unref, useSlots, watch } from "vue";
@@ -34,11 +35,11 @@ function getToastColorStyle(color, variant, autoContrast, contrastColor) {
34
35
  }
35
36
  //#endregion
36
37
  //#region src/components/toast/toast.vue?vue&type=script&setup=true&vapor=true&lang.ts
37
- var t0$1 = template("<div data-v-a830edcc>");
38
+ var t0$1 = template("<div data-v-782b93e5>");
38
39
  var t1 = template(" ");
39
- var t2 = template("<p data-v-a830edcc> ");
40
- var t3 = template("<div data-v-a830edcc class=rp-toast__content>");
41
- var t4 = template("<button data-v-a830edcc>");
40
+ var t2 = template("<p data-v-782b93e5> ");
41
+ var t3 = template("<div data-v-782b93e5 class=rp-toast__content>");
42
+ var t4 = template("<button data-v-782b93e5>");
42
43
  delegateEvents("click");
43
44
  //#endregion
44
45
  //#region src/components/toast/toast.vue
@@ -88,7 +89,12 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
88
89
  const props = __props;
89
90
  const emit = __emit;
90
91
  const slots = useSlots();
91
- const localOpen = ref(props.open ?? true);
92
+ const controllableOpen = useControllableValue({
93
+ modelValue: () => props.open,
94
+ defaultValue: () => true,
95
+ onChange: (open) => emit("update:open", open)
96
+ });
97
+ const isOpen = controllableOpen.value;
92
98
  const isMounted = ref(false);
93
99
  const pausedByHover = ref(false);
94
100
  const pausedByFocus = ref(false);
@@ -97,7 +103,6 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
97
103
  let timerStartedAt = 0;
98
104
  let remainingDuration = 0;
99
105
  watch(() => props.open, (open) => {
100
- if (open !== void 0) localOpen.value = open;
101
106
  if (open) closePending = false;
102
107
  });
103
108
  watch(() => props.pauseOnHover, (pauseOnHover) => {
@@ -110,7 +115,6 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
110
115
  pausedByFocus.value = false;
111
116
  resumeTimer();
112
117
  });
113
- const isOpen = computed(() => props.open ?? localOpen.value);
114
118
  const hasTitle = computed(() => Boolean(props.title || slots.title));
115
119
  const hasDescription = computed(() => Boolean(props.description));
116
120
  const hasContent = computed(() => Boolean(hasTitle.value || hasDescription.value || slots.default));
@@ -202,8 +206,7 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
202
206
  if (closePending) return;
203
207
  closePending = true;
204
208
  clearTimer();
205
- localOpen.value = false;
206
- emit("update:open", false);
209
+ controllableOpen.setValue(false);
207
210
  emit("close", reason);
208
211
  if (isOpen.value) {
209
212
  resetTimer();
@@ -217,7 +220,7 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
217
220
  name: "rp-toast",
218
221
  onAfterLeave: () => _on_after_leave
219
222
  }, extend(() => {
220
- return createIf(() => isOpen.value, () => {
223
+ return createIf(() => unref(isOpen), () => {
221
224
  const n30 = t0$1();
222
225
  renderEffect(() => setDynamicProps(n30, [rootAttrs.value]));
223
226
  setInsertionState(n30, null, 0);
@@ -287,7 +290,7 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
287
290
  }, null, 129);
288
291
  }, { _: 8 }), true);
289
292
  }
290
- }), [["__scopeId", "data-v-a830edcc"]]);
293
+ }), [["__scopeId", "data-v-782b93e5"]]);
291
294
  //#endregion
292
295
  //#region src/components/toast/toast-store.ts
293
296
  var TYPE_DEFAULTS = {
@@ -711,14 +714,17 @@ function optionValue(value) {
711
714
  return toValue(value);
712
715
  }
713
716
  function useToastState(options = {}) {
714
- const uncontrolledOpen = ref(options.defaultOpen ?? false);
715
717
  const closeReason = ref(null);
716
718
  const controlledOpen = computed(() => optionValue(options.open));
717
- const isOpen = computed(() => controlledOpen.value ?? uncontrolledOpen.value);
719
+ const controllableOpen = useControllableValue({
720
+ modelValue: () => controlledOpen.value,
721
+ defaultValue: () => options.defaultOpen ?? false,
722
+ onChange: (nextOpen) => options.onOpenChange?.(nextOpen)
723
+ });
724
+ const isOpen = controllableOpen.value;
718
725
  const lastCloseReason = computed(() => closeReason.value);
719
726
  watch(controlledOpen, (nextOpen) => {
720
727
  if (nextOpen === void 0) return;
721
- uncontrolledOpen.value = nextOpen;
722
728
  if (nextOpen) closeReason.value = null;
723
729
  }, {
724
730
  flush: "sync",
@@ -731,9 +737,8 @@ function useToastState(options = {}) {
731
737
  }));
732
738
  function setOpen(nextOpen) {
733
739
  if (nextOpen === isOpen.value) return;
734
- if (controlledOpen.value === void 0) uncontrolledOpen.value = nextOpen;
735
740
  if (nextOpen) closeReason.value = null;
736
- options.onOpenChange?.(nextOpen);
741
+ controllableOpen.setValue(nextOpen);
737
742
  }
738
743
  function open() {
739
744
  setOpen(true);
package/dist/tooltip.js CHANGED
@@ -1,13 +1,14 @@
1
1
  import './tooltip.css';
2
- import { t as bem } from "./bem.js";
2
+ import { t as useControllableValue } from "./useControllableValue.js";
3
3
  import { n as useStylesApi, t as presence } from "./styles-api.js";
4
- import { i as getComponentVariantColorRoles } from "./componentColors.js";
4
+ import { t as bem } from "./bem.js";
5
5
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
6
+ import { a as getComponentVariantColorRoles } from "./componentColors.js";
6
7
  import { n as useOverlayZIndex } from "./useOverlayZIndex.js";
7
8
  import { n as useFloatingPosition, r as useFloatingTarget, t as isElementReference } from "./useFloatingPosition.js";
8
9
  import { n as useTeleportPositioningKey, r as useTeleportTarget } from "./useTeleportTarget.js";
9
10
  import { VaporTeleport, VaporTransition, applyVShow, computed, createComponent, createIf, createSlot, createTemplateRefSetter, defineVaporComponent, extend, onBeforeUnmount, ref, renderEffect, setAttr, setDynamicProps, setInsertionState, setStaticTemplateRef, setStyle, setText, template, toDisplayString, unref, useId, useSlots, watch } from "vue";
10
- //#region src/composables/useDelayedOpen.ts
11
+ //#region src/internal/composables/useDelayedOpen.ts
11
12
  function readOption(value, fallback) {
12
13
  return typeof value === "function" ? value() ?? fallback : value ?? fallback;
13
14
  }
@@ -15,9 +16,13 @@ function readOptional(value) {
15
16
  return typeof value === "function" ? value() : value;
16
17
  }
17
18
  function useDelayedOpen(options = {}) {
18
- const uncontrolledOpen = ref(false);
19
+ const controllableOpen = useControllableValue({
20
+ modelValue: () => readOptional(options.open),
21
+ defaultValue: () => false,
22
+ onChange: (nextOpen) => options.onOpenChange?.(nextOpen)
23
+ });
19
24
  let openTimer = null;
20
- const isOpen = computed(() => readOptional(options.open) ?? uncontrolledOpen.value);
25
+ const isOpen = controllableOpen.value;
21
26
  function clearTimers() {
22
27
  if (openTimer) {
23
28
  clearTimeout(openTimer);
@@ -28,9 +33,7 @@ function useDelayedOpen(options = {}) {
28
33
  return readOption(options.disabled, false);
29
34
  }
30
35
  function setOpen(nextOpen) {
31
- const previousOpen = isOpen.value;
32
- if (readOptional(options.open) === void 0) uncontrolledOpen.value = nextOpen;
33
- if (previousOpen !== nextOpen) options.onOpenChange?.(nextOpen);
36
+ if (isOpen.value !== nextOpen) controllableOpen.setValue(nextOpen);
34
37
  }
35
38
  function open() {
36
39
  if (isDisabled()) return;
@@ -1,5 +1,6 @@
1
+ import { t as useControllableValue } from "./useControllableValue.js";
1
2
  import { t as bem } from "./bem.js";
2
- import { computed, ref, toValue, useId } from "vue";
3
+ import { computed, toValue, useId } from "vue";
3
4
  //#region src/components/collapse/useCollapse.ts
4
5
  var DEFAULT_ROLE = "region";
5
6
  function optionValue(value) {
@@ -7,11 +8,17 @@ function optionValue(value) {
7
8
  }
8
9
  function useCollapse(options = {}, emitOpenChange) {
9
10
  const generatedId = useId();
10
- const uncontrolledOpen = ref(false);
11
11
  const id = computed(() => optionValue(options.id) ?? `${generatedId}-collapse`);
12
- const controlledOpen = computed(() => optionValue(options.open));
13
12
  const isDisabled = computed(() => Boolean(optionValue(options.disabled)));
14
- const isOpen = computed(() => Boolean(controlledOpen.value ?? uncontrolledOpen.value));
13
+ const controllableOpen = useControllableValue({
14
+ modelValue: () => optionValue(options.open),
15
+ defaultValue: () => false,
16
+ onChange: (nextOpen) => {
17
+ options.onOpenChange?.(nextOpen);
18
+ emitOpenChange?.(nextOpen);
19
+ }
20
+ });
21
+ const isOpen = controllableOpen.value;
15
22
  const state = computed(() => isOpen.value ? "open" : "closed");
16
23
  const shouldRenderContent = computed(() => !optionValue(options.unmountOnExit) || isOpen.value);
17
24
  const rootClass = computed(() => bem("rp-collapse", {
@@ -54,9 +61,7 @@ function useCollapse(options = {}, emitOpenChange) {
54
61
  }));
55
62
  function setOpen(nextOpen) {
56
63
  if (isDisabled.value || nextOpen === isOpen.value) return;
57
- if (controlledOpen.value === void 0) uncontrolledOpen.value = nextOpen;
58
- options.onOpenChange?.(nextOpen);
59
- emitOpenChange?.(nextOpen);
64
+ controllableOpen.setValue(nextOpen);
60
65
  }
61
66
  function open() {
62
67
  setOpen(true);
@@ -1,5 +1,5 @@
1
1
  import { computed } from "vue";
2
- //#region src/composables/useControlState.ts
2
+ //#region src/internal/composables/useControlState.ts
3
3
  function mergeIds(...values) {
4
4
  const ids = values.flatMap((value) => value?.split(/\s+/) ?? []).filter(Boolean);
5
5
  return ids.length > 0 ? Array.from(new Set(ids)).join(" ") : void 0;
@@ -6,8 +6,14 @@ function useControllableValue(options) {
6
6
  const isControlled = computed(() => options.modelValue() !== void 0);
7
7
  watch(options.modelValue, (value) => {
8
8
  if (value !== void 0) uncontrolledValue.value = value;
9
- }, { immediate: true });
10
- const value = computed(() => options.modelValue() ?? uncontrolledValue.value);
9
+ }, {
10
+ flush: "sync",
11
+ immediate: true
12
+ });
13
+ const value = computed(() => {
14
+ const modelValue = options.modelValue();
15
+ return modelValue === void 0 ? uncontrolledValue.value : modelValue;
16
+ });
11
17
  function setValue(nextValue) {
12
18
  if (!isControlled.value) uncontrolledValue.value = nextValue;
13
19
  options.onChange(nextValue);