pxd 0.0.61 → 0.0.62

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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/dist/components/_internal/dismiss-container.d.vue.ts +28 -0
  3. package/dist/components/_internal/dismiss-container.vue +162 -0
  4. package/dist/components/_internal/popover-arrow.d.vue.ts +9 -0
  5. package/dist/components/_internal/popover-arrow.vue +38 -0
  6. package/dist/components/active-graph/index.vue +4 -4
  7. package/dist/components/avatar/index.vue +5 -7
  8. package/dist/components/avatar-group/index.d.vue.ts +0 -1
  9. package/dist/components/avatar-group/index.vue +1 -1
  10. package/dist/components/backtop/index.vue +1 -1
  11. package/dist/components/badge/index.d.vue.ts +6 -2
  12. package/dist/components/badge/index.vue +18 -4
  13. package/dist/components/badge/types.d.ts +5 -0
  14. package/dist/components/book/index.vue +1 -1
  15. package/dist/components/browser/index.vue +1 -1
  16. package/dist/components/bubble/index.d.vue.ts +22 -0
  17. package/dist/components/bubble/index.vue +59 -0
  18. package/dist/components/bubble/types.d.ts +6 -0
  19. package/dist/components/button/index.d.vue.ts +0 -2
  20. package/dist/components/button/index.vue +30 -21
  21. package/dist/components/button/types.d.ts +3 -2
  22. package/dist/components/button-group/index.d.vue.ts +14 -0
  23. package/dist/components/button-group/index.vue +26 -0
  24. package/dist/components/button-group/types.d.ts +9 -0
  25. package/dist/components/carousel/index.d.vue.ts +3 -3
  26. package/dist/components/carousel/index.vue +146 -113
  27. package/dist/components/carousel/types.d.ts +1 -1
  28. package/dist/components/carousel-item/index.vue +22 -17
  29. package/dist/components/checkbox/index.vue +6 -6
  30. package/dist/components/checkbox-group/index.d.vue.ts +1 -1
  31. package/dist/components/chip/index.d.vue.ts +1 -5
  32. package/dist/components/chip/index.vue +4 -4
  33. package/dist/components/color-selector/index.d.vue.ts +12 -0
  34. package/dist/components/color-selector/index.vue +64 -0
  35. package/dist/components/color-selector/types.d.ts +12 -0
  36. package/dist/components/command-menu/index.d.vue.ts +6 -6
  37. package/dist/components/command-menu/index.vue +23 -32
  38. package/dist/components/command-menu/types.d.ts +1 -1
  39. package/dist/components/command-menu-group/index.vue +15 -6
  40. package/dist/components/command-menu-group/types.d.ts +1 -1
  41. package/dist/components/countdown/index.d.vue.ts +11 -11
  42. package/dist/components/drawer/index.d.vue.ts +8 -8
  43. package/dist/components/drawer/index.vue +13 -10
  44. package/dist/components/drawer/types.d.ts +4 -3
  45. package/dist/components/ellipsis-text/index.d.vue.ts +4 -1
  46. package/dist/components/ellipsis-text/index.vue +84 -107
  47. package/dist/components/ellipsis-text/types.d.ts +2 -1
  48. package/dist/components/error/index.vue +1 -1
  49. package/dist/components/fader/index.vue +5 -9
  50. package/dist/components/gauge/index.vue +34 -29
  51. package/dist/components/grid/index.vue +1 -1
  52. package/dist/components/grid-item/index.vue +1 -1
  53. package/dist/components/hold-button/index.d.vue.ts +8 -10
  54. package/dist/components/hold-button/index.vue +20 -29
  55. package/dist/components/hold-button/types.d.ts +5 -6
  56. package/dist/components/index.d.ts +7 -0
  57. package/dist/components/index.js +7 -0
  58. package/dist/components/input/index.d.vue.ts +8 -8
  59. package/dist/components/input/index.vue +5 -4
  60. package/dist/components/intersection-observer/index.vue +4 -4
  61. package/dist/components/kbd/index.vue +1 -1
  62. package/dist/components/link-button/index.d.vue.ts +4 -4
  63. package/dist/components/link-button/index.vue +9 -8
  64. package/dist/components/link-button/types.d.ts +0 -3
  65. package/dist/components/list/index.d.vue.ts +10 -15
  66. package/dist/components/list/index.vue +58 -131
  67. package/dist/components/list/types.d.ts +4 -4
  68. package/dist/components/list-item/index.d.vue.ts +2 -2
  69. package/dist/components/list-item/index.vue +44 -39
  70. package/dist/components/loading-bar/index.vue +8 -7
  71. package/dist/components/material/index.vue +24 -46
  72. package/dist/components/menu/index.d.vue.ts +6 -8
  73. package/dist/components/menu/index.vue +18 -24
  74. package/dist/components/menu/types.d.ts +1 -2
  75. package/dist/components/message/composables/use-group-expand.d.ts +13 -0
  76. package/dist/components/message/composables/use-group-expand.js +50 -0
  77. package/dist/components/message/composables/use-message-timer.d.ts +9 -0
  78. package/dist/components/message/composables/use-message-timer.js +61 -0
  79. package/dist/components/message/composables/use-promise-message.d.ts +4 -0
  80. package/dist/components/message/composables/use-promise-message.js +49 -0
  81. package/dist/components/message/index.d.vue.ts +6 -33
  82. package/dist/components/message/index.vue +33 -185
  83. package/dist/components/message/types.d.ts +2 -2
  84. package/dist/components/message-item/index.vue +26 -2
  85. package/dist/components/modal/index.d.vue.ts +7 -7
  86. package/dist/components/modal/index.vue +7 -3
  87. package/dist/components/modal/types.d.ts +7 -3
  88. package/dist/components/note/index.vue +2 -2
  89. package/dist/components/number-input/index.d.vue.ts +5 -4
  90. package/dist/components/number-input/index.vue +3 -0
  91. package/dist/components/number-input/types.d.ts +1 -0
  92. package/dist/components/overlay/index.d.vue.ts +6 -3
  93. package/dist/components/overlay/index.vue +63 -68
  94. package/dist/components/overlay/types.d.ts +5 -4
  95. package/dist/components/pagination/index.vue +2 -2
  96. package/dist/components/pin-input/index.d.vue.ts +1 -1
  97. package/dist/components/pin-input/index.vue +7 -6
  98. package/dist/components/placeholder/index.vue +1 -1
  99. package/dist/components/popover/index.d.vue.ts +7 -8
  100. package/dist/components/popover/index.vue +149 -239
  101. package/dist/components/popover/types.d.ts +5 -5
  102. package/dist/components/progress/index.vue +1 -1
  103. package/dist/components/radio/index.vue +2 -2
  104. package/dist/components/resizable/index.vue +43 -51
  105. package/dist/components/resizable/types.d.ts +1 -1
  106. package/dist/components/resizable-handle/index.d.vue.ts +4 -1
  107. package/dist/components/resizable-handle/index.vue +29 -3
  108. package/dist/components/resizable-panel/index.vue +3 -7
  109. package/dist/components/scalable-text/index.d.vue.ts +9 -0
  110. package/dist/components/scalable-text/index.vue +147 -0
  111. package/dist/components/scalable-text/types.d.ts +12 -0
  112. package/dist/components/scrollable/index.d.vue.ts +2 -2
  113. package/dist/components/scrollable/index.vue +4 -3
  114. package/dist/components/separator/index.d.vue.ts +6 -0
  115. package/dist/components/separator/index.vue +18 -0
  116. package/dist/components/separator/types.d.ts +5 -0
  117. package/dist/components/skeleton/index.d.vue.ts +1 -1
  118. package/dist/components/slider/index.d.vue.ts +1 -1
  119. package/dist/components/slider/index.vue +39 -7
  120. package/dist/components/snippet/index.vue +16 -13
  121. package/dist/components/spinner/index.vue +3 -1
  122. package/dist/components/stack/index.d.vue.ts +1 -1
  123. package/dist/components/stack/index.vue +1 -1
  124. package/dist/components/switch/index.d.vue.ts +1 -1
  125. package/dist/components/switch/index.vue +4 -3
  126. package/dist/components/switch-item/index.vue +1 -1
  127. package/dist/components/tabs/index.d.vue.ts +12 -0
  128. package/dist/components/tabs/index.vue +270 -0
  129. package/dist/components/tabs/types.d.ts +12 -0
  130. package/dist/components/tabs-item/index.d.vue.ts +4 -0
  131. package/dist/components/tabs-item/index.vue +16 -0
  132. package/dist/components/tabs-item/types.d.ts +10 -0
  133. package/dist/components/text/index.vue +1 -1
  134. package/dist/components/textarea/index.d.vue.ts +2 -2
  135. package/dist/components/textarea/index.vue +1 -1
  136. package/dist/components/time-picker/index.d.vue.ts +3 -5
  137. package/dist/components/time-picker/index.vue +53 -45
  138. package/dist/components/time-picker/types.d.ts +1 -2
  139. package/dist/components/toggle/index.d.vue.ts +0 -2
  140. package/dist/components/toggle/index.vue +6 -6
  141. package/dist/components/toggle-button/index.vue +8 -6
  142. package/dist/components/tooltip/index.d.vue.ts +1 -1
  143. package/dist/components/tooltip/index.vue +19 -11
  144. package/dist/components/tooltip/types.d.ts +2 -2
  145. package/dist/components/virtual-list/index.d.vue.ts +8 -8
  146. package/dist/components/virtual-list/index.vue +27 -5
  147. package/dist/components/virtual-list/types.d.ts +3 -0
  148. package/dist/composables/index.d.ts +4 -1
  149. package/dist/composables/index.js +4 -1
  150. package/dist/composables/use-browser-observer.js +2 -2
  151. package/dist/composables/use-client-online.js +2 -2
  152. package/dist/composables/use-color-scheme.js +2 -2
  153. package/dist/composables/use-countdown.js +3 -2
  154. package/dist/composables/use-deferred-value.js +2 -2
  155. package/dist/composables/use-delay-destroy.js +11 -6
  156. package/dist/composables/use-document-hidden.js +2 -2
  157. package/dist/composables/use-focus-trap.js +2 -2
  158. package/dist/composables/use-list-filter.d.ts +11 -0
  159. package/dist/composables/use-list-filter.js +56 -0
  160. package/dist/composables/use-list-navigation.d.ts +27 -0
  161. package/dist/composables/use-list-navigation.js +159 -0
  162. package/dist/composables/use-lock-scroll.js +12 -12
  163. package/dist/composables/use-media-query.js +2 -2
  164. package/dist/composables/use-outside-click.d.ts +1 -1
  165. package/dist/composables/use-outside-click.js +8 -11
  166. package/dist/composables/use-overlay-manager.d.ts +18 -0
  167. package/dist/composables/use-overlay-manager.js +80 -0
  168. package/dist/composables/use-popover-responsive.d.ts +6 -8
  169. package/dist/composables/use-popover-responsive.js +9 -12
  170. package/dist/composables/use-repeat-action.js +2 -2
  171. package/dist/composables/use-swipe-gesture.d.ts +65 -0
  172. package/dist/composables/use-swipe-gesture.js +99 -0
  173. package/dist/composables/use-virtual-list.d.ts +5 -3
  174. package/dist/composables/use-virtual-list.js +25 -14
  175. package/dist/composables/use-window-size.js +2 -2
  176. package/dist/constants/size.d.ts +12 -0
  177. package/dist/constants/size.js +12 -0
  178. package/dist/contexts/button.d.ts +5 -0
  179. package/dist/contexts/button.js +5 -0
  180. package/dist/contexts/carousel.d.ts +2 -1
  181. package/dist/contexts/list.d.ts +23 -3
  182. package/dist/contexts/list.js +6 -2
  183. package/dist/contexts/resizable.d.ts +3 -11
  184. package/dist/contexts/tabs.d.ts +15 -0
  185. package/dist/contexts/tabs.js +2 -0
  186. package/dist/locales/en-us.d.ts +4 -4
  187. package/dist/locales/en-us.js +4 -4
  188. package/dist/locales/zh-cn.d.ts +4 -4
  189. package/dist/locales/zh-cn.js +4 -4
  190. package/dist/plugins/dayjs-millisecond-token.js +1 -1
  191. package/dist/styles/source.css +133 -128
  192. package/dist/styles/styles.css +2 -2
  193. package/dist/styles/tw.css +133 -128
  194. package/dist/types/shared/props.d.ts +1 -0
  195. package/dist/types/shared/utils.d.ts +1 -4
  196. package/dist/utils/date.d.ts +3 -3
  197. package/dist/utils/dom.d.ts +1 -0
  198. package/dist/utils/dom.js +4 -0
  199. package/dist/utils/event.d.ts +2 -1
  200. package/dist/utils/event.js +7 -1
  201. package/dist/utils/format.d.ts +3 -3
  202. package/dist/utils/format.js +5 -4
  203. package/dist/utils/fuzzy-search.d.ts +7 -0
  204. package/dist/utils/fuzzy-search.js +61 -0
  205. package/dist/utils/get.d.ts +2 -0
  206. package/dist/utils/get.js +15 -1
  207. package/dist/utils/index.d.ts +10 -11
  208. package/dist/utils/index.js +2 -3
  209. package/dist/utils/ref.d.ts +2 -2
  210. package/dist/utils/{throttle.d.ts → timing.d.ts} +1 -0
  211. package/dist/utils/{throttle.js → timing.js} +4 -2
  212. package/package.json +67 -63
  213. package/volar.d.ts +7 -0
  214. package/dist/components/overlay/overlay-stack.d.ts +0 -3
  215. package/dist/components/overlay/overlay-stack.js +0 -17
  216. package/dist/composables/use-pointer-gesture.d.ts +0 -180
  217. package/dist/composables/use-pointer-gesture.js +0 -406
  218. package/dist/utils/debounce.d.ts +0 -1
  219. package/dist/utils/debounce.js +0 -1
  220. package/dist/utils/regexp.d.ts +0 -8
  221. package/dist/utils/regexp.js +0 -8
  222. package/dist/utils/responsive.d.ts +0 -3
  223. package/dist/utils/responsive.js +0 -14
