pxd 0.0.39 → 0.0.41

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 (240) hide show
  1. package/README.md +9 -3
  2. package/dist/components/active-graph/index.vue +10 -5
  3. package/dist/components/backtop/index.vue +75 -0
  4. package/dist/components/badge/index.vue +9 -7
  5. package/dist/components/book/index.vue +3 -3
  6. package/dist/components/browser/index.vue +2 -2
  7. package/dist/components/checkbox/index.vue +4 -3
  8. package/dist/components/checkbox-group/index.vue +1 -1
  9. package/dist/components/choicebox-group/index.vue +1 -1
  10. package/dist/components/command-menu/index.vue +124 -0
  11. package/dist/components/command-menu-group/index.vue +18 -0
  12. package/dist/components/command-menu-item/index.vue +13 -0
  13. package/dist/components/countdown/index.vue +2 -1
  14. package/dist/components/drawer/index.vue +26 -26
  15. package/dist/components/error/index.vue +2 -2
  16. package/dist/components/fader/index.vue +31 -17
  17. package/dist/components/grid/index.vue +2 -2
  18. package/dist/components/grid-item/index.vue +2 -2
  19. package/dist/components/hold-button/index.vue +1 -1
  20. package/dist/components/index.d.ts +7 -0
  21. package/dist/components/index.js +7 -0
  22. package/dist/components/input/index.vue +18 -10
  23. package/dist/components/intersection-observer/index.vue +5 -5
  24. package/dist/components/kbd/index.vue +21 -8
  25. package/dist/components/{intersection-observer/content.vue → keep-alive-container/index.vue} +3 -1
  26. package/dist/components/list/index.vue +100 -92
  27. package/dist/components/list-item/index.vue +35 -33
  28. package/dist/components/loading-bar/index.vue +149 -0
  29. package/dist/components/material/index.vue +8 -8
  30. package/dist/components/menu/index.vue +26 -16
  31. package/dist/components/message/index.vue +28 -18
  32. package/dist/components/modal/index.vue +32 -36
  33. package/dist/components/note/index.vue +1 -1
  34. package/dist/components/overlay/index.vue +77 -24
  35. package/dist/components/pagination/index.vue +2 -2
  36. package/dist/components/placeholder/index.vue +13 -6
  37. package/dist/components/popover/index.vue +97 -87
  38. package/dist/components/progress/index.vue +1 -1
  39. package/dist/components/radio/index.vue +4 -3
  40. package/dist/components/radio-group/index.vue +1 -1
  41. package/dist/components/scrollable/index.vue +161 -94
  42. package/dist/components/slider/index.vue +7 -7
  43. package/dist/components/stack/index.vue +4 -4
  44. package/dist/components/switch/index.vue +1 -1
  45. package/dist/components/text/index.vue +1 -1
  46. package/dist/components/theme-switcher/index.vue +6 -2
  47. package/dist/components/time-picker/index.vue +281 -0
  48. package/dist/components/tooltip/index.vue +7 -7
  49. package/dist/composables/index.d.ts +1 -0
  50. package/dist/composables/index.js +1 -0
  51. package/dist/composables/use-browser-observer.d.ts +5 -5
  52. package/dist/composables/use-color-scheme.d.ts +5 -1
  53. package/dist/composables/use-color-scheme.js +20 -1
  54. package/dist/composables/use-config-provider-context.d.ts +1 -1
  55. package/dist/composables/use-countdown.d.ts +6 -0
  56. package/dist/composables/use-countdown.js +21 -7
  57. package/dist/composables/use-delay-destroy.d.ts +4 -4
  58. package/dist/composables/use-delay-destroy.js +15 -11
  59. package/dist/composables/use-focus-trap.d.ts +2 -2
  60. package/dist/composables/use-focus-trap.js +6 -6
  61. package/dist/composables/use-loading-bar.d.ts +25 -0
  62. package/dist/composables/use-loading-bar.js +27 -0
  63. package/dist/composables/use-media-query.js +1 -1
  64. package/dist/composables/use-message.d.ts +4 -1
  65. package/dist/composables/use-message.js +18 -0
  66. package/dist/composables/use-pointer-gesture.d.ts +2 -2
  67. package/dist/composables/use-pointer-gesture.js +3 -3
  68. package/dist/composables/use-repeat-action.d.ts +2 -2
  69. package/dist/composables/use-repeat-action.js +5 -5
  70. package/dist/composables/use-virtual-list.d.ts +1 -1
  71. package/dist/contexts/avatar.d.ts +1 -1
  72. package/dist/contexts/carousel.d.ts +1 -1
  73. package/dist/contexts/checkbox.d.ts +1 -1
  74. package/dist/contexts/choicebox.d.ts +2 -2
  75. package/dist/contexts/collapse.d.ts +1 -1
  76. package/dist/contexts/list.d.ts +5 -6
  77. package/dist/contexts/list.js +3 -3
  78. package/dist/contexts/radio.d.ts +1 -1
  79. package/dist/contexts/resizable.d.ts +1 -1
  80. package/dist/contexts/switch.d.ts +2 -2
  81. package/dist/{components/carousel → dist/components/keep-alive-container}/index.vue.d.ts +1 -1
  82. package/dist/index.d.ts +1 -1
  83. package/dist/index.js +1 -1
  84. package/dist/locales/en-us.d.ts +15 -7
  85. package/dist/locales/en-us.js +17 -9
  86. package/dist/locales/zh-cn.d.ts +15 -7
  87. package/dist/locales/zh-cn.js +17 -9
  88. package/dist/{components → src/components}/active-graph/index.vue.d.ts +7 -5
  89. package/dist/{components → src/components}/avatar-group/index.vue.d.ts +1 -1
  90. package/dist/src/components/backtop/index.vue.d.ts +20 -0
  91. package/dist/{components → src/components}/badge/index.vue.d.ts +2 -1
  92. package/dist/{components → src/components}/book/index.vue.d.ts +1 -1
  93. package/dist/{components → src/components}/browser/index.vue.d.ts +1 -1
  94. package/dist/{components → src/components}/button/index.vue.d.ts +1 -1
  95. package/dist/{components/intersection-observer/content.vue.d.ts → src/components/carousel/index.vue.d.ts} +1 -1
  96. package/dist/{components → src/components}/carousel-group/index.vue.d.ts +1 -1
  97. package/dist/{components → src/components}/chip/index.vue.d.ts +1 -1
  98. package/dist/{components → src/components}/choicebox/index.vue.d.ts +1 -1
  99. package/dist/{components → src/components}/choicebox-group/index.vue.d.ts +1 -1
  100. package/dist/{components → src/components}/collapse/index.vue.d.ts +1 -1
  101. package/dist/{components → src/components}/collapse-group/index.vue.d.ts +1 -1
  102. package/dist/src/components/command-menu/index.vue.d.ts +39 -0
  103. package/dist/src/components/command-menu-group/index.vue.d.ts +16 -0
  104. package/dist/src/components/command-menu-item/index.vue.d.ts +12 -0
  105. package/dist/{components → src/components}/config-provider/index.vue.d.ts +1 -1
  106. package/dist/{components → src/components}/description/index.vue.d.ts +1 -1
  107. package/dist/{components → src/components}/drawer/index.vue.d.ts +19 -14
  108. package/dist/{components → src/components}/empty-state/index.vue.d.ts +1 -1
  109. package/dist/{components → src/components}/error/index.vue.d.ts +1 -1
  110. package/dist/src/components/fader/index.vue.d.ts +11 -0
  111. package/dist/{components → src/components}/gauge/index.vue.d.ts +1 -1
  112. package/dist/{components → src/components}/grid/index.vue.d.ts +1 -1
  113. package/dist/{components → src/components}/grid-item/index.vue.d.ts +1 -1
  114. package/dist/{components → src/components}/hold-button/index.vue.d.ts +1 -1
  115. package/dist/{components → src/components}/input/index.vue.d.ts +9 -4
  116. package/dist/{components → src/components}/intersection-observer/index.vue.d.ts +3 -3
  117. package/dist/{components → src/components}/kbd/index.vue.d.ts +8 -5
  118. package/dist/src/components/keep-alive-container/index.vue.d.ts +12 -0
  119. package/dist/{components → src/components}/link-button/index.vue.d.ts +1 -1
  120. package/dist/src/components/list/index.vue.d.ts +40 -0
  121. package/dist/{components → src/components}/list-item/index.vue.d.ts +4 -4
  122. package/dist/src/components/loading-bar/index.vue.d.ts +14 -0
  123. package/dist/{components → src/components}/loading-dots/index.vue.d.ts +1 -1
  124. package/dist/{components → src/components}/material/index.vue.d.ts +1 -1
  125. package/dist/{components → src/components}/menu/index.vue.d.ts +11 -7
  126. package/dist/{components → src/components}/message/index.vue.d.ts +13 -13
  127. package/dist/{components → src/components}/modal/index.vue.d.ts +19 -14
  128. package/dist/{components → src/components}/more-button/index.vue.d.ts +1 -1
  129. package/dist/{components → src/components}/note/index.vue.d.ts +1 -1
  130. package/dist/{components → src/components}/number-input/index.vue.d.ts +1 -1
  131. package/dist/{components → src/components}/overlay/index.vue.d.ts +3 -4
  132. package/dist/{components → src/components}/pagination/index.vue.d.ts +1 -1
  133. package/dist/{components → src/components}/pin-input/index.vue.d.ts +1 -1
  134. package/dist/src/components/placeholder/index.vue.d.ts +9 -0
  135. package/dist/{components → src/components}/popover/index.vue.d.ts +10 -8
  136. package/dist/{components → src/components}/progress/index.vue.d.ts +1 -1
  137. package/dist/{components → src/components}/radio/index.vue.d.ts +1 -1
  138. package/dist/{components → src/components}/radio-group/index.vue.d.ts +1 -1
  139. package/dist/{components → src/components}/resizable/index.vue.d.ts +1 -1
  140. package/dist/src/components/resizable-handle/index.vue.d.ts +2 -0
  141. package/dist/{components → src/components}/resizable-panel/index.vue.d.ts +1 -1
  142. package/dist/{components → src/components}/skeleton/index.vue.d.ts +1 -1
  143. package/dist/{components → src/components}/slider/index.vue.d.ts +1 -1
  144. package/dist/{components → src/components}/snippet/index.vue.d.ts +1 -1
  145. package/dist/src/components/spinner/index.vue.d.ts +2 -0
  146. package/dist/{components → src/components}/stack/index.vue.d.ts +1 -1
  147. package/dist/{components → src/components}/status-dot/index.vue.d.ts +1 -1
  148. package/dist/{components → src/components}/switch/index.vue.d.ts +1 -1
  149. package/dist/{components → src/components}/switch-group/index.vue.d.ts +1 -1
  150. package/dist/{components → src/components}/teleport/index.vue.d.ts +1 -1
  151. package/dist/{components → src/components}/text/index.vue.d.ts +1 -1
  152. package/dist/{components → src/components}/textarea/index.vue.d.ts +1 -1
  153. package/dist/{components → src/components}/theme-switcher/index.vue.d.ts +1 -1
  154. package/dist/src/components/time-picker/index.vue.d.ts +25 -0
  155. package/dist/{components → src/components}/toggle/index.vue.d.ts +1 -1
  156. package/dist/{components → src/components}/tooltip/index.vue.d.ts +3 -5
  157. package/dist/{components → src/components}/virtual-list/index.vue.d.ts +1 -1
  158. package/dist/src/composables/use-browser-observer.d.ts +12 -0
  159. package/dist/src/composables/use-color-scheme.d.ts +11 -0
  160. package/dist/src/composables/use-config-provider-context.d.ts +7 -0
  161. package/dist/src/composables/use-copy-click.d.ts +4 -0
  162. package/dist/src/composables/use-countdown.d.ts +60 -0
  163. package/dist/src/composables/use-delay-change.d.ts +7 -0
  164. package/dist/src/composables/use-delay-destroy.d.ts +13 -0
  165. package/dist/src/composables/use-focus-trap.d.ts +4 -0
  166. package/dist/src/composables/use-loading-bar.d.ts +25 -0
  167. package/dist/src/composables/use-media-query.d.ts +15 -0
  168. package/dist/src/composables/use-message.d.ts +33 -0
  169. package/dist/src/composables/use-model-value.d.ts +11 -0
  170. package/dist/src/composables/use-pointer-gesture.d.ts +180 -0
  171. package/dist/src/composables/use-repeat-action.d.ts +16 -0
  172. package/dist/src/composables/use-unique-id-context.d.ts +2 -0
  173. package/dist/src/composables/use-virtual-list.d.ts +16 -0
  174. package/dist/src/contexts/avatar.d.ts +2 -0
  175. package/dist/src/contexts/carousel.d.ts +13 -0
  176. package/dist/src/contexts/checkbox.d.ts +2 -0
  177. package/dist/src/contexts/choicebox.d.ts +4 -0
  178. package/dist/src/contexts/collapse.d.ts +8 -0
  179. package/dist/src/contexts/list.d.ts +8 -0
  180. package/dist/src/contexts/radio.d.ts +2 -0
  181. package/dist/src/contexts/resizable.d.ts +35 -0
  182. package/dist/src/contexts/switch.d.ts +4 -0
  183. package/dist/src/locales/en-us.d.ts +42 -0
  184. package/dist/src/plugins/dayjs-millisecond-token.d.ts +3 -0
  185. package/dist/src/types/components/time-picker.d.ts +4 -0
  186. package/dist/src/utils/context.d.ts +17 -0
  187. package/dist/src/utils/date.d.ts +26 -0
  188. package/dist/src/utils/debounce/index.d.ts +73 -0
  189. package/dist/src/utils/debounce.d.ts +1 -0
  190. package/dist/src/utils/dom.d.ts +40 -0
  191. package/dist/{utils/events.d.ts → src/utils/event.d.ts} +1 -0
  192. package/dist/src/utils/format.d.ts +25 -0
  193. package/dist/src/utils/get.d.ts +11 -0
  194. package/dist/src/utils/is.d.ts +4 -0
  195. package/dist/src/utils/ref.d.ts +5 -0
  196. package/dist/src/utils/regexp.d.ts +8 -0
  197. package/dist/src/utils/responsive.d.ts +3 -0
  198. package/dist/src/utils/throttle/index.d.ts +53 -0
  199. package/dist/src/utils/throttle.d.ts +1 -0
  200. package/dist/src/utils/uid.d.ts +1 -0
  201. package/dist/styles/styles.css +2 -2
  202. package/dist/styles/tw.css +18 -1
  203. package/dist/types/components/list.d.ts +4 -3
  204. package/dist/types/components/time-picker.d.ts +4 -0
  205. package/dist/types/components/time-picker.js +0 -0
  206. package/dist/types/shared/utils.d.ts +5 -2
  207. package/dist/utils/date.d.ts +3 -3
  208. package/dist/utils/debounce/compat.d.ts +143 -0
  209. package/dist/utils/debounce/compat.js +47 -0
  210. package/dist/utils/debounce/index.d.ts +73 -0
  211. package/dist/utils/debounce/index.js +60 -0
  212. package/dist/utils/debounce.d.ts +1 -73
  213. package/dist/utils/debounce.js +1 -60
  214. package/dist/utils/event.d.ts +9 -0
  215. package/dist/utils/{events.js → event.js} +3 -0
  216. package/dist/utils/format.d.ts +4 -1
  217. package/dist/utils/format.js +6 -0
  218. package/dist/utils/ref.d.ts +2 -5
  219. package/dist/utils/regexp.d.ts +4 -0
  220. package/dist/utils/regexp.js +4 -0
  221. package/dist/utils/responsive.d.ts +2 -1
  222. package/dist/utils/responsive.js +4 -1
  223. package/dist/utils/throttle/compat.d.ts +79 -0
  224. package/dist/utils/throttle/compat.js +9 -0
  225. package/dist/utils/throttle/index.d.ts +53 -0
  226. package/dist/utils/throttle/index.js +34 -0
  227. package/dist/utils/throttle.d.ts +1 -53
  228. package/dist/utils/throttle.js +1 -34
  229. package/dist/utils/uid.js +1 -1
  230. package/package.json +11 -11
  231. package/volar.d.ts +7 -0
  232. package/dist/components/fader/index.vue.d.ts +0 -11
  233. package/dist/components/list/index.vue.d.ts +0 -29
  234. package/dist/components/placeholder/index.vue.d.ts +0 -8
  235. package/dist/components/resizable-handle/index.vue.d.ts +0 -2
  236. package/dist/components/spinner/index.vue.d.ts +0 -2
  237. /package/dist/{components → src/components}/avatar/index.vue.d.ts +0 -0
  238. /package/dist/{components → src/components}/checkbox/index.vue.d.ts +0 -0
  239. /package/dist/{components → src/components}/checkbox-group/index.vue.d.ts +0 -0
  240. /package/dist/{components → src/components}/countdown/index.vue.d.ts +0 -0
