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
@@ -4,46 +4,98 @@ import InformationIcon from "@gdsicon/vue/information";
4
4
  import StopIcon from "@gdsicon/vue/stop";
5
5
  import WarningIcon from "@gdsicon/vue/warning";
6
6
  import { computed, h } from "vue";
7
- import { useConfigProvider } from "../../composables/use-config-provider-context";
7
+ import { useConfigProvider } from "../../contexts/config-provider";
8
8
  import { isTruthyProp } from "../../utils/format";
9
- import { noteVariant } from "./cn";
9
+ import { tv } from "tailwind-variants";
10
10
  defineOptions({
11
- name: "PNote"
11
+ name: "PNote",
12
+ inheritAttrs: false
12
13
  });
13
14
  const props = defineProps({
14
- variant: { type: null, required: false, default: "default" },
15
+ variant: { type: String, required: false, default: "default" },
15
16
  size: { type: String, required: false },
16
17
  fill: { type: Boolean, required: false },
17
18
  label: { type: [Boolean, String, Number, Array, null], required: false, default: true }
18
19
  });
19
- const configProvider = useConfigProvider();
20
- const VARIANTS = {
21
- success: {
22
- icon: CheckCircleIcon
23
- },
24
- error: {
25
- icon: StopIcon
26
- },
27
- warning: {
28
- icon: WarningIcon
29
- },
30
- default: {
31
- icon: InformationIcon
20
+ const noteVariant = tv({
21
+ base: "pxd-note gap-2 sm:items-center max-sm:flex-col flex max-w-full rounded-md border",
22
+ variants: {
23
+ size: {
24
+ sm: "px-2 py-1.5 text-xs",
25
+ md: "px-3 py-2 text-sm",
26
+ lg: "px-4 py-2.5 text-base"
27
+ },
28
+ variant: {
29
+ success: {
30
+ base: "border-blue-500 text-blue-900",
31
+ fill: "border-blue-100 bg-blue-200 text-blue-900"
32
+ },
33
+ error: {
34
+ base: "border-red-500 text-red-900",
35
+ fill: "border-red-100 bg-red-200 text-red-900"
36
+ },
37
+ warning: {
38
+ base: "border-amber-500 text-amber-900",
39
+ fill: "border-amber-100 bg-amber-200 text-amber-900"
40
+ },
41
+ default: {
42
+ base: "border-input text-gray-900",
43
+ fill: "border-gray-100 bg-gray-200 text-gray-900"
44
+ },
45
+ primary: {
46
+ base: "border-gray-alpha-400 text-primary",
47
+ fill: "border-gray-100 bg-primary text-gray-100"
48
+ },
49
+ violet: {
50
+ base: "text-violet-900 border-violet-400",
51
+ fill: "text-violet-900 bg-violet-200 border-violet-100"
52
+ },
53
+ cyan: {
54
+ base: "border-teal-400 text-teal-900",
55
+ fill: "border-teal-100 bg-teal-200 text-teal-900"
56
+ }
57
+ },
58
+ fill: {
59
+ true: {},
60
+ false: {}
61
+ }
32
62
  },
33
- primary: {
34
- icon: InformationIcon
35
- },
36
- violet: {
37
- icon: InformationIcon
38
- },
39
- cyan: {
40
- icon: InformationIcon
63
+ compoundVariants: [
64
+ { variant: "success", fill: true, class: "border-blue-100 bg-blue-200 text-blue-900" },
65
+ { variant: "success", fill: false, class: "border-blue-500 text-blue-900" },
66
+ { variant: "error", fill: true, class: "border-red-100 bg-red-200 text-red-900" },
67
+ { variant: "error", fill: false, class: "border-red-500 text-red-900" },
68
+ { variant: "warning", fill: true, class: "border-amber-100 bg-amber-200 text-amber-900" },
69
+ { variant: "warning", fill: false, class: "border-amber-500 text-amber-900" },
70
+ { variant: "default", fill: true, class: "border-gray-100 bg-gray-200 text-gray-900" },
71
+ { variant: "default", fill: false, class: "border-input text-gray-900" },
72
+ { variant: "primary", fill: true, class: "border-gray-100 bg-primary text-gray-100" },
73
+ { variant: "primary", fill: false, class: "border-gray-alpha-400 text-primary" },
74
+ { variant: "violet", fill: true, class: "text-violet-900 bg-violet-200 border-violet-100" },
75
+ { variant: "violet", fill: false, class: "text-violet-900 border-violet-400" },
76
+ { variant: "cyan", fill: true, class: "border-teal-100 bg-teal-200 text-teal-900" },
77
+ { variant: "cyan", fill: false, class: "border-teal-400 text-teal-900" }
78
+ ],
79
+ defaultVariants: {
80
+ size: "md",
81
+ variant: "default",
82
+ fill: false
41
83
  }
84
+ });
85
+ const configProvider = useConfigProvider();
86
+ const VARIANTS_ICON = {
87
+ success: CheckCircleIcon,
88
+ error: StopIcon,
89
+ warning: WarningIcon,
90
+ default: InformationIcon,
91
+ primary: InformationIcon,
92
+ violet: InformationIcon,
93
+ cyan: InformationIcon
42
94
  };
43
95
  const computedLabel = computed(() => {
44
96
  const { label } = props;
45
97
  if (isTruthyProp(label)) {
46
- return VARIANTS[props.variant]?.icon || InformationIcon;
98
+ return VARIANTS_ICON[props.variant] || InformationIcon;
47
99
  }
48
100
  if (typeof label === "string" && label) {
49
101
  return h("span", null, label);
@@ -60,8 +112,8 @@ const computedClasses = computed(() => {
60
112
  </script>
61
113
 
62
114
  <template>
63
- <div :class="computedClasses">
64
- <div class="gap-3 flex flex-1">
115
+ <div :class="computedClasses" v-bind="$attrs">
116
+ <div class="gap-3 flex flex-1 shrink-0">
65
117
  <slot v-if="computedLabel" name="label">
66
118
  <Component :is="computedLabel" class="size-4 font-medium h-lh shrink-0" />
67
119
  </slot>
@@ -71,7 +123,7 @@ const computedClasses = computed(() => {
71
123
  </span>
72
124
  </div>
73
125
 
74
- <div v-if="$slots.action" class="pxd-note--action">
126
+ <div v-if="$slots.action" class="pxd-note--action max-sm:pl-7 shrink-0">
75
127
  <slot name="action" />
76
128
  </div>
77
129
  </div>
@@ -1,8 +1,16 @@
1
1
  import type { ComponentLabel, ComponentSize } from '../../types/shared'
2
- import type { noteVariant } from './cn'
2
+
3
+ export type NoteVariant =
4
+ | 'success'
5
+ | 'error'
6
+ | 'warning'
7
+ | 'default'
8
+ | 'primary'
9
+ | 'violet'
10
+ | 'cyan'
3
11
 
4
12
  export interface NoteProps {
5
- variant?: keyof typeof noteVariant.variants.variant
13
+ variant?: NoteVariant
6
14
  size?: ComponentSize
7
15
  fill?: boolean
8
16
  label?: boolean | ComponentLabel
@@ -11,21 +11,22 @@ type __VLS_Slots = {} & {
11
11
  };
12
12
  declare const __VLS_base: import("vue").DefineComponent<NumberInputProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
13
13
  input: (args_0: number | null | undefined) => any;
14
- blur: (args_0: FocusEvent) => any;
15
14
  change: (args_0: number | null | undefined, args_1: Event) => any;
16
- focus: (args_0: FocusEvent) => any;
17
15
  "update:modelValue": (args_0: number | null | undefined) => any;
16
+ blur: (args_0: FocusEvent) => any;
17
+ focus: (args_0: FocusEvent) => any;
18
18
  }, string, import("vue").PublicProps, Readonly<NumberInputProps> & Readonly<{
19
19
  onInput?: ((args_0: number | null | undefined) => any) | undefined;
20
- onBlur?: ((args_0: FocusEvent) => any) | undefined;
21
20
  onChange?: ((args_0: number | null | undefined, args_1: Event) => any) | undefined;
22
- onFocus?: ((args_0: FocusEvent) => any) | undefined;
23
21
  "onUpdate:modelValue"?: ((args_0: number | null | undefined) => any) | undefined;
22
+ onBlur?: ((args_0: FocusEvent) => any) | undefined;
23
+ onFocus?: ((args_0: FocusEvent) => any) | undefined;
24
24
  }>, {
25
25
  max: number;
26
26
  min: number;
27
27
  clearValue: number | null;
28
28
  step: number;
29
+ thousandsSeparator: string;
29
30
  scientific: boolean;
30
31
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
31
32
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -2,7 +2,7 @@
2
2
  import MinusIcon from "@gdsicon/vue/minus";
3
3
  import PlusIcon from "@gdsicon/vue/plus";
4
4
  import { isNil, isNumber, isUndefined } from "es-toolkit";
5
- import { computed, reactive, watch } from "vue";
5
+ import { computed, reactive, shallowRef, watch } from "vue";
6
6
  import { useRepeatAction } from "../../composables/use-repeat-action";
7
7
  import { NOOP } from "../../utils/event";
8
8
  import PInput from "../input/index.vue";
@@ -21,6 +21,8 @@ const props = defineProps({
21
21
  readonly: { type: Boolean, required: false },
22
22
  disabled: { type: Boolean, required: false },
23
23
  precision: { type: Number, required: false },
24
+ thousands: { type: Boolean, required: false },
25
+ thousandsSeparator: { type: String, required: false, default: "," },
24
26
  scientific: { type: Boolean, required: false, default: true },
25
27
  clearValue: { type: [Number, null], required: false, default: null },
26
28
  modelValue: { type: [Number, null], required: false }
@@ -35,10 +37,22 @@ const modelValue = computed({
35
37
  emits("update:modelValue", value);
36
38
  }
37
39
  });
40
+ const REGEXPS = {
41
+ "remove-leading-zeros": /^(-?)0+(?=\d)/,
42
+ "thousands-separator": /\B(?=(\d{3})+(?!\d))/g
43
+ };
44
+ const isFocused = shallowRef(false);
38
45
  const inputData = reactive({
39
46
  currentValue: props.modelValue,
40
47
  userInput: null
41
48
  });
49
+ function formatWithThousands(value) {
50
+ const str = String(value);
51
+ const dotIndex = str.indexOf(".");
52
+ const intPart = dotIndex === -1 ? str : str.slice(0, dotIndex);
53
+ const decPart = dotIndex === -1 ? "" : str.slice(dotIndex);
54
+ return intPart.replace(REGEXPS["thousands-separator"], props.thousandsSeparator) + decPart;
55
+ }
42
56
  const inputValue = computed(() => {
43
57
  if (inputData.userInput !== null) {
44
58
  return inputData.userInput;
@@ -55,6 +69,9 @@ const inputValue = computed(() => {
55
69
  currentValue = currentValue.toFixed(props.precision);
56
70
  }
57
71
  }
72
+ if (props.thousands && !isFocused.value) {
73
+ return formatWithThousands(currentValue);
74
+ }
58
75
  return currentValue;
59
76
  });
60
77
  const decreaseDisabled = computed(
@@ -138,10 +155,19 @@ function onInputKeydown(ev) {
138
155
  }
139
156
  }
140
157
  function onInputFocus(event) {
158
+ isFocused.value = true;
141
159
  emits("focus", event);
142
160
  }
143
161
  function onInputBlur(event) {
162
+ isFocused.value = false;
144
163
  inputData.userInput = null;
164
+ if (isNumber(inputData.currentValue)) {
165
+ const clamped = clampToRange(inputData.currentValue);
166
+ if (clamped !== inputData.currentValue) {
167
+ inputData.currentValue = clamped;
168
+ modelValue.value = clamped;
169
+ }
170
+ }
145
171
  if (inputData.currentValue === null) {
146
172
  ;
147
173
  event.target.value = "";
@@ -149,13 +175,17 @@ function onInputBlur(event) {
149
175
  emits("blur", event);
150
176
  }
151
177
  function onInputInput(value) {
152
- inputData.userInput = value;
153
- const newValue = value === "" ? null : Number.parseFloat(value);
178
+ const normalized = value.replace(REGEXPS["remove-leading-zeros"], "$1");
179
+ inputData.userInput = normalized;
180
+ const newValue = normalized === "" ? null : Number.parseFloat(normalized);
154
181
  inputData.currentValue = toPrecision(newValue ?? 0);
155
182
  modelValue.value = inputData.currentValue;
156
183
  }
157
184
  function onInputChange(value, event) {
158
- const newValue = toPrecision(value === "" ? null : Number.parseFloat(value));
185
+ let newValue = toPrecision(value === "" ? null : Number.parseFloat(value));
186
+ if (isNumber(newValue)) {
187
+ newValue = clampToRange(newValue);
188
+ }
159
189
  emits("change", newValue, event);
160
190
  }
161
191
  watch(
@@ -179,10 +209,10 @@ watch(
179
209
  input-type="number"
180
210
  :disabled="disabled"
181
211
  :readonly="readonly"
182
- :prefix-style="false"
183
- :suffix-style="false"
184
212
  :clear-value="clearValue"
185
213
  :model-value="inputValue"
214
+ :default-prefix-style="false"
215
+ :default-suffix-style="false"
186
216
  @blur="onInputBlur"
187
217
  @focus="onInputFocus"
188
218
  @input="onInputInput"
@@ -5,6 +5,8 @@ export interface NumberInputProps {
5
5
  readonly?: boolean
6
6
  disabled?: boolean
7
7
  precision?: number
8
+ thousands?: boolean
9
+ thousandsSeparator?: string
8
10
  scientific?: boolean
9
11
  clearValue?: number | null
10
12
  modelValue?: number | null
@@ -23,7 +23,7 @@ const props = defineProps({
23
23
  appendToBody: { type: Boolean, required: false, default: true },
24
24
  closeOnPressEscape: { type: Boolean, required: false, default: true },
25
25
  closeOnClickOverlay: { type: Boolean, required: false },
26
- shownElement: { type: null, required: false }
26
+ shownElement: { type: [String, Object], required: false }
27
27
  });
28
28
  const emits = defineEmits(["click", "escape", "update:modelValue"]);
29
29
  const { lockScroll, unlockScroll } = useLockScroll();
@@ -6,7 +6,7 @@ export interface OverlayProps {
6
6
  appendToBody?: boolean
7
7
  closeOnPressEscape?: boolean
8
8
  closeOnClickOverlay?: boolean
9
- shownElement?: string | HTMLElement
9
+ shownElement?: string | object
10
10
  }
11
11
 
12
12
  export interface OverlayEmits {
@@ -1,8 +1,9 @@
1
1
  <script setup>
2
2
  import ChevronRightIcon from "@gdsicon/vue/chevron-right";
3
- import { useConfigProvider } from "../../composables/use-config-provider-context";
3
+ import { useConfigProvider } from "../../contexts/config-provider";
4
4
  defineOptions({
5
- name: "PPagination"
5
+ name: "PPagination",
6
+ inheritAttrs: false
6
7
  });
7
8
  defineProps({
8
9
  prev: { type: Object, required: false },
@@ -15,6 +16,7 @@ const configProvider = useConfigProvider();
15
16
  <nav
16
17
  aria-label="pagination"
17
18
  class="pxd-pagination relative flex w-full flex-wrap items-start justify-between"
19
+ v-bind="$attrs"
18
20
  >
19
21
  <RouterLink
20
22
  v-if="prev"
@@ -41,7 +43,7 @@ const configProvider = useConfigProvider();
41
43
  <RouterLink
42
44
  v-if="next"
43
45
  :to="next.href"
44
- class="pxd-pagination--next min-h-13 group py-1 pl-2 pr-6 rounded-md no-underline! self-focus-ring outline-none"
46
+ class="pxd-pagination--next min-h-13 group py-1 pl-2 pr-6 rounded-md text-right no-underline! self-focus-ring outline-none"
45
47
  >
46
48
  <span
47
49
  secondary
@@ -1,5 +1,10 @@
1
1
  import type { PinInputProps } from './types';
2
- declare const __VLS_export: import("vue").DefineComponent<PinInputProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
2
+ declare function focus(): void;
3
+ declare function blur(): void;
4
+ declare const __VLS_export: import("vue").DefineComponent<PinInputProps, {
5
+ focus: typeof focus;
6
+ blur: typeof blur;
7
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
3
8
  change: (args_0: string) => any;
4
9
  "update:modelValue": (args_0: string) => any;
5
10
  }, string, import("vue").PublicProps, Readonly<PinInputProps> & Readonly<{
@@ -7,8 +12,8 @@ declare const __VLS_export: import("vue").DefineComponent<PinInputProps, {}, {},
7
12
  "onUpdate:modelValue"?: ((args_0: string) => any) | undefined;
8
13
  }>, {
9
14
  length: number;
10
- type: "numeric" | "alphabetic" | "alphanumeric" | "numeric-password" | "alphabetic-password" | "alphanumeric-password";
11
15
  placeholder: string;
16
+ type: "numeric" | "alphabetic" | "alphanumeric" | "numeric-password" | "alphabetic-password" | "alphanumeric-password";
12
17
  modelValue: string;
13
18
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
19
  declare const _default: typeof __VLS_export;
@@ -1,11 +1,12 @@
1
1
  <script setup>
2
- import { computed, ref, shallowRef } from "vue";
3
- import { useConfigProvider } from "../../composables/use-config-provider-context";
2
+ import { computed, shallowRef, watch } from "vue";
3
+ import { useConfigProvider } from "../../contexts/config-provider";
4
4
  import { useModelValue } from "../../composables/use-model-value";
5
5
  import { isTruthyProp } from "../../utils/format";
6
- import { pinInputVariant } from "./cn";
6
+ import { tv } from "tailwind-variants";
7
7
  defineOptions({
8
8
  name: "PPinInput",
9
+ inheritAttrs: false,
9
10
  model: {
10
11
  prop: "modelValue",
11
12
  event: "update:modelValue"
@@ -17,32 +18,45 @@ const props = defineProps({
17
18
  length: { type: Number, required: false, default: 4 },
18
19
  readonly: { type: Boolean, required: false },
19
20
  disabled: { type: Boolean, required: false },
20
- required: { type: Boolean, required: false },
21
21
  modelValue: { type: String, required: false, default: "" },
22
22
  placeholder: { type: String, required: false, default: "\u25CB" },
23
- inputMode: { type: null, required: false },
24
23
  type: { type: String, required: false, default: "numeric" }
25
24
  });
26
25
  const emits = defineEmits(["change", "update:modelValue"]);
26
+ const pinInputVariant = tv({
27
+ base: "pxd-input--border rounded-md motion-safe:transition-all",
28
+ variants: {
29
+ size: {
30
+ xs: "w-6 text-xs",
31
+ sm: "w-7.5 text-sm",
32
+ md: "w-9 text-sm",
33
+ lg: "w-10 text-base"
34
+ },
35
+ error: {
36
+ true: "is-error",
37
+ false: ""
38
+ },
39
+ disabled: {
40
+ true: "is-disabled",
41
+ false: ""
42
+ }
43
+ },
44
+ defaultVariants: {
45
+ size: "md",
46
+ error: false,
47
+ disabled: false
48
+ }
49
+ });
27
50
  const configProvider = useConfigProvider();
28
51
  const inputsRef = shallowRef([]);
29
52
  const modelValue = useModelValue(props, emits);
30
- const modelValueLocal = ref(
31
- (() => {
32
- if (typeof props.modelValue === "string") {
33
- return props.modelValue.split("");
34
- } else if (Array.isArray(props.modelValue)) {
35
- return props.modelValue;
36
- }
37
- return Array.from({ length: props.length }, () => "");
38
- })()
39
- );
53
+ let localValue = modelValue.value;
40
54
  const computedInputType = computed(() => {
41
55
  const { type } = props;
42
56
  if (type.includes("password")) {
43
57
  return "password";
44
58
  } else if (type === "numeric") {
45
- return "tel";
59
+ return "numeric";
46
60
  }
47
61
  return "text";
48
62
  });
@@ -56,14 +70,17 @@ const computedClasses = computed(() => {
56
70
  disabled: isTruthyProp(props.disabled)
57
71
  });
58
72
  });
73
+ function replaceCharAt(str, index, char) {
74
+ return str.substring(0, index) + char + str.substring(index + 1);
75
+ }
59
76
  function setInputValue(value, index) {
60
77
  if (index !== void 0) {
61
78
  inputsRef.value[index].value = value;
62
- modelValueLocal.value[index] = value;
79
+ localValue = replaceCharAt(localValue, index, value);
63
80
  } else {
64
- modelValueLocal.value = value.split("");
81
+ localValue = value;
65
82
  }
66
- modelValue.value = modelValueLocal.value.join("");
83
+ modelValue.value = localValue;
67
84
  }
68
85
  function focusInputField(dir, index) {
69
86
  let correctIndex = -1;
@@ -82,9 +99,9 @@ function focusInputField(dir, index) {
82
99
  inputsRef.value[correctIndex].select();
83
100
  }
84
101
  function getFirstEmptyIndex() {
85
- const length = modelValueLocal.value.length;
102
+ const length = localValue.length;
86
103
  if (length === props.length) {
87
- return modelValueLocal.value.findIndex((value) => !value);
104
+ return localValue.split("").findIndex((value) => !value);
88
105
  }
89
106
  return length;
90
107
  }
@@ -180,10 +197,30 @@ function onInputPastedValue(ev) {
180
197
  setInputValue(slicedText);
181
198
  }
182
199
  }
200
+ function focus() {
201
+ focusInputField("first");
202
+ }
203
+ function blur() {
204
+ inputsRef.value.forEach((input) => input.blur());
205
+ }
206
+ watch(
207
+ () => props.modelValue,
208
+ (newValue) => {
209
+ if (newValue === localValue) {
210
+ return;
211
+ }
212
+ localValue = newValue;
213
+ }
214
+ );
215
+ defineExpose({
216
+ focus,
217
+ blur
218
+ });
183
219
  </script>
184
220
 
185
221
  <template>
186
222
  <label
223
+ v-bind="$attrs"
187
224
  class="pxd-pin-input gap-1.5 flex size-max items-center"
188
225
  @keydown="onContainerKeydown"
189
226
  @compositionend="onCompositionEnd"
@@ -193,11 +230,12 @@ function onInputPastedValue(ev) {
193
230
  <div v-for="(n, i) of length" :key="n" :class="computedClasses">
194
231
  <input
195
232
  ref="inputsRef"
196
- :value="modelValueLocal[i]"
233
+ :value="modelValue[i]"
197
234
  :aria-label="`pin code ${n} of ${length}`"
198
235
  :type="computedInputType"
199
236
  :data-index="i"
200
237
  class="aspect-square size-full appearance-none rounded-inherit border-none bg-transparent text-center font-inherit outline-none placeholder:text-gray-600 placeholder:select-none focus:placeholder:opacity-0 disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-700 disabled:placeholder:text-gray-400 motion-safe:transition-all"
238
+ name="pin-input"
201
239
  minlength="1"
202
240
  maxlength="1"
203
241
  autocorrect="off"
@@ -205,7 +243,6 @@ function onInputPastedValue(ev) {
205
243
  autocapitalize="off"
206
244
  :readonly="readonly"
207
245
  :disabled="disabled"
208
- :required="required"
209
246
  :placeholder="placeholder"
210
247
  :inputmode="computedInputMode"
211
248
  @paste="onInputPastedValue"
@@ -1,5 +1,3 @@
1
- import type { HTMLAttributes } from 'vue'
2
-
3
1
  import type { ComponentSizeWithXs } from '../../types/shared'
4
2
 
5
3
  export interface PinInputProps {
@@ -8,10 +6,8 @@ export interface PinInputProps {
8
6
  length?: number
9
7
  readonly?: boolean
10
8
  disabled?: boolean
11
- required?: boolean
12
9
  modelValue?: string
13
10
  placeholder?: string
14
- inputMode?: HTMLAttributes['inputmode']
15
11
  type?:
16
12
  | 'numeric'
17
13
  | 'alphabetic'
@@ -1,6 +1,7 @@
1
1
  <script setup>
2
2
  import { computed } from "vue";
3
3
  import { getCssUnitValue } from "../../utils/format";
4
+ import { invert } from "es-toolkit";
4
5
  defineOptions({
5
6
  name: "PPlaceholder",
6
7
  inheritAttrs: false
@@ -46,6 +47,6 @@ const computedStyle = computed(() => {
46
47
  #0000 62.5%,
47
48
  #0000 100%
48
49
  )
49
- 0 0 / var(--placeholder-gap, 12px) var(--placeholder-gap, 12px) padding-box fixed;
50
+ 0 0 / var(--placeholder-gap, 12px) var(--placeholder-gap, 12px) padding-box;
50
51
  }
51
52
  </style>
@@ -25,9 +25,9 @@ declare const __VLS_base: import("vue").DefineComponent<PopoverProps, {
25
25
  "onOutside-click"?: ((args_0: MouseEvent) => any) | undefined;
26
26
  "onTrigger-click"?: ((args_0: PointerEvent) => any) | undefined;
27
27
  }>, {
28
- position: import("../../types/shared").ComponentPosition;
29
28
  offset: number;
30
29
  trigger: PopoverTrigger | PopoverTrigger[];
30
+ position: import("../../types/shared").ComponentPosition;
31
31
  showDelay: number;
32
32
  hideDelay: number;
33
33
  arrowColor: string;