ropav 0.1.7 → 0.1.8

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 (153) hide show
  1. package/README.md +1 -1
  2. package/dist/ancestry.js +136 -0
  3. package/dist/calendar.css +173 -0
  4. package/dist/calendar.js +714 -0
  5. package/dist/calendar2.js +37 -0
  6. package/dist/chevron-left.js +12 -0
  7. package/dist/color-picker.js +38 -88
  8. package/dist/combobox.css +251 -0
  9. package/dist/combobox.js +410 -0
  10. package/dist/components/calendar/calendar.d.ts +30 -0
  11. package/dist/components/calendar/calendarBehavior.d.ts +49 -0
  12. package/dist/components/calendar/index.d.ts +3 -0
  13. package/dist/components/calendar/index.js +3 -0
  14. package/dist/components/calendar/types.d.ts +53 -0
  15. package/dist/components/calendar/useCalendar.d.ts +24 -0
  16. package/dist/components/color-picker/useColorPickerDrag.d.ts +1 -1
  17. package/dist/components/color-picker/useColorPickerSaturation.d.ts +1 -1
  18. package/dist/components/color-picker/useColorPickerSlider.d.ts +1 -1
  19. package/dist/components/combobox/combobox.d.ts +29 -0
  20. package/dist/components/combobox/comboboxModel.d.ts +4 -0
  21. package/dist/components/combobox/index.d.ts +3 -0
  22. package/dist/components/combobox/index.js +2 -0
  23. package/dist/components/combobox/types.d.ts +43 -0
  24. package/dist/components/combobox/useCombobox.d.ts +45 -0
  25. package/dist/components/date-picker/date-picker.d.ts +33 -0
  26. package/dist/components/date-picker/datePickerModel.d.ts +10 -0
  27. package/dist/components/date-picker/index.d.ts +4 -0
  28. package/dist/components/date-picker/index.js +2 -0
  29. package/dist/components/date-picker/types.d.ts +57 -0
  30. package/dist/components/date-picker/useDatePicker.d.ts +29 -0
  31. package/dist/components/date-picker/useDatePickerValueState.d.ts +21 -0
  32. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +2 -2
  33. package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +2 -2
  34. package/dist/components/dropdown-menu/dropdown-menu.d.ts +2 -2
  35. package/dist/components/dropdown-menu/dropdownMenuContext.d.ts +7 -18
  36. package/dist/components/dropdown-menu/dropdownMenuInteraction.d.ts +3 -3
  37. package/dist/components/dropdown-menu/dropdownMenuInteractionTypes.d.ts +58 -29
  38. package/dist/components/dropdown-menu/useDropdownMenuDataController.d.ts +4 -3
  39. package/dist/components/dropdown-menu/useDropdownMenuDataRegistration.d.ts +6 -4
  40. package/dist/components/dropdown-menu/useDropdownMenuPresentation.d.ts +3 -4
  41. package/dist/components/dropdown-menu/useDropdownMenuTargetBindings.d.ts +5 -5
  42. package/dist/components/dropzone/dropzone.d.ts +31 -0
  43. package/dist/components/dropzone/dropzoneModel.d.ts +16 -0
  44. package/dist/components/dropzone/index.d.ts +3 -0
  45. package/dist/components/dropzone/index.js +2 -0
  46. package/dist/components/dropzone/types.d.ts +56 -0
  47. package/dist/components/dropzone/useDropzone.d.ts +25 -0
  48. package/dist/components/file-input/file-input.d.ts +29 -0
  49. package/dist/components/file-input/index.d.ts +3 -0
  50. package/dist/components/file-input/index.js +2 -0
  51. package/dist/components/file-input/types.d.ts +37 -0
  52. package/dist/components/file-input/useFileInput.d.ts +15 -0
  53. package/dist/components/floating/index.js +1 -1
  54. package/dist/components/floating/useFloatingPosition.d.ts +1 -13
  55. package/dist/components/floating/useFloatingTargetLifecycle.d.ts +32 -0
  56. package/dist/components/floating/useHoverDisclosure.d.ts +10 -0
  57. package/dist/components/hover-card/hover-card.d.ts +25 -0
  58. package/dist/components/hover-card/index.d.ts +3 -0
  59. package/dist/components/hover-card/index.js +2 -0
  60. package/dist/components/hover-card/types.d.ts +45 -0
  61. package/dist/components/hover-card/useHoverCard.d.ts +22 -0
  62. package/dist/components/hover-card/useHoverCardDisclosure.d.ts +19 -0
  63. package/dist/components/multi-select/index.d.ts +3 -0
  64. package/dist/components/multi-select/index.js +2 -0
  65. package/dist/components/multi-select/multi-select.d.ts +30 -0
  66. package/dist/components/multi-select/multiSelectModel.d.ts +3 -0
  67. package/dist/components/multi-select/types.d.ts +49 -0
  68. package/dist/components/multi-select/useMultiSelect.d.ts +46 -0
  69. package/dist/components/number-input/useNumberInput.d.ts +1 -3
  70. package/dist/components/popover/usePopoverBindings.d.ts +3 -6
  71. package/dist/components/scroll-area/useScrollArea.d.ts +4 -4
  72. package/dist/components/scroll-area/useScrollAreaAttributes.d.ts +3 -3
  73. package/dist/components/scroll-area/useScrollAreaPointer.d.ts +1 -1
  74. package/dist/components/segmented-control/index.d.ts +3 -0
  75. package/dist/components/segmented-control/index.js +2 -0
  76. package/dist/components/segmented-control/segmented-control.d.ts +26 -0
  77. package/dist/components/segmented-control/types.d.ts +47 -0
  78. package/dist/components/segmented-control/useSegmentedControl.d.ts +15 -0
  79. package/dist/components/select/useSelect.d.ts +31 -19
  80. package/dist/components/slider/useRangeSlider.d.ts +1 -1
  81. package/dist/components/slider/useRangeSliderPointer.d.ts +1 -1
  82. package/dist/components/tags-input/index.d.ts +3 -0
  83. package/dist/components/tags-input/index.js +2 -0
  84. package/dist/components/tags-input/tags-input.d.ts +27 -0
  85. package/dist/components/tags-input/tagsInputModel.d.ts +12 -0
  86. package/dist/components/tags-input/types.d.ts +37 -0
  87. package/dist/components/tags-input/useTagsInput.d.ts +23 -0
  88. package/dist/components/tooltip/useTooltipTargetBindings.d.ts +12 -0
  89. package/dist/date-picker.css +49 -0
  90. package/dist/date-picker.js +809 -0
  91. package/dist/dialog.js +9 -20
  92. package/dist/direction.js +6 -0
  93. package/dist/dropdown-menu.css +21 -3
  94. package/dist/dropdown-menu.js +341 -261
  95. package/dist/dropzone.css +135 -0
  96. package/dist/dropzone.js +431 -0
  97. package/dist/file-input.css +135 -0
  98. package/dist/file-input.js +198 -0
  99. package/dist/hover-card.css +80 -0
  100. package/dist/hover-card.js +402 -0
  101. package/dist/index.d.ts +9 -0
  102. package/dist/index.js +14 -3
  103. package/dist/internal/composables/useOverlayLayer.d.ts +12 -0
  104. package/dist/modal.js +1 -1
  105. package/dist/multi-select.css +316 -0
  106. package/dist/multi-select.js +481 -0
  107. package/dist/nativeChoice.js +169 -0
  108. package/dist/number-input.css +18 -18
  109. package/dist/number-input.js +36 -38
  110. package/dist/pagination.js +1 -10
  111. package/dist/pointerSession.js +130 -0
  112. package/dist/popover.css +21 -3
  113. package/dist/popover.js +37 -62
  114. package/dist/scroll-area.js +52 -62
  115. package/dist/segmented-control.css +176 -0
  116. package/dist/segmented-control.js +382 -0
  117. package/dist/select.css +50 -48
  118. package/dist/select.js +121 -271
  119. package/dist/slider.js +70 -129
  120. package/dist/tags-input.css +197 -0
  121. package/dist/tags-input.js +380 -0
  122. package/dist/tooltip.js +35 -30
  123. package/dist/useEditableOptionList.js +216 -0
  124. package/dist/useFlatOptionCollection.js +134 -0
  125. package/dist/useFloatingPosition.js +4 -160
  126. package/dist/useFloatingTargetLifecycle.js +127 -0
  127. package/dist/useFormControl.js +1 -0
  128. package/dist/{floating.js → useHoverDisclosure.js} +338 -421
  129. package/dist/useNativeChoiceTransaction.js +46 -0
  130. package/dist/useNativeFileSelection.js +86 -0
  131. package/dist/useOverlayZIndex.js +246 -15
  132. package/dist/utils/date.d.ts +13 -0
  133. package/dist/utils/dateAvailability.d.ts +7 -0
  134. package/dist/utils/dom/ancestry.d.ts +1 -0
  135. package/dist/utils/dom/direction.d.ts +2 -0
  136. package/dist/utils/dom/files.d.ts +3 -0
  137. package/dist/utils/dom/nativeChoice.d.ts +17 -0
  138. package/dist/utils/dom/pointerSession.d.ts +20 -0
  139. package/dist/utils/dom/scroll.d.ts +2 -1
  140. package/dist/utils/optionFilter.d.ts +5 -0
  141. package/docs/public-floating-api.md +7 -4
  142. package/docs/public-styles-api.md +25 -12
  143. package/package.json +39 -3
  144. package/src/styles/_mixins.scss +26 -0
  145. package/src/styles/styles-manifest.json +1 -2
  146. package/dist/components/floating/hoverDisclosureInteractionModel.d.ts +0 -42
  147. package/dist/components/floating/useHoverDisclosureInteractions.d.ts +0 -32
  148. package/dist/components/floating/useHoverDisclosureOpenState.d.ts +0 -25
  149. package/dist/components/floating/useHoverDisclosureTargetBinding.d.ts +0 -27
  150. package/dist/components/select/useSelectNativeControl.d.ts +0 -9
  151. package/dist/components/select/useSelectNativeValue.d.ts +0 -9
  152. package/dist/pointer.js +0 -9
  153. package/dist/utils/dom/pointer.d.ts +0 -2