@@ -2,106 +2,104 @@
2
2
  import { arrow, autoUpdate, computePosition, flip, shift, hide } from "@floating-ui/dom";
3
3
  import { computed, onBeforeUnmount, shallowRef, watch } from "vue";
4
4
  import { useDelayDestroy } from "../../composables/use-delay-destroy";
5
- import { useLockScroll } from "../../composables/use-lock-scroll";
5
+ import { useFocusTrap } from "../../composables/use-focus-trap";
6
6
  import { useOutsideClick } from "../../composables/use-outside-click";
7
7
  import { useConfigProvider } from "../../contexts/config-provider";
8
- import { debounce } from "../../utils/debounce";
9
- import { cachedOff, cachedOn, sleep } from "../../utils/event";
10
8
  import { getCssUnitValue, toArray } from "../../utils/format";
11
- import PTeleport from "../teleport/index.vue";
9
+ import PPopoverArrow from "../_internal/popover-arrow.vue";
10
+ import POverlay from "../overlay/index.vue";
12
11
  defineOptions({
13
12
  name: "PPopover",
14
- inheritAttrs: false
13
+ inheritAttrs: false,
14
+ model: {
15
+ prop: "modelValue",
16
+ event: "update:modelValue"
17
+ }
15
18
  });
16
19
  const props = defineProps({
17
20
  zIndex: { type: [Number, String], required: false },
18
- offset: { type: Number, required: false, default: 8 },
19
- visible: { type: Boolean, required: false },
21
+ offset: { type: Number, required: false },
20
22
  trigger: { type: [String, Array], required: false, default: () => ["hover"] },
21
23
  disabled: { type: Boolean, required: false },
24
+ adaptive: { type: Boolean, required: false },
22
25
  maxWidth: { type: [Number, String], required: false },
23
26
  position: { type: null, required: false, default: "bottom" },
24
27
  showDelay: { type: Number, required: false, default: 0 },
25
28
  hideDelay: { type: Number, required: false, default: 0 },
26
29
  showArrow: { type: Boolean, required: false },
27
- arrowColor: { type: String, required: false, default: "hsl(var(--primary))" },
30
+ arrowColor: { type: String, required: false },
31
+ modelValue: { type: Boolean, required: false },
28
32
  interactive: { type: Boolean, required: false, default: true },
29
33
  autoPosition: { type: Boolean, required: false, default: true },
30
34
  wrapperClass: { type: [String, Array, Object], required: false },
31
35
  contentClass: { type: [String, Array, Object], required: false },
32
36
  contentStyle: { type: [Object, String], required: false },
33
- unsetPosition: { type: Boolean, required: false, default: false },
34
- transitionType: { type: String, required: false, default: "fade-scale" },
35
37
  toggleOnTrigger: { type: Boolean, required: false, default: true },
36
38
  closeOnInvisible: { type: Boolean, required: false, default: true },
37
- closeOnPressEscape: { type: Boolean, required: false },
39
+ closeOnPressEscape: { type: Boolean, required: false, default: true },
38
40
  lockScrollOnVisible: { type: Boolean, required: false }
39
41
  });
