pxd 0.0.55 → 0.0.60

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 (275) hide show
  1. package/README.md +18 -4
  2. package/dist/components/_internal/fragment-container.vue +3 -2
  3. package/dist/components/active-graph/index.d.vue.ts +2 -3
  4. package/dist/components/active-graph/index.vue +23 -16
  5. package/dist/components/active-graph/types.d.ts +4 -3
  6. package/dist/components/avatar/index.vue +19 -10
  7. package/dist/components/avatar/types.d.ts +0 -12
  8. package/dist/components/avatar-group/index.d.vue.ts +2 -2
  9. package/dist/components/avatar-group/index.vue +4 -3
  10. package/dist/components/avatar-group/types.d.ts +11 -0
  11. package/dist/components/badge/index.d.vue.ts +1 -1
  12. package/dist/components/badge/index.vue +47 -3
  13. package/dist/components/badge/types.d.ts +24 -1
  14. package/dist/components/book/index.vue +3 -2
  15. package/dist/components/browser/index.vue +6 -2
  16. package/dist/components/button/index.d.vue.ts +1 -1
  17. package/dist/components/button/index.vue +60 -12
  18. package/dist/components/carousel/index.d.vue.ts +24 -2
  19. package/dist/components/carousel/index.vue +341 -28
  20. package/dist/components/carousel/types.d.ts +2 -2
  21. package/dist/components/carousel-item/index.d.vue.ts +13 -0
  22. package/dist/components/carousel-item/index.vue +49 -0
  23. package/dist/components/checkbox/index.d.vue.ts +1 -5
  24. package/dist/components/checkbox/index.vue +66 -31
  25. package/dist/components/checkbox/types.d.ts +2 -14
  26. package/dist/components/checkbox-group/index.d.vue.ts +2 -7
  27. package/dist/components/checkbox-group/index.vue +11 -29
  28. package/dist/components/checkbox-group/types.d.ts +12 -0
  29. package/dist/components/chip/index.d.vue.ts +1 -1
  30. package/dist/components/chip/index.vue +31 -2
  31. package/dist/components/choicebox/index.d.vue.ts +11 -5
  32. package/dist/components/choicebox/index.vue +36 -54
  33. package/dist/components/choicebox/types.d.ts +11 -18
  34. package/dist/components/choicebox-item/index.d.vue.ts +16 -0
  35. package/dist/components/choicebox-item/index.vue +67 -0
  36. package/dist/components/choicebox-item/types.d.ts +12 -0
  37. package/dist/components/collapse/index.d.vue.ts +5 -4
  38. package/dist/components/collapse/index.vue +47 -30
  39. package/dist/components/collapse/types.d.ts +2 -5
  40. package/dist/components/collapse-group/index.d.vue.ts +2 -4
  41. package/dist/components/collapse-group/index.vue +8 -20
  42. package/dist/components/collapse-group/types.d.ts +6 -0
  43. package/dist/components/command-menu/index.vue +6 -7
  44. package/dist/components/command-menu/types.d.ts +0 -5
  45. package/dist/components/command-menu-group/index.d.vue.ts +1 -1
  46. package/dist/components/command-menu-group/index.vue +3 -2
  47. package/dist/components/command-menu-group/types.d.ts +5 -0
  48. package/dist/components/config-provider/index.d.vue.ts +2 -2
  49. package/dist/components/config-provider/index.vue +6 -4
  50. package/dist/components/countdown/index.vue +3 -2
  51. package/dist/components/countdown/types.d.ts +2 -2
  52. package/dist/components/dash-line/index.vue +3 -1
  53. package/dist/components/description/index.d.vue.ts +1 -1
  54. package/dist/components/description/index.vue +8 -7
  55. package/dist/components/description/types.d.ts +1 -1
  56. package/dist/components/drawer/index.d.vue.ts +3 -2
  57. package/dist/components/drawer/index.vue +20 -15
  58. package/dist/components/drawer/types.d.ts +3 -3
  59. package/dist/components/ellipsis-text/index.d.vue.ts +14 -0
  60. package/dist/components/ellipsis-text/index.vue +242 -0
  61. package/dist/components/ellipsis-text/types.d.ts +14 -0
  62. package/dist/components/empty-state/index.vue +6 -2
  63. package/dist/components/error/index.d.vue.ts +1 -3
  64. package/dist/components/error/index.vue +21 -6
  65. package/dist/components/error/types.d.ts +7 -1
  66. package/dist/components/fader/index.vue +30 -11
  67. package/dist/components/fader/types.d.ts +2 -2
  68. package/dist/components/gauge/index.vue +7 -2
  69. package/dist/components/grid/index.vue +9 -4
  70. package/dist/components/grid/types.d.ts +0 -5
  71. package/dist/components/grid-item/index.d.vue.ts +1 -1
  72. package/dist/components/grid-item/index.vue +16 -8
  73. package/dist/components/grid-item/types.d.ts +6 -0
  74. package/dist/components/hold-button/index.d.vue.ts +2 -2
  75. package/dist/components/hold-button/index.vue +7 -4
  76. package/dist/components/index.d.ts +7 -3
  77. package/dist/components/index.js +7 -3
  78. package/dist/components/input/index.d.vue.ts +8 -8
  79. package/dist/components/input/index.vue +54 -21
  80. package/dist/components/input/types.d.ts +7 -10
  81. package/dist/components/intersection-observer/index.d.vue.ts +0 -1
  82. package/dist/components/intersection-observer/index.vue +12 -3
  83. package/dist/components/kbd/index.vue +1 -1
  84. package/dist/components/link-button/index.d.vue.ts +1 -1
  85. package/dist/components/link-button/index.vue +5 -4
  86. package/dist/components/link-button/types.d.ts +1 -1
  87. package/dist/components/list/index.d.vue.ts +8 -5
  88. package/dist/components/list/index.vue +50 -54
  89. package/dist/components/list/types.d.ts +3 -20
  90. package/dist/components/list-item/index.d.vue.ts +4 -3
  91. package/dist/components/list-item/index.vue +44 -18
  92. package/dist/components/list-item/types.d.ts +15 -0
  93. package/dist/components/loading-bar/index.vue +33 -2
  94. package/dist/components/loading-bar/types.d.ts +1 -1
  95. package/dist/components/loading-dots/index.vue +3 -2
  96. package/dist/components/menu/index.d.vue.ts +5 -2
  97. package/dist/components/menu/index.vue +4 -1
  98. package/dist/components/menu/types.d.ts +5 -0
  99. package/dist/components/message/index.d.vue.ts +11 -8
  100. package/dist/components/message/index.vue +4 -12
  101. package/dist/components/message/types.d.ts +1 -12
  102. package/dist/components/message-item/index.d.vue.ts +1 -3
  103. package/dist/components/message-item/index.vue +13 -7
  104. package/dist/components/message-item/types.d.ts +11 -0
  105. package/dist/components/modal/index.d.vue.ts +3 -2
  106. package/dist/components/modal/index.vue +17 -13
  107. package/dist/components/modal/types.d.ts +3 -3
  108. package/dist/components/noise-background/index.vue +4 -3
  109. package/dist/components/note/index.d.vue.ts +1 -2
  110. package/dist/components/note/index.vue +81 -29
  111. package/dist/components/note/types.d.ts +10 -2
  112. package/dist/components/number-input/index.d.vue.ts +5 -4
  113. package/dist/components/number-input/index.vue +36 -6
  114. package/dist/components/number-input/types.d.ts +2 -0
  115. package/dist/components/overlay/index.vue +1 -1
  116. package/dist/components/overlay/types.d.ts +1 -1
  117. package/dist/components/pagination/index.vue +5 -3
  118. package/dist/components/pin-input/index.d.vue.ts +7 -2
  119. package/dist/components/pin-input/index.vue +60 -23
  120. package/dist/components/pin-input/types.d.ts +0 -4
  121. package/dist/components/placeholder/index.vue +2 -1
  122. package/dist/components/popover/index.d.vue.ts +1 -1
  123. package/dist/components/popover/index.vue +116 -78
  124. package/dist/components/popover/types.d.ts +2 -0
  125. package/dist/components/progress/index.d.vue.ts +1 -1
  126. package/dist/components/progress/index.vue +15 -2
  127. package/dist/components/project-banner/index.d.vue.ts +18 -0
  128. package/dist/components/project-banner/index.vue +59 -0
  129. package/dist/components/project-banner/types.d.ts +8 -0
  130. package/dist/components/radio/index.vue +62 -20
  131. package/dist/components/radio/types.d.ts +1 -14
  132. package/dist/components/radio-group/index.d.vue.ts +2 -4
  133. package/dist/components/radio-group/index.vue +11 -16
  134. package/dist/components/radio-group/types.d.ts +12 -0
  135. package/dist/components/resizable/types.d.ts +5 -10
  136. package/dist/components/resizable-handle/index.vue +1 -1
  137. package/dist/components/resizable-panel/index.d.vue.ts +1 -1
  138. package/dist/components/resizable-panel/index.vue +7 -2
  139. package/dist/components/resizable-panel/types.d.ts +4 -0
  140. package/dist/components/scrollable/index.d.vue.ts +29 -0
  141. package/dist/components/scrollable/index.vue +98 -83
  142. package/dist/components/scrollable/types.d.ts +19 -5
  143. package/dist/components/skeleton/index.vue +24 -1
  144. package/dist/components/slider/index.d.vue.ts +6 -6
  145. package/dist/components/slider/index.vue +86 -44
  146. package/dist/components/slider/types.d.ts +1 -1
  147. package/dist/components/snippet/index.vue +28 -2
  148. package/dist/components/spinner/index.vue +4 -2
  149. package/dist/components/stack/index.d.vue.ts +2 -2
  150. package/dist/components/stack/index.vue +35 -3
  151. package/dist/components/stack/types.d.ts +1 -1
  152. package/dist/components/status-dot/index.vue +5 -1
  153. package/dist/components/switch/index.d.vue.ts +10 -1
  154. package/dist/components/switch/index.vue +35 -44
  155. package/dist/components/switch/types.d.ts +4 -12
  156. package/dist/components/switch-item/index.d.vue.ts +14 -0
  157. package/dist/components/switch-item/index.vue +79 -0
  158. package/dist/components/switch-item/types.d.ts +9 -0
  159. package/dist/components/teleport/index.d.vue.ts +1 -1
  160. package/dist/components/teleport/index.vue +1 -1
  161. package/dist/components/teleport/types.d.ts +1 -1
  162. package/dist/components/text/index.d.vue.ts +1 -2
  163. package/dist/components/text/index.vue +36 -22
  164. package/dist/components/text/types.d.ts +1 -1
  165. package/dist/components/textarea/index.d.vue.ts +4 -4
  166. package/dist/components/textarea/index.vue +33 -4
  167. package/dist/components/textarea/types.d.ts +0 -1
  168. package/dist/components/time-picker/index.d.vue.ts +1 -2
  169. package/dist/components/time-picker/index.vue +43 -9
  170. package/dist/components/time-picker/types.d.ts +1 -2
  171. package/dist/components/toggle/index.vue +11 -10
  172. package/dist/components/toggle-button/index.d.vue.ts +22 -0
  173. package/dist/components/toggle-button/index.vue +110 -0
  174. package/dist/components/toggle-button/types.d.ts +16 -0
  175. package/dist/components/{choicebox-group → toggle-button-group}/index.d.vue.ts +5 -5
  176. package/dist/components/toggle-button-group/index.vue +68 -0
  177. package/dist/components/toggle-button-group/types.d.ts +22 -0
  178. package/dist/components/tooltip/index.d.vue.ts +2 -0
  179. package/dist/components/tooltip/index.vue +9 -3
  180. package/dist/components/tooltip/types.d.ts +2 -0
  181. package/dist/components/virtual-list/index.d.vue.ts +25 -4
  182. package/dist/components/virtual-list/index.vue +66 -10
  183. package/dist/components/virtual-list/types.d.ts +9 -4
  184. package/dist/composables/index.d.ts +2 -2
  185. package/dist/composables/index.js +2 -2
  186. package/dist/composables/use-browser-observer.d.ts +5 -5
  187. package/dist/composables/use-browser-observer.js +23 -20
  188. package/dist/composables/use-copy-click.js +4 -0
  189. package/dist/composables/use-countdown.d.ts +2 -2
  190. package/dist/composables/use-focus-trap.d.ts +6 -2
  191. package/dist/composables/use-focus-trap.js +19 -7
  192. package/dist/composables/use-forward-ref-expose.d.ts +2 -0
  193. package/dist/composables/use-forward-ref-expose.js +41 -0
  194. package/dist/composables/use-message.d.ts +3 -6
  195. package/dist/composables/use-model-value.d.ts +9 -8
  196. package/dist/composables/use-popover-responsive.d.ts +2 -2
  197. package/dist/composables/use-popover-responsive.js +3 -3
  198. package/dist/composables/use-repeat-action.js +2 -2
  199. package/dist/composables/use-virtual-list.d.ts +21 -12
  200. package/dist/composables/use-virtual-list.js +90 -158
  201. package/dist/composables/use-window-size.d.ts +4 -0
  202. package/dist/composables/use-window-size.js +27 -0
  203. package/dist/contexts/avatar.d.ts +5 -2
  204. package/dist/contexts/carousel.d.ts +4 -4
  205. package/dist/contexts/carousel.js +1 -1
  206. package/dist/contexts/checkbox.d.ts +7 -2
  207. package/dist/contexts/choicebox.d.ts +8 -4
  208. package/dist/contexts/choicebox.js +1 -4
  209. package/dist/contexts/collapse.d.ts +5 -6
  210. package/dist/contexts/collapse.js +1 -1
  211. package/dist/contexts/config-provider.d.ts +5 -0
  212. package/dist/{composables/use-config-provider-context.js → contexts/config-provider.js} +8 -5
  213. package/dist/contexts/radio.d.ts +8 -2
  214. package/dist/contexts/switch.d.ts +8 -4
  215. package/dist/contexts/switch.js +1 -2
  216. package/dist/contexts/toggle-button.d.ts +7 -0
  217. package/dist/contexts/toggle-button.js +2 -0
  218. package/dist/styles/source.css +14 -2
  219. package/dist/styles/styles.css +2 -2
  220. package/dist/styles/tw.css +14 -2
  221. package/dist/types/shared/props.d.ts +1 -3
  222. package/dist/types/shared/utils.d.ts +0 -3
  223. package/dist/utils/context.d.ts +1 -0
  224. package/dist/utils/get.d.ts +1 -0
  225. package/dist/utils/get.js +14 -0
  226. package/dist/utils/responsive.js +2 -1
  227. package/dist/utils/throttle.js +9 -7
  228. package/dist/utils/uid.d.ts +1 -1
  229. package/dist/utils/uid.js +2 -2
  230. package/package.json +23 -21
  231. package/volar.d.ts +7 -3
  232. package/dist/components/badge/cn.d.ts +0 -90
  233. package/dist/components/badge/cn.js +0 -44
  234. package/dist/components/button/cn.d.ts +0 -121
  235. package/dist/components/button/cn.js +0 -55
  236. package/dist/components/carousel-group/index.d.vue.ts +0 -35
  237. package/dist/components/carousel-group/index.vue +0 -368
  238. package/dist/components/checkbox/cn.d.ts +0 -67
  239. package/dist/components/checkbox/cn.js +0 -31
  240. package/dist/components/chip/cn.d.ts +0 -49
  241. package/dist/components/chip/cn.js +0 -26
  242. package/dist/components/choicebox-group/index.vue +0 -65
  243. package/dist/components/error/cn.d.ts +0 -22
  244. package/dist/components/error/cn.js +0 -15
  245. package/dist/components/input/cn.d.ts +0 -73
  246. package/dist/components/input/cn.js +0 -36
  247. package/dist/components/list-item/cn.d.ts +0 -22
  248. package/dist/components/list-item/cn.js +0 -15
  249. package/dist/components/loading-bar/cn.d.ts +0 -70
  250. package/dist/components/loading-bar/cn.js +0 -32
  251. package/dist/components/note/cn.d.ts +0 -121
  252. package/dist/components/note/cn.js +0 -66
  253. package/dist/components/pin-input/cn.d.ts +0 -46
  254. package/dist/components/pin-input/cn.js +0 -25
  255. package/dist/components/progress/cn.d.ts +0 -19
  256. package/dist/components/progress/cn.js +0 -14
  257. package/dist/components/radio/cn.d.ts +0 -46
  258. package/dist/components/radio/cn.js +0 -42
  259. package/dist/components/skeleton/cn.d.ts +0 -43
  260. package/dist/components/skeleton/cn.js +0 -24
  261. package/dist/components/snippet/cn.d.ts +0 -52
  262. package/dist/components/snippet/cn.js +0 -27
  263. package/dist/components/stack/cn.d.ts +0 -70
  264. package/dist/components/stack/cn.js +0 -33
  265. package/dist/components/switch/cn.d.ts +0 -16
  266. package/dist/components/switch/cn.js +0 -13
  267. package/dist/components/switch-group/index.d.vue.ts +0 -23
  268. package/dist/components/switch-group/index.vue +0 -54
  269. package/dist/components/text/cn.d.ts +0 -67
  270. package/dist/components/text/cn.js +0 -34
  271. package/dist/components/textarea/cn.d.ts +0 -58
  272. package/dist/components/textarea/cn.js +0 -30
  273. package/dist/composables/use-config-provider-context.d.ts +0 -3
  274. package/dist/composables/use-unique-id-context.d.ts +0 -2
  275. package/dist/composables/use-unique-id-context.js +0 -11