@@ -0,0 +1,198 @@
1
+ import './file-input.css';
2
+ import { t as useStylesApi } from "./styles-api.js";
3
+ import { n as toPresenceAttribute } from "./attributes.js";
4
+ import { t as bem } from "./bem.js";
5
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
6
+ import { o as splitCompatibilityAttributes, t as composeEventHandlers } from "./attributes2.js";
7
+ import { t as useControlState } from "./useControlState.js";
8
+ import { t as useNativeFileSelection } from "./useNativeFileSelection.js";
9
+ import { child, computed, createSlot, defineVaporComponent, next, renderEffect, setDynamicProps, setInsertionState, setStaticTemplateRef, setText, template, toDisplayString, unref } from "vue";
10
+ //#region src/components/file-input/useFileInput.ts
11
+ function useFileInput(props, emitUpdate) {
12
+ const control = useControlState(props);
13
+ const { inputRef, files, settleSelection, clear, focus, open } = useNativeFileSelection({
14
+ modelValue: () => props.modelValue,
15
+ multiple: () => props.multiple ?? false,
16
+ disabled: () => control.disabled,
17
+ validationMessage: () => props.validationMessage,
18
+ onChange: emitUpdate
19
+ });
20
+ const fileNames = computed(() => files.value.map((file) => file.name));
21
+ const hasFiles = computed(() => files.value.length > 0);
22
+ const rootClass = computed(() => bem("rp-file-input", {
23
+ [`size-${props.size}`]: Boolean(props.size),
24
+ [`radius-${props.radius}`]: Boolean(props.radius),
25
+ disabled: control.disabled,
26
+ invalid: control.invalid,
27
+ valid: control.valid && !control.invalid,
28
+ filled: hasFiles.value
29
+ }));
30
+ const buttonText = computed(() => props.buttonLabel ?? (props.multiple ? "Choose files" : "Choose file"));
31
+ const displayValue = computed(() => {
32
+ if (hasFiles.value) return fileNames.value.join(", ");
33
+ return props.placeholder ?? (props.multiple ? "No files selected" : "No file selected");
34
+ });
35
+ function onChange(event) {
36
+ const input = event.target;
37
+ settleSelection({
38
+ status: "accepted",
39
+ files: input.files ?? []
40
+ });
41
+ }
42
+ return {
43
+ inputRef,
44
+ control,
45
+ files,
46
+ fileNames,
47
+ hasFiles,
48
+ rootClass,
49
+ buttonText,
50
+ displayValue,
51
+ onChange,
52
+ clear,
53
+ focus,
54
+ open
55
+ };
56
+ }
57
+ //#endregion
58
+ //#region src/components/file-input/file-input.vue?vue&type=script&setup=true&vapor=true&lang.ts
59
+ var t0 = template(" ");
60
+ var t1 = template("<div data-v-c2dff394><input data-v-c2dff394><span data-v-c2dff394></span><span data-v-c2dff394>", 1);
61
+ //#endregion
62
+ //#region src/components/file-input/file-input.vue
63
+ var file_input_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
64
+ name: "RpFileInput",
65
+ inheritAttrs: false,
66
+ __name: "file-input",
67
+ props: {
68
+ id: {},
69
+ name: {},
70
+ form: {},
71
+ modelValue: { default: void 0 },
72
+ accept: { default: void 0 },
73
+ capture: {
74
+ type: [Boolean, String],
75
+ default: void 0
76
+ },
77
+ multiple: {
78
+ type: Boolean,
79
+ default: false
80
+ },
81
+ size: {},
82
+ radius: {},
83
+ buttonLabel: { default: void 0 },
84
+ placeholder: { default: void 0 },
85
+ disabled: {
86
+ type: Boolean,
87
+ default: void 0
88
+ },
89
+ required: {
90
+ type: Boolean,
91
+ default: void 0
92
+ },
93
+ invalid: {
94
+ type: Boolean,
95
+ default: void 0
96
+ },
97
+ valid: {
98
+ type: Boolean,
99
+ default: void 0
100
+ },
101
+ ariaLabel: {},
102
+ describedby: {},
103
+ labelledby: {},
104
+ inputAttrs: {},
105
+ validationMessage: {},
106
+ classNames: {},
107
+ styles: {}
108
+ },
109
+ emits: ["update:modelValue"],
110
+ setup(__props, { expose: __expose, emit: __emit }) {
111
+ const props = __props;
112
+ const emit = __emit;
113
+ const { inputRef, control, files, fileNames, hasFiles, rootClass, buttonText, displayValue, onChange, clear, focus, open } = useFileInput(props, (value) => emit("update:modelValue", value));
114
+ const { getPartAttrs, getRootAttrs } = useStylesApi(props, "root");
115
+ const rootAttrs = computed(() => getRootAttrs({
116
+ class: rootClass.value,
117
+ "data-disabled": toPresenceAttribute(control.disabled),
118
+ "data-invalid": toPresenceAttribute(control.invalid)
119
+ }));
120
+ const nativeInputAttrs = computed(() => {
121
+ const attrs = props.inputAttrs ?? {};
122
+ const { compatibilityClass, compatibilityStyle, forwardedAttributes } = splitCompatibilityAttributes(attrs);
123
+ return {
124
+ ...forwardedAttributes,
125
+ ...getPartAttrs("input", {
126
+ class: "rp-file-input__native",
127
+ compatibilityClass,
128
+ compatibilityStyle
129
+ }),
130
+ id: control.id,
131
+ name: props.name,
132
+ form: control.form ?? forwardedAttributes.form,
133
+ type: "file",
134
+ value: void 0,
135
+ accept: props.accept,
136
+ capture: props.capture,
137
+ multiple: props.multiple || void 0,
138
+ disabled: control.disabled || void 0,
139
+ required: control.required || void 0,
140
+ "aria-label": props.ariaLabel || void 0,
141
+ "aria-labelledby": control.ariaLabelledby,
142
+ "aria-describedby": control.ariaDescribedby,
143
+ "aria-invalid": control.invalid || void 0,
144
+ "aria-required": control.required || void 0,
145
+ "data-disabled": toPresenceAttribute(control.disabled),
146
+ "data-invalid": toPresenceAttribute(control.invalid),
147
+ onChange: composeEventHandlers(onChange, attrs.onChange)
148
+ };
149
+ });
150
+ __expose({
151
+ nativeElement: inputRef,
152
+ clear,
153
+ focus,
154
+ open
155
+ });
156
+ const n9 = t1();
157
+ const n0 = child(n9);
158
+ const n4 = next(n0, 1);
159
+ const n8 = next(n4, 2);
160
+ setStaticTemplateRef(n0, inputRef, null, "inputRef");
161
+ renderEffect(() => {
162
+ setDynamicProps(n9, [rootAttrs.value]);
163
+ setDynamicProps(n0, [nativeInputAttrs.value]);
164
+ setDynamicProps(n4, [unref(getPartAttrs)("trigger", { class: "rp-file-input__trigger" }), { "aria-hidden": "true" }]);
165
+ });
166
+ setInsertionState(n4, null, 0);
167
+ createSlot("trigger", {
168
+ files: () => unref(files),
169
+ multiple: () => __props.multiple
170
+ }, () => {
171
+ const n3 = t0();
172
+ renderEffect(() => setText(n3, toDisplayString(unref(buttonText))));
173
+ return n3;
174
+ }, 1);
175
+ renderEffect(() => setDynamicProps(n8, [unref(getPartAttrs)("value", { class: ["rp-file-input__value", { "rp-file-input__value--placeholder": !unref(hasFiles) }] }), { "aria-hidden": "true" }]));
176
+ setInsertionState(n8, null, 0);
177
+ createSlot("value", {
178
+ files: () => unref(files),
179
+ fileNames: () => unref(fileNames),
180
+ hasFiles: () => unref(hasFiles)
181
+ }, () => {
182
+ const n7 = t0();
183
+ renderEffect(() => setText(n7, toDisplayString(unref(displayValue))));
184
+ return n7;
185
+ }, 1);
186
+ return n9;
187
+ }
188
+ }), [["__scopeId", "data-v-c2dff394"]]);
189
+ //#endregion
190
+ //#region src/components/file-input/types.ts
191
+ var fileInputParts = [
192
+ "root",
193
+ "input",
194
+ "trigger",
195
+ "value"
196
+ ];
197
+ //#endregion
198
+ export { file_input_default as n, fileInputParts as t };
@@ -0,0 +1,80 @@
1
+ @layer ropav.components {
2
+ .rp-hover-card[data-v-55e74041] {
3
+ position: relative;
4
+ display: inline-flex;
5
+ font-family: var(--rp-font-family);
6
+ vertical-align: middle;
7
+ }
8
+ .rp-hover-card__content[data-v-55e74041] {
9
+ --_rp-hover-card-main-axis-offset: var(--rp-spacing-2);
10
+ --_rp-hover-card-cross-axis-offset: 0px;
11
+ --_rp-hover-card-radius: var(--rp-radius-sm);
12
+ --_rp-hover-card-arrow-size: 0.5rem;
13
+ position: absolute;
14
+ z-index: 100;
15
+ box-sizing: border-box;
16
+ width: max-content;
17
+ max-width: min(22rem, 100vw - var(--rp-spacing-6));
18
+ padding: var(--rp-spacing-4);
19
+ color: var(--rp-color-text);
20
+ font-family: var(--rp-font-family);
21
+ font-size: var(--rp-font-size-md);
22
+ line-height: var(--rp-line-height-md);
23
+ overflow-wrap: anywhere;
24
+ background-color: var(--rp-color-default);
25
+ border: var(--rp-border-width-thin) solid var(--rp-color-default-border);
26
+ border-radius: var(--_rp-hover-card-radius);
27
+ box-shadow: var(--rp-shadow-base);
28
+ }
29
+ .rp-hover-card--target[data-v-55e74041] {
30
+ display: contents;
31
+ }
32
+ .rp-hover-card__arrow[data-v-55e74041] {
33
+ background-color: inherit;
34
+ border: inherit;
35
+ rotate: 45deg;
36
+ }
37
+ .rp-hover-card__arrow[data-side=top][data-v-55e74041] {
38
+ border-top-color: transparent;
39
+ border-left-color: transparent;
40
+ }
41
+ .rp-hover-card__arrow[data-side=right][data-v-55e74041] {
42
+ border-top-color: transparent;
43
+ border-right-color: transparent;
44
+ }
45
+ .rp-hover-card__arrow[data-side=bottom][data-v-55e74041] {
46
+ border-right-color: transparent;
47
+ border-bottom-color: transparent;
48
+ }
49
+ .rp-hover-card__arrow[data-side=left][data-v-55e74041] {
50
+ border-bottom-color: transparent;
51
+ border-left-color: transparent;
52
+ }
53
+ .rp-hover-card__arrow[data-v-55e74041] {
54
+ position: absolute;
55
+ box-sizing: border-box;
56
+ width: var(--_rp-hover-card-arrow-size);
57
+ height: var(--_rp-hover-card-arrow-size);
58
+ pointer-events: none;
59
+ }
60
+ .rp-hover-card__arrow[data-side=top][data-v-55e74041] {
61
+ bottom: calc(-1 * var(--_rp-hover-card-arrow-size) / 2);
62
+ }
63
+ .rp-hover-card__arrow[data-side=right][data-v-55e74041] {
64
+ left: calc(-1 * var(--_rp-hover-card-arrow-size) / 2);
65
+ }
66
+ .rp-hover-card__arrow[data-side=bottom][data-v-55e74041] {
67
+ top: calc(-1 * var(--_rp-hover-card-arrow-size) / 2);
68
+ }
69
+ .rp-hover-card__arrow[data-side=left][data-v-55e74041] {
70
+ right: calc(-1 * var(--_rp-hover-card-arrow-size) / 2);
71
+ }
72
+ .rp-hover-card-content-enter-active[data-v-55e74041],
73
+ .rp-hover-card-content-leave-active[data-v-55e74041] {
74
+ transition: opacity var(--rp-transition-fast);
75
+ }
76
+ .rp-hover-card-content-enter-from[data-v-55e74041],
77
+ .rp-hover-card-content-leave-to[data-v-55e74041] {
78
+ opacity: 0;
79
+ }
80
+ }
@@ -0,0 +1,402 @@
1
+ import './hover-card.css';
2
+ import { t as useStylesApi } from "./styles-api.js";
3
+ import { n as toPresenceAttribute } from "./attributes.js";
4
+ import { t as bem } from "./bem.js";
5
+ import { t as isElement } from "./query.js";
6
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
7
+ import { n as observeComposedAncestry, t as getComposedAncestry } from "./ancestry.js";
8
+ import { n as useOverlayZIndex, r as useOverlayLayer } from "./useOverlayZIndex.js";
9
+ import { t as getFloatingOffsetStyle } from "./floatingOffset.js";
10
+ import { t as useFloatingPosition } from "./useFloatingPosition.js";
11
+ import { t as useFloatingTargetLifecycle } from "./useFloatingTargetLifecycle.js";
12
+ import { n as useTeleportTarget } from "./useTeleportTarget.js";
13
+ import { t as getElementDirection } from "./direction.js";
14
+ import { n as useHoverDisclosureWithExternalDismissal } from "./useHoverDisclosure.js";
15
+ import { VaporTeleport, VaporTransition, applyVShow, computed, createComponent, createIf, createSlot, createTemplateRefSetter, defineVaporComponent, extend, onBeforeUnmount, readonly, ref, renderEffect, setAttr, setDynamicProps, setInsertionState, setStyle, setTemplateRefBinding, template, toValue, unref, useId, useSlots, watch } from "vue";
16
+ //#region src/internal/composables/useElementDirection.ts
17
+ var directionAttributeFilter = [
18
+ "class",
19
+ "dir",
20
+ "style"
21
+ ];
22
+ function getMutationObserverConstructor(element) {
23
+ return element.ownerDocument.defaultView?.MutationObserver ?? globalThis.MutationObserver;
24
+ }
25
+ function observeDirectionAttributes(element, onChange) {
26
+ const observers = /* @__PURE__ */ new Map();
27
+ const ancestry = [element, ...getComposedAncestry(element)];
28
+ for (const node of ancestry) {
29
+ if (!isElement(node)) continue;
30
+ const MutationObserverConstructor = getMutationObserverConstructor(node);
31
+ if (!MutationObserverConstructor) continue;
32
+ let observer = observers.get(MutationObserverConstructor);
33
+ if (!observer) {
34
+ observer = new MutationObserverConstructor(onChange);
35
+ observers.set(MutationObserverConstructor, observer);
36
+ }
37
+ observer.observe(node, {
38
+ attributes: true,
39
+ attributeFilter: directionAttributeFilter
40
+ });
41
+ }
42
+ return () => {
43
+ for (const observer of observers.values()) observer.disconnect();
44
+ };
45
+ }
46
+ function useElementDirection(elementSource) {
47
+ const direction = ref("ltr");
48
+ let disconnectElement;
49
+ function readDirection(element) {
50
+ direction.value = element ? getElementDirection(element) : "ltr";
51
+ }
52
+ function connectElement(element) {
53
+ disconnectElement?.();
54
+ disconnectElement = void 0;
55
+ readDirection(element);
56
+ if (!element) return;
57
+ const target = element;
58
+ let disconnectAttributes;
59
+ function reconnectAttributes() {
60
+ disconnectAttributes?.();
61
+ disconnectAttributes = observeDirectionAttributes(target, () => readDirection(target));
62
+ readDirection(target);
63
+ }
64
+ reconnectAttributes();
65
+ const disconnectAncestry = observeComposedAncestry(() => [target], reconnectAttributes, {
66
+ deferWhileDisconnected: true,
67
+ notifyOnDisconnect: true
68
+ });
69
+ disconnectElement = () => {
70
+ disconnectAttributes?.();
71
+ disconnectAncestry();
72
+ };
73
+ }
74
+ const stopSourceWatch = watch(() => toValue(elementSource), connectElement, {
75
+ immediate: true,
76
+ flush: "post"
77
+ });
78
+ onBeforeUnmount(() => {
79
+ stopSourceWatch();
80
+ disconnectElement?.();
81
+ });
82
+ return readonly(direction);
83
+ }
84
+ //#endregion
85
+ //#region src/components/hover-card/useHoverCardDisclosure.ts
86
+ function useHoverCardDisclosure(options, layerOptions) {
87
+ const { disclosure, dismissalHandlers } = useHoverDisclosureWithExternalDismissal(options);
88
+ const layer = useOverlayLayer({
89
+ active: disclosure.isOpen,
90
+ baseZIndex: layerOptions.baseZIndex,
91
+ element: layerOptions.element
92
+ });
93
+ onBeforeUnmount(layer.connectInteraction({
94
+ inside: layerOptions.inside,
95
+ escapeKeyDown: dismissalHandlers.escapeKeyDown,
96
+ pointerDownOutside: dismissalHandlers.pointerDownOutside
97
+ }));
98
+ return {
99
+ ...disclosure,
100
+ zIndex: layer.zIndex
101
+ };
102
+ }
103
+ //#endregion
104
+ //#region src/components/hover-card/useHoverCard.ts
105
+ var DEFAULT_PLACEMENT = "bottom-start";
106
+ var HOVER_CARD_OFFSET_PROPERTIES = {
107
+ mainAxis: "--_rp-hover-card-main-axis-offset",
108
+ crossAxis: "--_rp-hover-card-cross-axis-offset"
109
+ };
110
+ function useHoverCard(props, onOpenChange) {
111
+ const slots = useSlots();
112
+ const generatedId = useId();
113
+ const rootRef = ref(null);
114
+ const contentRef = ref(null);
115
+ const arrowRef = ref(null);
116
+ const hoverCardId = computed(() => props.id ?? `${generatedId}-hover-card`);
117
+ const placement = computed(() => props.placement ?? DEFAULT_PLACEMENT);
118
+ const teleportTo = useTeleportTarget(() => props.teleportTo);
119
+ const { isExplicitTarget, reference, targetElement } = useFloatingTargetLifecycle({
120
+ target: () => props.target,
121
+ fallback: rootRef
122
+ });
123
+ const contentDirection = useElementDirection(computed(() => {
124
+ const currentReference = reference.value;
125
+ if (isElement(currentReference)) return currentReference;
126
+ return isElement(currentReference?.contextElement) ? currentReference.contextElement : rootRef.value;
127
+ }));
128
+ const hasContent = computed(() => Boolean(slots.content || isExplicitTarget.value && slots.default));
129
+ const disclosureDisabled = computed(() => Boolean(props.disabled || !hasContent.value));
130
+ const baseZIndex = useOverlayZIndex({
131
+ baseZIndex: () => props.baseZIndex,
132
+ defaultBaseZIndex: 100,
133
+ aboveParent: false
134
+ });
135
+ const disclosure = useHoverCardDisclosure({
136
+ open: () => props.open,
137
+ defaultOpen: props.defaultOpen,
138
+ openDelay: () => props.openDelay,
139
+ closeDelay: () => props.closeDelay,
140
+ disabled: disclosureDisabled,
141
+ openOnFocus: () => props.openOnFocus,
142
+ closeOnEscape: () => props.closeOnEscape,
143
+ touchBehavior: () => props.touchBehavior,
144
+ interactionTarget: reference,
145
+ contentTarget: contentRef,
146
+ onOpenChange
147
+ }, {
148
+ baseZIndex,
149
+ element: contentRef,
150
+ inside: () => [rootRef.value, targetElement.value]
151
+ });
152
+ const isVisible = disclosure.isOpen;
153
+ const shouldRenderContent = computed(() => !disclosure.isDisabled.value && (Boolean(props.keepMounted) || disclosure.isOpen.value));
154
+ const shouldShowContent = computed(() => !props.keepMounted || disclosure.isOpen.value);
155
+ const floating = useFloatingPosition({
156
+ reference,
157
+ floating: contentRef,
158
+ arrow: arrowRef,
159
+ open: isVisible,
160
+ placement,
161
+ strategy: () => props.strategy ?? "absolute",
162
+ offset: () => props.offset,
163
+ flip: () => props.flip !== false,
164
+ flipOptions: () => props.flipOptions,
165
+ shift: () => props.shift !== false,
166
+ collisionPadding: () => props.collisionPadding ?? 8,
167
+ autoUpdateOptions: () => props.autoUpdateOptions,
168
+ restartKey: contentDirection
169
+ });
170
+ const placementSide = computed(() => floating.actualPlacement.value.split("-")[0]);
171
+ const rootClass = computed(() => bem("rp-hover-card", {
172
+ [`placement-${floating.actualPlacement.value}`]: true,
173
+ target: isExplicitTarget.value,
174
+ open: isVisible.value,
175
+ disabled: disclosure.isDisabled.value,
176
+ arrow: props.arrow
177
+ }));
178
+ const contentStyle = computed(() => ({
179
+ ...floating.floatingStyle.value,
180
+ ...getFloatingOffsetStyle(props.offset, HOVER_CARD_OFFSET_PROPERTIES),
181
+ zIndex: disclosure.zIndex.value
182
+ }));
183
+ const contentSlotProps = computed(() => ({
184
+ isOpen: isVisible.value,
185
+ open: disclosure.open,
186
+ close: disclosure.close,
187
+ toggle: disclosure.toggle
188
+ }));
189
+ return {
190
+ rootRef,
191
+ contentRef,
192
+ arrowRef,
193
+ hoverCardId,
194
+ isDisabled: disclosure.isDisabled,
195
+ isVisible,
196
+ isTargetMode: isExplicitTarget,
197
+ state: disclosure.state,
198
+ shouldRenderContent,
199
+ shouldShowContent,
200
+ rootClass,
201
+ contentStyle,
202
+ contentDirection,
203
+ contentSlotProps,
204
+ actualPlacement: floating.actualPlacement,
205
+ placementSide,
206
+ arrowStyle: floating.arrowStyle,
207
+ teleportTo
208
+ };
209
+ }
210
+ //#endregion
211
+ //#region src/components/hover-card/hover-card.vue?vue&type=script&setup=true&vapor=true&lang.ts
212
+ var t0 = template("<span data-v-55e74041 class=rp-hover-card__arrow aria-hidden=true>");
213
+ var t1 = template("<div data-v-55e74041>");
214
+ var t2 = template("<span data-v-55e74041>", 1);
215
+ //#endregion
216
+ //#region src/components/hover-card/hover-card.vue
217
+ var hover_card_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
218
+ name: "RpHoverCard",
219
+ inheritAttrs: false,
220
+ __name: "hover-card",
221
+ props: {
222
+ id: {},
223
+ baseZIndex: {},
224
+ open: {
225
+ type: Boolean,
226
+ default: void 0
227
+ },
228
+ defaultOpen: {
229
+ type: Boolean,
230
+ default: false
231
+ },
232
+ openDelay: { default: 700 },
233
+ closeDelay: { default: 300 },
234
+ disabled: {
235
+ type: Boolean,
236
+ default: false
237
+ },
238
+ openOnFocus: {
239
+ type: Boolean,
240
+ default: true
241
+ },
242
+ closeOnEscape: {
243
+ type: Boolean,
244
+ default: true
245
+ },
246
+ touchBehavior: { default: "none" },
247
+ keepMounted: {
248
+ type: Boolean,
249
+ default: false
250
+ },
251
+ target: {},
252
+ placement: { default: "bottom-start" },
253
+ strategy: { default: "absolute" },
254
+ offset: {},
255
+ flip: {
256
+ type: Boolean,
257
+ default: true
258
+ },
259
+ flipOptions: {},
260
+ shift: {
261
+ type: Boolean,
262
+ default: true
263
+ },
264
+ collisionPadding: { default: 8 },
265
+ autoUpdateOptions: {},
266
+ arrow: {
267
+ type: Boolean,
268
+ default: false
269
+ },
270
+ teleport: {
271
+ type: Boolean,
272
+ default: true
273
+ },
274
+ teleportTo: {},
275
+ classNames: {},
276
+ styles: {}
277
+ },
278
+ emits: ["update:open", "openChange"],
279
+ setup(__props, { emit: __emit }) {
280
+ const props = __props;
281
+ const emit = __emit;
282
+ const { rootRef, contentRef, arrowRef, hoverCardId, isDisabled, isTargetMode, state, shouldRenderContent, shouldShowContent, rootClass, contentStyle, contentDirection, contentSlotProps, actualPlacement, placementSide, arrowStyle, teleportTo } = useHoverCard(props, (open, details) => {
283
+ emit("update:open", open);
284
+ emit("openChange", open, details);
285
+ });
286
+ const templateRefs = {
287
+ root: rootRef,
288
+ content: contentRef,
289
+ arrow: arrowRef
290
+ };
291
+ const { getPartAttrs, getRootAttrs } = useStylesApi(props, "root");
292
+ const rootAttrs = computed(() => getRootAttrs({
293
+ class: rootClass.value,
294
+ "data-state": state.value,
295
+ "data-disabled": toPresenceAttribute(isDisabled.value)
296
+ }));
297
+ const publicTriggerProps = computed(() => {
298
+ const partAttrs = getPartAttrs("trigger");
299
+ return {
300
+ ...props.classNames?.trigger !== void 0 ? { class: partAttrs.class } : {},
301
+ ...props.styles?.trigger !== void 0 ? { style: partAttrs.style } : {},
302
+ "data-state": state.value,
303
+ "data-disabled": toPresenceAttribute(isDisabled.value)
304
+ };
305
+ });
306
+ const contentAttrs = computed(() => ({
307
+ ...getPartAttrs("content", {
308
+ class: "rp-hover-card__content",
309
+ style: contentStyle.value
310
+ }),
311
+ "data-state": state.value,
312
+ "data-placement": actualPlacement.value
313
+ }));
314
+ const _setTemplateRef = createTemplateRefSetter();
315
+ const n16 = t2();
316
+ renderEffect(() => setDynamicProps(n16, [rootAttrs.value]));
317
+ setInsertionState(n16, null, 0);
318
+ createIf(() => !unref(isTargetMode), () => {
319
+ return createSlot("default", {
320
+ triggerProps: () => publicTriggerProps.value,
321
+ isOpen: () => unref(contentSlotProps).isOpen,
322
+ open: () => unref(contentSlotProps).open,
323
+ close: () => unref(contentSlotProps).close,
324
+ toggle: () => unref(contentSlotProps).toggle
325
+ }, null, 1);
326
+ });
327
+ setInsertionState(n16, null, 1);
328
+ createComponent(VaporTeleport, {
329
+ to: () => unref(teleportTo),
330
+ disabled: () => !__props.teleport
331
+ }, () => {
332
+ return createComponent(VaporTransition, { name: "rp-hover-card-content" }, extend(() => {
333
+ return createIf(() => unref(shouldRenderContent), () => {
334
+ const n13 = t1();
335
+ renderEffect(() => setDynamicProps(n13, [
336
+ { id: unref(hoverCardId) },
337
+ contentAttrs.value,
338
+ {
339
+ dir: unref(contentDirection),
340
+ "data-side": unref(placementSide)
341
+ }
342
+ ]));
343
+ setInsertionState(n13, null, 0);
344
+ createSlot("content", {
345
+ isOpen: () => unref(contentSlotProps).isOpen,
346
+ open: () => unref(contentSlotProps).open,
347
+ close: () => unref(contentSlotProps).close,
348
+ toggle: () => unref(contentSlotProps).toggle
349
+ }, () => {
350
+ return createIf(() => unref(isTargetMode), () => {
351
+ return createSlot("default", {
352
+ triggerProps: () => publicTriggerProps.value,
353
+ isOpen: () => unref(contentSlotProps).isOpen,
354
+ open: () => unref(contentSlotProps).open,
355
+ close: () => unref(contentSlotProps).close,
356
+ toggle: () => unref(contentSlotProps).toggle
357
+ }, null, 1);
358
+ }, null, 129);
359
+ }, 1);
360
+ setInsertionState(n13, null, 1);
361
+ createIf(() => __props.arrow, () => {
362
+ const n12 = t0();
363
+ renderEffect(() => {
364
+ setAttr(n12, "data-side", unref(placementSide));
365
+ setStyle(n12, unref(arrowStyle));
366
+ _setTemplateRef(n12, templateRefs.arrow);
367
+ });
368
+ return n12;
369
+ });
370
+ applyVShow(n13, () => unref(shouldShowContent));
371
+ setTemplateRefBinding(n13, () => templateRefs.content, _setTemplateRef);
372
+ return n13;
373
+ }, null, 129);
374
+ }, { _: 8 }));
375
+ });
376
+ setTemplateRefBinding(n16, () => templateRefs.root);
377
+ return n16;
378
+ }
379
+ }), [["__scopeId", "data-v-55e74041"]]);
380
+ //#endregion
381
+ //#region src/components/hover-card/types.ts
382
+ var hoverCardPlacements = [
383
+ "top-start",
384
+ "top",
385
+ "top-end",
386
+ "right-start",
387
+ "right",
388
+ "right-end",
389
+ "bottom-start",
390
+ "bottom",
391
+ "bottom-end",
392
+ "left-start",
393
+ "left",
394
+ "left-end"
395
+ ];
396
+ var hoverCardParts = [
397
+ "root",
398
+ "trigger",
399
+ "content"
400
+ ];
401
+ //#endregion
402
+ export { hoverCardPlacements as n, hover_card_default as r, hoverCardParts as t };