40
- const emits = defineEmits(["show", "hide", "escape", "outside-click", "trigger-click", "visible-change"]);
41
- let isLockedScroll = false;
42
+ const emits = defineEmits(["show", "hide", "escape", "outside-click", "trigger-click", "visible-change", "update:modelValue"]);
42
43
  let showPopoverTimer;
43
44
  let hidePopoverTimer;
44
45
  let cleanupAutoUpdate = null;
45
- const allowedMethods = ["click", "manual", "contextmenu"];
46
- const arrayRef = shallowRef(null);
46
+ const arrowRef = shallowRef(null);
47
47
  const triggerRef = shallowRef(null);
48
48
  const wrapperRef = shallowRef(null);
49
49
  const localPosition = shallowRef(props.position);
50
50
  const triggerMethods = computed(() => toArray(props.trigger));
51
+ const transitionType = computed(() => props.adaptive ? "fade-slide" : "fade-scale");
51
52
  const wrapperStyle = computed(() => ({
52
- "z-index": props.zIndex,
53
+ "--popover-index": props.zIndex,
53
54
  "--popover-offset": props.offset,
54
- "--popover-arrow-bg": props.arrowColor,
55
+ "--popover-arrow-color": props.arrowColor,
55
56
  "--popover-max-width": getCssUnitValue(props.maxWidth)
56
57
  }));
