@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,92 +1,247 @@
|
|
|
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 { ComboboxRootProps, ComboboxRootEmits, ComboboxContentProps, ComboboxArrowProps, 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-menu'
|
|
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: { selectMenu: Partial<typeof theme> } }
|
|
13
|
+
|
|
14
|
+
const selectMenu = tv({ extend: tv(theme), ...(appConfig.ui?.selectMenu || {}) })
|
|
15
|
+
|
|
16
|
+
export interface SelectMenuItem {
|
|
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
|
+
disabled?: boolean
|
|
27
|
+
onSelect?(e?: Event): void
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type SelectMenuVariants = VariantProps<typeof selectMenu>
|
|
31
|
+
|
|
32
|
+
export interface SelectMenuProps<T extends MaybeArrayOfArrayItem<I>, I extends MaybeArrayOfArray<SelectMenuItem | AcceptableValue | boolean> = MaybeArrayOfArray<SelectMenuItem | AcceptableValue | boolean>, V extends SelectItemKey<T> | undefined = undefined, M extends boolean = false> extends Pick<ComboboxRootProps<T>, 'open' | 'defaultOpen' | 'disabled' | 'name' | 'resetSearchTermOnBlur' | 'highlightOnHover'>, UseComponentIconsProps {
|
|
33
|
+
id?: string
|
|
34
|
+
/** The placeholder text when the select is empty. */
|
|
35
|
+
placeholder?: string
|
|
36
|
+
/**
|
|
37
|
+
* Whether to display the search input or not.
|
|
38
|
+
* Can be an object to pass additional props to the input.
|
|
39
|
+
* `{ placeholder: 'Search...', variant: 'none' }`{lang="ts-type"}
|
|
40
|
+
* @defaultValue true
|
|
41
|
+
*/
|
|
42
|
+
searchInput?: boolean | InputProps
|
|
43
|
+
color?: SelectMenuVariants['color']
|
|
44
|
+
variant?: SelectMenuVariants['variant']
|
|
45
|
+
size?: SelectMenuVariants['size']
|
|
46
|
+
required?: boolean
|
|
47
|
+
/**
|
|
48
|
+
* The icon displayed to open the menu.
|
|
49
|
+
* @defaultValue appConfig.ui.icons.chevronDown
|
|
50
|
+
*/
|
|
51
|
+
trailingIcon?: string
|
|
52
|
+
/**
|
|
53
|
+
* The icon displayed when an item is selected.
|
|
54
|
+
* @defaultValue appConfig.ui.icons.check
|
|
55
|
+
*/
|
|
56
|
+
selectedIcon?: string
|
|
57
|
+
/**
|
|
58
|
+
* The content of the menu.
|
|
59
|
+
* @defaultValue { side: 'bottom', sideOffset: 8, collisionPadding: 8, position: 'popper' }
|
|
60
|
+
*/
|
|
61
|
+
content?: Omit<ComboboxContentProps, 'as' | 'asChild' | 'forceMount'>
|
|
62
|
+
/**
|
|
63
|
+
* Display an arrow alongside the menu.
|
|
64
|
+
* @defaultValue false
|
|
65
|
+
*/
|
|
66
|
+
arrow?: boolean | Omit<ComboboxArrowProps, 'as' | 'asChild'>
|
|
67
|
+
/**
|
|
68
|
+
* Render the menu in a portal.
|
|
69
|
+
* @defaultValue true
|
|
70
|
+
*/
|
|
71
|
+
portal?: boolean
|
|
72
|
+
/**
|
|
73
|
+
* When `items` is an array of objects, select the field to use as the value instead of the object itself.
|
|
74
|
+
* @defaultValue undefined
|
|
75
|
+
*/
|
|
76
|
+
valueKey?: V
|
|
77
|
+
/**
|
|
78
|
+
* When `items` is an array of objects, select the field to use as the label.
|
|
79
|
+
* @defaultValue 'label'
|
|
80
|
+
*/
|
|
81
|
+
labelKey?: V
|
|
82
|
+
items?: I
|
|
83
|
+
/** The value of the SelectMenu when initially rendered. Use when you do not need to control the state of the SelectMenu. */
|
|
84
|
+
defaultValue?: SelectModelValue<T, V, M>
|
|
85
|
+
/** The controlled value of the SelectMenu. Can be binded-with with `v-model`. */
|
|
86
|
+
modelValue?: SelectModelValue<T, V, M>
|
|
87
|
+
/** Whether multiple options can be selected or not. */
|
|
88
|
+
multiple?: M & boolean
|
|
89
|
+
/** Highlight the ring color like a focus state. */
|
|
90
|
+
highlight?: boolean
|
|
91
|
+
/**
|
|
92
|
+
* Determines if custom user input that does not exist in options can be added.
|
|
93
|
+
* @defaultValue false
|
|
94
|
+
*/
|
|
95
|
+
createItem?: boolean | 'always' | { position?: 'top' | 'bottom', when?: 'empty' | 'always' }
|
|
96
|
+
/**
|
|
97
|
+
* Fields to filter items by.
|
|
98
|
+
* @defaultValue [labelKey]
|
|
99
|
+
*/
|
|
100
|
+
filterFields?: string[]
|
|
101
|
+
/**
|
|
102
|
+
* When `true`, disable the default filters, useful for custom filtering (useAsyncData, useFetch, etc.).
|
|
103
|
+
* @defaultValue false
|
|
104
|
+
*/
|
|
105
|
+
ignoreFilter?: boolean
|
|
106
|
+
class?: any
|
|
107
|
+
ui?: PartialString<typeof selectMenu.slots>
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type SelectMenuEmits<T, V, M extends boolean> = Omit<ComboboxRootEmits<T>, 'update:modelValue'> & {
|
|
111
|
+
change: [payload: Event]
|
|
112
|
+
blur: [payload: FocusEvent]
|
|
113
|
+
focus: [payload: FocusEvent]
|
|
114
|
+
create: [item: string]
|
|
115
|
+
} & SelectModelValueEmits<T, V, M>
|
|
116
|
+
|
|
117
|
+
type SlotProps<T> = (props: { item: T, index: number }) => any
|
|
118
|
+
|
|
119
|
+
export interface SelectMenuSlots<T, M extends boolean> {
|
|
120
|
+
'leading'(props: { modelValue?: M extends true ? T[] : T, open: boolean, ui: any }): any
|
|
121
|
+
'default'(props: { modelValue?: M extends true ? T[] : T, open: boolean }): any
|
|
122
|
+
'trailing'(props: { modelValue?: M extends true ? T[] : T, open: boolean, ui: any }): any
|
|
123
|
+
'empty'(props: { searchTerm?: string }): any
|
|
124
|
+
'item': SlotProps<T>
|
|
125
|
+
'item-leading': SlotProps<T>
|
|
126
|
+
'item-label': SlotProps<T>
|
|
127
|
+
'item-trailing': SlotProps<T>
|
|
128
|
+
'create-item-label'(props: { item: string }): any
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
extendDevtoolsMeta({ defaultProps: { items: ['Option 1', 'Option 2', 'Option 3'] } })
|
|
7
132
|
</script>
|
|
8
133
|
|
|
9
|
-
<script setup lang="ts" generic="T extends SelectMenuItem | AcceptableValue">
|
|
10
|
-
import { computed, toRef } from 'vue'
|
|
11
|
-
import { ComboboxRoot, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxViewport, ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, useForwardPropsEmits } from '
|
|
134
|
+
<script setup lang="ts" generic="T extends MaybeArrayOfArrayItem<I>, I extends MaybeArrayOfArray<SelectMenuItem | AcceptableValue | boolean> = MaybeArrayOfArray<SelectMenuItem | AcceptableValue | boolean>, V extends SelectItemKey<T> | undefined = undefined, M extends boolean = false">
|
|
135
|
+
import { computed, toRef, toRaw } from 'vue'
|
|
136
|
+
import { ComboboxRoot, ComboboxArrow, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxViewport, ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, useForwardPropsEmits, useFilter } from 'reka-ui'
|
|
12
137
|
import { defu } from 'defu'
|
|
13
|
-
import { reactivePick } from '@vueuse/core'
|
|
138
|
+
import { reactivePick, createReusableTemplate } from '@vueuse/core'
|
|
14
139
|
import { useAppConfig } from '#imports'
|
|
15
140
|
import { useButtonGroup } from '../composables/useButtonGroup'
|
|
16
141
|
import { useComponentIcons } from '../composables/useComponentIcons'
|
|
17
142
|
import { useFormField } from '../composables/useFormField'
|
|
143
|
+
import { useLocale } from '../composables/useLocale'
|
|
144
|
+
import { get, compare } from '../utils'
|
|
18
145
|
import UIcon from './Icon.vue'
|
|
19
146
|
import UAvatar from './Avatar.vue'
|
|
20
147
|
import UChip from './Chip.vue'
|
|
21
|
-
import
|
|
148
|
+
import UInput from './Input.vue'
|
|
22
149
|
|
|
23
|
-
const props = withDefaults(defineProps<SelectMenuProps<T>>(), {
|
|
24
|
-
search: true,
|
|
150
|
+
const props = withDefaults(defineProps<SelectMenuProps<T, I, V, M>>(), {
|
|
25
151
|
portal: true,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
filter: () => ['label']
|
|
152
|
+
searchInput: true,
|
|
153
|
+
labelKey: 'label' as never
|
|
29
154
|
})
|
|
30
|
-
const emits = defineEmits<SelectMenuEmits<T>>()
|
|
31
|
-
const slots = defineSlots<SelectMenuSlots<T>>()
|
|
155
|
+
const emits = defineEmits<SelectMenuEmits<T, V, M>>()
|
|
156
|
+
const slots = defineSlots<SelectMenuSlots<T, M>>()
|
|
32
157
|
|
|
33
158
|
const searchTerm = defineModel<string>('searchTerm', { default: '' })
|
|
34
159
|
|
|
160
|
+
const { t } = useLocale()
|
|
35
161
|
const appConfig = useAppConfig()
|
|
36
|
-
const
|
|
37
|
-
|
|
162
|
+
const { contains } = useFilter({ sensitivity: 'base' })
|
|
163
|
+
|
|
164
|
+
const rootProps = useForwardPropsEmits(reactivePick(props, 'modelValue', 'defaultValue', 'open', 'defaultOpen', 'multiple', 'resetSearchTermOnBlur', 'highlightOnHover'), emits)
|
|
165
|
+
const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8, collisionPadding: 8, position: 'popper' }) as ComboboxContentProps)
|
|
166
|
+
const arrowProps = toRef(() => props.arrow as ComboboxArrowProps)
|
|
167
|
+
const searchInputProps = toRef(() => defu(props.searchInput, { placeholder: 'Search...', variant: 'none' }) as InputProps)
|
|
168
|
+
|
|
38
169
|
const { emitFormBlur, emitFormInput, emitFormChange, size: formGroupSize, color, id, name, highlight, disabled } = useFormField<InputProps>(props)
|
|
39
170
|
const { orientation, size: buttonGroupSize } = useButtonGroup<InputProps>(props)
|
|
40
171
|
const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(toRef(() => defu(props, { trailingIcon: appConfig.ui.icons.chevronDown })))
|
|
41
172
|
|
|
42
173
|
const selectSize = computed(() => buttonGroupSize.value || formGroupSize.value)
|
|
43
174
|
|
|
175
|
+
const [DefineCreateItemTemplate, ReuseCreateItemTemplate] = createReusableTemplate()
|
|
176
|
+
|
|
44
177
|
const ui = computed(() => selectMenu({
|
|
45
178
|
color: color.value,
|
|
46
179
|
variant: props.variant,
|
|
47
180
|
size: selectSize?.value,
|
|
48
181
|
loading: props.loading,
|
|
49
182
|
highlight: highlight.value,
|
|
50
|
-
leading: isLeading.value || !!slots.leading,
|
|
183
|
+
leading: isLeading.value || !!props.avatar || !!slots.leading,
|
|
51
184
|
trailing: isTrailing.value || !!slots.trailing,
|
|
52
185
|
buttonGroup: orientation.value
|
|
53
186
|
}))
|
|
54
187
|
|
|
55
|
-
function displayValue(
|
|
56
|
-
if (multiple && Array.isArray(
|
|
57
|
-
return
|
|
188
|
+
function displayValue(value: T | T[]): string {
|
|
189
|
+
if (props.multiple && Array.isArray(value)) {
|
|
190
|
+
return value.map(v => displayValue(v)).filter(Boolean).join(', ')
|
|
58
191
|
}
|
|
59
192
|
|
|
60
|
-
if (
|
|
61
|
-
return
|
|
193
|
+
if (!props.valueKey) {
|
|
194
|
+
return value && (typeof value === 'object' ? get(value, props.labelKey as string) : value)
|
|
62
195
|
}
|
|
63
196
|
|
|
64
|
-
|
|
197
|
+
const item = items.value.find(item => compare(typeof item === 'object' ? get(item, props.valueKey as string) : item, value))
|
|
198
|
+
return item && (typeof item === 'object' ? get(item, props.labelKey as string) : item)
|
|
65
199
|
}
|
|
66
200
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
201
|
+
const groups = computed(() => props.items?.length ? (Array.isArray(props.items[0]) ? props.items : [props.items]) as SelectMenuItem[][] : [])
|
|
202
|
+
// eslint-disable-next-line vue/no-dupe-keys
|
|
203
|
+
const items = computed(() => groups.value.flatMap(group => group) as T[])
|
|
204
|
+
|
|
205
|
+
const filteredGroups = computed(() => {
|
|
206
|
+
if (props.ignoreFilter || !searchTerm.value) {
|
|
207
|
+
return groups.value
|
|
70
208
|
}
|
|
71
209
|
|
|
72
|
-
const fields = Array.isArray(props.
|
|
210
|
+
const fields = Array.isArray(props.filterFields) ? props.filterFields : [props.labelKey] as string[]
|
|
73
211
|
|
|
74
|
-
return items.filter((item) => {
|
|
212
|
+
return groups.value.map(items => items.filter((item) => {
|
|
75
213
|
if (typeof item !== 'object') {
|
|
76
|
-
return
|
|
214
|
+
return contains(item, searchTerm.value)
|
|
77
215
|
}
|
|
78
216
|
|
|
79
|
-
|
|
80
|
-
|
|
217
|
+
if (item.type && ['label', 'separator'].includes(item.type)) {
|
|
218
|
+
return true
|
|
219
|
+
}
|
|
81
220
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
221
|
+
return fields.some(field => contains(get(item, field), searchTerm.value))
|
|
222
|
+
})).filter(group => group.filter(item => !item.type || !['label', 'separator'].includes(item.type)).length > 0)
|
|
223
|
+
})
|
|
224
|
+
const filteredItems = computed(() => filteredGroups.value.flatMap(group => group) as T[])
|
|
86
225
|
|
|
87
|
-
const
|
|
226
|
+
const createItem = computed(() => {
|
|
227
|
+
if (!props.createItem || !searchTerm.value) {
|
|
228
|
+
return false
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const newItem = props.valueKey ? { [props.valueKey]: searchTerm.value } as T : searchTerm.value
|
|
232
|
+
|
|
233
|
+
if ((typeof props.createItem === 'object' && props.createItem.when === 'always') || props.createItem === 'always') {
|
|
234
|
+
return !filteredItems.value.find(item => compare(item, newItem, props.valueKey))
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return !filteredItems.value.length
|
|
238
|
+
})
|
|
239
|
+
const createItemPosition = computed(() => typeof props.createItem === 'object' ? props.createItem.position : 'bottom')
|
|
88
240
|
|
|
89
241
|
function onUpdate(value: any) {
|
|
242
|
+
if (toRaw(props.modelValue) === value) {
|
|
243
|
+
return
|
|
244
|
+
}
|
|
90
245
|
// @ts-expect-error - 'target' does not exist in type 'EventInit'
|
|
91
246
|
const event = new Event('change', { target: { value } })
|
|
92
247
|
emits('change', event)
|
|
@@ -106,39 +261,57 @@ function onUpdateOpen(value: boolean) {
|
|
|
106
261
|
}
|
|
107
262
|
</script>
|
|
108
263
|
|
|
264
|
+
<!-- eslint-disable vue/no-template-shadow -->
|
|
109
265
|
<template>
|
|
266
|
+
<DefineCreateItemTemplate>
|
|
267
|
+
<ComboboxGroup :class="ui.group({ class: props.ui?.group })">
|
|
268
|
+
<ComboboxItem
|
|
269
|
+
:class="ui.item({ class: props.ui?.item })"
|
|
270
|
+
:value="searchTerm"
|
|
271
|
+
@select.prevent="emits('create', searchTerm)"
|
|
272
|
+
>
|
|
273
|
+
<span :class="ui.itemLabel({ class: props.ui?.itemLabel })">
|
|
274
|
+
<slot name="create-item-label" :item="searchTerm">
|
|
275
|
+
{{ t('selectMenu.create', { label: searchTerm }) }}
|
|
276
|
+
</slot>
|
|
277
|
+
</span>
|
|
278
|
+
</ComboboxItem>
|
|
279
|
+
</ComboboxGroup>
|
|
280
|
+
</DefineCreateItemTemplate>
|
|
281
|
+
|
|
110
282
|
<ComboboxRoot
|
|
111
283
|
:id="id"
|
|
112
284
|
v-slot="{ modelValue, open }"
|
|
113
285
|
v-bind="rootProps"
|
|
114
|
-
|
|
286
|
+
ignore-filter
|
|
115
287
|
as-child
|
|
116
288
|
:name="name"
|
|
117
289
|
:disabled="disabled"
|
|
118
|
-
:display-value="() => searchTerm"
|
|
119
|
-
:filter-function="filterFunction"
|
|
120
290
|
@update:model-value="onUpdate"
|
|
121
291
|
@update:open="onUpdateOpen"
|
|
122
292
|
>
|
|
123
293
|
<ComboboxAnchor as-child>
|
|
124
|
-
<ComboboxTrigger :class="ui.base({ class: props.class })" tabindex="0">
|
|
125
|
-
<span v-if="isLeading || !!slots.leading" :class="ui.leading({ class: props.ui?.leading })">
|
|
126
|
-
<slot name="leading" :model-value="(modelValue as T)" :open="open" :ui="ui">
|
|
127
|
-
<UIcon v-if="leadingIconName" :name="leadingIconName" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
|
|
294
|
+
<ComboboxTrigger :class="ui.base({ class: [props.class, props.ui?.base] })" tabindex="0">
|
|
295
|
+
<span v-if="isLeading || !!avatar || !!slots.leading" :class="ui.leading({ class: props.ui?.leading })">
|
|
296
|
+
<slot name="leading" :model-value="(modelValue as M extends true ? T[] : T)" :open="open" :ui="ui">
|
|
297
|
+
<UIcon v-if="isLeading && leadingIconName" :name="leadingIconName" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
|
|
298
|
+
<UAvatar v-else-if="!!avatar" :size="((props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()) as AvatarProps['size'])" v-bind="avatar" :class="ui.itemLeadingAvatar({ class: props.ui?.itemLeadingAvatar })" />
|
|
128
299
|
</slot>
|
|
129
300
|
</span>
|
|
130
301
|
|
|
131
|
-
<slot :model-value="(modelValue as T)" :open="open">
|
|
132
|
-
<
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
302
|
+
<slot :model-value="(modelValue as M extends true ? T[] : T)" :open="open">
|
|
303
|
+
<template v-for="displayedModelValue in [displayValue(modelValue as M extends true ? T[] : T)]" :key="displayedModelValue">
|
|
304
|
+
<span v-if="displayedModelValue" :class="ui.value({ class: props.ui?.value })">
|
|
305
|
+
{{ displayedModelValue }}
|
|
306
|
+
</span>
|
|
307
|
+
<span v-else :class="ui.placeholder({ class: props.ui?.placeholder })">
|
|
308
|
+
{{ placeholder ?? ' ' }}
|
|
309
|
+
</span>
|
|
310
|
+
</template>
|
|
138
311
|
</slot>
|
|
139
312
|
|
|
140
313
|
<span v-if="isTrailing || !!slots.trailing" :class="ui.trailing({ class: props.ui?.trailing })">
|
|
141
|
-
<slot name="trailing" :model-value="(modelValue as T)" :open="open" :ui="ui">
|
|
314
|
+
<slot name="trailing" :model-value="(modelValue as M extends true ? T[] : T)" :open="open" :ui="ui">
|
|
142
315
|
<UIcon v-if="trailingIconName" :name="trailingIconName" :class="ui.trailingIcon({ class: props.ui?.trailingIcon })" />
|
|
143
316
|
</slot>
|
|
144
317
|
</span>
|
|
@@ -147,19 +320,23 @@ function onUpdateOpen(value: boolean) {
|
|
|
147
320
|
|
|
148
321
|
<ComboboxPortal :disabled="!portal">
|
|
149
322
|
<ComboboxContent :class="ui.content({ class: props.ui?.content })" v-bind="contentProps">
|
|
150
|
-
<ComboboxInput v-if="
|
|
323
|
+
<ComboboxInput v-if="!!searchInput" v-model="searchTerm" :display-value="() => searchTerm" as-child>
|
|
324
|
+
<UInput autofocus autocomplete="off" v-bind="searchInputProps" :class="ui.input({ class: props.ui?.input })" />
|
|
325
|
+
</ComboboxInput>
|
|
151
326
|
|
|
152
327
|
<ComboboxEmpty :class="ui.empty({ class: props.ui?.empty })">
|
|
153
328
|
<slot name="empty" :search-term="searchTerm">
|
|
154
|
-
{{ searchTerm ?
|
|
329
|
+
{{ searchTerm ? t('selectMenu.noMatch', { searchTerm }) : t('selectMenu.noData') }}
|
|
155
330
|
</slot>
|
|
156
331
|
</ComboboxEmpty>
|
|
157
332
|
|
|
158
333
|
<ComboboxViewport :class="ui.viewport({ class: props.ui?.viewport })">
|
|
159
|
-
<
|
|
334
|
+
<ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'top'" />
|
|
335
|
+
|
|
336
|
+
<ComboboxGroup v-for="(group, groupIndex) in filteredGroups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
|
|
160
337
|
<template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
|
|
161
338
|
<ComboboxLabel v-if="item?.type === 'label'" :class="ui.label({ class: props.ui?.label })">
|
|
162
|
-
{{ item.
|
|
339
|
+
{{ get(item, props.labelKey as string) }}
|
|
163
340
|
</ComboboxLabel>
|
|
164
341
|
|
|
165
342
|
<ComboboxSeparator v-else-if="item?.type === 'separator'" :class="ui.separator({ class: props.ui?.separator })" />
|
|
@@ -168,12 +345,13 @@ function onUpdateOpen(value: boolean) {
|
|
|
168
345
|
v-else
|
|
169
346
|
:class="ui.item({ class: props.ui?.item })"
|
|
170
347
|
:disabled="item.disabled"
|
|
171
|
-
:value="valueKey && typeof item === 'object' ? (item
|
|
348
|
+
:value="valueKey && typeof item === 'object' ? get(item, props.valueKey as string) : item"
|
|
349
|
+
@select="item.onSelect"
|
|
172
350
|
>
|
|
173
351
|
<slot name="item" :item="(item as T)" :index="index">
|
|
174
352
|
<slot name="item-leading" :item="(item as T)" :index="index">
|
|
175
|
-
<
|
|
176
|
-
<
|
|
353
|
+
<UIcon v-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: props.ui?.itemLeadingIcon })" />
|
|
354
|
+
<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 })" />
|
|
177
355
|
<UChip
|
|
178
356
|
v-else-if="item.chip"
|
|
179
357
|
:size="((props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()) as ChipProps['size'])"
|
|
@@ -186,7 +364,7 @@ function onUpdateOpen(value: boolean) {
|
|
|
186
364
|
|
|
187
365
|
<span :class="ui.itemLabel({ class: props.ui?.itemLabel })">
|
|
188
366
|
<slot name="item-label" :item="(item as T)" :index="index">
|
|
189
|
-
{{
|
|
367
|
+
{{ typeof item === 'object' ? get(item, props.labelKey as string) : item }}
|
|
190
368
|
</slot>
|
|
191
369
|
</span>
|
|
192
370
|
|
|
@@ -201,7 +379,11 @@ function onUpdateOpen(value: boolean) {
|
|
|
201
379
|
</ComboboxItem>
|
|
202
380
|
</template>
|
|
203
381
|
</ComboboxGroup>
|
|
382
|
+
|
|
383
|
+
<ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'bottom'" />
|
|
204
384
|
</ComboboxViewport>
|
|
385
|
+
|
|
386
|
+
<ComboboxArrow v-if="!!arrow" v-bind="arrowProps" :class="ui.arrow({ class: props.ui?.arrow })" />
|
|
205
387
|
</ComboboxContent>
|
|
206
388
|
</ComboboxPortal>
|
|
207
389
|
</ComboboxRoot>
|
|
@@ -1,14 +1,49 @@
|
|
|
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 { SeparatorProps as _SeparatorProps } from 'reka-ui'
|
|
4
|
+
import type { AppConfig } from '@nuxt/schema'
|
|
5
|
+
import _appConfig from '#build/app.config'
|
|
6
|
+
import theme from '#build/ui/separator'
|
|
7
|
+
import type { AvatarProps } from '../types'
|
|
8
|
+
|
|
9
|
+
const appConfig = _appConfig as AppConfig & { ui: { separator: Partial<typeof theme> } }
|
|
10
|
+
|
|
11
|
+
const separator = tv({ extend: tv(theme), ...(appConfig.ui?.separator || {}) })
|
|
12
|
+
|
|
13
|
+
type SeparatorVariants = VariantProps<typeof separator>
|
|
14
|
+
|
|
15
|
+
export interface SeparatorProps extends Pick<_SeparatorProps, 'decorative'> {
|
|
16
|
+
/**
|
|
17
|
+
* The element or component this component should render as.
|
|
18
|
+
* @defaultValue 'div'
|
|
19
|
+
*/
|
|
20
|
+
as?: any
|
|
21
|
+
/** Display a label in the middle. */
|
|
22
|
+
label?: string
|
|
23
|
+
/** Display an icon in the middle. */
|
|
24
|
+
icon?: string
|
|
25
|
+
/** Display an avatar in the middle. */
|
|
26
|
+
avatar?: AvatarProps
|
|
27
|
+
color?: SeparatorVariants['color']
|
|
28
|
+
size?: SeparatorVariants['size']
|
|
29
|
+
type?: SeparatorVariants['type']
|
|
30
|
+
/**
|
|
31
|
+
* The orientation of the separator.
|
|
32
|
+
* @defaultValue 'horizontal'
|
|
33
|
+
*/
|
|
34
|
+
orientation?: _SeparatorProps['orientation']
|
|
35
|
+
class?: any
|
|
36
|
+
ui?: Partial<typeof separator.slots>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface SeparatorSlots {
|
|
40
|
+
default(props?: {}): any
|
|
41
|
+
}
|
|
7
42
|
</script>
|
|
8
43
|
|
|
9
44
|
<script setup lang="ts">
|
|
10
45
|
import { computed } from 'vue'
|
|
11
|
-
import { Separator, useForwardProps } from '
|
|
46
|
+
import { Separator, useForwardProps } from 'reka-ui'
|
|
12
47
|
import { reactivePick } from '@vueuse/core'
|
|
13
48
|
import UIcon from './Icon.vue'
|
|
14
49
|
import UAvatar from './Avatar.vue'
|
|
@@ -1,13 +1,28 @@
|
|
|
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 { AppConfig } from '@nuxt/schema'
|
|
4
|
+
import _appConfig from '#build/app.config'
|
|
5
|
+
import theme from '#build/ui/skeleton'
|
|
6
|
+
import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
|
|
7
|
+
|
|
8
|
+
const appConfig = _appConfig as AppConfig & { ui: { skeleton: Partial<typeof theme> } }
|
|
9
|
+
|
|
10
|
+
const skeleton = tv({ extend: tv(theme), ...(appConfig.ui?.skeleton || {}) })
|
|
11
|
+
|
|
12
|
+
export interface SkeletonProps {
|
|
13
|
+
/**
|
|
14
|
+
* The element or component this component should render as.
|
|
15
|
+
* @defaultValue 'div'
|
|
16
|
+
*/
|
|
17
|
+
as?: any
|
|
18
|
+
class?: any
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
extendDevtoolsMeta({ example: 'SkeletonExample' })
|
|
7
22
|
</script>
|
|
8
23
|
|
|
9
24
|
<script setup lang="ts">
|
|
10
|
-
import { Primitive } from '
|
|
25
|
+
import { Primitive } from 'reka-ui'
|
|
11
26
|
|
|
12
27
|
const props = defineProps<SkeletonProps>()
|
|
13
28
|
</script>
|