@byyuurin/ui 0.0.11 → 0.2.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 (297) 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 +50 -43
  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 +99 -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/CheckboxGroup.vue +131 -0
  30. package/dist/runtime/components/CheckboxGroup.vue.d.ts +89 -0
  31. package/dist/runtime/components/Chip.vue +35 -32
  32. package/dist/runtime/components/Chip.vue.d.ts +33 -15
  33. package/dist/runtime/components/Collapsible.vue +13 -9
  34. package/dist/runtime/components/Collapsible.vue.d.ts +16 -8
  35. package/dist/runtime/components/Drawer.vue +80 -70
  36. package/dist/runtime/components/Drawer.vue.d.ts +51 -28
  37. package/dist/runtime/components/DropdownMenu.vue +23 -16
  38. package/dist/runtime/components/DropdownMenu.vue.d.ts +77 -36
  39. package/dist/runtime/components/DropdownMenuContent.vue +136 -106
  40. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +38 -26
  41. package/dist/runtime/components/FieldGroup.vue +33 -0
  42. package/dist/runtime/components/FieldGroup.vue.d.ts +33 -0
  43. package/dist/runtime/components/Form.vue +172 -88
  44. package/dist/runtime/components/Form.vue.d.ts +69 -44
  45. package/dist/runtime/components/FormField.vue +108 -0
  46. package/dist/runtime/components/FormField.vue.d.ts +63 -0
  47. package/dist/runtime/components/Icon.vue +20 -0
  48. package/dist/runtime/components/Icon.vue.d.ts +9 -0
  49. package/dist/runtime/components/Input.vue +84 -79
  50. package/dist/runtime/components/Input.vue.d.ts +55 -43
  51. package/dist/runtime/components/InputNumber.vue +66 -52
  52. package/dist/runtime/components/InputNumber.vue.d.ts +50 -109
  53. package/dist/runtime/components/InputTags.vue +155 -0
  54. package/dist/runtime/components/InputTags.vue.d.ts +85 -0
  55. package/dist/runtime/components/Kbd.vue +11 -5
  56. package/dist/runtime/components/Kbd.vue.d.ts +17 -11
  57. package/dist/runtime/components/Link.vue +54 -197
  58. package/dist/runtime/components/Link.vue.d.ts +17 -17
  59. package/dist/runtime/components/LinkBase.vue +11 -33
  60. package/dist/runtime/components/LinkBase.vue.d.ts +8 -3
  61. package/dist/runtime/components/Marquee.vue +38 -0
  62. package/dist/runtime/components/Marquee.vue.d.ts +54 -0
  63. package/dist/runtime/components/Modal.vue +53 -39
  64. package/dist/runtime/components/Modal.vue.d.ts +64 -34
  65. package/dist/runtime/components/NavigationMenu.vue +345 -0
  66. package/dist/runtime/components/NavigationMenu.vue.d.ts +216 -0
  67. package/dist/runtime/components/OverlayProvider.vue +3 -3
  68. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -1
  69. package/dist/runtime/components/Pagination.vue +39 -47
  70. package/dist/runtime/components/Pagination.vue.d.ts +54 -31
  71. package/dist/runtime/components/PinInput.vue +46 -32
  72. package/dist/runtime/components/PinInput.vue.d.ts +40 -21
  73. package/dist/runtime/components/Popover.vue +33 -19
  74. package/dist/runtime/components/Popover.vue.d.ts +57 -32
  75. package/dist/runtime/components/Progress.vue +31 -26
  76. package/dist/runtime/components/Progress.vue.d.ts +32 -23
  77. package/dist/runtime/components/RadioGroup.vue +75 -48
  78. package/dist/runtime/components/RadioGroup.vue.d.ts +58 -36
  79. package/dist/runtime/components/ScrollArea.vue +33 -31
  80. package/dist/runtime/components/ScrollArea.vue.d.ts +9 -5
  81. package/dist/runtime/components/Select.vue +166 -76
  82. package/dist/runtime/components/Select.vue.d.ts +206 -65
  83. package/dist/runtime/components/Separator.vue +42 -16
  84. package/dist/runtime/components/Separator.vue.d.ts +35 -14
  85. package/dist/runtime/components/Skeleton.vue +18 -6
  86. package/dist/runtime/components/Skeleton.vue.d.ts +4 -4
  87. package/dist/runtime/components/Slider.vue +42 -24
  88. package/dist/runtime/components/Slider.vue.d.ts +43 -27
  89. package/dist/runtime/components/Switch.vue +40 -31
  90. package/dist/runtime/components/Switch.vue.d.ts +36 -27
  91. package/dist/runtime/components/Table.vue +329 -79
  92. package/dist/runtime/components/Table.vue.d.ts +152 -66
  93. package/dist/runtime/components/Tabs.vue +70 -23
  94. package/dist/runtime/components/Tabs.vue.d.ts +61 -29
  95. package/dist/runtime/components/Textarea.vue +102 -54
  96. package/dist/runtime/components/Textarea.vue.d.ts +57 -41
  97. package/dist/runtime/components/Timeline.vue +102 -0
  98. package/dist/runtime/components/Timeline.vue.d.ts +74 -0
  99. package/dist/runtime/components/Toast.vue +84 -38
  100. package/dist/runtime/components/Toast.vue.d.ts +48 -27
  101. package/dist/runtime/components/ToastProvider.vue +31 -22
  102. package/dist/runtime/components/ToastProvider.vue.d.ts +30 -17
  103. package/dist/runtime/components/Tooltip.vue +33 -21
  104. package/dist/runtime/components/Tooltip.vue.d.ts +37 -15
  105. package/dist/runtime/composables/defineShortcuts.d.ts +16 -0
  106. package/dist/runtime/composables/defineShortcuts.js +129 -0
  107. package/dist/runtime/composables/useAvatarGroup.d.ts +8 -3
  108. package/dist/runtime/composables/useAvatarGroup.js +10 -3
  109. package/dist/runtime/composables/useComponentIcons.d.ts +9 -6
  110. package/dist/runtime/composables/useComponentIcons.js +4 -4
  111. package/dist/runtime/composables/useFieldGroup.d.ts +8 -0
  112. package/dist/runtime/composables/useFieldGroup.js +14 -0
  113. package/dist/runtime/composables/useFormField.d.ts +62 -0
  114. package/dist/runtime/composables/useFormField.js +99 -0
  115. package/dist/runtime/composables/useKbd.d.ts +3 -2
  116. package/dist/runtime/composables/useKbd.js +3 -2
  117. package/dist/runtime/composables/useLocale.d.ts +68 -5
  118. package/dist/runtime/composables/useLocale.js +11 -11
  119. package/dist/runtime/composables/useOverlay.d.ts +51 -15
  120. package/dist/runtime/composables/useOverlay.js +44 -30
  121. package/dist/runtime/composables/usePortal.d.ts +6 -0
  122. package/dist/runtime/composables/usePortal.js +17 -0
  123. package/dist/runtime/composables/useToast.d.ts +12 -5
  124. package/dist/runtime/composables/useToast.js +12 -7
  125. package/dist/runtime/locale/en.d.ts +30 -1
  126. package/dist/runtime/locale/en.js +2 -1
  127. package/dist/runtime/locale/index.d.ts +2 -2
  128. package/dist/runtime/locale/index.js +1 -1
  129. package/dist/runtime/locale/zh_tw.d.ts +31 -0
  130. package/dist/runtime/locale/{zh-tw.js → zh_tw.js} +2 -1
  131. package/dist/runtime/plugins/colors.d.ts +2 -0
  132. package/dist/runtime/plugins/colors.js +50 -0
  133. package/dist/runtime/types/app.config.d.ts +6 -0
  134. package/dist/runtime/types/form.d.ts +58 -17
  135. package/dist/runtime/types/form.js +11 -0
  136. package/dist/runtime/types/index.d.ts +56 -8
  137. package/dist/runtime/types/index.js +49 -1
  138. package/dist/runtime/types/input.d.ts +8 -0
  139. package/dist/runtime/types/locale.d.ts +5 -0
  140. package/dist/runtime/types/style.d.ts +33 -0
  141. package/dist/runtime/types/style.js +0 -0
  142. package/dist/runtime/types/unocss.d.ts +4 -0
  143. package/dist/runtime/types/utils.d.ts +41 -37
  144. package/dist/runtime/utils/form.d.ts +5 -1
  145. package/dist/runtime/utils/form.js +49 -0
  146. package/dist/runtime/utils/index.d.ts +10 -13
  147. package/dist/runtime/utils/index.js +41 -48
  148. package/dist/runtime/utils/link.d.ts +3 -2
  149. package/dist/runtime/utils/link.js +16 -2
  150. package/dist/runtime/utils/locale.d.ts +5 -0
  151. package/dist/runtime/utils/locale.js +10 -0
  152. package/dist/runtime/utils/style.d.ts +94 -0
  153. package/dist/runtime/utils/style.js +37 -0
  154. package/dist/runtime/vue/components/Icon.vue +15 -0
  155. package/dist/runtime/vue/components/Icon.vue.d.ts +7 -0
  156. package/dist/runtime/vue/components/Link.vue +163 -0
  157. package/dist/runtime/vue/components/Link.vue.d.ts +95 -0
  158. package/dist/runtime/vue/composables/useAppConfig.d.ts +1 -0
  159. package/dist/runtime/vue/composables/useAppConfig.js +4 -0
  160. package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
  161. package/dist/runtime/vue/plugins/color-mode.js +6 -0
  162. package/dist/runtime/vue/plugins/head.d.ts +4 -0
  163. package/dist/runtime/vue/plugins/head.js +9 -0
  164. package/dist/runtime/vue/stubs.d.ts +16 -1
  165. package/dist/runtime/vue/stubs.js +32 -1
  166. package/dist/setup.d.mts +13 -0
  167. package/dist/setup.mjs +12 -0
  168. package/dist/shared/ui.CzIlLITK.mjs +51 -0
  169. package/dist/shared/ui.DLOxhmP0.mjs +4242 -0
  170. package/dist/shared/ui.DpbffTXs.d.mts +84 -0
  171. package/dist/shared/ui.IulR-OYx.d.mts +64 -0
  172. package/dist/types.d.mts +3 -1
  173. package/dist/unocss.d.mts +12 -52
  174. package/dist/unocss.mjs +144 -254
  175. package/dist/unplugin.d.mts +13 -26
  176. package/dist/unplugin.mjs +193 -18
  177. package/dist/vite.d.mts +10 -1
  178. package/dist/vite.mjs +12 -3
  179. package/package.json +154 -87
  180. package/vue-plugin.d.ts +5 -0
  181. package/dist/module.d.ts +0 -13
  182. package/dist/module.mjs.map +0 -1
  183. package/dist/runtime/app/injections.d.ts +0 -9331
  184. package/dist/runtime/app/injections.js +0 -61
  185. package/dist/runtime/components/ButtonGroup.vue +0 -26
  186. package/dist/runtime/components/ButtonGroup.vue.d.ts +0 -26
  187. package/dist/runtime/components/FormItem.vue +0 -90
  188. package/dist/runtime/components/FormItem.vue.d.ts +0 -60
  189. package/dist/runtime/composables/useButtonGroup.d.ts +0 -5
  190. package/dist/runtime/composables/useButtonGroup.js +0 -9
  191. package/dist/runtime/composables/useFormItem.d.ts +0 -27
  192. package/dist/runtime/composables/useFormItem.js +0 -64
  193. package/dist/runtime/composables/useTheme.d.ts +0 -9
  194. package/dist/runtime/composables/useTheme.js +0 -23
  195. package/dist/runtime/index.d.ts +0 -44
  196. package/dist/runtime/index.js +0 -44
  197. package/dist/runtime/locale/zh-tw.d.ts +0 -2
  198. package/dist/runtime/theme/accordion.d.ts +0 -50
  199. package/dist/runtime/theme/accordion.js +0 -28
  200. package/dist/runtime/theme/alert.d.ts +0 -119
  201. package/dist/runtime/theme/alert.js +0 -47
  202. package/dist/runtime/theme/app.d.ts +0 -19
  203. package/dist/runtime/theme/app.js +0 -19
  204. package/dist/runtime/theme/avatar-group.d.ts +0 -46
  205. package/dist/runtime/theme/avatar-group.js +0 -32
  206. package/dist/runtime/theme/avatar.d.ts +0 -50
  207. package/dist/runtime/theme/avatar.js +0 -34
  208. package/dist/runtime/theme/badge.d.ts +0 -76
  209. package/dist/runtime/theme/badge.js +0 -92
  210. package/dist/runtime/theme/breadcrumb.d.ts +0 -61
  211. package/dist/runtime/theme/breadcrumb.js +0 -44
  212. package/dist/runtime/theme/button-group.d.ts +0 -60
  213. package/dist/runtime/theme/button-group.js +0 -42
  214. package/dist/runtime/theme/button.d.ts +0 -184
  215. package/dist/runtime/theme/button.js +0 -164
  216. package/dist/runtime/theme/calendar.d.ts +0 -58
  217. package/dist/runtime/theme/calendar.js +0 -86
  218. package/dist/runtime/theme/card.d.ts +0 -56
  219. package/dist/runtime/theme/card.js +0 -37
  220. package/dist/runtime/theme/carousel.d.ts +0 -107
  221. package/dist/runtime/theme/carousel.js +0 -43
  222. package/dist/runtime/theme/checkbox.d.ts +0 -82
  223. package/dist/runtime/theme/checkbox.js +0 -54
  224. package/dist/runtime/theme/chip.d.ts +0 -61
  225. package/dist/runtime/theme/chip.js +0 -66
  226. package/dist/runtime/theme/collapsible.d.ts +0 -32
  227. package/dist/runtime/theme/collapsible.js +0 -10
  228. package/dist/runtime/theme/drawer.d.ts +0 -142
  229. package/dist/runtime/theme/drawer.js +0 -113
  230. package/dist/runtime/theme/dropdown-menu.d.ts +0 -65
  231. package/dist/runtime/theme/dropdown-menu.js +0 -83
  232. package/dist/runtime/theme/form-item.d.ts +0 -70
  233. package/dist/runtime/theme/form-item.js +0 -34
  234. package/dist/runtime/theme/form.d.ts +0 -2
  235. package/dist/runtime/theme/form.js +0 -7
  236. package/dist/runtime/theme/index.d.ts +0 -41
  237. package/dist/runtime/theme/index.js +0 -41
  238. package/dist/runtime/theme/input-number.d.ts +0 -115
  239. package/dist/runtime/theme/input-number.js +0 -95
  240. package/dist/runtime/theme/input.d.ts +0 -172
  241. package/dist/runtime/theme/input.js +0 -151
  242. package/dist/runtime/theme/kbd.d.ts +0 -33
  243. package/dist/runtime/theme/kbd.js +0 -26
  244. package/dist/runtime/theme/link.d.ts +0 -38
  245. package/dist/runtime/theme/link.js +0 -26
  246. package/dist/runtime/theme/modal.d.ts +0 -42
  247. package/dist/runtime/theme/modal.js +0 -55
  248. package/dist/runtime/theme/pagination.d.ts +0 -74
  249. package/dist/runtime/theme/pagination.js +0 -17
  250. package/dist/runtime/theme/pinInput.d.ts +0 -94
  251. package/dist/runtime/theme/pinInput.js +0 -111
  252. package/dist/runtime/theme/popover.d.ts +0 -32
  253. package/dist/runtime/theme/popover.js +0 -13
  254. package/dist/runtime/theme/progress.d.ts +0 -180
  255. package/dist/runtime/theme/progress.js +0 -95
  256. package/dist/runtime/theme/radio-group.d.ts +0 -104
  257. package/dist/runtime/theme/radio-group.js +0 -61
  258. package/dist/runtime/theme/scroll-area.d.ts +0 -67
  259. package/dist/runtime/theme/scroll-area.js +0 -33
  260. package/dist/runtime/theme/select.d.ts +0 -186
  261. package/dist/runtime/theme/select.js +0 -173
  262. package/dist/runtime/theme/separator.d.ts +0 -74
  263. package/dist/runtime/theme/separator.js +0 -53
  264. package/dist/runtime/theme/skeleton.d.ts +0 -2
  265. package/dist/runtime/theme/skeleton.js +0 -7
  266. package/dist/runtime/theme/slider.d.ts +0 -70
  267. package/dist/runtime/theme/slider.js +0 -52
  268. package/dist/runtime/theme/switch.d.ts +0 -116
  269. package/dist/runtime/theme/switch.js +0 -78
  270. package/dist/runtime/theme/table.d.ts +0 -86
  271. package/dist/runtime/theme/table.js +0 -36
  272. package/dist/runtime/theme/tabs.d.ts +0 -129
  273. package/dist/runtime/theme/tabs.js +0 -146
  274. package/dist/runtime/theme/textarea.d.ts +0 -90
  275. package/dist/runtime/theme/textarea.js +0 -116
  276. package/dist/runtime/theme/toast-provider.d.ts +0 -116
  277. package/dist/runtime/theme/toast-provider.js +0 -97
  278. package/dist/runtime/theme/toast.d.ts +0 -83
  279. package/dist/runtime/theme/toast.js +0 -35
  280. package/dist/runtime/theme/tooltip.d.ts +0 -38
  281. package/dist/runtime/theme/tooltip.js +0 -11
  282. package/dist/runtime/types/components.d.ts +0 -42
  283. package/dist/runtime/utils/extend-theme.d.ts +0 -9
  284. package/dist/runtime/utils/extend-theme.js +0 -27
  285. package/dist/runtime/utils/styler.d.ts +0 -4
  286. package/dist/runtime/utils/styler.js +0 -10
  287. package/dist/runtime/utils/translator.d.ts +0 -18
  288. package/dist/runtime/utils/translator.js +0 -8
  289. package/dist/shared/ui.D1BTWZFB.mjs +0 -5
  290. package/dist/shared/ui.D1BTWZFB.mjs.map +0 -1
  291. package/dist/unocss.d.ts +0 -52
  292. package/dist/unocss.mjs.map +0 -1
  293. package/dist/unplugin.d.ts +0 -26
  294. package/dist/unplugin.mjs.map +0 -1
  295. package/dist/vite.d.ts +0 -9
  296. package/dist/vite.mjs.map +0 -1
  297. /package/dist/runtime/types/{components.js → input.js} +0 -0