@@ -1,14 +1,13 @@
1
1
  <script setup>
2
- import { arrow, computePosition, flip, offset, shift } from "@floating-ui/dom";
3
- import { computed, shallowRef, watch } from "vue";
4
- import { useIntersectionObserver } from "../../composables/use-browser-observer";
2
+ import { arrow, autoUpdate, computePosition, flip, shift, hide } from "@floating-ui/dom";
3
+ import { computed, onBeforeUnmount, shallowRef, watch } from "vue";
5
4
  import { useDelayDestroy } from "../../composables/use-delay-destroy";
6
5
  import { useLockScroll } from "../../composables/use-lock-scroll";
7
6
  import { useOutsideClick } from "../../composables/use-outside-click";
8
7
  import { debounce } from "../../utils/debounce";
9
8
  import { cachedOff, cachedOn, sleep } from "../../utils/event";
10
9
  import { getCssUnitValue, toArray } from "../../utils/format";
11
- import { useConfigProvider } from "../../composables/use-config-provider-context";
10
+ import { useConfigProvider } from "../../contexts/config-provider";
12
11
  import PTeleport from "../teleport/index.vue";
13
12
  defineOptions({
14
13
  name: "PPopover",
@@ -30,7 +29,7 @@ const props = defineProps({
30
29
  autoPosition: { type: Boolean, required: false, default: true },
31
30
  wrapperClass: { type: [String, Array, Object], required: false },
32
31
  contentClass: { type: [String, Array, Object], required: false },
33
- contentStyle: { type: null, required: false },
32
+ contentStyle: { type: [Object, String], required: false },
34
33
  unsetPosition: { type: Boolean, required: false, default: false },
35
34
  transitionType: { type: String, required: false, default: "fade-scale" },
36
35
  toggleOnTrigger: { type: Boolean, required: false, default: true },
@@ -39,8 +38,10 @@ const props = defineProps({
39
38
  lockScrollOnVisible: { type: Boolean, required: false }
40
39
  });
41
40
  const emits = defineEmits(["show", "hide", "escape", "outside-click", "trigger-click", "visible-change"]);
41
+ let isLockedScroll = false;
42
42
  let showPopoverTimer;
43
43
  let hidePopoverTimer;
44
+ let cleanupAutoUpdate = null;
44
45
  const allowedMethods = ["click", "manual", "contextmenu"];
45
46
  const arrayRef = shallowRef(null);
46
47
  const triggerRef = shallowRef(null);
@@ -49,6 +50,7 @@ const localPosition = shallowRef(props.position);
49
50
  const triggerMethods = computed(() => toArray(props.trigger));
50
51
  const wrapperStyle = computed(() => ({
51
52
  "z-index": props.zIndex,
53
+ "--popover-offset": props.offset,
52
54
  "--popover-arrow-bg": props.arrowColor,
53
55
  "--popover-max-width": getCssUnitValue(props.maxWidth)
54
56
  }));
@@ -68,11 +70,13 @@ const {
68
70
  emits("visible-change", v);
69
71
  if (v) {
70
72
  if (props.lockScrollOnVisible) {
73
+ isLockedScroll = true;
71
74
  lockScroll();
72
75
  }
73
76
  emits("show");
74
77
  } else {
75
- if (props.lockScrollOnVisible) {
78
+ if (isLockedScroll) {
79
+ isLockedScroll = false;
76
80
  unlockScroll();
77
81
  }
78
82
  emits("hide");
@@ -99,11 +103,44 @@ useOutsideClick(wrapperRef, {
99
103
  { edges: ["leading"] }
100
104
  )
101
105
  });
102
- useIntersectionObserver(triggerRef, ([entry]) => {
103
- if (props.closeOnInvisible && isVisible.value && entry.intersectionRatio === 0) {
106
+ function disposeAutoUpdate() {
107
+ if (cleanupAutoUpdate) {
108
+ cleanupAutoUpdate();
109
+ cleanupAutoUpdate = null;
110
+ }
111
+ }
112
+ async function updatePosition() {
113
+ const { x, y, placement, middlewareData } = await computePosition(
114
+ triggerRef.value,
115
+ wrapperRef.value,
116
+ {
117
+ 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
+ ]
125
+ }
126
+ );
127
+ localPosition.value = placement;
128
+ if (middlewareData.hide?.referenceHidden || middlewareData.hide?.escaped) {
104
129
  handlePopoverHide(true);
130
+ return;
105
131
  }
106
- });
132
+ Object.assign(wrapperRef.value.style, {
133
+ left: `${x}px`,
134
+ top: `${y}px`
135
+ });
136
+ if (middlewareData.arrow) {
137
+ const { x: arrowX, y: arrowY } = middlewareData.arrow;
138
+ Object.assign(arrayRef.value.style, {
139
+ left: arrowX != null ? `${Math.max(arrowX, 5)}px` : "",
140
+ top: arrowY != null ? `${Math.max(arrowY, 5)}px` : ""
141
+ });
142
+ }
143
+ }
107
144
  async function handlePopoverShow() {
108
145
  if (showPopoverTimer || props.disabled) {
109
146
  return;
@@ -126,30 +163,11 @@ async function handlePopoverShow() {
126
163
  Object.assign(wrapperRef.value.style, { left: "0", top: "0" });
127
164
  return;
128
165
  }
129
- const { x, y, placement, middlewareData } = await computePosition(
130
- triggerRef.value,
131
- wrapperRef.value,
132
- {
133
- placement: localPosition.value,
134
- middleware: [
135
- shift(),
136
- offset(props.offset),
137
- props.autoPosition && flip(),
138
- props.showArrow && arrow({ element: arrayRef.value })
139
- ]
140
- }
141
- );
142
- localPosition.value = placement;
143
- Object.assign(wrapperRef.value.style, {
144
- left: `${x}px`,
145
- top: `${y}px`
146
- });
147
- if (middlewareData.arrow) {
148
- const { x: x2, y: y2 } = middlewareData.arrow;
149
- Object.assign(arrayRef.value.style, {
150
- left: x2 != null ? `${Math.max(x2, 5)}px` : "",
151
- top: y2 != null ? `${Math.max(y2, 5)}px` : ""
152
- });
166
+ disposeAutoUpdate();
167
+ if (props.autoPosition) {
168
+ cleanupAutoUpdate = autoUpdate(triggerRef.value, wrapperRef.value, updatePosition);
169
+ } else {
170
+ await updatePosition();
153
171
  }
154
172
  }
155
173
  async function handlePopoverHide(immediate = false) {
@@ -169,6 +187,7 @@ async function handlePopoverHide(immediate = false) {
169
187
  immediate ? 0 : props.hideDelay
170
188
  );
171
189
  });
190
+ disposeAutoUpdate();
172
191
  await hidePopover();
173
192
  if (props.closeOnPressEscape) {
174
193
  cachedOff(document, "keydown", onPopoverKeystroke);
@@ -264,6 +283,13 @@ watch(
264
283
  }
265
284
  }
266
285
  );
286
+ onBeforeUnmount(() => {
287
+ if (isLockedScroll) {
288
+ isLockedScroll = false;
289
+ unlockScroll();
290
+ }
291
+ disposeAutoUpdate();
292
+ });
267
293
  defineExpose({
268
294
  show: handlePopoverShow,
269
295
  hide: handlePopoverHide
@@ -273,7 +299,9 @@ defineExpose({
273
299
  <template>
274
300
  <div
275
301
  ref="triggerRef"
276
- class="pxd-popover inline-flex max-w-full active:select-none"
302
+ class="pxd-popover inline-flex max-w-full active:select-none data-[disabled=true]:pointer-events-none data-[visible=true]:pointer-events-auto"
303
+ :data-visible="isVisible"
304
+ :data-disabled="disabled"
277
305
  v-bind="$attrs"
278
306
  @click="onTriggerClick"
279
307
  @focusin="onTriggerFocusin"
@@ -292,19 +320,28 @@ defineExpose({
292
320
  :class="wrapperClass"
293
321
  :style="wrapperStyle"
294
322
  :data-visible="isVisible"
323
+ :data-position="localPosition"
295
324
  :data-interactive="interactive"
296
- class="pxd-popover--wrapper sm:max-w-(--popover-max-width) absolute isolate z-10 flex max-w-full outline-none data-[interactive=false]:pointer-events-none data-[visible=false]:pointer-events-none motion-reduce:data-[visible=false]:hidden"
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"
297
327
  @pointerenter="onContentPointerEnter"
298
328
  @pointerleave="onContentPointerLeave"
299
329
  >
300
330
  <div
301
- class="pxd-popover--container pointer-events-auto relative z-1 w-inherit transform-gpu default-animation-duration default-animation-timing-function"
302
- :data-position="localPosition"
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
332
  :data-transition-type="transitionType"
304
333
  :data-show-transition="configProvider.popoverShowTransition"
305
334
  >
306
- <i v-if="showArrow" ref="arrayRef" class="pxd-popover--arrow absolute z-1 border-solid" />
307
- <div class="pxd-popover--content" :class="contentClass" :style="contentStyle">
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
+ <div
341
+ class="pxd-popover--content h-full max-h-inherit overflow-auto"
342
+ :class="contentClass"
343
+ :style="contentStyle"
344
+ >
308
345
  <slot name="content" />
309
346
  </div>
310
347
  </div>
@@ -389,6 +426,7 @@ defineExpose({
389
426
  }
390
427
 
391
428
  .pxd-popover--container {
429
+ --popover-padding: calc(var(--popover-offset, 8) * 1px);
392
430
  animation-name: popover-fade-show;
393
431
  animation-fill-mode: forwards;
394
432
 
@@ -424,84 +462,84 @@ defineExpose({
424
462
  animation-name: popover-fade-slide-hide;
425
463
  }
426
464
 
427
- &[data-position='top'] {
428
- transform-origin: bottom center;
465
+ [data-position='top'] & {
466
+ transform-origin: 50% 100%;
429
467
  }
430
468
 
431
- &[data-position='top-start'] {
432
- transform-origin: bottom left;
469
+ [data-position='top-start'] & {
470
+ transform-origin: 0% 100%;
433
471
  }
434
472
 
435
- &[data-position='top-end'] {
436
- transform-origin: bottom right;
473
+ [data-position='top-end'] & {
474
+ transform-origin: 100% 100%;
437
475
  }
438
476
 
439
- &[data-position='bottom'] {
477
+ [data-position='bottom'] & {
440
478
  transform-origin: top center;
441
479
  }
442
480
 
443
- &[data-position='bottom-start'] {
481
+ [data-position='bottom-start'] & {
444
482
  transform-origin: top left;
445
483
  }
446
484
 
447
- &[data-position='bottom-end'] {
485
+ [data-position='bottom-end'] & {
448
486
  transform-origin: top right;
449
487
  }
450
488
 
451
- &[data-position='left'] {
489
+ [data-position='left'] & {
452
490
  transform-origin: right center;
453
491
  }
454
492
 
455
- &[data-position='left-start'] {
493
+ [data-position='left-start'] & {
456
494
  transform-origin: right top;
457
495
  }
458
496
 
459
- &[data-position='left-end'] {
497
+ [data-position='left-end'] & {
460
498
  transform-origin: right bottom;
461
499
  }
462
500
 
463
- &[data-position='right'] {
501
+ [data-position='right'] & {
464
502
  transform-origin: left center;
465
503
  }
466
504
 
467
- &[data-position='right-start'] {
505
+ [data-position='right-start'] & {
468
506
  transform-origin: left top;
469
507
  }
470
508
 
471
- &[data-position='right-end'] {
509
+ [data-position='right-end'] & {
472
510
  transform-origin: left bottom;
473
511
  }
474
512
 
475
- &[data-position='top'] .pxd-popover--arrow,
476
- &[data-position='top-start'] .pxd-popover--arrow,
477
- &[data-position='top-end'] .pxd-popover--arrow {
478
- bottom: -5px;
479
- border-width: 6px 6px 0;
480
- border-color: var(--popover-arrow-bg) transparent transparent;
513
+ [data-position^='top'][data-unset-position='false'] & {
514
+ padding-bottom: var(--popover-padding);
481
515
  }
482
516
 
483
- &[data-position='bottom'] .pxd-popover--arrow,
484
- &[data-position='bottom-start'] .pxd-popover--arrow,
485
- &[data-position='bottom-end'] .pxd-popover--arrow {
486
- top: -5px;
487
- border-width: 0 6px 6px;
488
- border-color: transparent transparent var(--popover-arrow-bg);
517
+ [data-position^='bottom'][data-unset-position='false'] & {
518
+ padding-top: var(--popover-padding);
489
519
  }
490
520
 
491
- &[data-position='left'] .pxd-popover--arrow,
492
- &[data-position='left-start'] .pxd-popover--arrow,
493
- &[data-position='left-end'] .pxd-popover--arrow {
494
- right: -5px;
495
- border-width: 6px 0 6px 6px;
496
- border-color: transparent transparent transparent var(--popover-arrow-bg);
521
+ [data-position^='left'][data-unset-position='false'] & {
522
+ padding-right: var(--popover-padding);
497
523
  }
498
524
 
499
- &[data-position='right'] .pxd-popover--arrow,
500
- &[data-position='right-start'] .pxd-popover--arrow,
501
- &[data-position='right-end'] .pxd-popover--arrow {
502
- left: -5px;
503
- border-width: 6px 6px 6px 0;
504
- border-color: transparent var(--popover-arrow-bg) transparent transparent;
525
+ [data-position^='right'][data-unset-position='false'] & {
526
+ padding-left: var(--popover-padding);
505
527
  }
506
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
+ }
507
545
  </style>
@@ -1,3 +1,5 @@
1
+ import type { CSSProperties } from 'vue'
2
+
1
3
  import type { ComponentClass, ComponentPosition } from '../../types/shared'
2
4
 
3
5
  export type PopoverTrigger = 'click' | 'hover' | 'focus' | 'contextmenu' | 'manual'
@@ -11,8 +11,8 @@ declare const __VLS_base: import("vue").DefineComponent<ProgressProps, {}, {}, {
11
11
  "onUpdate:modelValue"?: ((args_0: number) => any) | undefined;
12
12
  }>, {
13
13
  label: boolean | string | number;
14
- variant: import("../../types/shared").ComponentVariant | "secondary";
15
14
  max: number;
15
+ variant: import("../../types/shared").ComponentVariant | "secondary";
16
16
  min: number;
17
17
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
18
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,10 +1,10 @@
1
1
  <script setup>
2
2
  import { computed } from "vue";
3
- import { useConfigProvider } from "../../composables/use-config-provider-context";
3
+ import { useConfigProvider } from "../../contexts/config-provider";
4
4
  import { useModelValue } from "../../composables/use-model-value";
5
5
  import { isTruthyProp } from "../../utils/format";
6
6
  import { getColorByThreshold } from "../../utils/get";
7
- import { progressVariant } from "./cn";
7
+ import { tv } from "tailwind-variants";
8
8
  defineOptions({
9
9
  name: "PProgress",
10
10
  inheritAttrs: false,
@@ -23,6 +23,19 @@ const props = defineProps({
23
23
  modelValue: { type: [Number, null], required: false }
24
24
  });
25
25
  const emits = defineEmits(["change", "update:modelValue"]);
26
+ const progressVariant = tv({
27
+ base: "pxd-progress-bar flex-1 shrink-0 overflow-hidden rounded-full bg-gray-200",
28
+ variants: {
29
+ size: {
30
+ sm: "h-2",
31
+ md: "h-2.5",
32
+ lg: "h-3.5"
33
+ }
34
+ },
35
+ defaultVariants: {
36
+ size: "md"
37
+ }
38
+ });
26
39
  const configProvider = useConfigProvider();
27
40
  const VARIANTS_COLORS = {
28
41
  primary: "var(--color-primary)",
@@ -0,0 +1,18 @@
1
+ import type { ProjectBannerProps } from './types';
2
+ declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {};
3
+ type __VLS_Slots = {} & {
4
+ icon?: (props: typeof __VLS_1) => any;
5
+ } & {
6
+ default?: (props: typeof __VLS_3) => any;
7
+ } & {
8
+ action?: (props: typeof __VLS_5) => any;
9
+ };
10
+ declare const __VLS_base: import("vue").DefineComponent<ProjectBannerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ProjectBannerProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
12
+ declare const _default: typeof __VLS_export;
13
+ export default _default;
14
+ type __VLS_WithSlots<T, S> = T & {
15
+ new (): {
16
+ $slots: S;
17
+ };
18
+ };
@@ -0,0 +1,59 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { tv } from "tailwind-variants";
4
+ defineOptions({
5
+ name: "PProjectBanner",
6
+ inheritAttrs: false
7
+ });
8
+ const props = defineProps({
9
+ label: { type: [String, Number, Array, null], required: false },
10
+ variant: { type: String, required: false }
11
+ });
12
+ const projectBannerVariant = tv({
13
+ slots: {
14
+ base: "gap-x-2 py-2 leading-5 min-h-10 text-sm flex w-full -translate-y-px items-center justify-center border-y",
15
+ action: "ml-6 md:ml-0 font-medium cursor-pointer underline underline-offset-3 motion-safe:transition-colors"
16
+ },
17
+ variants: {
18
+ variant: {
19
+ warning: {
20
+ base: "border-amber-400 bg-amber-100 text-amber-900",
21
+ action: "text-amber-1000 decoration-amber-400 hover:border-amber-500 hover:text-amber-900"
22
+ },
23
+ success: {
24
+ base: "border-green-400 bg-green-100 text-green-900",
25
+ action: "text-green-1000 decoration-green-400 hover:border-green-500 hover:text-green-900"
26
+ },
27
+ error: {
28
+ base: "border-red-400 bg-red-100 text-red-900",
29
+ action: "text-red-1000 decoration-red-400 hover:border-red-500 hover:text-red-900"
30
+ },
31
+ info: {
32
+ base: "border-blue-400 bg-blue-100 text-blue-900",
33
+ action: "text-blue-1000 decoration-blue-400 hover:border-blue-500 hover:text-blue-900"
34
+ }
35
+ }
36
+ }
37
+ });
38
+ const computedClasses = computed(() => projectBannerVariant({ variant: props.variant }));
39
+ </script>
40
+
41
+ <template>
42
+ <aside :class="computedClasses.base()" v-bind="$attrs">
43
+ <div class="gap-2 px-6 md:justify-center md:flex-row md:items-center flex w-full flex-col">
44
+ <div class="gap-2 flex items-center">
45
+ <div v-if="$slots.icon" aria-hidden="true" class="shrink-0">
46
+ <slot name="icon"></slot>
47
+ </div>
48
+
49
+ <p class="my-0!">
50
+ <slot>{{ label }}</slot>
51
+ </p>
52
+ </div>
53
+
54
+ <div v-if="$slots.action" :class="computedClasses.action()">
55
+ <slot name="action"></slot>
56
+ </div>
57
+ </div>
58
+ </aside>
59
+ </template>
@@ -0,0 +1,8 @@
1
+ import type { ComponentLabel } from '../../types/shared'
2
+
3
+ export type ProjectBannerVariant = 'warning' | 'error' | 'success' | 'info'
4
+
5
+ export interface ProjectBannerProps {
6
+ label?: ComponentLabel
7
+ variant?: ProjectBannerVariant
8
+ }
@@ -1,12 +1,12 @@
1
1
  <script setup>
2
2
  import { computed } from "vue";
3
3
  import { useModelValue } from "../../composables/use-model-value";
4
- import { useUniqueId } from "../../composables/use-unique-id-context";
5
4
  import { useRadioGroupContext } from "../../contexts/radio";
6
5
  import { getUniqueId } from "../../utils/uid";
7
- import { radioVariant } from "./cn";
6
+ import { tv } from "tailwind-variants";
8
7
  defineOptions({
9
8
  name: "PRadio",
9
+ inheritAttrs: false,
10
10
  model: {
11
11
  prop: "modelValue",
12
12
  event: "update:modelValue"
@@ -15,50 +15,92 @@ defineOptions({
15
15
  const props = defineProps({
16
16
  label: { type: [String, Number, Array, null], required: false },
17
17
  value: { type: [String, Number, Boolean], required: true },
18
- required: { type: Boolean, required: false },
19
18
  disabled: { type: Boolean, required: false },
20
19
  modelValue: { type: [String, Number, Boolean], required: false }
21
20
  });
22
21
  const emits = defineEmits(["change", "update:modelValue"]);
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",
24
+ variants: {
25
+ checked: {
26
+ true: {
27
+ base: "border-primary bg-background-100 peer-checked:after:scale-100",
28
+ disabled: "border-gray-500 bg-gray-100 peer-disabled:after:bg-gray-500"
29
+ },
30
+ false: {
31
+ base: "border-gray-alpha-400 bg-background-100 group-hover/radio:bg-gray-200",
32
+ disabled: "border-gray-500 bg-gray-100"
33
+ }
34
+ },
35
+ disabled: {
36
+ true: "",
37
+ false: ""
38
+ }
39
+ },
40
+ compoundVariants: [
41
+ {
42
+ checked: true,
43
+ disabled: false,
44
+ class: "border-primary bg-background-100 peer-checked:after:scale-100"
45
+ },
46
+ {
47
+ checked: true,
48
+ disabled: true,
49
+ class: "border-gray-500 bg-gray-100 peer-disabled:after:bg-gray-500"
50
+ },
51
+ {
52
+ checked: false,
53
+ disabled: false,
54
+ class: "border-gray-alpha-400 bg-background-100 group-hover/radio:bg-gray-200"
55
+ },
56
+ { checked: false, disabled: true, class: "border-gray-500 bg-gray-100" }
57
+ ],
58
+ defaultVariants: {
59
+ checked: false,
60
+ disabled: false
61
+ }
62
+ });
23
63
  const uniqueId = getUniqueId();
24
- const modelValue = useModelValue(props, emits);
25
- const radioGroupName = useUniqueId("RadioGroupName");
26
64
  const radioGroupContext = useRadioGroupContext();
27
- const isChecked = computed(
28
- () => (radioGroupContext?.modelValue ?? modelValue.value) === props.value
65
+ const radioGroupName = radioGroupContext?.name ?? getUniqueId();
66
+ const modelValue = useModelValue(
67
+ radioGroupContext?.props ?? props,
68
+ radioGroupContext?.emits ?? emits
29
69
  );
30
- const computedDisabled = computed(() => props.disabled || radioGroupContext?.disabled);
31
- const computedRequired = computed(() => props.required || radioGroupContext?.required);
70
+ const isChecked = computed(() => modelValue.value === props.value);
71
+ const isDisabled = computed(() => props.disabled || radioGroupContext?.props.disabled);
32
72
  const computedClasses = computed(() => {
33
73
  return radioVariant({
34
74
  checked: isChecked.value,
35
- disabled: computedDisabled.value
75
+ disabled: isDisabled.value
36
76
  });
37
77
  });
38
- function onChangeValue() {
39
- emits("update:modelValue", props.value);
78
+ function onInputChange() {
79
+ if (isDisabled.value) {
80
+ return;
81
+ }
82
+ modelValue.value = props.value;
40
83
  }
41
84
  </script>
42
85
 
43
86
  <template>
44
87
  <label
45
88
  role="radio"
46
- :aria-checked="isChecked"
47
- :data-disabled="computedDisabled"
48
- class="pxd-radio group/radio gap-2 inline-flex max-w-full cursor-pointer touch-manipulation items-center data-[disabled=true]:cursor-not-allowed"
49
- :class="{ 'is-disabled text-gray-500': computedDisabled }"
89
+ :aria-selected="isChecked"
90
+ :data-disabled="isDisabled"
91
+ class="pxd-radio group/radio gap-2 inline-flex max-w-full cursor-pointer touch-manipulation items-center data-[disabled=true]:cursor-not-allowed data-[disabled=true]:text-gray-500"
50
92
  :for="uniqueId"
93
+ v-bind="$attrs"
51
94
  >
52
95
  <input
53
96
  :id="uniqueId"
54
97
  type="radio"
55
98
  :value="value"
56
- class="peer smallest"
99
+ class="peer visually-hidden"
57
100
  :checked="isChecked"
58
101
  :name="radioGroupName"
59
- :required="computedRequired"
60
- :disabled="computedDisabled"
61
- @change="onChangeValue"
102
+ :disabled="isDisabled"
103
+ @change="onInputChange"
62
104
  />
63
105
 
64
106
  <span aria-hidden="true" :class="computedClasses" />
@@ -1,9 +1,8 @@
1
- import type { ComponentLabel, ComponentOption, ComponentValue } from '../../types/shared'
1
+ import type { ComponentLabel, ComponentValue } from '../../types/shared'
2
2
 
3
3
  export interface RadioProps {
4
4
  label?: ComponentLabel
5
5
  value: ComponentValue
6
- required?: boolean
7
6
  disabled?: boolean
8
7
  modelValue?: ComponentValue
9
8
  }
@@ -12,15 +11,3 @@ export interface RadioEmits {
12
11
  change: [NonNullable<RadioProps['modelValue']>]
13
12
  'update:modelValue': [NonNullable<RadioProps['modelValue']>]
14
13
  }
15
-
16
- export interface RadioGroupProps {
17
- disabled?: boolean
18
- required?: boolean
19
- modelValue?: ComponentValue
20
- options?: ComponentOption[]
21
- }
22
-
23
- export interface RadioGroupEmits {
24
- change: [NonNullable<RadioGroupProps['modelValue']>]
25
- 'update:modelValue': [NonNullable<RadioGroupProps['modelValue']>]
26
- }
@@ -1,4 +1,4 @@
1
- import type { RadioGroupProps } from '../radio/types';
1
+ import type { RadioGroupProps } from './types';
2
2
  declare var __VLS_8: {};
3
3
  type __VLS_Slots = {} & {
4
4
  default?: (props: typeof __VLS_8) => any;
@@ -9,9 +9,7 @@ declare const __VLS_base: import("vue").DefineComponent<RadioGroupProps, {}, {},
9
9
  }, string, import("vue").PublicProps, Readonly<RadioGroupProps> & Readonly<{
10
10
  onChange?: ((args_0: NonNullable<import("../../types/shared").ComponentValue | undefined>) => any) | undefined;
11
11
  "onUpdate:modelValue"?: ((args_0: NonNullable<import("../../types/shared").ComponentValue | undefined>) => any) | undefined;
12
- }>, {
13
- options: import("../../types/shared").ComponentOption[];
14
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
13
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
16
14
  declare const _default: typeof __VLS_export;
17
15
  export default _default;