@byyuurin/ui 0.0.11 → 0.1.0

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 (289) hide show
  1. package/README.md +170 -58
  2. package/dist/module.d.mts +4 -13
  3. package/dist/module.json +4 -4
  4. package/dist/module.mjs +54 -20
  5. package/dist/runtime/components/Accordion.vue +28 -23
  6. package/dist/runtime/components/Accordion.vue.d.ts +51 -29
  7. package/dist/runtime/components/Alert.vue +47 -27
  8. package/dist/runtime/components/Alert.vue.d.ts +37 -25
  9. package/dist/runtime/components/App.vue +9 -8
  10. package/dist/runtime/components/App.vue.d.ts +22 -20
  11. package/dist/runtime/components/Avatar.vue +65 -21
  12. package/dist/runtime/components/Avatar.vue.d.ts +27 -13
  13. package/dist/runtime/components/AvatarGroup.vue +14 -10
  14. package/dist/runtime/components/AvatarGroup.vue.d.ts +12 -9
  15. package/dist/runtime/components/Badge.vue +64 -32
  16. package/dist/runtime/components/Badge.vue.d.ts +30 -29
  17. package/dist/runtime/components/Breadcrumb.vue +40 -22
  18. package/dist/runtime/components/Breadcrumb.vue.d.ts +48 -21
  19. package/dist/runtime/components/Button.vue +113 -52
  20. package/dist/runtime/components/Button.vue.d.ts +36 -20
  21. package/dist/runtime/components/Calendar.vue +48 -39
  22. package/dist/runtime/components/Calendar.vue.d.ts +58 -31
  23. package/dist/runtime/components/Card.vue +18 -14
  24. package/dist/runtime/components/Card.vue.d.ts +18 -14
  25. package/dist/runtime/components/Carousel.vue +80 -46
  26. package/dist/runtime/components/Carousel.vue.d.ts +46 -25
  27. package/dist/runtime/components/Checkbox.vue +60 -35
  28. package/dist/runtime/components/Checkbox.vue.d.ts +35 -28
  29. package/dist/runtime/components/Chip.vue +35 -32
  30. package/dist/runtime/components/Chip.vue.d.ts +33 -15
  31. package/dist/runtime/components/Collapsible.vue +13 -9
  32. package/dist/runtime/components/Collapsible.vue.d.ts +16 -8
  33. package/dist/runtime/components/Drawer.vue +80 -70
  34. package/dist/runtime/components/Drawer.vue.d.ts +51 -28
  35. package/dist/runtime/components/DropdownMenu.vue +23 -16
  36. package/dist/runtime/components/DropdownMenu.vue.d.ts +77 -36
  37. package/dist/runtime/components/DropdownMenuContent.vue +133 -103
  38. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +38 -26
  39. package/dist/runtime/components/FieldGroup.vue +33 -0
  40. package/dist/runtime/components/FieldGroup.vue.d.ts +33 -0
  41. package/dist/runtime/components/Form.vue +172 -88
  42. package/dist/runtime/components/Form.vue.d.ts +69 -44
  43. package/dist/runtime/components/FormField.vue +108 -0
  44. package/dist/runtime/components/FormField.vue.d.ts +63 -0
  45. package/dist/runtime/components/Icon.vue +20 -0
  46. package/dist/runtime/components/Icon.vue.d.ts +9 -0
  47. package/dist/runtime/components/Input.vue +82 -77
  48. package/dist/runtime/components/Input.vue.d.ts +55 -43
  49. package/dist/runtime/components/InputNumber.vue +65 -49
  50. package/dist/runtime/components/InputNumber.vue.d.ts +51 -105
  51. package/dist/runtime/components/Kbd.vue +11 -5
  52. package/dist/runtime/components/Kbd.vue.d.ts +17 -11
  53. package/dist/runtime/components/Link.vue +54 -197
  54. package/dist/runtime/components/Link.vue.d.ts +17 -17
  55. package/dist/runtime/components/LinkBase.vue +11 -33
  56. package/dist/runtime/components/LinkBase.vue.d.ts +8 -3
  57. package/dist/runtime/components/Modal.vue +53 -39
  58. package/dist/runtime/components/Modal.vue.d.ts +64 -34
  59. package/dist/runtime/components/NavigationMenu.vue +336 -0
  60. package/dist/runtime/components/NavigationMenu.vue.d.ts +181 -0
  61. package/dist/runtime/components/OverlayProvider.vue +3 -3
  62. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -1
  63. package/dist/runtime/components/Pagination.vue +39 -47
  64. package/dist/runtime/components/Pagination.vue.d.ts +54 -31
  65. package/dist/runtime/components/PinInput.vue +46 -32
  66. package/dist/runtime/components/PinInput.vue.d.ts +40 -21
  67. package/dist/runtime/components/Popover.vue +33 -19
  68. package/dist/runtime/components/Popover.vue.d.ts +57 -32
  69. package/dist/runtime/components/Progress.vue +31 -26
  70. package/dist/runtime/components/Progress.vue.d.ts +32 -23
  71. package/dist/runtime/components/RadioGroup.vue +75 -48
  72. package/dist/runtime/components/RadioGroup.vue.d.ts +58 -36
  73. package/dist/runtime/components/ScrollArea.vue +33 -31
  74. package/dist/runtime/components/ScrollArea.vue.d.ts +9 -5
  75. package/dist/runtime/components/Select.vue +166 -76
  76. package/dist/runtime/components/Select.vue.d.ts +206 -65
  77. package/dist/runtime/components/Separator.vue +42 -16
  78. package/dist/runtime/components/Separator.vue.d.ts +35 -14
  79. package/dist/runtime/components/Skeleton.vue +18 -6
  80. package/dist/runtime/components/Skeleton.vue.d.ts +4 -4
  81. package/dist/runtime/components/Slider.vue +42 -24
  82. package/dist/runtime/components/Slider.vue.d.ts +43 -27
  83. package/dist/runtime/components/Switch.vue +40 -31
  84. package/dist/runtime/components/Switch.vue.d.ts +36 -27
  85. package/dist/runtime/components/Table.vue +279 -51
  86. package/dist/runtime/components/Table.vue.d.ts +151 -65
  87. package/dist/runtime/components/Tabs.vue +70 -23
  88. package/dist/runtime/components/Tabs.vue.d.ts +61 -29
  89. package/dist/runtime/components/Textarea.vue +102 -54
  90. package/dist/runtime/components/Textarea.vue.d.ts +57 -41
  91. package/dist/runtime/components/Toast.vue +84 -38
  92. package/dist/runtime/components/Toast.vue.d.ts +48 -27
  93. package/dist/runtime/components/ToastProvider.vue +31 -22
  94. package/dist/runtime/components/ToastProvider.vue.d.ts +30 -17
  95. package/dist/runtime/components/Tooltip.vue +33 -21
  96. package/dist/runtime/components/Tooltip.vue.d.ts +37 -15
  97. package/dist/runtime/composables/defineShortcuts.d.ts +16 -0
  98. package/dist/runtime/composables/defineShortcuts.js +129 -0
  99. package/dist/runtime/composables/useAvatarGroup.d.ts +8 -3
  100. package/dist/runtime/composables/useAvatarGroup.js +10 -3
  101. package/dist/runtime/composables/useComponentIcons.d.ts +9 -6
  102. package/dist/runtime/composables/useComponentIcons.js +4 -4
  103. package/dist/runtime/composables/useFieldGroup.d.ts +8 -0
  104. package/dist/runtime/composables/useFieldGroup.js +14 -0
  105. package/dist/runtime/composables/useFormField.d.ts +62 -0
  106. package/dist/runtime/composables/useFormField.js +99 -0
  107. package/dist/runtime/composables/useKbd.d.ts +3 -2
  108. package/dist/runtime/composables/useKbd.js +3 -2
  109. package/dist/runtime/composables/useLocale.d.ts +68 -5
  110. package/dist/runtime/composables/useLocale.js +11 -11
  111. package/dist/runtime/composables/useOverlay.d.ts +51 -15
  112. package/dist/runtime/composables/useOverlay.js +44 -30
  113. package/dist/runtime/composables/usePortal.d.ts +6 -0
  114. package/dist/runtime/composables/usePortal.js +17 -0
  115. package/dist/runtime/composables/useToast.d.ts +12 -5
  116. package/dist/runtime/composables/useToast.js +12 -7
  117. package/dist/runtime/locale/en.d.ts +30 -1
  118. package/dist/runtime/locale/en.js +2 -1
  119. package/dist/runtime/locale/index.d.ts +2 -2
  120. package/dist/runtime/locale/index.js +1 -1
  121. package/dist/runtime/locale/zh_tw.d.ts +31 -0
  122. package/dist/runtime/locale/{zh-tw.js → zh_tw.js} +2 -1
  123. package/dist/runtime/plugins/colors.d.ts +2 -0
  124. package/dist/runtime/plugins/colors.js +50 -0
  125. package/dist/runtime/types/app.config.d.ts +6 -0
  126. package/dist/runtime/types/form.d.ts +58 -17
  127. package/dist/runtime/types/form.js +11 -0
  128. package/dist/runtime/types/index.d.ts +51 -8
  129. package/dist/runtime/types/index.js +45 -2
  130. package/dist/runtime/types/input.d.ts +8 -0
  131. package/dist/runtime/types/locale.d.ts +5 -0
  132. package/dist/runtime/types/style.d.ts +33 -0
  133. package/dist/runtime/types/style.js +0 -0
  134. package/dist/runtime/types/unocss.d.ts +4 -0
  135. package/dist/runtime/types/utils.d.ts +38 -37
  136. package/dist/runtime/utils/form.d.ts +5 -1
  137. package/dist/runtime/utils/form.js +49 -0
  138. package/dist/runtime/utils/index.d.ts +10 -13
  139. package/dist/runtime/utils/index.js +41 -48
  140. package/dist/runtime/utils/link.d.ts +3 -2
  141. package/dist/runtime/utils/link.js +16 -2
  142. package/dist/runtime/utils/locale.d.ts +5 -0
  143. package/dist/runtime/utils/locale.js +10 -0
  144. package/dist/runtime/utils/style.d.ts +94 -0
  145. package/dist/runtime/utils/style.js +37 -0
  146. package/dist/runtime/vue/components/Icon.vue +15 -0
  147. package/dist/runtime/vue/components/Icon.vue.d.ts +7 -0
  148. package/dist/runtime/vue/components/Link.vue +163 -0
  149. package/dist/runtime/vue/components/Link.vue.d.ts +95 -0
  150. package/dist/runtime/vue/composables/useAppConfig.d.ts +1 -0
  151. package/dist/runtime/vue/composables/useAppConfig.js +4 -0
  152. package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
  153. package/dist/runtime/vue/plugins/color-mode.js +6 -0
  154. package/dist/runtime/vue/plugins/head.d.ts +4 -0
  155. package/dist/runtime/vue/plugins/head.js +9 -0
  156. package/dist/runtime/vue/stubs.d.ts +16 -1
  157. package/dist/runtime/vue/stubs.js +32 -1
  158. package/dist/setup.d.mts +13 -0
  159. package/dist/setup.mjs +12 -0
  160. package/dist/shared/ui.CzIlLITK.mjs +51 -0
  161. package/dist/shared/ui.DSyJHSTk.mjs +3787 -0
  162. package/dist/shared/ui.DpbffTXs.d.mts +84 -0
  163. package/dist/shared/ui.IulR-OYx.d.mts +64 -0
  164. package/dist/types.d.mts +3 -1
  165. package/dist/unocss.d.mts +12 -52
  166. package/dist/unocss.mjs +144 -254
  167. package/dist/unplugin.d.mts +13 -26
  168. package/dist/unplugin.mjs +193 -18
  169. package/dist/vite.d.mts +10 -1
  170. package/dist/vite.mjs +12 -3
  171. package/package.json +154 -87
  172. package/vue-plugin.d.ts +5 -0
  173. package/dist/module.d.ts +0 -13
  174. package/dist/module.mjs.map +0 -1
  175. package/dist/runtime/app/injections.d.ts +0 -9331
  176. package/dist/runtime/app/injections.js +0 -61
  177. package/dist/runtime/components/ButtonGroup.vue +0 -26
  178. package/dist/runtime/components/ButtonGroup.vue.d.ts +0 -26
  179. package/dist/runtime/components/FormItem.vue +0 -90
  180. package/dist/runtime/components/FormItem.vue.d.ts +0 -60
  181. package/dist/runtime/composables/useButtonGroup.d.ts +0 -5
  182. package/dist/runtime/composables/useButtonGroup.js +0 -9
  183. package/dist/runtime/composables/useFormItem.d.ts +0 -27
  184. package/dist/runtime/composables/useFormItem.js +0 -64
  185. package/dist/runtime/composables/useTheme.d.ts +0 -9
  186. package/dist/runtime/composables/useTheme.js +0 -23
  187. package/dist/runtime/index.d.ts +0 -44
  188. package/dist/runtime/index.js +0 -44
  189. package/dist/runtime/locale/zh-tw.d.ts +0 -2
  190. package/dist/runtime/theme/accordion.d.ts +0 -50
  191. package/dist/runtime/theme/accordion.js +0 -28
  192. package/dist/runtime/theme/alert.d.ts +0 -119
  193. package/dist/runtime/theme/alert.js +0 -47
  194. package/dist/runtime/theme/app.d.ts +0 -19
  195. package/dist/runtime/theme/app.js +0 -19
  196. package/dist/runtime/theme/avatar-group.d.ts +0 -46
  197. package/dist/runtime/theme/avatar-group.js +0 -32
  198. package/dist/runtime/theme/avatar.d.ts +0 -50
  199. package/dist/runtime/theme/avatar.js +0 -34
  200. package/dist/runtime/theme/badge.d.ts +0 -76
  201. package/dist/runtime/theme/badge.js +0 -92
  202. package/dist/runtime/theme/breadcrumb.d.ts +0 -61
  203. package/dist/runtime/theme/breadcrumb.js +0 -44
  204. package/dist/runtime/theme/button-group.d.ts +0 -60
  205. package/dist/runtime/theme/button-group.js +0 -42
  206. package/dist/runtime/theme/button.d.ts +0 -184
  207. package/dist/runtime/theme/button.js +0 -164
  208. package/dist/runtime/theme/calendar.d.ts +0 -58
  209. package/dist/runtime/theme/calendar.js +0 -86
  210. package/dist/runtime/theme/card.d.ts +0 -56
  211. package/dist/runtime/theme/card.js +0 -37
  212. package/dist/runtime/theme/carousel.d.ts +0 -107
  213. package/dist/runtime/theme/carousel.js +0 -43
  214. package/dist/runtime/theme/checkbox.d.ts +0 -82
  215. package/dist/runtime/theme/checkbox.js +0 -54
  216. package/dist/runtime/theme/chip.d.ts +0 -61
  217. package/dist/runtime/theme/chip.js +0 -66
  218. package/dist/runtime/theme/collapsible.d.ts +0 -32
  219. package/dist/runtime/theme/collapsible.js +0 -10
  220. package/dist/runtime/theme/drawer.d.ts +0 -142
  221. package/dist/runtime/theme/drawer.js +0 -113
  222. package/dist/runtime/theme/dropdown-menu.d.ts +0 -65
  223. package/dist/runtime/theme/dropdown-menu.js +0 -83
  224. package/dist/runtime/theme/form-item.d.ts +0 -70
  225. package/dist/runtime/theme/form-item.js +0 -34
  226. package/dist/runtime/theme/form.d.ts +0 -2
  227. package/dist/runtime/theme/form.js +0 -7
  228. package/dist/runtime/theme/index.d.ts +0 -41
  229. package/dist/runtime/theme/index.js +0 -41
  230. package/dist/runtime/theme/input-number.d.ts +0 -115
  231. package/dist/runtime/theme/input-number.js +0 -95
  232. package/dist/runtime/theme/input.d.ts +0 -172
  233. package/dist/runtime/theme/input.js +0 -151
  234. package/dist/runtime/theme/kbd.d.ts +0 -33
  235. package/dist/runtime/theme/kbd.js +0 -26
  236. package/dist/runtime/theme/link.d.ts +0 -38
  237. package/dist/runtime/theme/link.js +0 -26
  238. package/dist/runtime/theme/modal.d.ts +0 -42
  239. package/dist/runtime/theme/modal.js +0 -55
  240. package/dist/runtime/theme/pagination.d.ts +0 -74
  241. package/dist/runtime/theme/pagination.js +0 -17
  242. package/dist/runtime/theme/pinInput.d.ts +0 -94
  243. package/dist/runtime/theme/pinInput.js +0 -111
  244. package/dist/runtime/theme/popover.d.ts +0 -32
  245. package/dist/runtime/theme/popover.js +0 -13
  246. package/dist/runtime/theme/progress.d.ts +0 -180
  247. package/dist/runtime/theme/progress.js +0 -95
  248. package/dist/runtime/theme/radio-group.d.ts +0 -104
  249. package/dist/runtime/theme/radio-group.js +0 -61
  250. package/dist/runtime/theme/scroll-area.d.ts +0 -67
  251. package/dist/runtime/theme/scroll-area.js +0 -33
  252. package/dist/runtime/theme/select.d.ts +0 -186
  253. package/dist/runtime/theme/select.js +0 -173
  254. package/dist/runtime/theme/separator.d.ts +0 -74
  255. package/dist/runtime/theme/separator.js +0 -53
  256. package/dist/runtime/theme/skeleton.d.ts +0 -2
  257. package/dist/runtime/theme/skeleton.js +0 -7
  258. package/dist/runtime/theme/slider.d.ts +0 -70
  259. package/dist/runtime/theme/slider.js +0 -52
  260. package/dist/runtime/theme/switch.d.ts +0 -116
  261. package/dist/runtime/theme/switch.js +0 -78
  262. package/dist/runtime/theme/table.d.ts +0 -86
  263. package/dist/runtime/theme/table.js +0 -36
  264. package/dist/runtime/theme/tabs.d.ts +0 -129
  265. package/dist/runtime/theme/tabs.js +0 -146
  266. package/dist/runtime/theme/textarea.d.ts +0 -90
  267. package/dist/runtime/theme/textarea.js +0 -116
  268. package/dist/runtime/theme/toast-provider.d.ts +0 -116
  269. package/dist/runtime/theme/toast-provider.js +0 -97
  270. package/dist/runtime/theme/toast.d.ts +0 -83
  271. package/dist/runtime/theme/toast.js +0 -35
  272. package/dist/runtime/theme/tooltip.d.ts +0 -38
  273. package/dist/runtime/theme/tooltip.js +0 -11
  274. package/dist/runtime/types/components.d.ts +0 -42
  275. package/dist/runtime/utils/extend-theme.d.ts +0 -9
  276. package/dist/runtime/utils/extend-theme.js +0 -27
  277. package/dist/runtime/utils/styler.d.ts +0 -4
  278. package/dist/runtime/utils/styler.js +0 -10
  279. package/dist/runtime/utils/translator.d.ts +0 -18
  280. package/dist/runtime/utils/translator.js +0 -8
  281. package/dist/shared/ui.D1BTWZFB.mjs +0 -5
  282. package/dist/shared/ui.D1BTWZFB.mjs.map +0 -1
  283. package/dist/unocss.d.ts +0 -52
  284. package/dist/unocss.mjs.map +0 -1
  285. package/dist/unplugin.d.ts +0 -26
  286. package/dist/unplugin.mjs.map +0 -1
  287. package/dist/vite.d.ts +0 -9
  288. package/dist/vite.mjs.map +0 -1
  289. /package/dist/runtime/types/{components.js → input.js} +0 -0