@@ -1,13 +1,15 @@
1
1
  <script>
2
-
2
+ import theme from "#build/ui/drawer";
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 },
@@ -17,108 +19,116 @@ const props = defineProps({
17
19
  transition: { type: Boolean, required: false, default: true },
18
20
  direction: { type: null, required: false, default: "bottom" },
19
21
  inset: { type: Boolean, required: false },
20
- portal: { type: Boolean, required: false, default: true },
21
- close: { type: [Object, Boolean], required: false, default: true },
22
- closeIcon: { type: String, required: false },
22
+ portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
23
+ close: { type: [Boolean, Object], required: false, default: true },
24
+ closeIcon: { type: [String, Object], required: false },
23
25
  dismissible: { type: Boolean, required: false, default: true },
24
- class: { type: null, required: false },
25
26
  ui: { type: null, required: false },
27
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
26
28
  open: { type: Boolean, required: false },
27
29
  defaultOpen: { type: Boolean, required: false },
28
30
  modal: { type: Boolean, required: false, default: true }
29
31
  });
30
- const emit = defineEmits(["after-leave", "update:open"]);
32
+ const emit = defineEmits(["after-leave", "after-enter", "close-prevent", "update:open"]);
31
33
  const slots = defineSlots();
32
34
  const rootProps = useForwardPropsEmits(reactivePick(props, "open", "defaultOpen", "modal"), emit);
