@nuxt/ui 3.0.0-alpha.0 → 3.0.0-alpha.10
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.
- package/.nuxt/ui/accordion.ts +20 -0
- package/.nuxt/ui/alert.ts +242 -0
- package/.nuxt/ui/avatar-group.ts +40 -0
- package/.nuxt/ui/avatar.ts +42 -0
- package/.nuxt/ui/badge.ts +194 -0
- package/.nuxt/ui/breadcrumb.ts +45 -0
- package/.nuxt/ui/button-group.ts +16 -0
- package/.nuxt/ui/button.ts +344 -0
- package/.nuxt/ui/calendar.ts +85 -0
- package/.nuxt/ui/card.ts +8 -0
- package/.nuxt/ui/carousel.ts +41 -0
- package/.nuxt/ui/checkbox.ts +105 -0
- package/.nuxt/ui/chip.ts +67 -0
- package/.nuxt/ui/collapsible.ts +6 -0
- package/.nuxt/ui/color-picker.ts +39 -0
- package/.nuxt/ui/command-palette.ts +50 -0
- package/.nuxt/ui/container.ts +3 -0
- package/.nuxt/ui/context-menu.ts +198 -0
- package/.nuxt/ui/drawer.ts +55 -0
- package/.nuxt/ui/dropdown-menu.ts +199 -0
- package/.nuxt/ui/form-field.ts +40 -0
- package/.nuxt/ui/form.ts +3 -0
- package/.nuxt/ui/index.ts +48 -0
- package/.nuxt/ui/input-menu.ts +410 -0
- package/.nuxt/ui/input-number.ts +204 -0
- package/.nuxt/ui/input.ts +263 -0
- package/.nuxt/ui/kbd.ts +19 -0
- package/.nuxt/ui/link.ts +15 -0
- package/.nuxt/ui/modal.ts +28 -0
- package/.nuxt/ui/navigation-menu.ts +390 -0
- package/.nuxt/ui/pagination.ts +8 -0
- package/.nuxt/ui/pin-input.ts +145 -0
- package/.nuxt/ui/popover.ts +6 -0
- package/.nuxt/ui/progress.ts +258 -0
- package/.nuxt/ui/radio-group.ts +112 -0
- package/.nuxt/ui/select-menu.ts +316 -0
- package/.nuxt/ui/select.ts +315 -0
- package/.nuxt/ui/separator.ts +143 -0
- package/.nuxt/ui/skeleton.ts +3 -0
- package/.nuxt/ui/slideover.ts +63 -0
- package/.nuxt/ui/slider.ts +148 -0
- package/.nuxt/ui/stepper.ts +180 -0
- package/.nuxt/ui/switch.ts +113 -0
- package/.nuxt/ui/table.ts +129 -0
- package/.nuxt/ui/tabs.ts +227 -0
- package/.nuxt/ui/textarea.ts +263 -0
- package/.nuxt/ui/toast.ts +66 -0
- package/.nuxt/ui/toaster.ts +75 -0
- package/.nuxt/ui/tooltip.ts +9 -0
- package/README.md +75 -54
- package/cli/commands/{init.mjs → make/component.mjs} +5 -5
- package/cli/commands/make/index.mjs +14 -0
- package/cli/commands/make/locale.mjs +64 -0
- package/cli/index.mjs +2 -2
- package/cli/templates.mjs +52 -7
- package/cli/utils.mjs +14 -0
- package/dist/chunks/component-meta.cjs +82802 -0
- package/dist/chunks/component-meta.mjs +82800 -0
- package/dist/client/devtools/200.html +1 -0
- package/dist/client/devtools/404.html +1 -0
- package/dist/client/devtools/_fonts/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58UfivUw4aw-SK92LTmKP0.woff2 +0 -0
- package/dist/client/devtools/_fonts/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58UfivUw-9uYm8d48E4.woff2 +0 -0
- package/dist/client/devtools/_fonts/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K6z9mXg-VNw7NHvqnp.woff2 +0 -0
- package/dist/client/devtools/_fonts/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6z9mXgjU0-EkYdMs3MAX.woff2 +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-7DW3w-R7n06NbhGy.woff +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDG3w-leGNfkTmsj.woff +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDW3w-ciElMF03ku.woff +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JCm3w-sB722Uoa0f.woff +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JDW3w-PBDI1JDjwV.woff +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8gCm3w-0q1hqVn09O.woff +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9XCm3w-ByvzuLy2fa.woff +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9uCm3w-5TKCIs6EEw.woff +0 -0
- package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat_XDW3w-r2swRDGfn2.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAC5thTQ-ldB60l5U8r.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpthTQ-wbFKGFDrgo.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpxhTQ-LLUBv5jskj.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwARZthTQ-F71RdTRbNg.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwA_JxhTQ-6nh65gZkc0.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAfJthTQ-aMoWEJLmTt.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAkJxhTQ-WMBvmLOgKm.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAop1hTQ-utGC2hnWq2.woff +0 -0
- package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxhTQ-YpyTieVa5B.woff +0 -0
- package/dist/client/devtools/_nuxt/B1fTd_Rf.js +1 -0
- package/dist/client/devtools/_nuxt/CSUxkedg.js +1 -0
- package/dist/client/devtools/_nuxt/CbRTGpb7.js +1 -0
- package/dist/client/devtools/_nuxt/YQTlxbcT.js +53 -0
- package/dist/client/devtools/_nuxt/builds/latest.json +1 -0
- package/dist/client/devtools/_nuxt/builds/meta/b3465abc-0a92-4ee7-ba6b-e5174891fcc0.json +1 -0
- package/dist/client/devtools/_nuxt/entry.DXXceQev.css +1 -0
- package/dist/client/devtools/_nuxt/error-404.BJpkZFyY.css +1 -0
- package/dist/client/devtools/_nuxt/error-500.D3i9VDlt.css +1 -0
- package/dist/client/devtools/favicon.svg +1 -0
- package/dist/client/devtools/index.html +1 -0
- package/dist/devtools/runtime/DevtoolsRenderer.vue +54 -0
- package/dist/devtools/runtime/examples/AvatarGroupExample.vue +7 -0
- package/dist/devtools/runtime/examples/ButtonGroupExample.vue +8 -0
- package/dist/devtools/runtime/examples/CardExample.vue +13 -0
- package/dist/devtools/runtime/examples/CarouselExample.vue +13 -0
- package/dist/devtools/runtime/examples/ChipExample.vue +5 -0
- package/dist/devtools/runtime/examples/CollapsibleExample.vue +8 -0
- package/dist/devtools/runtime/examples/CommandPaletteExample.vue +29 -0
- package/dist/devtools/runtime/examples/ContainerExample.vue +5 -0
- package/dist/devtools/runtime/examples/ContextMenuExample.vue +5 -0
- package/dist/devtools/runtime/examples/DrawerExample.vue +8 -0
- package/dist/devtools/runtime/examples/DropdownMenuExample.vue +5 -0
- package/dist/devtools/runtime/examples/FormExample.vue +30 -0
- package/dist/devtools/runtime/examples/FormFieldExample.vue +5 -0
- package/dist/devtools/runtime/examples/LinkExample.vue +5 -0
- package/dist/devtools/runtime/examples/ModalExample.vue +8 -0
- package/dist/devtools/runtime/examples/PopoverExample.vue +8 -0
- package/dist/devtools/runtime/examples/SkeletonExample.vue +3 -0
- package/dist/devtools/runtime/examples/SlideoverExample.vue +8 -0
- package/dist/devtools/runtime/examples/StepperExample.vue +44 -0
- package/dist/devtools/runtime/examples/ToasterExample.vue +11 -0
- package/dist/devtools/runtime/examples/TooltipExample.vue +5 -0
- package/dist/module.cjs +223 -4
- package/dist/module.d.cts +54 -0
- package/dist/module.d.mts +38 -7
- package/dist/module.d.ts +38 -7
- package/dist/module.json +4 -3
- package/dist/module.mjs +180 -2617
- package/dist/runtime/components/Accordion.vue +95 -11
- package/dist/runtime/components/Alert.vue +69 -10
- package/dist/runtime/components/App.vue +28 -5
- package/dist/runtime/components/Avatar.vue +57 -12
- package/dist/runtime/components/AvatarGroup.vue +34 -7
- package/dist/runtime/components/Badge.vue +61 -9
- package/dist/runtime/components/Breadcrumb.vue +93 -16
- package/dist/runtime/components/Button.vue +78 -12
- package/dist/runtime/components/ButtonGroup.vue +35 -8
- package/dist/runtime/components/Calendar.vue +190 -0
- package/dist/runtime/components/Card.vue +29 -7
- package/dist/runtime/components/Carousel.vue +322 -0
- package/dist/runtime/components/Checkbox.vue +64 -30
- package/dist/runtime/components/Chip.vue +48 -8
- package/dist/runtime/components/Collapsible.vue +32 -8
- package/dist/runtime/components/ColorPicker.vue +265 -0
- package/dist/runtime/components/CommandPalette.vue +207 -88
- package/dist/runtime/components/Container.vue +26 -7
- package/dist/runtime/components/ContextMenu.vue +150 -11
- package/dist/runtime/components/ContextMenuContent.vue +63 -19
- package/dist/runtime/components/Drawer.vue +68 -15
- package/dist/runtime/components/DropdownMenu.vue +147 -12
- package/dist/runtime/components/DropdownMenuContent.vue +69 -19
- package/dist/runtime/components/Form.vue +80 -42
- package/dist/runtime/components/FormField.vue +58 -21
- package/dist/runtime/components/Icon.vue +13 -3
- package/dist/runtime/components/Input.vue +61 -12
- package/dist/runtime/components/InputMenu.vue +247 -53
- package/dist/runtime/components/InputNumber.vue +192 -0
- package/dist/runtime/components/Kbd.vue +31 -7
- package/dist/runtime/components/Link.vue +148 -21
- package/dist/runtime/components/LinkBase.vue +21 -8
- package/dist/runtime/components/Modal.vue +90 -15
- package/dist/runtime/components/NavigationMenu.vue +234 -69
- package/dist/runtime/components/Pagination.vue +124 -15
- package/dist/runtime/components/PinInput.vue +96 -0
- package/dist/runtime/components/Popover.vue +66 -11
- package/dist/runtime/components/Progress.vue +67 -12
- package/dist/runtime/components/RadioGroup.vue +78 -9
- package/dist/runtime/components/Select.vue +155 -26
- package/dist/runtime/components/SelectMenu.vue +245 -63
- package/dist/runtime/components/Separator.vue +42 -7
- package/dist/runtime/components/Skeleton.vue +22 -7
- package/dist/runtime/components/Slideover.vue +88 -15
- package/dist/runtime/components/Slider.vue +37 -7
- package/dist/runtime/components/Stepper.vue +171 -0
- package/dist/runtime/components/Switch.vue +58 -14
- package/dist/runtime/components/Table.vue +262 -0
- package/dist/runtime/components/Tabs.vue +97 -17
- package/dist/runtime/components/Textarea.vue +55 -9
- package/dist/runtime/components/Toast.vue +66 -9
- package/dist/runtime/components/Toaster.vue +57 -21
- package/dist/runtime/components/Tooltip.vue +49 -10
- package/dist/runtime/composables/defineLocale.d.ts +9 -0
- package/dist/runtime/composables/defineLocale.js +4 -0
- package/dist/runtime/composables/defineShortcuts.d.ts +1 -1
- package/dist/runtime/composables/defineShortcuts.js +2 -8
- package/dist/runtime/composables/extendDevtoolsMeta.d.ts +7 -0
- package/dist/runtime/composables/extendDevtoolsMeta.js +2 -0
- package/dist/runtime/composables/useAvatarGroup.d.ts +2 -2
- package/dist/runtime/composables/useButtonGroup.d.ts +5 -5
- package/dist/runtime/composables/useComponentIcons.d.ts +3 -0
- package/dist/runtime/composables/useFormField.d.ts +13 -6
- package/dist/runtime/composables/useFormField.js +12 -7
- package/dist/runtime/composables/useKbd.d.ts +10 -3
- package/dist/runtime/composables/useKbd.js +14 -8
- package/dist/runtime/composables/useLocale.d.ts +4 -0
- package/dist/runtime/composables/useLocale.js +10 -0
- package/dist/runtime/composables/useModal.d.ts +2 -2
- package/dist/runtime/composables/useSlideover.d.ts +2 -2
- package/dist/runtime/composables/useToast.d.ts +2 -2
- package/dist/runtime/index.css +1 -0
- package/dist/runtime/keyframes.css +1 -0
- package/dist/runtime/locale/ar.d.ts +2 -0
- package/dist/runtime/locale/ar.js +53 -0
- package/dist/runtime/locale/cs.d.ts +2 -0
- package/dist/runtime/locale/cs.js +52 -0
- package/dist/runtime/locale/de.d.ts +2 -0
- package/dist/runtime/locale/de.js +52 -0
- package/dist/runtime/locale/en.d.ts +2 -0
- package/dist/runtime/locale/en.js +52 -0
- package/dist/runtime/locale/es.d.ts +2 -0
- package/dist/runtime/locale/es.js +52 -0
- package/dist/runtime/locale/fa_ir.d.ts +2 -0
- package/dist/runtime/locale/fa_ir.js +53 -0
- package/dist/runtime/locale/fr.d.ts +2 -0
- package/dist/runtime/locale/fr.js +52 -0
- package/dist/runtime/locale/index.d.ts +19 -0
- package/dist/runtime/locale/index.js +19 -0
- package/dist/runtime/locale/it.d.ts +2 -0
- package/dist/runtime/locale/it.js +52 -0
- package/dist/runtime/locale/ja.d.ts +2 -0
- package/dist/runtime/locale/ja.js +52 -0
- package/dist/runtime/locale/ko.d.ts +2 -0
- package/dist/runtime/locale/ko.js +52 -0
- package/dist/runtime/locale/nl.d.ts +2 -0
- package/dist/runtime/locale/nl.js +52 -0
- package/dist/runtime/locale/pl.d.ts +2 -0
- package/dist/runtime/locale/pl.js +52 -0
- package/dist/runtime/locale/pt.d.ts +2 -0
- package/dist/runtime/locale/pt.js +52 -0
- package/dist/runtime/locale/pt_br.d.ts +2 -0
- package/dist/runtime/locale/pt_br.js +52 -0
- package/dist/runtime/locale/ru.d.ts +2 -0
- package/dist/runtime/locale/ru.js +52 -0
- package/dist/runtime/locale/sk.d.ts +2 -0
- package/dist/runtime/locale/sk.js +52 -0
- package/dist/runtime/locale/tr.d.ts +2 -0
- package/dist/runtime/locale/tr.js +52 -0
- package/dist/runtime/locale/zh_hans.d.ts +2 -0
- package/dist/runtime/locale/zh_hans.js +52 -0
- package/dist/runtime/locale/zh_hant.d.ts +2 -0
- package/dist/runtime/locale/zh_hant.js +52 -0
- package/dist/runtime/plugins/colors.d.ts +2 -0
- package/dist/runtime/plugins/colors.js +12 -8
- package/dist/runtime/plugins/modal.d.ts +2 -0
- package/dist/runtime/plugins/slideover.d.ts +2 -0
- package/dist/runtime/types/form.d.ts +10 -4
- package/dist/runtime/types/index.d.ts +50 -42
- package/dist/runtime/types/index.js +8 -0
- package/dist/runtime/types/locale.d.ts +54 -0
- package/dist/runtime/types/utils.d.ts +8 -3
- package/dist/runtime/utils/form.d.ts +7 -5
- package/dist/runtime/utils/form.js +117 -28
- package/dist/runtime/utils/index.d.ts +2 -1
- package/dist/runtime/utils/index.js +16 -0
- package/dist/runtime/utils/link.d.ts +25 -55
- package/dist/runtime/utils/link.js +1 -1
- package/dist/runtime/utils/locale.d.ts +15 -0
- package/dist/runtime/utils/locale.js +25 -0
- package/dist/runtime/vue/components/Icon.vue +15 -0
- package/dist/runtime/vue/components/Link.vue +208 -0
- package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
- package/dist/runtime/vue/plugins/color-mode.js +6 -0
- package/dist/runtime/vue/plugins/head.d.ts +4 -0
- package/dist/runtime/vue/plugins/head.js +6 -0
- package/dist/runtime/vue/stubs.d.ts +15 -0
- package/dist/runtime/vue/stubs.js +27 -0
- package/dist/shared/ui.CwmIkD_Y.cjs +3269 -0
- package/dist/shared/ui.D_93iuwH.mjs +3262 -0
- package/dist/unplugin.cjs +192 -0
- package/dist/unplugin.d.cts +49 -0
- package/dist/unplugin.d.mts +49 -0
- package/dist/unplugin.d.ts +49 -0
- package/dist/unplugin.mjs +181 -0
- package/dist/vite.cjs +22 -0
- package/dist/vite.d.cts +13 -0
- package/dist/vite.d.mts +13 -0
- package/dist/vite.d.ts +13 -0
- package/dist/vite.mjs +20 -0
- package/package.json +103 -37
- package/vue-plugin.d.ts +5 -0
- package/dist/runtime/assets/css/animations.css +0 -1
- package/dist/runtime/components/Accordion.vue.d.ts +0 -492
- package/dist/runtime/components/Alert.vue.d.ts +0 -548
- package/dist/runtime/components/App.vue.d.ts +0 -25
- package/dist/runtime/components/Avatar.vue.d.ts +0 -384
- package/dist/runtime/components/AvatarGroup.vue.d.ts +0 -381
- package/dist/runtime/components/Badge.vue.d.ts +0 -422
- package/dist/runtime/components/Breadcrumb.vue.d.ts +0 -307
- package/dist/runtime/components/Button.vue.d.ts +0 -949
- package/dist/runtime/components/ButtonGroup.vue.d.ts +0 -182
- package/dist/runtime/components/Card.vue.d.ts +0 -191
- package/dist/runtime/components/Checkbox.vue.d.ts +0 -819
- package/dist/runtime/components/Chip.vue.d.ts +0 -590
- package/dist/runtime/components/Collapsible.vue.d.ts +0 -159
- package/dist/runtime/components/CommandPalette.vue.d.ts +0 -684
- package/dist/runtime/components/Container.vue.d.ts +0 -27
- package/dist/runtime/components/ContextMenu.vue.d.ts +0 -796
- package/dist/runtime/components/Drawer.vue.d.ts +0 -343
- package/dist/runtime/components/DropdownMenu.vue.d.ts +0 -815
- package/dist/runtime/components/DropdownMenuContent.vue.d.ts +0 -0
- package/dist/runtime/components/Form.vue.d.ts +0 -39
- package/dist/runtime/components/FormField.vue.d.ts +0 -356
- package/dist/runtime/components/Icon.vue.d.ts +0 -17
- package/dist/runtime/components/Input.vue.d.ts +0 -1137
- package/dist/runtime/components/InputMenu.vue.d.ts +0 -2121
- package/dist/runtime/components/Kbd.vue.d.ts +0 -169
- package/dist/runtime/components/Link.vue.d.ts +0 -76
- package/dist/runtime/components/LinkBase.vue.d.ts +0 -49
- package/dist/runtime/components/Modal.vue.d.ts +0 -319
- package/dist/runtime/components/NavigationMenu.vue.d.ts +0 -1789
- package/dist/runtime/components/Pagination.vue.d.ts +0 -295
- package/dist/runtime/components/Popover.vue.d.ts +0 -197
- package/dist/runtime/components/Progress.vue.d.ts +0 -1781
- package/dist/runtime/components/RadioGroup.vue.d.ts +0 -1715
- package/dist/runtime/components/Select.vue.d.ts +0 -1569
- package/dist/runtime/components/SelectMenu.vue.d.ts +0 -1661
- package/dist/runtime/components/Separator.vue.d.ts +0 -0
- package/dist/runtime/components/Skeleton.vue.d.ts +0 -26
- package/dist/runtime/components/Slideover.vue.d.ts +0 -375
- package/dist/runtime/components/Slider.vue.d.ts +0 -0
- package/dist/runtime/components/Switch.vue.d.ts +0 -1676
- package/dist/runtime/components/Tabs.vue.d.ts +0 -934
- package/dist/runtime/components/Textarea.vue.d.ts +0 -1133
- package/dist/runtime/components/Toast.vue.d.ts +0 -0
- package/dist/runtime/components/Toaster.vue.d.ts +0 -362
- package/dist/runtime/components/Tooltip.vue.d.ts +0 -248
- package/dist/runtime/types/component.d.ts +0 -17
- package/dist/runtime/types/component.js +0 -0
- /package/dist/runtime/{components/ContextMenuContent.vue.d.ts → types/locale.js} +0 -0
|
@@ -1,16 +1,60 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { tv } from
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { tv } from 'tailwind-variants'
|
|
3
|
+
import type { PopoverRootProps, HoverCardRootProps, PopoverRootEmits, PopoverContentProps, PopoverArrowProps } from 'reka-ui'
|
|
4
|
+
import type { AppConfig } from '@nuxt/schema'
|
|
5
|
+
import _appConfig from '#build/app.config'
|
|
6
|
+
import theme from '#build/ui/popover'
|
|
7
|
+
import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
|
|
8
|
+
|
|
9
|
+
const appConfig = _appConfig as AppConfig & { ui: { popover: Partial<typeof theme> } }
|
|
10
|
+
|
|
11
|
+
const popover = tv({ extend: tv(theme), ...(appConfig.ui?.popover || {}) })
|
|
12
|
+
|
|
13
|
+
export interface PopoverProps extends PopoverRootProps, Pick<HoverCardRootProps, 'openDelay' | 'closeDelay'> {
|
|
14
|
+
/**
|
|
15
|
+
* The display mode of the popover.
|
|
16
|
+
* @defaultValue 'click'
|
|
17
|
+
*/
|
|
18
|
+
mode?: 'click' | 'hover'
|
|
19
|
+
/**
|
|
20
|
+
* The content of the popover.
|
|
21
|
+
* @defaultValue { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
|
|
22
|
+
*/
|
|
23
|
+
content?: Omit<PopoverContentProps, 'as' | 'asChild' | 'forceMount'>
|
|
24
|
+
/**
|
|
25
|
+
* Display an arrow alongside the popover.
|
|
26
|
+
* @defaultValue false
|
|
27
|
+
*/
|
|
28
|
+
arrow?: boolean | Omit<PopoverArrowProps, 'as' | 'asChild'>
|
|
29
|
+
/**
|
|
30
|
+
* Render the popover in a portal.
|
|
31
|
+
* @defaultValue true
|
|
32
|
+
*/
|
|
33
|
+
portal?: boolean
|
|
34
|
+
/**
|
|
35
|
+
* When `true`, the popover will not close when clicking outside.
|
|
36
|
+
* @defaultValue false
|
|
37
|
+
*/
|
|
38
|
+
preventClose?: boolean
|
|
39
|
+
class?: any
|
|
40
|
+
ui?: Partial<typeof popover.slots>
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface PopoverEmits extends PopoverRootEmits {}
|
|
44
|
+
|
|
45
|
+
export interface PopoverSlots {
|
|
46
|
+
default(props: { open: boolean }): any
|
|
47
|
+
content(props?: {}): any
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
extendDevtoolsMeta({ example: 'PopoverExample' })
|
|
7
51
|
</script>
|
|
8
52
|
|
|
9
53
|
<script setup lang="ts">
|
|
10
54
|
import { computed, toRef } from 'vue'
|
|
11
55
|
import { defu } from 'defu'
|
|
12
|
-
import { useForwardPropsEmits } from '
|
|
13
|
-
import { Popover, HoverCard } from '
|
|
56
|
+
import { useForwardPropsEmits } from 'reka-ui'
|
|
57
|
+
import { Popover, HoverCard } from 'reka-ui/namespaced'
|
|
14
58
|
import { reactivePick } from '@vueuse/core'
|
|
15
59
|
|
|
16
60
|
const props = withDefaults(defineProps<PopoverProps>(), {
|
|
@@ -24,7 +68,18 @@ const slots = defineSlots<PopoverSlots>()
|
|
|
24
68
|
|
|
25
69
|
const pick = props.mode === 'hover' ? reactivePick(props, 'defaultOpen', 'open', 'openDelay', 'closeDelay') : reactivePick(props, 'defaultOpen', 'open', 'modal')
|
|
26
70
|
const rootProps = useForwardPropsEmits(pick, emits)
|
|
27
|
-
const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8 }) as PopoverContentProps)
|
|
71
|
+
const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8, collisionPadding: 8 }) as PopoverContentProps)
|
|
72
|
+
const contentEvents = computed(() => {
|
|
73
|
+
if (props.preventClose) {
|
|
74
|
+
return {
|
|
75
|
+
pointerDownOutside: (e: Event) => e.preventDefault(),
|
|
76
|
+
interactOutside: (e: Event) => e.preventDefault(),
|
|
77
|
+
escapeKeyDown: (e: Event) => e.preventDefault()
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return {}
|
|
82
|
+
})
|
|
28
83
|
const arrowProps = toRef(() => props.arrow as PopoverArrowProps)
|
|
29
84
|
|
|
30
85
|
// eslint-disable-next-line vue/no-dupe-keys
|
|
@@ -37,12 +92,12 @@ const Component = computed(() => props.mode === 'hover' ? HoverCard : Popover)
|
|
|
37
92
|
|
|
38
93
|
<template>
|
|
39
94
|
<Component.Root v-slot="{ open }" v-bind="rootProps">
|
|
40
|
-
<Component.Trigger v-if="!!slots.default" as-child>
|
|
95
|
+
<Component.Trigger v-if="!!slots.default" as-child :class="props.class">
|
|
41
96
|
<slot :open="open" />
|
|
42
97
|
</Component.Trigger>
|
|
43
98
|
|
|
44
99
|
<Component.Portal :disabled="!portal">
|
|
45
|
-
<Component.Content v-bind="contentProps" :class="ui.content({ class: [props.class, props.ui?.content] })">
|
|
100
|
+
<Component.Content v-bind="contentProps" :class="ui.content({ class: [!slots.default && props.class, props.ui?.content] })" v-on="contentEvents">
|
|
46
101
|
<slot name="content" />
|
|
47
102
|
|
|
48
103
|
<Component.Arrow v-if="!!arrow" v-bind="arrowProps" :class="ui.arrow({ class: props.ui?.arrow })" />
|
|
@@ -1,15 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
<!-- eslint-disable vue/block-tag-newline -->
|
|
2
|
+
<script lang="ts">
|
|
3
|
+
import { tv, type VariantProps } from 'tailwind-variants'
|
|
4
|
+
import type { ProgressRootProps, ProgressRootEmits } from 'reka-ui'
|
|
5
|
+
import type { AppConfig } from '@nuxt/schema'
|
|
6
|
+
import _appConfig from '#build/app.config'
|
|
7
|
+
import theme from '#build/ui/progress'
|
|
8
|
+
|
|
9
|
+
const appConfig = _appConfig as AppConfig & { ui: { progress: Partial<typeof theme> } }
|
|
10
|
+
|
|
11
|
+
const progress = tv({ extend: tv(theme), ...(appConfig.ui?.progress || {}) })
|
|
12
|
+
|
|
13
|
+
type ProgressVariants = VariantProps<typeof progress>
|
|
14
|
+
|
|
15
|
+
export interface ProgressProps extends Pick<ProgressRootProps, 'getValueLabel' | 'modelValue'> {
|
|
16
|
+
/**
|
|
17
|
+
* The element or component this component should render as.
|
|
18
|
+
* @defaultValue 'div'
|
|
19
|
+
*/
|
|
20
|
+
as?: any
|
|
21
|
+
/** The maximum progress value. */
|
|
22
|
+
max?: number | Array<any>
|
|
23
|
+
/** Display the current progress value. */
|
|
24
|
+
status?: boolean
|
|
25
|
+
/** Whether the progress is visually inverted. */
|
|
26
|
+
inverted?: boolean
|
|
27
|
+
size?: ProgressVariants['size']
|
|
28
|
+
color?: ProgressVariants['color']
|
|
29
|
+
/**
|
|
30
|
+
* The orientation of the progress bar.
|
|
31
|
+
* @defaultValue 'horizontal'
|
|
32
|
+
*/
|
|
33
|
+
orientation?: ProgressVariants['orientation']
|
|
34
|
+
animation?: ProgressVariants['animation']
|
|
35
|
+
class?: any
|
|
36
|
+
ui?: Partial<typeof progress.slots>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ProgressEmits extends ProgressRootEmits {}
|
|
40
|
+
|
|
41
|
+
export type ProgressSlots = {
|
|
42
|
+
status(props: { percent?: number }): any
|
|
43
|
+
} & {
|
|
44
|
+
[key: string]: (props: { step: number }) => any
|
|
45
|
+
}
|
|
46
|
+
|
|
7
47
|
</script>
|
|
8
48
|
|
|
9
49
|
<script setup lang="ts">
|
|
10
50
|
import { computed } from 'vue'
|
|
11
|
-
import {
|
|
51
|
+
import { Primitive, ProgressRoot, ProgressIndicator, useForwardPropsEmits } from 'reka-ui'
|
|
12
52
|
import { reactivePick } from '@vueuse/core'
|
|
53
|
+
import { useLocale } from '../composables/useLocale'
|
|
13
54
|
|
|
14
55
|
const props = withDefaults(defineProps<ProgressProps>(), {
|
|
15
56
|
inverted: false,
|
|
@@ -19,7 +60,9 @@ const props = withDefaults(defineProps<ProgressProps>(), {
|
|
|
19
60
|
const emits = defineEmits<ProgressEmits>()
|
|
20
61
|
defineSlots<ProgressSlots>()
|
|
21
62
|
|
|
22
|
-
const
|
|
63
|
+
const { dir } = useLocale()
|
|
64
|
+
|
|
65
|
+
const rootProps = useForwardPropsEmits(reactivePick(props, 'getValueLabel', 'modelValue'), emits)
|
|
23
66
|
|
|
24
67
|
const isIndeterminate = computed(() => rootProps.value.modelValue === null)
|
|
25
68
|
const hasSteps = computed(() => Array.isArray(props.max))
|
|
@@ -53,8 +96,20 @@ const indicatorStyle = computed(() => {
|
|
|
53
96
|
return
|
|
54
97
|
}
|
|
55
98
|
|
|
56
|
-
|
|
57
|
-
|
|
99
|
+
if (props.orientation === 'vertical') {
|
|
100
|
+
return {
|
|
101
|
+
transform: `translateY(${props.inverted ? '' : '-'}${100 - percent.value}%)`
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
if (dir.value === 'rtl') {
|
|
105
|
+
return {
|
|
106
|
+
transform: `translateX(${props.inverted ? '-' : ''}${100 - percent.value}%)`
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
return {
|
|
110
|
+
transform: `translateX(${props.inverted ? '' : '-'}${100 - percent.value}%)`
|
|
111
|
+
}
|
|
112
|
+
}
|
|
58
113
|
}
|
|
59
114
|
})
|
|
60
115
|
|
|
@@ -104,7 +159,7 @@ const ui = computed(() => progress({
|
|
|
104
159
|
</script>
|
|
105
160
|
|
|
106
161
|
<template>
|
|
107
|
-
<
|
|
162
|
+
<Primitive :as="as" :class="ui.root({ class: [props.class, props.ui?.root] })">
|
|
108
163
|
<div v-if="!isIndeterminate && (status || $slots.status)" :class="ui.status({ class: props.ui?.status })" :style="statusStyle">
|
|
109
164
|
<slot name="status" :percent="percent">
|
|
110
165
|
{{ percent }}%
|
|
@@ -122,5 +177,5 @@ const ui = computed(() => progress({
|
|
|
122
177
|
</slot>
|
|
123
178
|
</div>
|
|
124
179
|
</div>
|
|
125
|
-
</
|
|
180
|
+
</Primitive>
|
|
126
181
|
</template>
|
|
@@ -1,19 +1,84 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { tv } from
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { tv, type VariantProps } from 'tailwind-variants'
|
|
3
|
+
import type { RadioGroupRootProps, RadioGroupRootEmits, AcceptableValue } from 'reka-ui'
|
|
4
|
+
import type { AppConfig } from '@nuxt/schema'
|
|
5
|
+
import _appConfig from '#build/app.config'
|
|
6
|
+
import theme from '#build/ui/radio-group'
|
|
7
|
+
import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
|
|
8
|
+
|
|
9
|
+
const appConfig = _appConfig as AppConfig & { ui: { radioGroup: Partial<typeof theme> } }
|
|
10
|
+
|
|
11
|
+
const radioGroup = tv({ extend: tv(theme), ...(appConfig.ui?.radioGroup || {}) })
|
|
12
|
+
|
|
13
|
+
type RadioGroupVariants = VariantProps<typeof radioGroup>
|
|
14
|
+
|
|
15
|
+
export interface RadioGroupItem {
|
|
16
|
+
label?: string
|
|
17
|
+
description?: string
|
|
18
|
+
disabled?: boolean
|
|
19
|
+
value?: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface RadioGroupProps<T> extends Pick<RadioGroupRootProps, 'defaultValue' | 'disabled' | 'loop' | 'modelValue' | 'name' | 'required'> {
|
|
23
|
+
/**
|
|
24
|
+
* The element or component this component should render as.
|
|
25
|
+
* @defaultValue 'div'
|
|
26
|
+
*/
|
|
27
|
+
as?: any
|
|
28
|
+
legend?: string
|
|
29
|
+
/**
|
|
30
|
+
* When `items` is an array of objects, select the field to use as the value.
|
|
31
|
+
* @defaultValue 'value'
|
|
32
|
+
*/
|
|
33
|
+
valueKey?: string
|
|
34
|
+
/**
|
|
35
|
+
* When `items` is an array of objects, select the field to use as the label.
|
|
36
|
+
* @defaultValue 'label'
|
|
37
|
+
*/
|
|
38
|
+
labelKey?: string
|
|
39
|
+
/**
|
|
40
|
+
* When `items` is an array of objects, select the field to use as the description.
|
|
41
|
+
* @defaultValue 'description'
|
|
42
|
+
*/
|
|
43
|
+
descriptionKey?: string
|
|
44
|
+
items?: T[]
|
|
45
|
+
size?: RadioGroupVariants['size']
|
|
46
|
+
color?: RadioGroupVariants['color']
|
|
47
|
+
/**
|
|
48
|
+
* The orientation the radio buttons are laid out.
|
|
49
|
+
* @defaultValue 'vertical'
|
|
50
|
+
*/
|
|
51
|
+
orientation?: RadioGroupRootProps['orientation']
|
|
52
|
+
class?: any
|
|
53
|
+
ui?: Partial<typeof radioGroup.slots>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type RadioGroupEmits = RadioGroupRootEmits & {
|
|
57
|
+
change: [payload: Event]
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type SlotProps<T> = (props: { item: T, modelValue?: AcceptableValue }) => any
|
|
61
|
+
|
|
62
|
+
export interface RadioGroupSlots<T> {
|
|
63
|
+
legend(props?: {}): any
|
|
64
|
+
label: SlotProps<T>
|
|
65
|
+
description: SlotProps<T>
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
extendDevtoolsMeta({ defaultProps: { items: ['Option 1', 'Option 2', 'Option 3'] } })
|
|
7
69
|
</script>
|
|
8
70
|
|
|
9
71
|
<script setup lang="ts" generic="T extends RadioGroupItem | AcceptableValue">
|
|
10
72
|
import { computed, useId } from 'vue'
|
|
11
|
-
import { RadioGroupRoot, RadioGroupItem, RadioGroupIndicator, Label, useForwardPropsEmits } from '
|
|
73
|
+
import { RadioGroupRoot, RadioGroupItem, RadioGroupIndicator, Label, useForwardPropsEmits } from 'reka-ui'
|
|
12
74
|
import { reactivePick } from '@vueuse/core'
|
|
13
75
|
import { useFormField } from '../composables/useFormField'
|
|
76
|
+
import { get } from '../utils'
|
|
14
77
|
|
|
15
78
|
const props = withDefaults(defineProps<RadioGroupProps<T>>(), {
|
|
16
79
|
valueKey: 'value',
|
|
80
|
+
labelKey: 'label',
|
|
81
|
+
descriptionKey: 'description',
|
|
17
82
|
orientation: 'vertical'
|
|
18
83
|
})
|
|
19
84
|
const emits = defineEmits<RadioGroupEmits>()
|
|
@@ -21,7 +86,7 @@ const slots = defineSlots<RadioGroupSlots<T>>()
|
|
|
21
86
|
|
|
22
87
|
const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'modelValue', 'defaultValue', 'orientation', 'loop', 'required'), emits)
|
|
23
88
|
|
|
24
|
-
const { emitFormChange, emitFormInput, color, name, size, id: _id, disabled } = useFormField<RadioGroupProps<T>>(props)
|
|
89
|
+
const { emitFormChange, emitFormInput, color, name, size, id: _id, disabled } = useFormField<RadioGroupProps<T>>(props, { bind: false })
|
|
25
90
|
const id = _id.value ?? useId()
|
|
26
91
|
|
|
27
92
|
const ui = computed(() => radioGroup({
|
|
@@ -41,11 +106,15 @@ function normalizeItem(item: any) {
|
|
|
41
106
|
}
|
|
42
107
|
}
|
|
43
108
|
|
|
44
|
-
const value = item
|
|
109
|
+
const value = get(item, props.valueKey as string)
|
|
110
|
+
const label = get(item, props.labelKey as string)
|
|
111
|
+
const description = get(item, props.descriptionKey as string)
|
|
45
112
|
|
|
46
113
|
return {
|
|
47
114
|
...item,
|
|
48
115
|
value,
|
|
116
|
+
label,
|
|
117
|
+
description,
|
|
49
118
|
id: `${id}:${value}`
|
|
50
119
|
}
|
|
51
120
|
}
|
|
@@ -1,34 +1,136 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { tv } from
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { tv, type VariantProps } from 'tailwind-variants'
|
|
3
|
+
import type { SelectRootProps, SelectRootEmits, SelectContentProps, SelectArrowProps, AcceptableValue } from 'reka-ui'
|
|
4
|
+
import type { AppConfig } from '@nuxt/schema'
|
|
5
|
+
import _appConfig from '#build/app.config'
|
|
6
|
+
import theme from '#build/ui/select'
|
|
7
|
+
import type { UseComponentIconsProps } from '../composables/useComponentIcons'
|
|
8
|
+
import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
|
|
9
|
+
import type { AvatarProps, ChipProps, InputProps } from '../types'
|
|
10
|
+
import type { PartialString, MaybeArrayOfArray, MaybeArrayOfArrayItem, SelectModelValue, SelectModelValueEmits, SelectItemKey } from '../types/utils'
|
|
11
|
+
|
|
12
|
+
const appConfig = _appConfig as AppConfig & { ui: { select: Partial<typeof theme> } }
|
|
13
|
+
|
|
14
|
+
const select = tv({ extend: tv(theme), ...(appConfig.ui?.select || {}) })
|
|
15
|
+
|
|
16
|
+
export interface SelectItem {
|
|
17
|
+
label?: string
|
|
18
|
+
icon?: string
|
|
19
|
+
avatar?: AvatarProps
|
|
20
|
+
chip?: ChipProps
|
|
21
|
+
/**
|
|
22
|
+
* The item type.
|
|
23
|
+
* @defaultValue 'item'
|
|
24
|
+
*/
|
|
25
|
+
type?: 'label' | 'separator' | 'item'
|
|
26
|
+
value?: string
|
|
27
|
+
disabled?: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type SelectVariants = VariantProps<typeof select>
|
|
31
|
+
|
|
32
|
+
export interface SelectProps<T extends MaybeArrayOfArrayItem<I>, I extends MaybeArrayOfArray<SelectItem | AcceptableValue | boolean> = MaybeArrayOfArray<SelectItem | AcceptableValue | boolean>, V extends SelectItemKey<T> | undefined = undefined, M extends boolean = false> extends Omit<SelectRootProps<T>, 'dir' | 'multiple' | 'modelValue' | 'defaultValue' | 'by'>, UseComponentIconsProps {
|
|
33
|
+
id?: string
|
|
34
|
+
/** The placeholder text when the select is empty. */
|
|
35
|
+
placeholder?: string
|
|
36
|
+
color?: SelectVariants['color']
|
|
37
|
+
variant?: SelectVariants['variant']
|
|
38
|
+
size?: SelectVariants['size']
|
|
39
|
+
/**
|
|
40
|
+
* The icon displayed to open the menu.
|
|
41
|
+
* @defaultValue appConfig.ui.icons.chevronDown
|
|
42
|
+
*/
|
|
43
|
+
trailingIcon?: string
|
|
44
|
+
/**
|
|
45
|
+
* The icon displayed when an item is selected.
|
|
46
|
+
* @defaultValue appConfig.ui.icons.check
|
|
47
|
+
*/
|
|
48
|
+
selectedIcon?: string
|
|
49
|
+
/**
|
|
50
|
+
* The content of the menu.
|
|
51
|
+
* @defaultValue { side: 'bottom', sideOffset: 8, collisionPadding: 8, position: 'popper' }
|
|
52
|
+
*/
|
|
53
|
+
content?: Omit<SelectContentProps, 'as' | 'asChild' | 'forceMount'>
|
|
54
|
+
/**
|
|
55
|
+
* Display an arrow alongside the menu.
|
|
56
|
+
* @defaultValue false
|
|
57
|
+
*/
|
|
58
|
+
arrow?: boolean | Omit<SelectArrowProps, 'as' | 'asChild'>
|
|
59
|
+
/**
|
|
60
|
+
* Render the menu in a portal.
|
|
61
|
+
* @defaultValue true
|
|
62
|
+
*/
|
|
63
|
+
portal?: boolean
|
|
64
|
+
/**
|
|
65
|
+
* When `items` is an array of objects, select the field to use as the value.
|
|
66
|
+
* @defaultValue 'value'
|
|
67
|
+
*/
|
|
68
|
+
valueKey?: V
|
|
69
|
+
/**
|
|
70
|
+
* When `items` is an array of objects, select the field to use as the label.
|
|
71
|
+
* @defaultValue 'label'
|
|
72
|
+
*/
|
|
73
|
+
labelKey?: V
|
|
74
|
+
items?: I
|
|
75
|
+
/** The value of the Select when initially rendered. Use when you do not need to control the state of the Select. */
|
|
76
|
+
defaultValue?: SelectModelValue<T, V, M, T extends { value: infer U } ? U : never>
|
|
77
|
+
/** The controlled value of the Select. Can be bind as `v-model`. */
|
|
78
|
+
modelValue?: SelectModelValue<T, V, M, T extends { value: infer U } ? U : never>
|
|
79
|
+
/** Whether multiple options can be selected or not. */
|
|
80
|
+
multiple?: M & boolean
|
|
81
|
+
/** Highlight the ring color like a focus state. */
|
|
82
|
+
highlight?: boolean
|
|
83
|
+
class?: any
|
|
84
|
+
ui?: PartialString<typeof select.slots>
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type SelectEmits<T, V, M extends boolean> = Omit<SelectRootEmits<T>, 'update:modelValue'> & {
|
|
88
|
+
change: [payload: Event]
|
|
89
|
+
blur: [payload: FocusEvent]
|
|
90
|
+
focus: [payload: FocusEvent]
|
|
91
|
+
} & SelectModelValueEmits<T, V, M, T extends { value: infer U } ? U : never>
|
|
92
|
+
|
|
93
|
+
type SlotProps<T> = (props: { item: T, index: number }) => any
|
|
94
|
+
|
|
95
|
+
export interface SelectSlots<T, M extends boolean> {
|
|
96
|
+
'leading'(props: { modelValue?: M extends true ? AcceptableValue[] : AcceptableValue, open: boolean, ui: any }): any
|
|
97
|
+
'default'(props: { modelValue?: M extends true ? AcceptableValue[] : AcceptableValue, open: boolean }): any
|
|
98
|
+
'trailing'(props: { modelValue?: M extends true ? AcceptableValue[] : AcceptableValue, open: boolean, ui: any }): any
|
|
99
|
+
'item': SlotProps<T>
|
|
100
|
+
'item-leading': SlotProps<T>
|
|
101
|
+
'item-label': SlotProps<T>
|
|
102
|
+
'item-trailing': SlotProps<T>
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
extendDevtoolsMeta({ defaultProps: { items: ['Option 1', 'Option 2', 'Option 3'] } })
|
|
7
106
|
</script>
|
|
8
107
|
|
|
9
|
-
<script setup lang="ts" generic="T extends SelectItem | AcceptableValue">
|
|
108
|
+
<script setup lang="ts" generic="T extends MaybeArrayOfArrayItem<I>, I extends MaybeArrayOfArray<SelectItem | AcceptableValue | boolean> = MaybeArrayOfArray<SelectItem | AcceptableValue | boolean>, V extends SelectItemKey<T> | undefined = undefined, M extends boolean = false">
|
|
10
109
|
import { computed, toRef } from 'vue'
|
|
11
|
-
import { SelectRoot,
|
|
110
|
+
import { SelectRoot, SelectArrow, SelectTrigger, SelectPortal, SelectContent, SelectViewport, SelectLabel, SelectGroup, SelectItem, SelectItemIndicator, SelectItemText, SelectSeparator, useForwardPropsEmits } from 'reka-ui'
|
|
12
111
|
import { defu } from 'defu'
|
|
13
112
|
import { reactivePick } from '@vueuse/core'
|
|
14
113
|
import { useAppConfig } from '#imports'
|
|
15
114
|
import { useButtonGroup } from '../composables/useButtonGroup'
|
|
16
115
|
import { useComponentIcons } from '../composables/useComponentIcons'
|
|
17
116
|
import { useFormField } from '../composables/useFormField'
|
|
117
|
+
import { get, compare } from '../utils'
|
|
18
118
|
import UIcon from './Icon.vue'
|
|
19
119
|
import UAvatar from './Avatar.vue'
|
|
20
120
|
import UChip from './Chip.vue'
|
|
21
121
|
|
|
22
|
-
const props = withDefaults(defineProps<SelectProps<T>>(), {
|
|
23
|
-
valueKey: 'value',
|
|
122
|
+
const props = withDefaults(defineProps<SelectProps<T, I, V, M>>(), {
|
|
123
|
+
valueKey: 'value' as never,
|
|
124
|
+
labelKey: 'label' as never,
|
|
24
125
|
portal: true
|
|
25
126
|
})
|
|
26
|
-
const emits = defineEmits<SelectEmits
|
|
27
|
-
const slots = defineSlots<SelectSlots<T>>()
|
|
127
|
+
const emits = defineEmits<SelectEmits<T, V, M>>()
|
|
128
|
+
const slots = defineSlots<SelectSlots<T, M>>()
|
|
28
129
|
|
|
29
130
|
const appConfig = useAppConfig()
|
|
30
|
-
const rootProps = useForwardPropsEmits(reactivePick(props, 'modelValue', 'defaultValue', 'open', 'defaultOpen', 'disabled', 'autocomplete', 'required'), emits)
|
|
31
|
-
const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8, position: 'popper' }) as SelectContentProps)
|
|
131
|
+
const rootProps = useForwardPropsEmits(reactivePick(props, 'modelValue', 'defaultValue', 'open', 'defaultOpen', 'disabled', 'autocomplete', 'required', 'multiple'), emits)
|
|
132
|
+
const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8, collisionPadding: 8, position: 'popper' }) as SelectContentProps)
|
|
133
|
+
const arrowProps = toRef(() => props.arrow as SelectArrowProps)
|
|
32
134
|
|
|
33
135
|
const { emitFormChange, emitFormInput, emitFormBlur, size: formGroupSize, color, id, name, highlight, disabled } = useFormField<InputProps>(props)
|
|
34
136
|
const { orientation, size: buttonGroupSize } = useButtonGroup<InputProps>(props)
|
|
@@ -42,12 +144,23 @@ const ui = computed(() => select({
|
|
|
42
144
|
size: selectSize?.value,
|
|
43
145
|
loading: props.loading,
|
|
44
146
|
highlight: highlight.value,
|
|
45
|
-
leading: isLeading.value || !!slots.leading,
|
|
147
|
+
leading: isLeading.value || !!props.avatar || !!slots.leading,
|
|
46
148
|
trailing: isTrailing.value || !!slots.trailing,
|
|
47
149
|
buttonGroup: orientation.value
|
|
48
150
|
}))
|
|
49
151
|
|
|
50
152
|
const groups = computed(() => props.items?.length ? (Array.isArray(props.items[0]) ? props.items : [props.items]) as SelectItem[][] : [])
|
|
153
|
+
// eslint-disable-next-line vue/no-dupe-keys
|
|
154
|
+
const items = computed(() => groups.value.flatMap(group => group) as T[])
|
|
155
|
+
|
|
156
|
+
function displayValue(value?: AcceptableValue | AcceptableValue[]): string | undefined {
|
|
157
|
+
if (props.multiple && Array.isArray(value)) {
|
|
158
|
+
return value.map(v => displayValue(v)).filter(Boolean).join(', ')
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const item = items.value.find(item => compare(typeof item === 'object' ? get(item, props.valueKey as string) : item, value))
|
|
162
|
+
return item && (typeof item === 'object' ? get(item, props.labelKey as string) : item)
|
|
163
|
+
}
|
|
51
164
|
|
|
52
165
|
function onUpdate(value: any) {
|
|
53
166
|
// @ts-expect-error - 'target' does not exist in type 'EventInit'
|
|
@@ -69,27 +182,39 @@ function onUpdateOpen(value: boolean) {
|
|
|
69
182
|
}
|
|
70
183
|
</script>
|
|
71
184
|
|
|
185
|
+
<!-- eslint-disable vue/no-template-shadow -->
|
|
72
186
|
<template>
|
|
73
187
|
<SelectRoot
|
|
74
188
|
:id="id"
|
|
75
189
|
v-slot="{ modelValue, open }"
|
|
76
190
|
v-bind="rootProps"
|
|
77
191
|
:name="name"
|
|
192
|
+
:autocomplete="autocomplete"
|
|
78
193
|
:disabled="disabled"
|
|
79
194
|
@update:model-value="onUpdate"
|
|
80
195
|
@update:open="onUpdateOpen"
|
|
81
196
|
>
|
|
82
|
-
<SelectTrigger :class="ui.base({ class: props.class })">
|
|
83
|
-
<span v-if="isLeading || !!slots.leading" :class="ui.leading({ class: props.ui?.leading })">
|
|
84
|
-
<slot name="leading" :model-value="modelValue" :open="open" :ui="ui">
|
|
85
|
-
<UIcon v-if="leadingIconName" :name="leadingIconName" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
|
|
197
|
+
<SelectTrigger :class="ui.base({ class: [props.class, props.ui?.base] })">
|
|
198
|
+
<span v-if="isLeading || !!avatar || !!slots.leading" :class="ui.leading({ class: props.ui?.leading })">
|
|
199
|
+
<slot name="leading" :model-value="(modelValue as M extends true ? AcceptableValue[] : AcceptableValue)" :open="open" :ui="ui">
|
|
200
|
+
<UIcon v-if="isLeading && leadingIconName" :name="leadingIconName" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
|
|
201
|
+
<UAvatar v-else-if="!!avatar" :size="((props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()) as AvatarProps['size'])" v-bind="avatar" :class="ui.itemLeadingAvatar({ class: props.ui?.itemLeadingAvatar })" />
|
|
86
202
|
</slot>
|
|
87
203
|
</span>
|
|
88
204
|
|
|
89
|
-
<
|
|
205
|
+
<slot :model-value="(modelValue as M extends true ? AcceptableValue[] : AcceptableValue)" :open="open">
|
|
206
|
+
<template v-for="displayedModelValue in [displayValue(modelValue)]" :key="displayedModelValue">
|
|
207
|
+
<span v-if="displayedModelValue" :class="ui.value({ class: props.ui?.value })">
|
|
208
|
+
{{ displayedModelValue }}
|
|
209
|
+
</span>
|
|
210
|
+
<span v-else :class="ui.placeholder({ class: props.ui?.placeholder })">
|
|
211
|
+
{{ placeholder ?? ' ' }}
|
|
212
|
+
</span>
|
|
213
|
+
</template>
|
|
214
|
+
</slot>
|
|
90
215
|
|
|
91
216
|
<span v-if="isTrailing || !!slots.trailing" :class="ui.trailing({ class: props.ui?.trailing })">
|
|
92
|
-
<slot name="trailing" :model-value="modelValue" :open="open" :ui="ui">
|
|
217
|
+
<slot name="trailing" :model-value="(modelValue as M extends true ? AcceptableValue[] : AcceptableValue)" :open="open" :ui="ui">
|
|
93
218
|
<UIcon v-if="trailingIconName" :name="trailingIconName" :class="ui.trailingIcon({ class: props.ui?.trailingIcon })" />
|
|
94
219
|
</slot>
|
|
95
220
|
</span>
|
|
@@ -101,19 +226,21 @@ function onUpdateOpen(value: boolean) {
|
|
|
101
226
|
<SelectGroup v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
|
|
102
227
|
<template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
|
|
103
228
|
<SelectLabel v-if="item?.type === 'label'" :class="ui.label({ class: props.ui?.label })">
|
|
104
|
-
{{ item.
|
|
229
|
+
{{ get(item, props.labelKey as string) }}
|
|
105
230
|
</SelectLabel>
|
|
231
|
+
|
|
106
232
|
<SelectSeparator v-else-if="item?.type === 'separator'" :class="ui.separator({ class: props.ui?.separator })" />
|
|
233
|
+
|
|
107
234
|
<SelectItem
|
|
108
235
|
v-else
|
|
109
236
|
:class="ui.item({ class: props.ui?.item })"
|
|
110
237
|
:disabled="item.disabled"
|
|
111
|
-
:value="typeof item === 'object' ? (item
|
|
238
|
+
:value="typeof item === 'object' ? get(item, props.valueKey as string) : item"
|
|
112
239
|
>
|
|
113
240
|
<slot name="item" :item="(item as T)" :index="index">
|
|
114
241
|
<slot name="item-leading" :item="(item as T)" :index="index">
|
|
115
|
-
<
|
|
116
|
-
<
|
|
242
|
+
<UIcon v-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: props.ui?.itemLeadingIcon })" />
|
|
243
|
+
<UAvatar v-else-if="item.avatar" :size="((props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()) as AvatarProps['size'])" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: props.ui?.itemLeadingAvatar })" />
|
|
117
244
|
<UChip
|
|
118
245
|
v-else-if="item.chip"
|
|
119
246
|
:size="((props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()) as ChipProps['size'])"
|
|
@@ -126,7 +253,7 @@ function onUpdateOpen(value: boolean) {
|
|
|
126
253
|
|
|
127
254
|
<SelectItemText :class="ui.itemLabel({ class: props.ui?.itemLabel })">
|
|
128
255
|
<slot name="item-label" :item="(item as T)" :index="index">
|
|
129
|
-
{{ typeof item === 'object' ? item.
|
|
256
|
+
{{ typeof item === 'object' ? get(item, props.labelKey as string) : item }}
|
|
130
257
|
</slot>
|
|
131
258
|
</SelectItemText>
|
|
132
259
|
|
|
@@ -142,6 +269,8 @@ function onUpdateOpen(value: boolean) {
|
|
|
142
269
|
</template>
|
|
143
270
|
</SelectGroup>
|
|
144
271
|
</SelectViewport>
|
|
272
|
+
|
|
273
|
+
<SelectArrow v-if="!!arrow" v-bind="arrowProps" :class="ui.arrow({ class: props.ui?.arrow })" />
|
|
145
274
|
</SelectContent>
|
|
146
275
|
</SelectPortal>
|
|
147
276
|
</SelectRoot>
|