@@ -7,10 +7,11 @@ import LoadingIcon from "@gdsicon/vue/loader-circle";
7
7
  import WarningFillIcon from "@gdsicon/vue/warning-fill";
8
8
  import { computed, onBeforeUnmount, onMounted, ref } from "vue";
9
9
  import {
10
+ CLEAR_MESSAGES_EVENT_NAME,
10
11
  CREATE_MESSAGE_EVENT_NAME,
11
12
  REMOVE_MESSAGE_EVENT_NAME
12
13
  } from "../../composables/use-message";
13
- import { optimizedOff, optimizedOn } from "../../utils/events";
14
+ import { optimizedOff, optimizedOn } from "../../utils/event";
14
15
  import { isServer } from "../../utils/is";
15
16
  import PButton from "../button/index.vue";
16
17
  import PTeleport from "../teleport/index.vue";
@@ -30,7 +31,8 @@ const TYPE_ICONS = {
30
31
  error: ErrorFillIcon,
31
32
  loading: LoadingIcon
32
33
  };
33
- const ITEM_SELECTOR = ".pxd-message--item";
34
+ const ITEM_CLASSES = "pxd-message--item";
35
+ const ITEM_SELECTOR = `.${ITEM_CLASSES}`;
34
36
  const groupMessages = ref([]);