57
58
  const configProvider = useConfigProvider();
58
- const { lockScroll, unlockScroll } = useLockScroll();
59
+ const allowOutsideClick = computed(() => !triggerMethods.value.includes("manual"));
60
+ const focusTrapContainer = computed(() => isVisible.value ? wrapperRef.value : null);
61
+ const computePositionMiddleware = computed(() => {
62
+ return [
63
+ shift(),
64
+ props.autoPosition && flip(),
65
+ props.showArrow && arrow({ element: arrowRef.value }),
66
+ props.closeOnInvisible && hide({ strategy: "referenceHidden" }),
67
+ props.closeOnInvisible && hide({ strategy: "escaped" })
68
+ ];
69
+ });
59
70
  const {
60
71
  render: isRender,
61
72
  visible: isVisible,
62
73
  show: showPopover,
63
74
  hide: hidePopover
64
- } = useDelayDestroy(props.visible, {
75
+ } = useDelayDestroy(props.modelValue, {
65
76
  delay: 2e3,
66
77
  visibleChange(v) {
67
- if (triggerMethods.value.includes("manual")) {
78
+ if (!allowOutsideClick.value) {
68
79
  return;
69
80
  }
70
81
  emits("visible-change", v);
71
82
  if (v) {
72
- if (props.lockScrollOnVisible) {
73
- isLockedScroll = true;
74
- lockScroll();
75
- }
76
83
  emits("show");
84
+ emits("update:modelValue", true);
77
85
  } else {
78
- if (isLockedScroll) {
79
- isLockedScroll = false;
80
- unlockScroll();
81
- }
82
86
  emits("hide");
87
+ emits("update:modelValue", false);
83
88
  }
84
89
  }
85
90
  });
91
+ useFocusTrap(focusTrapContainer);
86
92
  useOutsideClick(wrapperRef, {
93
+ allowList: [triggerRef, wrapperRef],
87
94
  isEnabled: () => {
88
- return isVisible.value && allowedMethods.some((t) => triggerMethods.value.includes(t));
95
+ return isVisible.value && allowOutsideClick.value;
89
96
  },
90
- isOutside: (ev) => {
91
- const el = ev.target;
92
- return !(triggerRef.value?.contains(el) || wrapperRef.value?.contains(el));
93
- },
94
- onTrigger: debounce(
95
- (ev) => {
96
- emits("outside-click", ev);
97
- if (triggerMethods.value.includes("manual")) {
98
- return;
99
- }
97
+ onTrigger: (ev) => {
98
+ emits("outside-click", ev);
99
+ if (allowOutsideClick.value) {
100
100
  handlePopoverHide();
101
- },
102
- 500,
103
- { edges: ["leading"] }
104
- )
101
+ }
102
+ }
105
103
  });
106
104
  function disposeAutoUpdate() {
107
105
  if (cleanupAutoUpdate) {
@@ -115,13 +113,7 @@ async function updatePosition() {
115
113
  wrapperRef.value,
116
114
  {
117
115
  placement: props.position,
118
- middleware: [
119
- shift(),
120
- props.autoPosition && flip(),
121
- props.showArrow && arrow({ element: arrayRef.value }),
122
- props.closeOnInvisible && hide({ strategy: "referenceHidden" }),
123
- props.closeOnInvisible && hide({ strategy: "escaped" })
124
- ]
116
+ middleware: computePositionMiddleware.value
125
117
  }
126
118
  );
127
119
  localPosition.value = placement;
@@ -129,13 +121,14 @@ async function updatePosition() {
129
121
  handlePopoverHide(true);
130
122
  return;
131
123
  }
132
- Object.assign(wrapperRef.value.style, {
133
- left: `${x}px`,
134
- top: `${y}px`
135
- });
124
+ const wrapperPositionStyle = {
125
+ left: props.adaptive ? "0" : `${x}px`,
126
+ top: props.adaptive ? "0" : `${y}px`
127
+ };
128
+ Object.assign(wrapperRef.value.style, wrapperPositionStyle);
136
129
  if (middlewareData.arrow) {
137
130
  const { x: arrowX, y: arrowY } = middlewareData.arrow;
138
- Object.assign(arrayRef.value.style, {
131
+ Object.assign(arrowRef.value.style, {
139
132
  left: arrowX != null ? `${Math.max(arrowX, 5)}px` : "",
140
133
  top: arrowY != null ? `${Math.max(arrowY, 5)}px` : ""
141
134
  });
@@ -156,13 +149,6 @@ async function handlePopoverShow() {
156
149
  }, props.showDelay);
157
150
  });
158
151
  await showPopover();
159
- if (props.closeOnPressEscape) {
160
- cachedOn(document, "keydown", onPopoverKeystroke);
161
- }
162
- if (props.unsetPosition) {
163
- Object.assign(wrapperRef.value.style, { left: "0", top: "0" });
164
- return;
165
- }
166
152
  disposeAutoUpdate();
167
153
  if (props.autoPosition) {
168
154
  cleanupAutoUpdate = autoUpdate(triggerRef.value, wrapperRef.value, updatePosition);
@@ -172,7 +158,11 @@ async function handlePopoverShow() {
172
158
  }
173
159
  async function handlePopoverHide(immediate = false) {
174
160
  if (hidePopoverTimer) {
175
- return;
161
+ if (!immediate) {
162
+ return;
163
+ }
164
+ clearTimeout(hidePopoverTimer);
165
+ hidePopoverTimer = null;
176
166
  }
177
167
  await new Promise((resolve) => {
178
168
  if (showPopoverTimer) {
@@ -188,22 +178,9 @@ async function handlePopoverHide(immediate = false) {
188
178
  );
189
179
  });
190
180
  disposeAutoUpdate();
191
- await hidePopover();
192
- if (props.closeOnPressEscape) {
193
- cachedOff(document, "keydown", onPopoverKeystroke);
194
- }
195
- }
196
- function onPopoverKeystroke(ev) {
197
- if (ev.ctrlKey || ev.metaKey || ev.altKey || ev.shiftKey) {
198
- return;
199
- }
200
- if (ev.key !== "Escape") {
201
- return;
202
- }
203
- emits("escape", ev);
204
- handlePopoverHide(true);
181
+ hidePopover();
205
182
  }
206
- async function onTriggerClick(ev) {
183
+ function onTriggerClick(ev) {
207
184
  if (props.disabled) {
208
185
  return;
209
186
  }
@@ -229,33 +206,27 @@ function onTriggerPointerLeave() {
229
206
  }
230
207
  handlePopoverHide();
231
208
  }
232
- function onTriggerFocusin() {
233
- if (props.disabled || !triggerMethods.value.includes("focus")) {
234
- return;
235
- }
236
- handlePopoverShow();
237
- }
238
- async function onTriggerFocusout() {
239
- if (props.disabled || !triggerMethods.value.includes("focus")) {
209
+ function onTriggerContextmenu() {
210
+ if (props.disabled || !triggerMethods.value.includes("contextmenu")) {
240
211
  return;
241
212
  }
242
- await sleep(0);
243
- if (wrapperRef.value.contains(document.activeElement)) {
213
+ if (isVisible.value) {
214
+ handlePopoverHide();
244
215
  return;
245
216
  }
246
- handlePopoverHide();
217
+ handlePopoverShow();
247
218
  }
248
- async function onTriggerContextmenu() {
249
- if (props.disabled || !triggerMethods.value.includes("contextmenu")) {
219
+ const PREVENT_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "Home", "End"]);
220
+ function onWrapperKeydown(ev) {
221
+ if (props.disabled || !isVisible.value) {
250
222
  return;
251
223
  }
252
- if (isVisible.value) {
253
- await handlePopoverHide();
254
- return;
224
+ const { key } = ev;
225
+ if (PREVENT_KEYS.has(key)) {
226
+ ev.preventDefault();
255
227
  }
256
- await handlePopoverShow();
257
228
  }
258
- function onContentPointerEnter() {
229
+ function onWrapperPointerEnter() {
259
230
  if (props.disabled) {
260
231
  return;
261
232
  }
@@ -264,7 +235,7 @@ function onContentPointerEnter() {
264
235
  }
265
236
  handlePopoverShow();
266
237
  }
267
- function onContentPointerLeave() {
238
+ function onWrapperPointerLeave() {
268
239
  if (props.disabled) {
269
240
  return;
270
241
  }
@@ -274,20 +245,16 @@ function onContentPointerLeave() {
274
245
  handlePopoverHide();
275
246
  }
276
247
  watch(
277
- () => props.visible,
248
+ () => props.modelValue,
278
249
  (visible) => {
279
250
  if (visible) {
280
251
  handlePopoverShow();
281
252
  } else {
282
- handlePopoverHide();
253
+ handlePopoverHide(true);
283
254
  }
284
255
  }
285
256
  );
286
257
  onBeforeUnmount(() => {
287
- if (isLockedScroll) {
288
- isLockedScroll = false;
289
- unlockScroll();
290
- }
291
258
  disposeAutoUpdate();
292
259
  });
293
260
  defineExpose({
@@ -304,39 +271,39 @@ defineExpose({
304
271
  :data-disabled="disabled"
305
272
  v-bind="$attrs"
306
273
  @click="onTriggerClick"
307
- @focusin="onTriggerFocusin"
308
- @focusout="onTriggerFocusout"
309
274
  @pointerenter="onTriggerPointerEnter"
310
275
  @pointerleave="onTriggerPointerLeave"
311
276
  @contextmenu.prevent="onTriggerContextmenu"
312
277
  >
313
278
  <slot />
314
279
 
315
- <PTeleport>
280
+ <POverlay
281
+ :model-value="isVisible"
282
+ :show-overlay="adaptive"
283
+ :close-on-press-escape="closeOnPressEscape"
284
+ :lock-scroll-on-visible="adaptive"
285
+ @escape="handlePopoverHide()"
286
+ >
316
287
  <div
317
288
  v-if="isRender"
318
289
  ref="wrapperRef"
319
290
  tabindex="-1"
320
- :class="wrapperClass"
321
- :style="wrapperStyle"
322
291
  :data-visible="isVisible"
292
+ :data-adaptive="adaptive"
323
293
  :data-position="localPosition"
324
294
  :data-interactive="interactive"
325
- :data-unset-position="unsetPosition"
326
- class="pxd-popover--wrapper sm:max-w-(--popover-max-width) absolute isolate z-10 flex max-h-full max-w-full outline-none data-[interactive=false]:pointer-events-none data-[visible=false]:pointer-events-none motion-reduce:data-[visible=false]:hidden"
327
- @pointerenter="onContentPointerEnter"
328
- @pointerleave="onContentPointerLeave"
295
+ :class="wrapperClass"
296
+ :style="wrapperStyle"
297
+ class="pxd-popover--wrapper sm:max-w-(--popover-max-width) absolute -top-full -left-full isolate z-(--popover-index) flex max-h-full max-w-full outline-none data-[interactive=false]:pointer-events-none data-[visible=false]:pointer-events-none motion-reduce:data-[visible=false]:hidden"
298
+ @keydown="onWrapperKeydown"
299
+ @pointerenter="onWrapperPointerEnter"
300
+ @pointerleave="onWrapperPointerLeave"
329
301
  >
330
302
  <div
331
- class="pxd-popover--container pointer-events-auto relative z-1 max-h-[80dvh] max-h-[80vh] w-inherit transform-gpu default-animation-duration default-animation-timing-function"
303
+ class="pxd-popover--container relative z-1 w-inherit default-transition-duration default-transition-timing-function"
332
304
  :data-transition-type="transitionType"
333
305
  :data-show-transition="configProvider.popoverShowTransition"
334
306
  >
335
- <i
336
- v-if="showArrow"
337
- ref="arrayRef"
338
- class="pxd-popover--arrow absolute z-1 rotate-45 border-5 border-(--popover-arrow-bg)"
339
- />
340
307
  <div
341
308
  class="pxd-popover--content h-full max-h-inherit overflow-auto"
342
309
  :class="contentClass"
@@ -344,146 +311,121 @@ defineExpose({
344
311
  >
345
312
  <slot name="content" />
346
313
  </div>
314
+
315
+ <div
316
+ v-if="showArrow"
317
+ ref="arrowRef"
318
+ class="pxd-popover--arrow pointer-events-none absolute z-1"
319
+ >
320
+ <PPopoverArrow
321
+ fill="var(--popover-arrow-color,transparent)"
322
+ stroke="var(--popover-arrow-border,transparent)"
323
+ :position="localPosition"
324
+ />
325
+ </div>
347
326
  </div>
348
327
  </div>
349
- </PTeleport>
328
+ </POverlay>
350
329
  </div>
351
330
  </template>
352
331
 
353
332
  <style lang="postcss">
354
- @keyframes popover-fade-show {
355
- 0% {
356
- opacity: 0;
357
- pointer-events: none;
358
- }
359
-
360
- 100% {
361
- opacity: 1;
362
- }
363
- }
364
-
365
- @keyframes popover-fade-hide {
366
- 0% {
367
- opacity: 1;
368
- }
333
+ .pxd-popover--wrapper {
334
+ --popover-padding: calc(var(--popover-offset, 8) * 1px);
369
335
 
370
- 100% {
371
- opacity: 0;
372
- pointer-events: none;
336
+ .pxd-popover--content.border + .pxd-popover--arrow {
337
+ --popover-arrow-border: var(--color-gray-300);
373
338
  }
374
- }
375
339
 
376
- @keyframes popover-fade-scale-show {
377
- 0% {
378
- transform: scale(0.95);
379
- opacity: 0;
380
- pointer-events: none;
381
- }
340
+ &[data-position^='top'] {
341
+ &[data-adaptive='false'] {
342
+ padding-bottom: var(--popover-padding);
343
+ }
382
344
 
383
- 100% {
384
- transform: scale(1);
385
- opacity: 1;
345
+ .pxd-popover--arrow {
346
+ bottom: -6px;
347
+ }
386
348
  }
387
- }
388
349
 
389
- @keyframes popover-fade-scale-hide {
390
- 0% {
391
- transform: scale(1);
392
- opacity: 1;
393
- }
350
+ &[data-position^='bottom'] {
351
+ &[data-adaptive='false'] {
352
+ padding-top: var(--popover-padding);
353
+ }
394
354
 
395
- 100% {
396
- transform: scale(0.95);
397
- opacity: 0;
398
- pointer-events: none;
355
+ .pxd-popover--arrow {
356
+ top: -6px;
357
+ }
399
358
  }
400
- }
401
359
 
402
- @keyframes popover-fade-slide-show {
403
- 0% {
404
- transform: translateY(100%);
405
- opacity: 0;
406
- pointer-events: none;
407
- }
360
+ &[data-position^='left'] {
361
+ &[data-adaptive='false'] {
362
+ padding-right: var(--popover-padding);
363
+ }
408
364
 
409
- 100% {
410
- transform: translateY(0);
411
- opacity: 1;
365
+ .pxd-popover--arrow {
366
+ right: -6px;
367
+ }
412
368
  }
413
- }
414
369
 
415
- @keyframes popover-fade-slide-hide {
416
- 0% {
417
- transform: translateY(0);
418
- opacity: 1;
419
- }
370
+ &[data-position^='right'] {
371
+ &[data-adaptive='false'] {
372
+ padding-left: var(--popover-padding);
373
+ }
420
374
 
421
- 100% {
422
- transform: translateY(100%);
423
- opacity: 0;
424
- pointer-events: none;
375
+ .pxd-popover--arrow {
376
+ left: -6px;
377
+ }
425
378
  }
426
379
  }
427
380
 
428
381
  .pxd-popover--container {
429
- --popover-padding: calc(var(--popover-offset, 8) * 1px);
430
- animation-name: popover-fade-show;
431
- animation-fill-mode: forwards;
382
+ transition-property: opacity, transform;
383
+ max-height: min(800px, 80vh);
384
+ max-height: min(800px, 80dvh);
385
+ pointer-events: none;
432
386
 
433
- &:hover {
434
- will-change: transform, animation;
387
+ [data-visible='true'] & {
388
+ opacity: 1;
389
+ pointer-events: auto;
435
390
  }
436
391
 
437
392
  [data-visible='true'] &[data-show-transition='false'] {
438
- animation-name: none !important;
439
- }
440
-
441
- [data-visible='true'] &[data-transition-type='fade'] {
442
- animation-name: popover-fade-show;
443
- }
444
-
445
- [data-visible='false'] &[data-transition-type='fade'] {
446
- animation-name: popover-fade-hide;
447
- }
448
-
449
- [data-visible='true'] &[data-transition-type='fade-scale'] {
450
- animation-name: popover-fade-scale-show;
393
+ transition-duration: 0s !important;
451
394
  }
452
395
 
453
396
  [data-visible='false'] &[data-transition-type='fade-scale'] {
454
- animation-name: popover-fade-scale-hide;
455
- }
456
-
457
- [data-visible='true'] &[data-transition-type='fade-slide'] {
458
- animation-name: popover-fade-slide-show;
397
+ opacity: 0;
398
+ transform: scale(var(--popover-scale));
399
+ transition-duration: var(--faster-transition-duration);
459
400
  }
460
401
 
461
402
  [data-visible='false'] &[data-transition-type='fade-slide'] {
462
- animation-name: popover-fade-slide-hide;
403
+ transform: translateY(100%);
404
+ transition-duration: var(--faster-transition-duration);
463
405
  }
464
406
 
465
407
  [data-position='top'] & {
466
- transform-origin: 50% 100%;
408
+ transform-origin: center bottom;
467
409
  }
468
410
 
469
411
  [data-position='top-start'] & {
470
- transform-origin: 0% 100%;
412
+ transform-origin: left bottom;
471
413
  }
472
414
 
473
415
  [data-position='top-end'] & {
474
- transform-origin: 100% 100%;
416
+ transform-origin: right bottom;
475
417
  }
476
418
 
477
419
  [data-position='bottom'] & {
478
- transform-origin: top center;
420
+ transform-origin: center top;
479
421
  }
480
422
 
481
423
  [data-position='bottom-start'] & {
482
- transform-origin: top left;
424
+ transform-origin: left top;
483
425
  }
484
426
 
485
427
  [data-position='bottom-end'] & {
486
- transform-origin: top right;
428
+ transform-origin: right top;
487
429
  }
488
430
 
489
431
  [data-position='left'] & {
@@ -509,37 +451,5 @@ defineExpose({
509
451
  [data-position='right-end'] & {
510
452
  transform-origin: left bottom;
511
453
  }
512
-
513
- [data-position^='top'][data-unset-position='false'] & {
514
- padding-bottom: var(--popover-padding);
515
- }
516
-
517
- [data-position^='bottom'][data-unset-position='false'] & {
518
- padding-top: var(--popover-padding);
519
- }
520
-
521
- [data-position^='left'][data-unset-position='false'] & {
522
- padding-right: var(--popover-padding);
523
- }
524
-
525
- [data-position^='right'][data-unset-position='false'] & {
526
- padding-left: var(--popover-padding);
527
- }
528
- }
529
-
530
- .pxd-popover--wrapper[data-position^='top'] .pxd-popover--arrow {
531
- bottom: 4px;
532
- }
533
-
534
- .pxd-popover--wrapper[data-position^='bottom'] .pxd-popover--arrow {
535
- top: 4px;
536
- }
537
-
538
- .pxd-popover--wrapper[data-position^='left'] .pxd-popover--arrow {
539
- right: 4px;
540
- }
541
-
542
- .pxd-popover--wrapper[data-position^='right'] .pxd-popover--arrow {
543
- left: 4px;
544
454
  }
545
455
  </style>
@@ -1,27 +1,26 @@
1
1
  import type { ComponentClass, ComponentPosition } from '../../types/shared'
2
2
  import type { CSSProperties } from 'vue'
3
3
 
4
- export type PopoverTrigger = 'click' | 'hover' | 'focus' | 'contextmenu' | 'manual'
4
+ export type PopoverTrigger = 'click' | 'hover' | 'contextmenu' | 'manual'
5
5
 
6
6
  export interface PopoverProps {
7
7
  zIndex?: number | string
8
8
  offset?: number
9
- visible?: boolean
10
9
  trigger?: PopoverTrigger | PopoverTrigger[]
11
10
  disabled?: boolean
11
+ adaptive?: boolean
12
12
  maxWidth?: number | string
13
13
  position?: ComponentPosition
14
14
  showDelay?: number
15
15
  hideDelay?: number
16
16
  showArrow?: boolean
17
17
  arrowColor?: string
18
+ modelValue?: boolean
18
19
  interactive?: boolean
19
20
  autoPosition?: boolean
20
21
  wrapperClass?: ComponentClass
21
22
  contentClass?: ComponentClass
22
23
  contentStyle?: CSSProperties | string
23
- unsetPosition?: boolean
24
- transitionType?: 'fade' | 'fade-scale' | 'fade-slide'
25
24
  toggleOnTrigger?: boolean
26
25
  closeOnInvisible?: boolean
27
26
  closeOnPressEscape?: boolean
@@ -32,7 +31,8 @@ export interface PopoverEmits {
32
31
  show: []
33
32
  hide: []
34
33
  escape: [KeyboardEvent]
35
- 'outside-click': [MouseEvent]
34
+ 'outside-click': [PointerEvent]
36
35
  'trigger-click': [PointerEvent]
37
36
  'visible-change': [visible: boolean]
37
+ 'update:modelValue': [visible: boolean]
38
38
  }
@@ -87,7 +87,7 @@ const computedProgressBarStyles = computed(() => {
87
87
  >
88
88
  <div :class="computedClasses">
89
89
  <div
90
- class="h-full rounded-inherit motion-safe:transition-all"
90
+ class="h-full rounded-inherit motion-safe:transition-appearance"
91
91
  :style="computedProgressBarStyles"
92
92
  />
93
93
  </div>
@@ -20,7 +20,7 @@ const props = defineProps({
20
20
  });
21
21
  const emits = defineEmits(["change", "update:modelValue"]);
22
22
  const radioVariant = tv({
23
- base: "pxd-radio--inner size-4 after:content-empty after:size-2 inline-flex items-center justify-center rounded-full border peer-focus-ring after:scale-40 after:rounded-full after:bg-primary after:opacity-0 peer-checked:after:scale-100 peer-checked:after:opacity-100 motion-safe:transition-colors motion-safe:after:transition-all",
23
+ base: "pxd-radio--inner size-4 after:content-empty after:size-2 inline-flex items-center justify-center rounded-full border peer-focus-ring after:scale-40 after:rounded-full after:bg-primary after:opacity-0 peer-checked:after:scale-100 peer-checked:after:opacity-100 motion-safe:transition-colors motion-safe:after:transition-appearance",
24
24
  variants: {
25
25
  checked: {
26
26
  true: {
@@ -105,7 +105,7 @@ function onInputChange() {
105
105
 
106
106
  <span aria-hidden="true" :class="computedClasses" />
107
107
 
108
- <span class="text-sm flex-1 shrink-0 empty:hidden">
108
+ <span class="text-sm flex-1 shrink-0 leading-none empty:hidden">
109
109
  <slot>
110
110
  {{ label }}
111
111
  </slot>