@@ -3,13 +3,14 @@
3
3
  </script>
4
4
 
5
5
  <script setup>
6
- import { reactiveOmit } from "@vueuse/core";
7
- import { diff, isEqual } from "ohash/utils";
6
+ import { reactiveOmit, reactivePick } from "@vueuse/core";
7
+ import { isEqual } from "ohash/utils";
8
8
  import { useForwardProps } from "reka-ui";
9
- import { hasProtocol } from "ufo";
10
- import { computed, getCurrentInstance, resolveComponent } from "vue";
11
- import { useNuxtApp, useRoute } from "#imports";
12
- import { useTheme } from "../composables/useTheme";
9
+ import { computed } from "vue";
10
+ import theme from "#build/ui/link";
11
+ import { useAppConfig, useRoute } from "#imports";
12
+ import { isPartiallyEqual } from "../utils/link";
13
+ import { cv, merge } from "../utils/style";
13
14
  import LinkBase from "./LinkBase.vue";
14
15
  defineOptions({ inheritAttrs: false });
15
16
  const props = defineProps({
@@ -17,21 +18,19 @@ const props = defineProps({
17
18
  type: { type: null, required: false, default: "button" },
18
19
  label: { type: String, required: false },
19
20
  disabled: { type: Boolean, required: false },
20
- active: { type: Boolean, required: false },
21
+ active: { type: Boolean, required: false, default: void 0 },
21
22
  exact: { type: Boolean, required: false },
22
23
  exactQuery: { type: [Boolean, String], required: false },
23
24
  exactHash: { type: Boolean, required: false },
24
25
  inactiveClass: { type: String, required: false },
25
- disableClass: { type: String, required: false },
26
26
  custom: { type: Boolean, required: false },
27
- underline: { type: Boolean, required: false },
28
27
  raw: { type: Boolean, required: false },
29
- class: { type: null, required: false },
28
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
30
29
  to: { type: null, required: false },
31
30
  href: { type: null, required: false },
32
31
  external: { type: Boolean, required: false },
33
- target: { type: [String, Object, null], required: false },
34
- rel: { type: [String, Object, null], required: false },
32
+ target: { type: [String, Object], required: false },
33
+ rel: { type: [String, Object], required: false },
35
34
  noRel: { type: Boolean, required: false },
36
35
  prefetchedClass: { type: String, required: false },
37
36
  prefetch: { type: Boolean, required: false },
@@ -39,75 +38,25 @@ const props = defineProps({
39
38
  noPrefetch: { type: Boolean, required: false },
40
39
  activeClass: { type: String, required: false },
41
40
  exactActiveClass: { type: String, required: false },
42
- ariaCurrentValue: { type: String, required: false },
41
+ ariaCurrentValue: { type: String, required: false, default: "page" },
43
42
  viewTransition: { type: Boolean, required: false },
44
43
  replace: { type: Boolean, required: false }
45
44
  });
46
45
  defineSlots();
47
- const hasRouter = computed(() => {
48
- const app = getCurrentInstance()?.appContext.app;
49
- return !!app?.config?.globalProperties?.$router;
50
- });
51
- const nuxtApp = useNuxtApp();
52
- const hasNuxtLink = !!nuxtApp.$router;
53
- const linkComponent = computed(() => ({
54
- NuxtLink: nuxtApp.$router ? resolveComponent("NuxtLink") : null,
55
- RouterLink: hasRouter.value ? resolveComponent("RouterLink") : null
56
- }));
57
- const route = computed(() => {
58
- if (!hasRouter.value)
59
- return null;
60
- try {
61
- return useRoute();
62
- } catch {
63
- return null;
64
- }
65
- });
66
- const linkProps = useForwardProps(reactiveOmit(
67
- props,
68
- "as",
69
- "type",
70
- "disabled",
71
- "active",
72
- "exact",
73
- "exactQuery",
74
- "exactHash",
75
- "activeClass",
76
- "inactiveClass",
77
- "raw",
78
- "class",
79
- ...hasNuxtLink ? [] : ["to"]
80
- ));
81
- function isPartiallyEqual(item1, item2) {
82
- const diffedKeys = diff(item1, item2).reduce((filtered, q) => {
83
- if (q.type === "added")
84
- filtered.add(q.key);
85
- return filtered;
86
- }, /* @__PURE__ */ new Set());
87
- const item1Filtered = Object.fromEntries(Object.entries(item1).filter(([key]) => !diffedKeys.has(key)));
88
- const item2Filtered = Object.fromEntries(Object.entries(item2).filter(([key]) => !diffedKeys.has(key)));
89
- return isEqual(item1Filtered, item2Filtered);
90
- }
91
- const isExternalLink = computed(() => {
92
- const to = props.to || props.href;
93
- if (!to)
94
- return false;
95
- if (props.target === "_blank")
96
- return true;
97
- return typeof to === "string" && hasProtocol(to, { acceptRelative: true });
98
- });
46
+ const route = useRoute();
47
+ const inheritProps = useForwardProps(reactivePick(props, "as", "type", "disabled"));
48
+ const nuxtLinkProps = useForwardProps(reactiveOmit(props, "as", "type", "disabled", "active", "exact", "exactQuery", "exactHash", "activeClass", "inactiveClass", "to", "href", "raw", "custom", "class"));
49
+ const to = computed(() => props.to ?? props.href);
99
50
  function isLinkActive({ route: linkRoute, isActive, isExactActive }) {
100
51
  if (props.active !== void 0)
101
52
  return props.active;
102
- if (isExternalLink.value || !props.to)
103
- return false;
104
53
  if (props.exactQuery === "partial") {
105
- if (!isPartiallyEqual(linkRoute?.query, route.value?.query))
54
+ if (!isPartiallyEqual(linkRoute.query, route.query))
106
55
  return false;
107
- } else if (props.exactQuery === true && !isEqual(linkRoute?.query, route.value?.query)) {
56
+ } else if (props.exactQuery === true && !isEqual(linkRoute.query, route.query)) {
108
57
  return false;
109
58
  }
110
- if (props.exactHash && linkRoute?.hash !== route.value?.hash)
59
+ if (props.exactHash && linkRoute.hash !== route.hash)
111
60
  return false;
112
61
  if (props.exact && isExactActive)
113
62
  return true;
@@ -115,139 +64,47 @@ function isLinkActive({ route: linkRoute, isActive, isExactActive }) {
115
64
  return true;
116
65
  return false;
117
66
  }
118
- const { theme, createStyler } = useTheme();
119
- function resolveLinkClass({ route: route2, isActive, isExactActive } = {}) {
120
- const { link } = theme.value;
121
- const active = isLinkActive({ route: route2, isActive, isExactActive });
122
- if (props.raw)
123
- return [props.class, active ? props.activeClass : props.inactiveClass];
124
- const styler = createStyler({
125
- ...link,
67
+ const appConfig = useAppConfig();
68
+ const ui = computed(() => {
69
+ const link = merge(theme, {
70
+ ...appConfig.ui.link,
126
71
  variants: {
127
- ...link.variants,
72
+ ...appConfig.ui.link?.variants,
128
73
  active: {
129
- true: [link.variants.active.true, props.activeClass],
130
- false: [link.variants.active.false, props.inactiveClass]
131
- },
132
- disabled: {
133
- true: [link.variants.disabled.true, props.disableClass]
74
+ true: [appConfig.ui.link?.variants?.active?.true, props.activeClass].filter(Boolean).join(" "),
75
+ false: [appConfig.ui.link?.variants?.active?.false, props.inactiveClass].filter(Boolean).join(" ")
134
76
  }
135
77
  }
136
78
  });
137
- return styler({ ...props, active }).base();
79
+ return cv(link)();
80
+ });
81
+ function resolveLinkClass({ route: route2, isActive, isExactActive }) {
82
+ const active = isLinkActive({ route: route2, isActive, isExactActive });
83
+ if (props.raw)
84
+ return [props.class, active ? props.activeClass : props.inactiveClass];
85
+ return ui.value.base({ ...props, active });
138
86
  }
139
87
  </script>
140
88
 
141
89
  <template>
142
- <template v-if="hasRouter">
143
- <component
144
- :is="linkComponent.NuxtLink"
145
- v-if="hasNuxtLink"
146
- v-slot="{ href, navigate, route: linkRoute, rel, target, isExternal, isActive, isExactActive }"
147
- v-bind="linkProps"
148
- :href="to ? void 0 : href"
149
- custom
150
- >
151
- <template v-if="custom">
152
- <slot
153
- v-bind="{
90
+ <NuxtLink
91
+ v-slot="{ href, navigate, route: linkRoute, rel, target, isExternal, isActive, isExactActive }"
92
+ v-bind="nuxtLinkProps"
93
+ :to="to"
94
+ custom
95
+ >
96
+ <template v-if="custom">
97
+ <slot
98
+ v-bind="{
154
99
  ...$attrs,
155
- as,
156
- type,
157
- disabled,
100
+ ...props.exact && isExactActive ? { 'aria-current': props.ariaCurrentValue } : {},
101
+ ...inheritProps,
158
102
  href,
159
103
  navigate,
160
104
  rel,
161
105
  target,
162
106
  isExternal,
163
107
  active: isLinkActive({ route: linkRoute, isActive, isExactActive })
164
- }"
165
- >
166
- {{ props.label }}
167
- </slot>
168
- </template>
169
- <LinkBase
170
- v-else
171
- v-bind="{
172
- ...$attrs,
173
- as,
174
- type,
175
- disabled,
176
- href,
177
- navigate,
178
- rel,
179
- target,
180
- isExternal
181
- }"
182
- :class="resolveLinkClass({ route: linkRoute, isActive, isExactActive })"
183
- :data-part="$attrs['data-part'] ?? 'base'"
184
- >
185
- <slot :active="isLinkActive({ route: linkRoute, isActive, isExactActive })">
186
- {{ props.label }}
187
- </slot>
188
- </LinkBase>
189
- </component>
190
- <component
191
- :is="linkComponent.RouterLink"
192
- v-else
193
- v-slot="{ href, navigate, route: linkRoute, isActive, isExactActive }"
194
- v-bind="linkProps"
195
- :to="isExternalLink ? '#' : to || '#'"
196
- custom
197
- >
198
- <template v-if="custom">
199
- <slot
200
- v-bind="{
201
- ...$attrs,
202
- ...isExternalLink ? {
203
- href: to || props.href,
204
- target: props.target
205
- } : {
206
- href: to ? href : void 0,
207
- target: void 0
208
- },
209
- as,
210
- type,
211
- disabled,
212
- navigate,
213
- active: isLinkActive({ route: linkRoute, isActive, isExactActive }),
214
- isExternal: isExternalLink
215
- }"
216
- >
217
- {{ props.label }}
218
- </slot>
219
- </template>
220
- <LinkBase
221
- v-else
222
- v-bind="{
223
- ...$attrs,
224
- as,
225
- type,
226
- disabled,
227
- href: to ? href : void 0,
228
- navigate
229
- }"
230
- :is-external="isExternalLink"
231
- :class="resolveLinkClass({ route: linkRoute, isActive, isExactActive })"
232
- :data-part="$attrs['data-part'] ?? 'base'"
233
- >
234
- <slot :active="isLinkActive({ route: linkRoute, isActive, isExactActive })">
235
- {{ props.label }}
236
- </slot>
237
- </LinkBase>
238
- </component>
239
- </template>
240
- <template v-else>
241
- <template v-if="props.custom">
242
- <slot
243
- v-bind="{
244
- ...$attrs,
245
- as,
246
- type,
247
- disabled,
248
- href: to || href,
249
- target: target || (isExternalLink ? '_blank' : void 0),
250
- active: false
251
108
  }"
252
109
  >
253
110
  {{ props.label }}
@@ -257,19 +114,19 @@ function resolveLinkClass({ route: route2, isActive, isExactActive } = {}) {
257
114
  v-else
258
115
  v-bind="{
259
116
  ...$attrs,
260
- as,
261
- type,
262
- disabled,
263
- href: typeof to === 'string' ? to : href,
264
- target: target || (isExternalLink ? '_blank' : void 0)
117
+ ...props.exact && isExactActive ? { 'aria-current': props.ariaCurrentValue } : {},
118
+ ...inheritProps,
119
+ href,
120
+ navigate,
121
+ rel,
122
+ target,
123
+ isExternal
265
124
  }"
266
- :is-external="isExternalLink"
267
- :class="resolveLinkClass()"
268
- :data-part="$attrs['data-part'] ?? 'base'"
125
+ :class="resolveLinkClass({ route: linkRoute, isActive, isExactActive })"
269
126
  >
270
- <slot :active="false">
127
+ <slot :active="isLinkActive({ route: linkRoute, isActive, isExactActive })">
271
128
  {{ props.label }}
272
129
  </slot>
273
130
  </LinkBase>
274
- </template>
131
+ </NuxtLink>
275
132
  </template>
@@ -1,13 +1,8 @@
1
1
  import type { PrimitiveProps } from 'reka-ui';
2
2
  import type { ButtonHTMLAttributes } from 'vue';
3
3
  import type { RouteLocationRaw, RouterLinkProps } from 'vue-router';
4
- import type { link } from '../theme/index.js';
5
- import type { ComponentAttrs } from '../types/index.js';
6
- export interface LinkSlots {
7
- default?: (props: {
8
- active: boolean;
9
- }) => any;
10
- }
4
+ import type { ComponentBaseProps } from '../types';
5
+ import type { StaticSlot } from '../types/utils';
11
6
  interface NuxtLinkProps extends Omit<RouterLinkProps, 'to'> {
12
7
  /**
13
8
  * Route Location the link should navigate to when clicked on.
@@ -24,11 +19,11 @@ interface NuxtLinkProps extends Omit<RouterLinkProps, 'to'> {
24
19
  /**
25
20
  * Where to display the linked URL, as the name for a browsing context.
26
21
  */
27
- target?: '_blank' | '_parent' | '_self' | '_top' | (string & {}) | null;
22
+ target?: '_blank' | '_parent' | '_self' | '_top' | (string & {});
28
23
  /**
29
24
  * A rel attribute value to apply on the link. Defaults to "noopener noreferrer" for external links.
30
25
  */
31
- rel?: 'noopener' | 'noreferrer' | 'nofollow' | 'sponsored' | 'ugc' | (string & {}) | null;
26
+ rel?: 'noopener' | 'noreferrer' | 'nofollow' | 'sponsored' | 'ugc' | (string & {});
32
27
  /**
33
28
  * If set to true, no rel attribute will be added to the link
34
29
  */
@@ -53,7 +48,7 @@ interface NuxtLinkProps extends Omit<RouterLinkProps, 'to'> {
53
48
  */
54
49
  noPrefetch?: boolean;
55
50
  }
56
- export interface LinkProps extends Omit<ComponentAttrs<typeof link>, 'ui'>, NuxtLinkProps {
51
+ export interface LinkProps extends ComponentBaseProps, NuxtLinkProps {
57
52
  /**
58
53
  * The element or component this component should render as when not a link.
59
54
  * @default "button"
@@ -70,23 +65,28 @@ export interface LinkProps extends Omit<ComponentAttrs<typeof link>, 'ui'>, Nuxt
70
65
  active?: boolean;
71
66
  /** Will only be active if the current route is an exact match. */
72
67
  exact?: boolean;
73
- /** Will only be active if the current route query is an exact match. */
68
+ /** Allows controlling how the current route query sets the link as active. */
74
69
  exactQuery?: boolean | 'partial';
75
70
  /** Will only be active if the current route hash is an exact match. */
76
71
  exactHash?: boolean;
77
72
  /** The class to apply when the link is inactive. */
78
73
  inactiveClass?: string;
79
- /** The class to apply when the link is disabled. */
80
- disableClass?: string;
81
74
  custom?: boolean;
82
- underline?: boolean;
83
- /** When `true`, only styles from `class`, `ui.active`, and `ui.inactive` will be applied. */
75
+ /** When `true`, only styles from `class`, `activeClass`, and `inactiveClass` will be applied. */
84
76
  raw?: boolean;
85
77
  }
86
- declare const _default: __VLS_WithSlots<import("vue").DefineComponent<LinkProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<LinkProps> & Readonly<{}>, {
87
- type: "button" | "submit" | "reset";
78
+ export interface LinkSlots {
79
+ default: StaticSlot<{
80
+ active: boolean;
81
+ }>;
82
+ }
83
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<LinkProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<LinkProps> & Readonly<{}>, {
84
+ active: boolean;
85
+ type: "reset" | "submit" | "button";
86
+ ariaCurrentValue: "page" | "step" | "location" | "date" | "time" | "true" | "false";
88
87
  as: import("reka-ui").AsTag | import("vue").Component;
89
88
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, LinkSlots>;
89
+ declare const _default: typeof __VLS_export;
90
90
  export default _default;
91
91
  type __VLS_WithSlots<T, S> = T & {
92
92
  new (): {
@@ -12,38 +12,19 @@ const props = defineProps({
12
12
  onClick: { type: [Function, Array], required: false },
13
13
  href: { type: String, required: false },
14
14
  navigate: { type: Function, required: false },
15
- rel: { type: String, required: false },
16
- target: { type: String, required: false },
15
+ target: { type: null, required: false },
16
+ rel: { type: null, required: false },
17
+ active: { type: Boolean, required: false },
17
18
  isExternal: { type: Boolean, required: false }
18
19
  });
19
- const wrapperProps = computed(() => {
20
- const { href, rel, target, disabled } = props;
21
- const baseProps = {
22
- rel,
23
- target
24
- };
25
- if (props.href) {
26
- return {
27
- ...baseProps,
28
- "as": "a",
29
- "href": disabled ? void 0 : href,
30
- "aria-disabled": disabled ? "true" : void 0,
31
- "role": disabled ? "link" : void 0,
32
- "tabindex": disabled ? -1 : void 0
33
- };
20
+ const linkProps = computed(() => {
21
+ const { as, type, href, rel, target, disabled } = props;
22
+ if (href) {
23
+ return disabled ? { as: "a", ariaDisabled: "true", role: "link", tabindex: -1, rel, target } : { as: "a", href, rel, target };
34
24
  }
35
- if (props.as === "button") {
36
- return {
37
- ...baseProps,
38
- as: props.as,
39
- type: props.type,
40
- disabled
41
- };
42
- }
43
- return {
44
- ...baseProps,
45
- as: props.as
46
- };
25
+ if (as === "button")
26
+ return { as, type, disabled, rel, target };
27
+ return { as, rel, target };
47
28
  });
48
29
  function onClickWrapper(e) {
49
30
  if (props.disabled) {
@@ -61,10 +42,7 @@ function onClickWrapper(e) {
61
42
  </script>
62
43
 
63
44
  <template>
64
- <Primitive
65
- v-bind="wrapperProps"
66
- @click="onClickWrapper"
67
- >
45
+ <Primitive v-bind="linkProps" @click="onClickWrapper">
68
46
  <slot></slot>
69
47
  </Primitive>
70
48
  </template>
@@ -1,25 +1,30 @@
1
1
  import type { PrimitiveProps } from 'reka-ui';
2
+ import type { LinkProps } from '../types';
3
+ import type { MaybeNull } from '../types/utils';
2
4
  export interface LinkBaseProps {
3
5
  /**
4
6
  * The element or component this component should render as.
5
7
  * @default "button"
6
8
  */
7
9
  as?: PrimitiveProps['as'];
10
+ /** @default "button" */
8
11
  type?: string;
9
12
  disabled?: boolean;
10
13
  onClick?: ((e: MouseEvent) => void | Promise<void>) | Array<((e: MouseEvent) => void | Promise<void>)>;
11
14
  href?: string;
12
15
  navigate?: (e: MouseEvent) => void;
13
- rel?: string;
14
- target?: string;
16
+ target?: MaybeNull<LinkProps['target']>;
17
+ rel?: MaybeNull<LinkProps['rel']>;
18
+ active?: boolean;
15
19
  isExternal?: boolean;
16
20
  }
17
- declare const _default: __VLS_WithSlots<import("vue").DefineComponent<LinkBaseProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<LinkBaseProps> & Readonly<{}>, {
21
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<LinkBaseProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<LinkBaseProps> & Readonly<{}>, {
18
22
  type: string;
19
23
  as: import("reka-ui").AsTag | import("vue").Component;
20
24
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
21
25
  default?: (props: {}) => any;
22
26
  }>;
27
+ declare const _default: typeof __VLS_export;
23
28
  export default _default;
24
29
  type __VLS_WithSlots<T, S> = T & {
25
30
  new (): {
@@ -1,79 +1,92 @@
1
1
  <script>
2
-
2
+ import theme from "#build/ui/modal";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
6
  import { reactivePick } from "@vueuse/core";
7
7
  import { DialogClose, DialogContent, DialogDescription, DialogOverlay, DialogPortal, DialogRoot, DialogTitle, DialogTrigger, useForwardPropsEmits, VisuallyHidden } from "reka-ui";
8
8
  import { computed, toRef } from "vue";
9
+ import { useAppConfig } from "#imports";
9
10
  import { useLocale } from "../composables/useLocale";
10
- import { useTheme } from "../composables/useTheme";
11
+ import { usePortal } from "../composables/usePortal";
12
+ import { cv, merge } from "../utils/style";
11
13
  import Button from "./Button.vue";
12
14
  const props = defineProps({
13
15
  title: { type: String, required: false },
14
16
  description: { type: String, required: false },
15
- size: { type: null, required: false },
16
17
  content: { type: Object, required: false },
17
- portal: { type: Boolean, required: false, default: true },
18
18
  overlay: { type: Boolean, required: false, default: true },
19
19
  transition: { type: Boolean, required: false, default: true },
20
+ fullscreen: { type: Boolean, required: false },
21
+ portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
22
+ close: { type: [Boolean, Object], required: false, default: true },
23
+ closeIcon: { type: [String, Object], required: false },
20
24
  dismissible: { type: Boolean, required: false, default: true },
21
- close: { type: [Object, Boolean], required: false, default: true },
22
- closeIcon: { type: String, required: false },
23
- class: { type: null, required: false },
24
25
  ui: { type: null, required: false },
26
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
25
27
  open: { type: Boolean, required: false },
26
28
  defaultOpen: { type: Boolean, required: false },
27
29
  modal: { type: Boolean, required: false, default: true }
28
30
  });
29
- const emit = defineEmits(["after-leave", "update:open"]);
31
+ const emit = defineEmits(["after-leave", "after-enter", "close-prevent", "update:open"]);
30
32
  const slots = defineSlots();
31
33
  const rootProps = useForwardPropsEmits(reactivePick(props, "open", "defaultOpen", "modal"), emit);
32
- const contentProps = toRef(() => ({
34
+ const portalProps = usePortal(toRef(() => props.portal));
35
+ const contentProps = computed(() => ({
33
36
  ...props.content,
34
- ...slots.content || slots.header || !props.description && !slots.description ? { "aria-describedby": void 0 } : {}
37
+ ...!!slots.content || !!slots.header || !props.description && !slots.description ? { "aria-describedby": void 0 } : {}
35
38
  }));
36
39
  const contentEvents = computed(() => {
37
40
  if (props.dismissible)
38
41
  return {};
39
- return {
40
- pointerDownOutside: (e) => e.preventDefault(),
41
- interactOutside: (e) => e.preventDefault(),
42
- escapeKeyDown: (e) => e.preventDefault()
43
- };
42
+ const events = ["pointerDownOutside", "interactOutside", "escapeKeyDown"];
43
+ return events.reduce((acc, curr) => {
44
+ acc[curr] = (e) => {
45
+ e.preventDefault();
46
+ emit("close-prevent");
47
+ };
48
+ return acc;
49
+ }, {});
44
50
  });
45
51
  const { t } = useLocale();
46
- const { theme, generateStyle } = useTheme();
47
- const style = computed(() => generateStyle("modal", props));
52
+ const appConfig = useAppConfig();
53
+ const ui = computed(() => {
54
+ const styler = cv(merge(theme, appConfig.ui.modal));
55
+ return styler(props);
56
+ });
48
57
  </script>
49
58
 
50
59
  <template>
51
- <DialogRoot v-slot="{ open }" v-bind="rootProps">
52
- <DialogTrigger
53
- v-if="slots.default"
54
- :class="props.class"
55
- as-child
56
- >
60
+ <DialogRoot v-slot="{ open, close }" v-bind="rootProps">
61
+ <DialogTrigger v-if="!!slots.default" as-child :class="props.class">
57
62
  <slot :open="open"></slot>
58
63
  </DialogTrigger>
59
- <DialogPortal :disabled="!props.portal">
60
- <DialogOverlay v-if="props.overlay" :class="style.overlay({ class: props.ui?.overlay })" data-part="overlay" />
61
64
 
62
- <DialogContent :class="style.content({ class: props.ui?.content })" data-part="content" v-bind="contentProps" v-on="contentEvents" @after-leave="emit('after-leave')">
63
- <VisuallyHidden v-if="slots.content || slots.header || !props.title && !slots.title">
65
+ <DialogPortal v-bind="portalProps">
66
+ <DialogOverlay v-if="props.overlay" :class="ui.overlay({ class: props.ui?.overlay })" data-part="overlay" />
67
+
68
+ <DialogContent
69
+ :class="ui.content({ class: [props.ui?.content, !slots.default && props.class] })"
70
+ v-bind="contentProps"
71
+ data-part="content"
72
+ @after-enter="emit('after-enter')"
73
+ @after-leave="emit('after-leave')"
74
+ v-on="contentEvents"
75
+ >
76
+ <VisuallyHidden v-if="!!slots.content || !!slots.header || !props.title && !slots.title">
64
77
  <DialogTitle />
65
78
  </VisuallyHidden>
66
79
 
67
- <slot name="content">
80
+ <slot name="content" :close="close">
68
81
  <div
69
82
  v-if="slots.header || props.title || slots.title || props.description || slots.description || props.close || slots.close"
70
- :class="style.header({ class: props.ui?.header })"
83
+ :class="ui.header({ class: props.ui?.header })"
71
84
  data-part="header"
72
85
  >
73
- <slot name="header">
86
+ <slot name="header" :close="close">
74
87
  <DialogTitle
75
88
  v-if="props.title || slots.title"
76
- :class="style.title({ class: props.ui?.title })"
89
+ :class="ui.title({ class: props.ui?.title })"
77
90
  data-part="title"
78
91
  >
79
92
  <slot name="title">
@@ -82,13 +95,14 @@ const style = computed(() => generateStyle("modal", props));
82
95
  </DialogTitle>
83
96
 
84
97
  <DialogClose v-if="props.close || slots.close" as-child>
85
- <slot name="close" :ui="props.ui">
98
+ <slot name="close" :close="close" :ui="ui">
86
99
  <Button
87
100
  variant="ghost"
88
- :icon="props.closeIcon || theme.app.icons.close"
101
+ color="neutral"
102
+ :icon="props.closeIcon || appConfig.ui.icons.close"
89
103
  v-bind="typeof props.close === 'boolean' ? {} : props.close"
90
104
  :aria-label="t('modal.close')"
91
- :class="style.close({ class: props.ui?.close })"
105
+ :class="ui.close({ class: props.ui?.close })"
92
106
  data-part="close"
93
107
  />
94
108
  </slot>
@@ -96,7 +110,7 @@ const style = computed(() => generateStyle("modal", props));
96
110
 
97
111
  <DialogDescription
98
112
  v-if="props.description || slots.description"
99
- :class="style.description({ class: props.ui?.description })"
113
+ :class="ui.description({ class: props.ui?.description })"
100
114
  data-part="description"
101
115
  >
102
116
  <slot name="description">
@@ -106,12 +120,12 @@ const style = computed(() => generateStyle("modal", props));
106
120
  </slot>
107
121
  </div>
108
122
 
109
- <div v-if="slots.body" :class="style.body({ class: props.ui?.body })" data-part="body">
110
- <slot name="body"></slot>
123
+ <div v-if="slots.body" :class="ui.body({ class: props.ui?.body })" data-part="body">
124
+ <slot name="body" :close="close"></slot>
111
125
  </div>
112
126
 
113
- <div v-if="slots.footer" :class="style.footer({ class: props.ui?.footer })" data-part="footer">
114
- <slot name="footer"></slot>
127
+ <div v-if="slots.footer" :class="ui.footer({ class: props.ui?.footer })" data-part="footer">
128
+ <slot name="footer" :close="close"></slot>
115
129
  </div>
116
130
  </slot>
117
131
  </DialogContent>