35
37
  const visibleMessages = computed(() => {
36
38
  const max = Math.max(props.max, 0);
@@ -152,6 +154,12 @@ function closeMessageByKey(key) {
152
154
  }
153
155
  groupMessages.value.splice(index, 1);
154
156
  }
157
+ function clearMessage() {
158
+ groupMessages.value.forEach((m) => {
159
+ m._timerId && clearTimeout(m._timerId);
160
+ });
161
+ groupMessages.value = [];
162
+ }
155
163
  function onCreateMessage({ detail: data }) {
156
164
  if (!data || data.group !== props.group) {
157
165
  return;
@@ -167,32 +175,34 @@ function onRemoveMessage({ detail: data }) {
167
175
  }
168
176
  closeMessageByKey(data.key);
169
177
  }
170
- function closeMessageByKeyAll() {
171
- groupMessages.value.forEach((m) => {
172
- m._timerId && clearTimeout(m._timerId);
173
- });
174
- groupMessages.value = [];
178
+ function onClearMessages({ detail: data }) {
179
+ if (!data || data.group !== props.group) {
180
+ return;
181
+ }
182
+ clearMessage();
175
183
  }
176
184
  onMounted(() => {
177
185
  if (isServer) {
178
186
  return;
179
187
  }
188
+ optimizedOn(window, CLEAR_MESSAGES_EVENT_NAME, onClearMessages);
180
189
  optimizedOn(window, CREATE_MESSAGE_EVENT_NAME, onCreateMessage);
181
190
  optimizedOn(window, REMOVE_MESSAGE_EVENT_NAME, onRemoveMessage);
182
191
  });
183
192
  onBeforeUnmount(() => {
184
- closeMessageByKeyAll();
193
+ clearMessage();
194
+ optimizedOff(window, CLEAR_MESSAGES_EVENT_NAME, onCreateMessage);
185
195
  optimizedOff(window, CREATE_MESSAGE_EVENT_NAME, onCreateMessage);
186
196
  optimizedOff(window, REMOVE_MESSAGE_EVENT_NAME, onRemoveMessage);
187
197
  });
188
198
  defineExpose({
189
199
  messages: groupMessages,
190
200
  visibleMessages,
191
- getMessage: getMessageByKey,
192
- pauseMessage: pauseMessageByKey,
193
- resumeMessage: resumeMessageByKey,
194
- closeMessage: closeMessageByKey,
195
- closeMessageAll: closeMessageByKeyAll
201
+ get: getMessageByKey,
202
+ pause: pauseMessageByKey,
203
+ resume: resumeMessageByKey,
204
+ close: closeMessageByKey,
205
+ clear: clearMessage
196
206
  });
197
207
  </script>
198
208
 
@@ -218,7 +228,7 @@ defineExpose({
218
228
  aria-live="polite"
219
229
  :data-key="item.key"
220
230
  :data-type="item.type"
221
- :class="[ITEM_SELECTOR, item.class, { 'pr-9 pointer-events-auto': item.closeable }]"
231
+ :class="[ITEM_CLASSES, item.class, { 'pr-9 pointer-events-auto': item.closeable }]"
222
232
  class="py-2 px-3 text-sm relative flex w-max max-w-full rounded-lg bg-background-100 break-all whitespace-pre-wrap shadow-border-modal"
223
233
  >
224
234
  <Component :is="TYPE_ICONS[item.type]" v-if="item.type" class="pxd-message--icon size-4 mr-2 mt-0.5 shrink-0" :class="item.type" />
@@ -247,6 +257,10 @@ defineExpose({
247
257
  max-width: min(500px, 100vw);
248
258
  max-height: min(800px, 50vh);
249
259
 
260
+ .pxd-transition--fade-scale-leave-active {
261
+ position: absolute;
262
+ }
263
+
250
264
  .pxd-message--item {
251
265
  --scale: .95;
252
266
  }
@@ -317,8 +331,4 @@ defineExpose({
317
331
  }
318
332
  }
319
333
  }
320
-
321
- .relative > .pxd-transition--fade-scale-leave-active {
322
- position: absolute;
323
- }
324
334
  </style>
@@ -2,9 +2,8 @@
2
2
  import { shallowRef, watch } from "vue";
3
3
  import { useFocusTrap } from "../../composables/use-focus-trap";
4
4
  import { useModelValue } from "../../composables/use-model-value";
5
- import { getCssUnitValue } from "../../utils/format";
5
+ import { getCssUnitValue, isTruthyProp } from "../../utils/format";
6
6
  import POverlay from "../overlay/index.vue";
7
- import PScrollable from "../scrollable/index.vue";
8
7
  defineOptions({
9
8
  name: "PModal",
10
9
  model: {
@@ -21,17 +20,18 @@ const props = defineProps({
21
20
  appendToBody: { type: Boolean, required: false, default: true },
22
21
  headerStylize: { type: Boolean, required: false, default: false },
23
22
  footerStylize: { type: Boolean, required: false, default: true },
24
- modalClass: { type: [String, Array, Object], required: false },
23
+ wrapperClass: { type: [String, Array, Object], required: false },
24
+ contentClass: { type: [String, Array, Object], required: false },
25
25
  closeOnPressEscape: { type: Boolean, required: false, default: false },
26
26
  closeOnClickOverlay: { type: Boolean, required: false, default: false }
27
27
  });
28
- const emits = defineEmits(["open", "close", "click-outside", "update:modelValue"]);
28
+ const emits = defineEmits(["show", "hide", "visible-change", "outside-click", "update:modelValue"]);
29
29
  const modalRef = shallowRef();
30
30
  const isVisible = useModelValue(props, emits);
31
31
  useFocusTrap(modalRef);
32
32
  function onOverlayClick(ev) {
33
- emits("click-outside", ev);
34
- if (!props.closeOnClickOverlay || props.loading) {
33
+ emits("outside-click", ev);
34
+ if (!isTruthyProp(props.closeOnClickOverlay) || isTruthyProp(props.loading)) {
35
35
  return;
36
36
  }
37
37
  isVisible.value = false;
@@ -43,11 +43,12 @@ function onUpdateModelValue(visible) {
43
43
  isVisible.value = visible;
44
44
  }
45
45
  watch(() => isVisible.value, (visible) => {
46
+ emits("visible-change", visible);
46
47
  if (visible) {
47
- emits("open");
48
+ emits("show");
48
49
  return;
49
50
  }
50
- emits("close");
51
+ emits("hide");
51
52
  });
52
53
  </script>
53
54
 
@@ -66,35 +67,36 @@ watch(() => isVisible.value, (visible) => {
66
67
  role="dialog"
67
68
  tabindex="-1"
68
69
  aria-modal="true"
69
- class="pxd-modal left-0 bottom-0 translate-z-0 sm:top-1/2 sm:left-1/2 sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:[--o:0] sm:[--t:scale(0.98)] sm:w-[calc(var(--w,540)*1px)] fixed z-10 flex h-max w-full max-w-full flex-col overflow-hidden rounded-t-lg bg-background-100 shadow-border-modal outline-none motion-safe:transition-all dark:bg-background-200"
70
- :class="modalClass"
70
+ class="pxd-modal left-0 bottom-0 translate-z-0 sm:top-1/2 sm:left-1/2 sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:[--o:0] sm:[--t:scale(0.98)] sm:w-[var(--w,540px)] fixed z-10 flex h-max max-h-[min(800px,80vh)] w-full max-w-full flex-col overflow-hidden rounded-t-lg bg-background-100 shadow-border-modal outline-none motion-safe:transition-all dark:bg-background-200"
71
+ :class="wrapperClass"
71
72
  :style="{ '--w': getCssUnitValue(width) }"
72
73
  >
73
74
  <header
74
75
  class="pxd-modal--header px-6 py-4 relative shrink-0 empty:py-3"
75
76
  :class="{ 'sm:pt-4 border-b bg-background-200 dark:bg-background-100': headerStylize }"
76
77
  >
77
- <h3 v-if="$slots.title || title" class="text-lg sm:text-xl font-semibold tracking-tight m-0">
78
- <slot name="title">
79
- {{ title }}
80
- </slot>
81
- </h3>
78
+ <slot name="header">
79
+ <h3 v-if="$slots.title || title" class="text-lg sm:text-xl font-semibold tracking-tight m-0">
80
+ <slot name="title">
81
+ {{ title }}
82
+ </slot>
83
+ </h3>
82
84
 
83
- <div v-if="$slots.subtitle || subtitle" class="mt-2 text-sm text-muted-foreground">
84
- <slot name="subtitle">
85
- {{ subtitle }}
86
- </slot>
87
- </div>
85
+ <div v-if="$slots.subtitle || subtitle" class="mt-2 text-sm text-muted-foreground">
86
+ <slot name="subtitle">
87
+ {{ subtitle }}
88
+ </slot>
89
+ </div>
90
+ </slot>
88
91
  </header>
89
92
 
90
- <PScrollable
93
+ <div
91
94
  v-if="$slots.default"
92
- :data-header="headerStylize"
93
- class="pxd-modal--content group flex-1"
94
- content-class="group-data-[header=true]:pt-5 px-6 pb-5"
95
+ class="pxd-modal--content group px-6 pb-5 h-full flex-1 overflow-auto"
96
+ :class="[{ 'pt-5': headerStylize }, contentClass]"
95
97
  >
96
98
  <slot />
97
- </PScrollable>
99
+ </div>
98
100
 
99
101
  <footer
100
102
  v-if="$slots.footer"
@@ -111,19 +113,13 @@ watch(() => isVisible.value, (visible) => {
111
113
  <style>
112
114
  .pxd-transition--modal-enter-active,
113
115
  .pxd-transition--modal-leave-active {
114
- transition-timing-function: var(--default-transition-timing-function);
115
- transition:
116
- transform var(--default-transition-duration),
117
- opacity var(--default-transition-duration);
116
+ transition: var(--default-transition-duration) var(--default-transition-timing-function);
117
+ transition-property: transform, opacity;
118
118
  }
119
119
 
120
- .pxd-modal.pxd-transition--modal-enter-from,
121
- .pxd-modal.pxd-transition--modal-leave-to {
120
+ .pxd-transition--modal-enter-from,
121
+ .pxd-transition--modal-leave-to {
122
122
  opacity: var(--o, 1);
123
- transform: var(--t, translate(0, 100%));
124
- }
125
-
126
- .pxd-modal {
127
- max-height: min(800px, 80vh);
123
+ transform: var(--t, translate3d(0, 100%, 0));
128
124
  }
129
125
  </style>
@@ -85,7 +85,7 @@ const computedClass = computed(() => {
85
85
  <Component :is="computedLabel" class="font-medium shrink-0" />
86
86
  </slot>
87
87
 
88
- <span class="flex-1">
88
+ <span class="flex-1 shrink-0">
89
89
  <slot />
90
90
  </span>
91
91
  </div>
@@ -1,11 +1,26 @@
1
1
  <script setup>
2
- import { computed, nextTick, onBeforeUnmount, shallowRef, watch } from "vue";
3
- import { getScrollContainer, getScrollElByContainer, hasScrollbar, isScrollable } from "../../utils/dom";
4
- import { optimizedOff, optimizedOn } from "../../utils/events";
2
+ import {
3
+ computed,
4
+ nextTick,
5
+ onBeforeUnmount,
6
+ ref,
7
+ shallowRef,
8
+ watch
9
+ } from "vue";
10
+ import {
11
+ getScrollContainer,
12
+ getScrollElByContainer,
13
+ hasScrollbar,
14
+ isScrollable
15
+ } from "../../utils/dom";
16
+ import { optimizedOff, optimizedOn } from "../../utils/event";
17
+ import { isTruthyProp } from "../../utils/format";
5
18
  import { isServer } from "../../utils/is";
19
+ import { unrefElement } from "../../utils/ref";
6
20
  import PTeleport from "../teleport/index.vue";
7
21
  defineOptions({
8
22
  name: "POverlay",
23
+ inheritAttrs: false,
9
24
  model: {
10
25
  prop: "modelValue",
11
26
  event: "update:modelValue"
@@ -16,25 +31,27 @@ const props = defineProps({
16
31
  zIndex: { type: Number, required: false },
17
32
  modelValue: { type: Boolean, required: false, default: false },
18
33
  appendToBody: { type: Boolean, required: false, default: true },
19
- overlayClass: { type: [String, Array, Object], required: false },
20
34
  closeOnPressEscape: { type: Boolean, required: false, default: true },
21
- closeOnClickOverlay: { type: Boolean, required: false }
35
+ closeOnClickOverlay: { type: Boolean, required: false },
36
+ shownElement: { type: null, required: false }
22
37
  });
23
38
  const emits = defineEmits(["click", "update:modelValue"]);
24
39
  let scrollContainer;
40
+ const clipPath = ref("");
25
41
  const overlayRef = shallowRef();
26
42
  const computedStyle = computed(() => ({
27
- "--z": props.zIndex
43
+ "--z": props.zIndex,
44
+ "clip-path": clipPath.value
28
45
  }));
29
46
  function onOverlayClick(ev) {
30
47
  emits("click", ev);
31
- if (!props.closeOnClickOverlay) {
48
+ if (!isTruthyProp(props.closeOnClickOverlay)) {
32
49
  return;
33
50
  }
34
51
  emits("update:modelValue", false);
35
52
  }
36
53
  function onOverlayKeydown(ev) {
37
- if (!props.closeOnPressEscape || !props.modelValue) {
54
+ if (!isTruthyProp(props.closeOnPressEscape) || !props.modelValue) {
38
55
  return;
39
56
  }
40
57
  if (ev.ctrlKey || ev.metaKey || ev.altKey || ev.shiftKey) {
@@ -62,27 +79,63 @@ function removeScrollDisabled() {
62
79
  if (!scrollContainer) {
63
80
  return;
64
81
  }
65
- scrollContainer.classList.remove("scroll-disabled-x", "scroll-disabled-y", "scrollbar-stable");
82
+ scrollContainer.classList.remove(
83
+ "scroll-disabled-x",
84
+ "scroll-disabled-y",
85
+ "scrollbar-stable"
86
+ );
66
87
  }
67
- watch(() => props.modelValue, (visible) => {
68
- if (isServer) {
88
+ function tryGetShownElementIfNeed() {
89
+ const { shownElement } = props;
90
+ if (!shownElement) {
69
91
  return;
70
92
  }
71
- if (!visible) {
72
- removeScrollDisabled();
73
- optimizedOff(document, "keydown", onOverlayKeydown);
93
+ const el = typeof shownElement === "string" ? document.querySelector(shownElement) : unrefElement(shownElement);
94
+ if (!el) {
74
95
  return;
75
96
  }
76
- nextTick(() => {
77
- if (!scrollContainer) {
78
- scrollContainer = getScrollElByContainer(
79
- getScrollContainer(overlayRef.value, true)
80
- );
97
+ const rect = el.getBoundingClientRect();
98
+ clipPath.value = `polygon(
99
+ 0% 0%,
100
+ 0% 100%,
101
+ ${rect.left}px 100%,
102
+ ${rect.left}px ${rect.top}px,
103
+ ${rect.right}px ${rect.top}px,
104
+ ${rect.right}px ${rect.bottom}px,
105
+ ${rect.left}px ${rect.bottom}px,
106
+ ${rect.left}px 100%,
107
+ 100% 100%,
108
+ 100% 0%
109
+ )`;
110
+ }
111
+ watch(
112
+ () => props.shownElement,
113
+ tryGetShownElementIfNeed
114
+ );
115
+ watch(
116
+ () => props.modelValue,
117
+ (visible) => {
118
+ if (isServer) {
119
+ return;
120
+ }
121
+ if (!visible) {
122
+ removeScrollDisabled();
123
+ optimizedOff(document, "keydown", onOverlayKeydown);
124
+ return;
81
125
  }
82
- addScrollDisabled();
83
- optimizedOn(document, "keydown", onOverlayKeydown);
84
- });
85
- }, { immediate: true });
126
+ nextTick(() => {
127
+ if (!scrollContainer) {
128
+ scrollContainer = getScrollElByContainer(
129
+ getScrollContainer(overlayRef.value, true)
130
+ );
131
+ }
132
+ addScrollDisabled();
133
+ tryGetShownElementIfNeed();
134
+ optimizedOn(document, "keydown", onOverlayKeydown);
135
+ });
136
+ },
137
+ { immediate: true }
138
+ );
86
139
  onBeforeUnmount(() => {
87
140
  optimizedOff(document, "keydown", onOverlayKeydown);
88
141
  removeScrollDisabled();
@@ -98,8 +151,8 @@ onBeforeUnmount(() => {
98
151
  ref="overlayRef"
99
152
  :data-blur="blur"
100
153
  class="pxd-overlay inset-0 bg-black/40 sm:bg-background-100/80 fixed z-(--z,10) data-[blur=true]:backdrop-blur-xs motion-safe:transition-colors"
101
- :class="overlayClass"
102
154
  :style="computedStyle"
155
+ v-bind="$attrs"
103
156
  @click="onOverlayClick"
104
157
  />
105
158
  </Transition>
@@ -14,7 +14,7 @@ const config = useConfigProvider();
14
14
  <template>
15
15
  <nav aria-label="pagination" class="pxd-pagination relative flex w-full flex-wrap items-start justify-between">
16
16
  <RouterLink v-if="prev" :to="prev.href" class="pxd-pagination--prev min-h-13 group py-1 pr-2 pl-6 rounded-md !no-underline self-focus-ring outline-none">
17
- <span secondary class="text-[13px] text-foreground-secondary group-hover:text-foreground motion-safe:transition-colors">
17
+ <span secondary class="text-13px text-foreground-secondary group-hover:text-foreground motion-safe:transition-colors">
18
18
  {{ config.locale.compare.prev }}
19
19
  </span>
20
20
 
@@ -29,7 +29,7 @@ const config = useConfigProvider();
29
29
  </div>
30
30
 
31
31
  <RouterLink v-if="next" :to="next.href" class="pxd-pagination--next min-h-13 group py-1 pl-2 pr-6 rounded-md !no-underline self-focus-ring outline-none">
32
- <span secondary class="text-[13px] text-foreground-secondary group-hover:text-foreground motion-safe:transition-colors">
32
+ <span secondary class="text-13px text-foreground-secondary group-hover:text-foreground motion-safe:transition-colors">
33
33
  {{ config.locale.compare.next }}
34
34
  </span>
35
35
 
@@ -9,7 +9,8 @@ const props = defineProps({
9
9
  color: { type: String, required: false },
10
10
  width: { type: String, required: false },
11
11
  height: { type: String, required: false },
12
- border: { type: Boolean, required: false }
12
+ border: { type: Boolean, required: false },
13
+ invert: { type: Boolean, required: false }
13
14
  });
14
15
  const computedStyle = computed(() => {
15
16
  return {
@@ -22,21 +23,27 @@ const computedStyle = computed(() => {
22
23
 
23
24
  <template>
24
25
  <div
25
- class="pxd-placeholder relative max-w-full overflow-hidden rounded-lg border-dashed"
26
- :class="{ border }"
26
+ class="pxd-placeholder relative max-w-full overflow-hidden rounded-lg"
27
+ :class="{ 'border': border, 'is-invert': invert }"
27
28
  :style="computedStyle"
28
29
  v-bind="$attrs"
29
30
  />
30
31
  </template>
31
32
 
32
- <style scoped>
33
+ <style lang="postcss">
33
34
  .pxd-placeholder {
35
+ --deg: -45deg;
36
+
37
+ &.is-invert {
38
+ --deg: 45deg;
39
+ }
40
+
34
41
  width: 100%;
35
42
  height: 36px;
36
- color: var(--color-gray-300);
43
+ color: var(--color-gray-400);
37
44
  background-image:
38
45
  repeating-linear-gradient(
39
- -45deg,
46
+ var(--deg),
40
47
  currentColor 0,
41
48
  currentColor 1px,
42
49
  transparent 1px,