33
- const contentProps = toRef(() => ({
35
+ const portalProps = usePortal(toRef(() => props.portal));
36
+ const contentProps = computed(() => ({
34
37
  ...props.content,
35
- ...slots.content || slots.header || !props.description && !slots.description ? { "aria-describedby": void 0 } : {}
38
+ ...!!slots.content || !!slots.header || !props.description && !slots.description ? { "aria-describedby": void 0 } : {}
36
39
  }));
37
40
  const contentEvents = computed(() => {
38
41
  if (props.dismissible)
39
42
  return {};
40
- return {
41
- pointerDownOutside: (e) => e.preventDefault(),
42
- interactOutside: (e) => e.preventDefault(),
43
- escapeKeyDown: (e) => e.preventDefault()
44
- };
43
+ const events = ["pointerDownOutside", "interactOutside", "escapeKeyDown"];
44
+ return events.reduce((acc, curr) => {
45
+ acc[curr] = (e) => {
46
+ e.preventDefault();
47
+ emit("close-prevent");
48
+ };
49
+ return acc;
50
+ }, {});
45
51
  });
46
52
  const { t } = useLocale();
47
- const { theme, generateStyle } = useTheme();
48
- const style = computed(() => generateStyle("drawer", props));
53
+ const appConfig = useAppConfig();
54
+ const ui = computed(() => {
55
+ const styler = cv(merge(theme, appConfig.ui.drawer));
56
+ return styler(props);
57
+ });
49
58
  </script>
50
59
 
51
60
  <template>
52
- <DialogRoot v-slot="{ open }" v-bind="rootProps">
53
- <DialogTrigger v-if="slots.default" as-child :class="props.class">
61
+ <DialogRoot v-slot="{ open, close }" v-bind="rootProps">
62
+ <DialogTrigger v-if="!!slots.default" as-child :class="props.class">
54
63
  <slot :open="open"></slot>
55
64
  </DialogTrigger>
56
65
 
57
- <DialogPortal :disabled="!props.portal">
58
- <DialogOverlay v-if="props.overlay" :class="style.overlay({ class: props.ui?.overlay })" data-part="overlay" />
66
+ <DialogPortal v-bind="portalProps">
67
+ <DialogOverlay v-if="props.overlay" :class="ui.overlay({ class: props.ui?.overlay })" data-part="overlay" />
59
68
 
60
69
  <DialogContent
61
- :class="style.content({ class: [!slots.default && props.class, props.ui?.content] })"
70
+ :class="ui.content({ class: [props.ui?.content, !slots.default && props.class] })"
71
+ v-bind="contentProps"
62
72
  :data-direction="props.direction"
63
73
  data-part="content"
64
- v-bind="contentProps"
65
- v-on="contentEvents"
74
+ @after-enter="emit('after-enter')"
66
75
  @after-leave="emit('after-leave')"
76
+ v-on="contentEvents"
67
77
  >
68
- <VisuallyHidden v-if="slots.content || slots.header || !props.title && !slots.title">
78
+ <VisuallyHidden v-if="!!slots.content || !!slots.header || !props.title && !slots.title">
69
79
  <DialogTitle />
70
80
  </VisuallyHidden>
71
81
 
72
- <slot name="content">
73
- <div :class="style.container({ class: props.ui?.container })" data-part="container">
74
- <div
75
- v-if="slots.header || props.title || slots.title || props.description || slots.description || props.close || slots.close"
76
- :class="style.header({ class: props.ui?.header })"
77
- data-part="header"
78
- >
79
- <slot name="header">
80
- <DialogTitle
81
- v-if="props.title || slots.title"
82
- :class="style.title({ class: props.ui?.title })"
83
- data-part="title"
84
- >
85
- <slot name="title">
86
- {{ props.title }}
87
- </slot>
88
- </DialogTitle>
82
+ <slot name="content" :close="close">
83
+ <div
84
+ v-if="slots.header || (props.title || !!slots.title) || (props.description || !!slots.description) || (props.close || !!slots.close)"
85
+ :class="ui.header({ class: props.ui?.header })"
86
+ data-part="header"
87
+ >
88
+ <slot name="header" :close="close">
89
+ <DialogTitle
90
+ v-if="props.title || slots.title"
91
+ :class="ui.title({ class: props.ui?.title })"
92
+ data-part="title"
93
+ >
94
+ <slot name="title">
95
+ {{ props.title }}
96
+ </slot>
97
+ </DialogTitle>
89
98
 
90
- <DialogClose v-if="props.close || slots.close" as-child>
91
- <slot name="close" :ui="props.ui">
92
- <Button
93
- variant="ghost"
94
- :icon="props.closeIcon || theme.app.icons.close"
95
- v-bind="typeof props.close === 'boolean' ? {} : props.close"
96
- :aria-label="t('modal.close')"
97
- :class="style.close({ class: props.ui?.close })"
98
- data-part="close"
99
- />
100
- </slot>
101
- </DialogClose>
99
+ <DialogClose v-if="props.close || !!slots.close" as-child>
100
+ <slot name="close" :close="close" :ui="ui">
101
+ <Button
102
+ v-if="props.close"
103
+ color="neutral"
104
+ variant="ghost"
105
+ :icon="props.closeIcon || appConfig.ui.icons.close"
106
+ :aria-label="t('modal.close')"
107
+ v-bind="typeof props.close === 'object' ? props.close : {}"
108
+ :class="ui.close({ class: props.ui?.close })"
109
+ data-part="close"
110
+ />
111
+ </slot>
112
+ </DialogClose>
102
113
 
103
- <DialogDescription
104
- v-if="props.description || slots.description"
105
- :class="style.description({ class: props.ui?.description })"
106
- data-part="description"
107
- >
108
- <slot name="description">
109
- {{ props.description }}
110
- </slot>
111
- </DialogDescription>
112
- </slot>
113
- </div>
114
+ <DialogDescription
115
+ v-if="props.description || !!slots.description"
116
+ :class="ui.description({ class: props.ui?.description })"
117
+ data-part="description"
118
+ >
119
+ <slot name="description">
120
+ {{ props.description }}
121
+ </slot>
122
+ </DialogDescription>
123
+ </slot>
124
+ </div>
114
125
 
115
- <div v-if="slots.body" :class="style.body({ class: props.ui?.body })" data-part="body">
116
- <slot name="body"></slot>
117
- </div>
126
+ <div v-if="slots.body" :class="ui.body({ class: props.ui?.body })" data-part="body">
127
+ <slot name="body" :close="close"></slot>
128
+ </div>
118
129
 
119
- <div v-if="slots.footer" :class="style.footer({ class: props.ui?.footer })" data-part="footer">
120
- <slot name="footer"></slot>
121
- </div>
130
+ <div v-if="slots.footer" :class="ui.footer({ class: props.ui?.footer })" data-part="footer">
131
+ <slot name="footer" :close="close"></slot>
122
132
  </div>
123
133
  </slot>
124
134
  </DialogContent>
@@ -1,24 +1,10 @@
1
1
  import type { VariantProps } from '@byyuurin/ui-kit';
2
2
  import type { DialogContentEmits, DialogContentProps, DialogRootEmits, DialogRootProps } from 'reka-ui';
3
- import type { drawer } from '../theme/index.js';
4
- import type { ButtonProps, ComponentAttrs, EmitsToProps } from '../types/index.js';
5
- export interface DrawerEmits extends DialogRootEmits {
6
- 'after-leave': [];
7
- }
8
- export interface DrawerSlots {
9
- default?: any;
10
- content?: any;
11
- header?: any;
12
- title?: any;
13
- description?: any;
14
- close?: (props: {
15
- ui: ComponentAttrs<typeof drawer>['ui'];
16
- }) => any;
17
- body?: any;
18
- footer?: any;
19
- }
20
- type DrawerVariants = VariantProps<typeof drawer>;
21
- export interface DrawerProps extends ComponentAttrs<typeof drawer>, DialogRootProps {
3
+ import theme from '#build/ui/drawer';
4
+ import type { ButtonProps, ComponentBaseProps, ComponentStyler, ComponentUIProps, IconProps } from '../types';
5
+ import type { EmitsToProps, StaticSlot } from '../types/utils';
6
+ type ThemeVariants = VariantProps<typeof theme>;
7
+ export interface DrawerProps extends ComponentBaseProps, DialogRootProps {
22
8
  title?: string;
23
9
  description?: string;
24
10
  /** The content of the drawer. */
@@ -28,13 +14,16 @@ export interface DrawerProps extends ComponentAttrs<typeof drawer>, DialogRootPr
28
14
  * @default true
29
15
  */
30
16
  overlay?: boolean;
31
- /** @default true */
17
+ /**
18
+ * Animate the drawer when opening or closing.
19
+ * @default true
20
+ */
32
21
  transition?: boolean;
33
22
  /**
34
23
  * The direction of the drawer.
35
24
  * @default "bottom"
36
25
  */
37
- direction?: DrawerVariants['direction'];
26
+ direction?: ThemeVariants['direction'];
38
27
  /**
39
28
  * Whether to inset the drawer from the edges.
40
29
  */
@@ -43,35 +32,69 @@ export interface DrawerProps extends ComponentAttrs<typeof drawer>, DialogRootPr
43
32
  * Render the drawer in a portal.
44
33
  * @default true
45
34
  */
46
- portal?: boolean;
35
+ portal?: boolean | string | HTMLElement;
47
36
  /**
48
37
  * Display a close button to dismiss the drawer.
49
38
  * @default true
50
39
  */
51
- close?: ButtonProps | boolean;
40
+ close?: boolean | Partial<ButtonProps>;
52
41
  /** @default app.icons.close */
53
- closeIcon?: string;
42
+ closeIcon?: IconProps['name'];
54
43
  /**
55
44
  * When `false`, the drawer will not close when clicking outside or pressing escape.
56
45
  * @default true
57
46
  */
58
47
  dismissible?: boolean;
48
+ ui?: ComponentUIProps<typeof theme>;
49
+ }
50
+ export interface DrawerEmits extends DialogRootEmits {
51
+ 'after-leave': [];
52
+ 'after-enter': [];
53
+ 'close-prevent': [];
54
+ }
55
+ export interface DrawerSlots {
56
+ default: StaticSlot<{
57
+ open: boolean;
58
+ }>;
59
+ content: StaticSlot<{
60
+ close: () => void;
61
+ }>;
62
+ header: StaticSlot<{
63
+ close: () => void;
64
+ }>;
65
+ title: StaticSlot;
66
+ description: StaticSlot;
67
+ close: StaticSlot<{
68
+ close: () => void;
69
+ ui: ComponentStyler<typeof theme>;
70
+ }>;
71
+ body: StaticSlot<{
72
+ close: () => void;
73
+ }>;
74
+ footer: StaticSlot<{
75
+ close: () => void;
76
+ }>;
59
77
  }
60
- declare const _default: __VLS_WithSlots<import("vue").DefineComponent<DrawerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
78
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<DrawerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
61
79
  "update:open": (value: boolean) => any;
62
80
  "after-leave": () => any;
81
+ "after-enter": () => any;
82
+ "close-prevent": () => any;
63
83
  }, string, import("vue").PublicProps, Readonly<DrawerProps> & Readonly<{
64
84
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
65
85
  "onAfter-leave"?: (() => any) | undefined;
86
+ "onAfter-enter"?: (() => any) | undefined;
87
+ "onClose-prevent"?: (() => any) | undefined;
66
88
  }>, {
67
- close: ButtonProps | boolean;
68
89
  overlay: boolean;
69
- direction: "top" | "bottom" | "left" | "right";
90
+ close: boolean | Partial<ButtonProps>;
70
91
  transition: boolean;
92
+ direction: "top" | "right" | "bottom" | "left";
71
93
  modal: boolean;
72
- portal: boolean;
94
+ portal: boolean | string | HTMLElement;
73
95
  dismissible: boolean;
74
96
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, DrawerSlots>;
97
+ declare const _default: typeof __VLS_export;
75
98
  export default _default;
76
99
  type __VLS_WithSlots<T, S> = T & {
77
100
  new (): {
@@ -1,27 +1,29 @@
1
1
  <script>
2
-
2
+ import theme from "#build/ui/dropdown-menu";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
6
  import { reactivePick } from "@vueuse/core";
7
7
  import { DropdownMenuArrow, DropdownMenuRoot, DropdownMenuTrigger, useForwardPropsEmits } from "reka-ui";
8
8
  import { computed, toRef } from "vue";
9
- import { useTheme } from "../composables/useTheme";
9
+ import { useAppConfig } from "#imports";
10
10
  import { omit } from "../utils";
11
+ import { cv, merge } from "../utils/style";
11
12
  import DropdownMenuContent from "./DropdownMenuContent.vue";
12
13
  const props = defineProps({
13
14
  size: { type: null, required: false },
14
15
  items: { type: null, required: false },
15
- checkedIcon: { type: String, required: false },
16
- loadingIcon: { type: String, required: false },
17
- externalIcon: { type: [Boolean, String], required: false, default: true },
16
+ checkedIcon: { type: [String, Object], required: false },
17
+ loadingIcon: { type: [String, Object], required: false },
18
+ externalIcon: { type: [Boolean, String, Object], required: false, default: true },
18
19
  content: { type: Object, required: false },
19
20
  arrow: { type: [Boolean, Object], required: false },
20
- portal: { type: Boolean, required: false, default: true },
21
+ portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
21
22
  labelKey: { type: null, required: false, default: "label" },
23
+ descriptionKey: { type: null, required: false, default: "description" },
22
24
  disabled: { type: Boolean, 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
  defaultOpen: { type: Boolean, required: false },
26
28
  open: { type: Boolean, required: false },
27
29
  modal: { type: Boolean, required: false, default: true }
@@ -31,35 +33,40 @@ const slots = defineSlots();
31
33
  const rootProps = useForwardPropsEmits(reactivePick(props, "defaultOpen", "open", "modal"), emit);
32
34
  const contentProps = toRef(() => ({ side: "bottom", sideOffset: 8, collisionPadding: 8, ...props.content }));
33
35
  const arrowProps = toRef(() => props.arrow);
34
- const proxySlots = omit(slots, ["default"]);
35
- const { generateStyle } = useTheme();
36
- const style = computed(() => generateStyle("dropdownMenu", props));
36
+ const getProxySlots = () => omit(slots, ["default"]);
37
+ const appConfig = useAppConfig();
38
+ const ui = computed(() => {
39
+ const styler = cv(merge(theme, appConfig.ui.dropdownMenu));
40
+ return styler(props);
41
+ });
37
42
  </script>
38
43
 
39
44
  <template>
40
45
  <DropdownMenuRoot v-slot="{ open }" v-bind="rootProps">
41
- <DropdownMenuTrigger v-if="slots.default" as-child :class="props.class" :disabled="props.disabled">
46
+ <DropdownMenuTrigger v-if="!!slots.default" as-child :class="props.class" :disabled="props.disabled">
42
47
  <slot :open="open"></slot>
43
48
  </DropdownMenuTrigger>
44
49
 
45
50
  <DropdownMenuContent
46
- :class="style.content({ class: [!slots.default && props.class, props.ui?.content] })"
47
- data-part="content"
48
- :ui="props.ui"
49
51
  v-bind="contentProps"
50
52
  :size="props.size"
51
53
  :items="props.items"
52
54
  :portal="props.portal"
53
55
  :label-key="props.labelKey"
56
+ :description-key="props.descriptionKey"
54
57
  :checked-icon="props.checkedIcon"
55
58
  :loading-icon="props.loadingIcon"
56
59
  :external-icon="props.externalIcon"
60
+ :ui="ui"
61
+ :ui-override="props.ui"
62
+ :class="ui.content({ class: [props.ui?.content, !slots.default && props.class] })"
63
+ data-part="content"
57
64
  >
58
- <template v-for="(_, name) in proxySlots" #[name]="slotProps">
65
+ <template v-for="(_, name) in getProxySlots()" #[name]="slotProps">
59
66
  <slot :name="name" v-bind="slotProps"></slot>
60
67
  </template>
61
68
 
62
- <DropdownMenuArrow v-if="props.arrow" v-bind="arrowProps" :class="style.arrow({ class: props.ui?.arrow })" data-part="arrow" />
69
+ <DropdownMenuArrow v-if="props.arrow" v-bind="arrowProps" :class="ui.arrow({ class: props.ui?.arrow })" data-part="arrow" />
63
70
  </DropdownMenuContent>
64
71
  </DropdownMenuRoot>
65
72
  </template>
@@ -1,15 +1,19 @@
1
1
  import type { VariantProps } from '@byyuurin/ui-kit';
2
2
  import type { DropdownMenuArrowProps, DropdownMenuContentEmits, DropdownMenuContentProps, DropdownMenuRootEmits, DropdownMenuRootProps } from 'reka-ui';
3
- import type { dropdownMenu } from '../theme/index.js';
4
- import type { ArrayOrNested, AvatarProps, ComponentAttrs, DynamicSlots, EmitsToProps, KbdProps, LinkProps, MergeTypes, NestedItem } from '../types/index.js';
5
- export interface DropdownMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom' | 'underline'> {
6
- icon?: string;
3
+ import theme from '#build/ui/dropdown-menu';
4
+ import type { AvatarProps, ComponentBaseProps, ComponentStyler, ComponentUIProps, IconProps, KbdProps, LinkProps } from '../types';
5
+ import type { ArrayOrNested, DynamicSlots, EmitsToProps, GetItemKeys, MergeTypes, NestedItem, StaticSlot } from '../types/utils';
6
+ export interface DropdownMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
7
+ label?: string;
8
+ description?: string;
9
+ icon?: IconProps['name'];
10
+ color?: ThemeVariants['color'];
7
11
  avatar?: AvatarProps;
8
12
  content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>;
9
- kbds?: Array<string | KbdProps['value']>;
13
+ kbds?: KbdProps['value'][] | KbdProps[];
10
14
  /**
11
15
  * The item type.
12
- * @default 'link'
16
+ * @default "link"
13
17
  */
14
18
  type?: 'label' | 'separator' | 'link' | 'checkbox';
15
19
  slot?: string;
@@ -21,45 +25,31 @@ export interface DropdownMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'cust
21
25
  children?: ArrayOrNested<DropdownMenuItem>;
22
26
  onSelect?: (e: Event) => void;
23
27
  onUpdateChecked?: (checked: boolean) => void;
28
+ ui?: Pick<ComponentUIProps<typeof theme>, 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemWrapper' | 'itemLabel' | 'itemDescription' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
24
29
  [key: string]: any;
25
30
  }
26
- type SlotProps<T extends DropdownMenuItem> = (props: {
27
- item: T;
28
- active?: boolean;
29
- index: number;
30
- }) => any;
31
- export type DropdownMenuSlots<T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>, I extends NestedItem<T> = NestedItem<T>> = {
32
- 'default'?: (props: {
33
- open: boolean;
34
- }) => any;
35
- 'item'?: SlotProps<I>;
36
- 'item-leading'?: SlotProps<I>;
37
- 'item-label'?: SlotProps<I>;
38
- 'item-trailing'?: SlotProps<I>;
39
- } & DynamicSlots<MergeTypes<I>, 'leading' | 'label' | 'trailing', SlotProps<I>>;
40
- export interface DropdownMenuEmits extends DropdownMenuRootEmits {
41
- }
42
- type DropdownMenuVariants = VariantProps<typeof dropdownMenu>;
43
- export interface DropdownMenuProps<T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>> extends ComponentAttrs<typeof dropdownMenu>, Omit<DropdownMenuRootProps, 'dir'> {
31
+ type ThemeVariants = VariantProps<typeof theme>;
32
+ export interface DropdownMenuProps<T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>> extends ComponentBaseProps, Omit<DropdownMenuRootProps, 'dir'> {
44
33
  /** @default "md" */
45
- size?: DropdownMenuVariants['size'];
34
+ size?: ThemeVariants['size'];
46
35
  items?: T;
47
36
  /**
48
37
  * The icon displayed when an item is checked.
49
38
  * @default app.icons.check
50
39
  */
51
- checkedIcon?: string;
40
+ checkedIcon?: IconProps['name'];
52
41
  /**
53
42
  * The icon displayed when an item is loading.
54
43
  * @default app.icons.loading
55
44
  */
56
- loadingIcon?: string;
45
+ loadingIcon?: IconProps['name'];
57
46
  /**
58
47
  * The icon displayed when the item is an external link.
48
+ *
59
49
  * Set to `false` to hide the external icon.
60
50
  * @default app.icons.external
61
51
  */
62
- externalIcon?: boolean | string;
52
+ externalIcon?: boolean | IconProps['name'];
63
53
  /**
64
54
  * The content of the menu.
65
55
  * @default { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
@@ -74,26 +64,77 @@ export interface DropdownMenuProps<T extends ArrayOrNested<DropdownMenuItem> = A
74
64
  * Render the menu in a portal.
75
65
  * @default true
76
66
  */
77
- portal?: boolean;
67
+ portal?: boolean | string | HTMLElement;
78
68
  /**
79
69
  * The key used to get the label from the item.
80
70
  * @default "label"
81
71
  */
82
- labelKey?: keyof NestedItem<T>;
72
+ labelKey?: GetItemKeys<T>;
73
+ /**
74
+ * The key used to get the description from the item.
75
+ * @default "description"
76
+ */
77
+ descriptionKey?: GetItemKeys<T>;
83
78
  disabled?: boolean;
79
+ ui?: ComponentUIProps<typeof theme>;
84
80
  }
85
- declare const _default: <T extends ArrayOrNested<DropdownMenuItem>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
86
- props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
87
- readonly "onUpdate:open"?: ((payload: boolean) => any) | undefined;
88
- } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onUpdate:open"> & DropdownMenuProps<T> & Partial<{}>> & import("vue").PublicProps;
89
- expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
81
+ export interface DropdownMenuEmits extends DropdownMenuRootEmits {
82
+ }
83
+ export type DropdownMenuSlots<A extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>, T extends NestedItem<A> = NestedItem<A>> = {
84
+ 'default': StaticSlot<{
85
+ open: boolean;
86
+ }>;
87
+ 'item': StaticSlot<{
88
+ item: T;
89
+ active?: boolean;
90
+ index: number;
91
+ ui: ComponentStyler<typeof theme>;
92
+ }>;
93
+ 'item-leading': StaticSlot<{
94
+ item: T;
95
+ active?: boolean;
96
+ index: number;
97
+ ui: ComponentStyler<typeof theme>;
98
+ }>;
99
+ 'item-label': StaticSlot<{
100
+ item: T;
101
+ active?: boolean;
102
+ index: number;
103
+ }>;
104
+ 'item-description': StaticSlot<{
105
+ item: T;
106
+ active?: boolean;
107
+ index: number;
108
+ }>;
109
+ 'item-trailing': StaticSlot<{
110
+ item: T;
111
+ active?: boolean;
112
+ index: number;
113
+ ui: ComponentStyler<typeof theme>;
114
+ }>;
115
+ 'content-top': StaticSlot;
116
+ 'content-bottom': StaticSlot;
117
+ } & DynamicSlots<MergeTypes<T>, 'label' | 'description', {
118
+ active?: boolean;
119
+ index: number;
120
+ }> & DynamicSlots<MergeTypes<T>, 'leading' | 'trailing', {
121
+ active?: boolean;
122
+ index: number;
123
+ ui: ComponentStyler<typeof theme>;
124
+ }>;
125
+ declare const __VLS_export: <T extends ArrayOrNested<DropdownMenuItem>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
126
+ props: __VLS_PrettifyLocal<DropdownMenuProps<T> & {
127
+ "onUpdate:open"?: ((payload: boolean) => any) | undefined;
128
+ }> & import("vue").PublicProps;
129
+ expose: (exposed: {}) => void;
90
130
  attrs: any;
91
131
  slots: DropdownMenuSlots<T, NestedItem<T>>;
92
132
  emit: (evt: "update:open", payload: boolean) => void;
93
133
  }>) => import("vue").VNode & {
94
134
  __ctx?: Awaited<typeof __VLS_setup>;
95
135
  };
136
+ declare const _default: typeof __VLS_export;
96
137
  export default _default;
97
138
  type __VLS_PrettifyLocal<T> = {
98
- [K in keyof T]: T[K];
139
+ [K in keyof T as K]: T[K];
99
140
  } & {};