Compare commits

...

69 Commits

Author SHA1 Message Date
Benjamin Canac
98728f12ee chore(release): v2.18.5 2024-09-18 10:49:21 +02:00
renovate[bot]
ee908602ea chore(deps): update dependency tailwindcss to ^3.4.12 (dev) (#2214)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-18 10:34:42 +02:00
renovate[bot]
5d6b2d4ce1 chore(deps): update dependency date-fns to ^4.1.0 (dev) (#2212)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-17 16:48:56 +02:00
Benjamin Canac
3bfb659a65 chore(package): add missing description 2024-09-17 12:34:03 +02:00
renovate[bot]
439cadd629 chore(deps): update dependency date-fns to v4 (dev) (#2205)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-16 18:34:12 +02:00
Benjamin Canac
57d5203e6a docs(ComponentCard): put back selects after nuxt-component-meta update
Resolves nuxt/ui#2197
2024-09-16 15:26:22 +02:00
renovate[bot]
1488e20992 chore(deps): update all non-major dependencies to ^11.1.0 (dev) (#2206)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-16 15:15:36 +02:00
Dave Stewart
7f50c7031f fix(module): allow CSS variables in tailwind colors (#2014) 2024-09-16 15:15:04 +02:00
Hussam Mousa
68124de510 fix(Table): select all rows reactivity issue (#2200) 2024-09-16 12:54:43 +02:00
renovate[bot]
bae7f3f393 chore(deps): update nuxt framework to v3.13.2 (dev) (#2119)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2024-09-16 12:49:01 +02:00
renovate[bot]
5b16ccbce6 chore(deps): update all non-major dependencies (dev) (#2193)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-16 11:25:30 +02:00
Malik-Jouda
d22526c0c1 fix(Slideover): bind shadow class to panel (#2201) 2024-09-16 11:25:02 +02:00
Romain Hamel
67c6a74ed1 feat(Form): add errors slot prop (#2188) 2024-09-12 11:14:32 +02:00
Malik-Jouda
bf32baaab0 fix(Slideover): bind rounded class to panel (#2187)
Co-authored-by: malik jouda <m.jouda@approved.tech>
2024-09-12 10:42:22 +02:00
renovate[bot]
a0d94fabdf chore(deps): update all non-major dependencies (dev) (#2183)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-12 10:39:21 +02:00
Bernardo Oliveira
e8ea84a573 fix(Button): button link not showing disabled classes (#2185) 2024-09-11 18:00:45 +02:00
renovate[bot]
0274febbe7 chore(deps): update all non-major dependencies (dev) (#2175)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 16:39:40 +02:00
Benjamin Canac
af4df8a2c0 chore(renovate): update 2024-09-11 14:12:00 +02:00
Neil Richter
c850f85aaa fix(Pagination): use links on prev and next button (#2179) 2024-09-11 14:07:25 +02:00
Neil Richter
730cb4953e docs(modal): clarify file names and UModals purpose (#2178) 2024-09-11 14:07:15 +02:00
Benjamin Canac
b01f88fc47 docs(ComponentProps): remove log 2024-09-11 14:04:18 +02:00
Benjamin Canac
400c170d7b chore(renovate): update 2024-09-10 17:53:13 +02:00
Benjamin Canac
c99bd732fd chore(renovate): ignore deps only on dev branch 2024-09-10 17:45:28 +02:00
Daniel Roe
ead904fd2f fix(module): augment @nuxt/schema rather than nuxt/schema (#2171)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2024-09-10 17:40:48 +02:00
Benjamin Canac
3920dbc393 chore(renovate): add v3 label for v3 branch 2024-09-09 18:20:43 +02:00
renovate[bot]
9e7212287d chore(deps): update all non-major dependencies (dev) (#2160)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-09 18:13:20 +02:00
Benjamin Canac
686bede78b docs(deps): update nuxt-component-meta 2024-09-09 16:03:03 +02:00
Romain Hamel
7aec42ca15 fix(FormGroup): remove id when used with RadioGroup (#2152) 2024-09-06 18:59:17 +02:00
Emmanuel Ferdman
8d79eea19b fix(README): update license link (#2154)
Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>
2024-09-06 18:54:24 +02:00
Benjamin Canac
c7becccdfb chore(renovate): ignore happy-dom 2024-09-06 15:29:29 +02:00
Benjamin Canac
91e3c756a6 chore(package): remove engines 2024-09-06 15:18:15 +02:00
renovate[bot]
3036253b40 chore(deps): update dependency @tailwindcss/forms to ^0.5.9 (dev) (#2118)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-06 11:59:19 +02:00
Alex Liu
8210936f22 fix(Textarea): resolve row count calculation errors caused by scrollbar (#2040)
Co-authored-by: Romain Hamel <rom.hml@gmail.com>
2024-09-06 11:56:27 +02:00
Vann
b1f691f28c fix(Table): checkbox can emit the @select event (#2072) 2024-09-06 09:46:29 +02:00
Benjamin Canac
e495bbda94 chore(renovate): add v3 branch 2024-09-05 16:49:37 +02:00
renovate[bot]
8b4726d6d7 chore(deps): update all non-major dependencies (#2108)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-05 16:21:05 +02:00
Jonatan Wackström
82c4926c09 fix(Tabs): recalculate marker if items change (#2101) 2024-09-03 10:52:18 +02:00
Selemondev
1282a5f6c0 fix(Carousel): remove trailing space in next button icon (#2088)
Co-authored-by: selemondev-triply <selemon@triply.co>
2024-09-03 10:51:40 +02:00
renovate[bot]
5754ec565d chore(deps): update all non-major dependencies (#2079)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2024-09-03 10:50:26 +02:00
Ezra Ashenafi
82313e862c fix(Input): avoid binding value when type is file (#2047) 2024-09-03 10:49:24 +02:00
sam
0527f8db58 docs(table): use status instead of deprecated pending in useFetch and useAsyncData (#2084)
Co-authored-by: Samuel Belo <samuel.belo@devoteam.com>
2024-09-03 10:30:09 +02:00
renovate[bot]
f745550f45 chore(deps): update all non-major dependencies (#2067)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2024-08-22 23:49:03 +02:00
renovate[bot]
f5a490d98b chore(deps): update nuxt framework to ^3.13.0 (#2076)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-22 23:24:24 +02:00
kicaj
5abfc34f18 docs(radio-group): improve config section (#2046) 2024-08-22 11:13:04 +02:00
Inesh Bose
e4ba4f7c72 fix(module): consider user tailwind configPath for module as string (#2074) 2024-08-22 11:04:52 +02:00
Benjamin Canac
cff3671c2b chore(renovate): enable lockfile maintenance 2024-08-20 17:05:15 +02:00
Benjamin Canac
44e97da472 chore(renovate): ignore eslint dep 2024-08-20 12:41:34 +02:00
Benjamin Canac
79d42dd97b chore(deps): update @vueuse/* and fuse.js 2024-08-20 12:41:17 +02:00
renovate[bot]
a894a2f099 chore(deps): update devdependency @nuxt/test-utils to ^3.14.1 (#2038)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-20 12:25:47 +02:00
Benjamin Canac
b1e6d2294b docs(Footer): add link to /pro/terms 2024-08-20 11:58:16 +02:00
renovate[bot]
9ea724ea82 chore(deps): update all non-major dependencies (#2025)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-20 10:50:42 +02:00
Daniel Roe
d0d79e8a17 chore(deps): use latest versions of color-mode + router (#2056) 2024-08-16 16:36:18 +02:00
Benjamin Canac
8d9b89dec7 chore(github): put back labels in issue templates 2024-08-07 15:35:46 +02:00
renovate[bot]
c9fd1a2c7a chore(deps): update all non-major dependencies (#1997)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-07 10:23:47 +02:00
Benjamin Canac
c27124ab91 chore(renovate): ignore @nuxt/eslint-config 2024-08-06 17:40:48 +02:00
Benjamin Canac
d6658209b6 chore(release): v2.18.4 2024-08-05 14:35:54 +02:00
Hash Brown
9c04969022 fix(Tabs): use nextTick before marker calc (#2020) 2024-08-05 11:09:27 +02:00
Benjamin Canac
606c7b6567 docs: import $ui from useNuxtApp 2024-08-04 21:50:38 +02:00
Benjamin Canac
7e37668940 fix(module): suffix types imports with /index
Resolves #2018
2024-08-04 21:41:55 +02:00
Romain Hamel
4d61936e7e fix(Form): submit event data (#2012) 2024-08-04 09:49:56 +02:00
Yu Zhuohao
8ac9ca4978 fix(module): reduce css bundle size by fixing safelist regex (#2005)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2024-08-02 19:02:39 +02:00
Romain Hamel
3485092edb fix(useFormGroup): app config default input size (#2011) 2024-08-02 18:03:11 +02:00
Dave Stewart
1cc7e2a306 fix(module): handle nested colors from ui config (#2008) 2024-08-02 14:22:22 +02:00
Benjamin Canac
3411b89191 chore(renovate): remove @nuxt/module-builder and vue-tsc from ignore 2024-07-30 12:51:31 +02:00
Benjamin Canac
1b869dc1fb chore(release): v2.18.3 2024-07-30 12:36:44 +02:00
renovate[bot]
4ae6e31bd9 chore(deps): update devdependency @nuxt/test-utils to ^3.14.0 (#1989)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-30 12:27:13 +02:00
Benjamin Canac
69f605fa72 fix(Link): define rel as any 2024-07-30 12:26:39 +02:00
Benjamin Canac
93ddf1d60b fix(types): only use .ts for index 2024-07-30 11:14:43 +02:00
renovate[bot]
03c5820f5d chore(deps): update all non-major dependencies (#1975)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-30 11:03:34 +02:00
110 changed files with 2840 additions and 2438 deletions

View File

@@ -1,6 +1,6 @@
name: "🐛 Bug report" name: "🐛 Bug report"
description: Report a bug to help us improve the module. description: Report a bug to help us improve the module.
labels: ["triage"] labels: ["triage", "bug"]
body: body:
- type: markdown - type: markdown
attributes: attributes:

View File

@@ -1,6 +1,6 @@
name: "🚀 Feature request" name: "🚀 Feature request"
description: Suggest an idea or enhancement for the module. description: Suggest an idea or enhancement for the module.
labels: ["triage"] labels: ["triage", "enhancement"]
body: body:
- type: markdown - type: markdown
attributes: attributes:

View File

@@ -1,5 +1,51 @@
# Changelog # Changelog
## [2.18.5](https://github.com/nuxt/ui/compare/v2.18.4...v2.18.5) (2024-09-18)
### Features
* **Form:** add errors slot prop ([#2188](https://github.com/nuxt/ui/issues/2188)) ([67c6a74](https://github.com/nuxt/ui/commit/67c6a74ed15db1ee8a40e9c74ecfef0d3c3e374a))
### Bug Fixes
* **Button:** button link not showing disabled classes ([#2185](https://github.com/nuxt/ui/issues/2185)) ([e8ea84a](https://github.com/nuxt/ui/commit/e8ea84a5736759d953664f8f397a2339c212b294))
* **Carousel:** remove trailing space in next button icon ([#2088](https://github.com/nuxt/ui/issues/2088)) ([1282a5f](https://github.com/nuxt/ui/commit/1282a5f6c001aa05597d458800bafcf6b6419634))
* **FormGroup:** remove id when used with `RadioGroup` ([#2152](https://github.com/nuxt/ui/issues/2152)) ([7aec42c](https://github.com/nuxt/ui/commit/7aec42ca15aaa0ccc63c520b484cba203fd3232b))
* **Input:** avoid binding value when type is `file` ([#2047](https://github.com/nuxt/ui/issues/2047)) ([82313e8](https://github.com/nuxt/ui/commit/82313e862cbf21ae631156af4cd057f1383db634))
* **module:** allow CSS variables in tailwind colors ([#2014](https://github.com/nuxt/ui/issues/2014)) ([7f50c70](https://github.com/nuxt/ui/commit/7f50c7031fecb5ab26a6d0f58b576b2fd0860487))
* **module:** augment `@nuxt/schema` rather than `nuxt/schema` ([#2171](https://github.com/nuxt/ui/issues/2171)) ([ead904f](https://github.com/nuxt/ui/commit/ead904fd2f2bbb29fd60ccde063bf02daa2cbdbb))
* **module:** consider user tailwind `configPath` for module as string ([#2074](https://github.com/nuxt/ui/issues/2074)) ([e4ba4f7](https://github.com/nuxt/ui/commit/e4ba4f7c729f99dde51891636605793864812d30))
* **Pagination:** use links on prev and next button ([#2179](https://github.com/nuxt/ui/issues/2179)) ([c850f85](https://github.com/nuxt/ui/commit/c850f85aaa40c7abbe8cc4dc1bd4705bf7677390))
* **README:** update license link ([#2154](https://github.com/nuxt/ui/issues/2154)) ([8d79eea](https://github.com/nuxt/ui/commit/8d79eea19b3276b1f1e069d33b98b311e9b91cfd))
* **Slideover:** bind `rounded` class to panel ([#2187](https://github.com/nuxt/ui/issues/2187)) ([bf32baa](https://github.com/nuxt/ui/commit/bf32baaab01dc4150622f67b3b4a8d02d21b922c))
* **Slideover:** bind `shadow` class to panel ([#2201](https://github.com/nuxt/ui/issues/2201)) ([d22526c](https://github.com/nuxt/ui/commit/d22526c0c10735a92e63b7d086e7b8534a08d768))
* **Table:** checkbox can emit the `[@select](https://github.com/select)` event ([#2072](https://github.com/nuxt/ui/issues/2072)) ([b1f691f](https://github.com/nuxt/ui/commit/b1f691f28ca8c94f6b658dcb61eeff06951bd1d0))
* **Table:** select all rows reactivity issue ([#2200](https://github.com/nuxt/ui/issues/2200)) ([68124de](https://github.com/nuxt/ui/commit/68124de5106e55cb2987a6ba4ec1120d79b51788))
* **Tabs:** recalculate marker if items change ([#2101](https://github.com/nuxt/ui/issues/2101)) ([82c4926](https://github.com/nuxt/ui/commit/82c4926c090ce7fac48022a93b1b05b877bb48dd))
* **Textarea:** resolve row count calculation errors caused by scrollbar ([#2040](https://github.com/nuxt/ui/issues/2040)) ([8210936](https://github.com/nuxt/ui/commit/8210936f22fcf6b7eb5b9711e2c29be38956b8d6))
## [2.18.4](https://github.com/nuxt/ui/compare/v2.18.3...v2.18.4) (2024-08-05)
### Bug Fixes
* **Form:** submit event data ([#2012](https://github.com/nuxt/ui/issues/2012)) ([4d61936](https://github.com/nuxt/ui/commit/4d61936e7e90b664846a8f265825612c509511d7))
* **module:** handle nested colors from ui config ([#2008](https://github.com/nuxt/ui/issues/2008)) ([1cc7e2a](https://github.com/nuxt/ui/commit/1cc7e2a306e0f3f666b9a588f6ed02e7eabc0272))
* **module:** reduce css bundle size by fixing safelist regex ([#2005](https://github.com/nuxt/ui/issues/2005)) ([8ac9ca4](https://github.com/nuxt/ui/commit/8ac9ca49789a9a7281f7a40926e7e9a8068cc395))
* **module:** suffix types imports with `/index` ([7e37668](https://github.com/nuxt/ui/commit/7e37668940d06c5aa20b60d9bfd600d50a171014)), closes [#2018](https://github.com/nuxt/ui/issues/2018)
* **Tabs:** use `nextTick` before marker calc ([#2020](https://github.com/nuxt/ui/issues/2020)) ([9c04969](https://github.com/nuxt/ui/commit/9c049690227af8aba61a1f7c002b00c5dfeb63ff))
* **useFormGroup:** app config default input size ([#2011](https://github.com/nuxt/ui/issues/2011)) ([3485092](https://github.com/nuxt/ui/commit/3485092edb55f9ef2ca038a8c137431866d6c28a))
## [2.18.3](https://github.com/nuxt/ui/compare/v2.18.2...v2.18.3) (2024-07-30)
### Bug Fixes
* **Link:** define `rel` as any ([69f605f](https://github.com/nuxt/ui/commit/69f605fa724454e4be9e4cee9666a5d57f43a129))
* **types:** only use `.ts` for index ([93ddf1d](https://github.com/nuxt/ui/commit/93ddf1d60b0ea5f99f564f3d3969c397ad91cc72))
## [2.18.2](https://github.com/nuxt/ui/compare/v2.18.1...v2.18.2) (2024-07-25) ## [2.18.2](https://github.com/nuxt/ui/compare/v2.18.1...v2.18.2) (2024-07-25)

View File

@@ -77,7 +77,7 @@ Licensed under the [MIT license](https://github.com/nuxt/ui/blob/dev/LICENSE.md)
[npm-downloads-href]: https://npmjs.com/package/@nuxt/ui [npm-downloads-href]: https://npmjs.com/package/@nuxt/ui
[license-src]: https://img.shields.io/github/license/nuxt/ui.svg?style=flat&colorA=18181B&colorB=28CF8D [license-src]: https://img.shields.io/github/license/nuxt/ui.svg?style=flat&colorA=18181B&colorB=28CF8D
[license-href]: https://github.com/nuxt/ui/blob/main/LICENSE [license-href]: https://github.com/nuxt/ui/blob/main/LICENSE.md
[nuxt-src]: https://img.shields.io/badge/Nuxt-18181B?logo=nuxt.js [nuxt-src]: https://img.shields.io/badge/Nuxt-18181B?logo=nuxt.js
[nuxt-href]: https://nuxt.com [nuxt-href]: https://nuxt.com

View File

@@ -25,6 +25,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const { $ui } = useNuxtApp()
const links = [{ const links = [{
icon: 'i-simple-icons-figma', icon: 'i-simple-icons-figma',
label: 'Figma Kit', label: 'Figma Kit',
@@ -43,5 +45,8 @@ const links = [{
label: 'Releases', label: 'Releases',
icon: 'i-heroicons-rocket-launch', icon: 'i-heroicons-rocket-launch',
to: '/releases' to: '/releases'
}, {
label: 'Terms',
to: '/pro/terms'
}] }]
</script> </script>

View File

@@ -54,6 +54,7 @@ defineProps<{
}>() }>()
const route = useRoute() const route = useRoute()
const { $ui } = useNuxtApp()
const { metaSymbol } = useShortcuts() const { metaSymbol } = useShortcuts()
const nav = inject<Ref<NavItem[]>>('navigation') const nav = inject<Ref<NavItem[]>>('navigation')

View File

@@ -156,9 +156,11 @@ const generateOptions = (key: string, schema: { kind: string, schema: [], type:
options = [...appConfig.ui.colors] options = [...appConfig.ui.colors]
} }
if (key.toLowerCase() === 'size' && schema?.schema?.length > 0) { const schemaOptions = Object.values(schema?.schema || {})
if (key.toLowerCase() === 'size' && schemaOptions?.length > 0) {
const baseSizeOrder = { 'xs': 1, 'sm': 2, 'md': 3, 'lg': 4, 'xl': 5 } const baseSizeOrder = { 'xs': 1, 'sm': 2, 'md': 3, 'lg': 4, 'xl': 5 }
schema.schema.sort((a: string, b: string) => { schemaOptions.sort((a: string, b: string) => {
const aBase = a.match(/[a-zA-Z]+/)[0].toLowerCase() const aBase = a.match(/[a-zA-Z]+/)[0].toLowerCase()
const bBase = b.match(/[a-zA-Z]+/)[0].toLowerCase() const bBase = b.match(/[a-zA-Z]+/)[0].toLowerCase()
@@ -173,8 +175,8 @@ const generateOptions = (key: string, schema: { kind: string, schema: [], type:
}) })
} }
if (schema?.schema?.length > 0 && schema?.kind === 'enum' && !hasIgnoredTypes && optionItem?.restriction !== 'only') { if (schemaOptions?.length > 0 && schema?.kind === 'enum' && !hasIgnoredTypes && optionItem?.restriction !== 'only') {
options = schema.schema.filter(option => typeof option === 'string').map((option: string) => option.replaceAll('"', '')) options = schemaOptions.filter(option => typeof option === 'string').map((option: string) => option.replaceAll('"', ''))
} }
if (optionItem?.restriction === 'only') { if (optionItem?.restriction === 'only') {

View File

@@ -5,15 +5,15 @@
{{ prop.description }} {{ prop.description }}
</p> </p>
<Collapsible v-if="prop.schema?.kind === 'array' && prop.schema?.schema?.filter(schema => schema.kind === 'object').length"> <Collapsible v-if="prop.schema?.kind === 'array' && Object.values(prop.schema?.schema)?.filter((schema: any) => schema.kind === 'object').length">
<FieldGroup v-for="schema in prop.schema.schema" :key="schema.name"> <FieldGroup v-for="schema in (Object.values(prop.schema.schema) as any[])" :key="schema.name">
<ComponentPropsField v-for="subProp in Object.values(schema.schema)" :key="(subProp as any).name" :prop="subProp" /> <ComponentPropsField v-for="subProp in Object.values(schema.schema)" :key="(subProp as any).name" :prop="subProp" />
</FieldGroup> </FieldGroup>
</Collapsible> </Collapsible>
<Collapsible v-else-if="prop.schema?.kind === 'array' && prop.schema?.schema?.filter(schema => schema.kind === 'array').length"> <Collapsible v-else-if="(prop.schema?.kind === 'enum' || prop.schema?.kind === 'array') && Object.values(prop.schema?.schema)?.filter((schema: any) => schema.kind === 'array' && typeof schema.schema === 'object')?.length > 1">
<FieldGroup v-for="schema in prop.schema.schema" :key="schema.name"> <FieldGroup v-for="schema in (Object.values(prop.schema.schema) as any[])" :key="schema.name">
<template v-for="subSchema in schema.schema" :key="subSchema.name"> <template v-for="subSchema in schema.schema" :key="subSchema.name">
<ComponentPropsField v-for="subProp in Object.values(subSchema.schema)" :key="(subProp as any).name" :prop="subProp" /> <ComponentPropsField v-for="subProp in subSchema.schema" :key="(subProp as any).name" :prop="subProp" />
</template> </template>
</FieldGroup> </FieldGroup>
</Collapsible> </Collapsible>
@@ -23,7 +23,7 @@
</FieldGroup> </FieldGroup>
</Collapsible> </Collapsible>
<div v-else-if="prop.schema?.kind === 'enum' && prop.schema.type !== 'boolean' && startsWithCapital(prop.schema.type) && !prop.schema.type.startsWith(prop.schema.schema[0])" class="flex items-center flex-wrap gap-1 -my-1"> <div v-else-if="prop.schema?.kind === 'enum' && prop.schema.type !== 'boolean' && startsWithCapital(prop.schema.type) && !prop.schema.type.startsWith(prop.schema.schema[0])" class="flex items-center flex-wrap gap-1 -my-1">
<code v-for="value in prop.schema.schema.filter(value => typeof value === 'string')" :key="value" class="whitespace-pre-wrap break-words leading-6">{{ value }}</code> <code v-for="value in Object.values(prop.schema.schema).filter(value => typeof value === 'string')" :key="value" class="whitespace-pre-wrap break-words leading-6">{{ value }}</code>
</div> </div>
</Field> </Field>
</template> </template>

View File

@@ -85,7 +85,7 @@ const pageFrom = computed(() => (page.value - 1) * pageCount.value + 1)
const pageTo = computed(() => Math.min(page.value * pageCount.value, pageTotal.value)) const pageTo = computed(() => Math.min(page.value * pageCount.value, pageTotal.value))
// Data // Data
const { data: todos, pending } = await useLazyAsyncData<{ const { data: todos, status } = await useLazyAsyncData<{
id: number id: number
title: string title: string
completed: string completed: string
@@ -181,7 +181,7 @@ const { data: todos, pending } = await useLazyAsyncData<{
v-model:sort="sort" v-model:sort="sort"
:rows="todos" :rows="todos"
:columns="columnsTable" :columns="columnsTable"
:loading="pending" :loading="status === 'pending'"
sort-asc-icon="i-heroicons-arrow-up" sort-asc-icon="i-heroicons-arrow-up"
sort-desc-icon="i-heroicons-arrow-down" sort-desc-icon="i-heroicons-arrow-down"
sort-mode="manual" sort-mode="manual"

View File

@@ -23,7 +23,7 @@ export default defineAppConfig({
Try to change the `primary` and `gray` colors by clicking on the :u-icon{name="i-heroicons-swatch-20-solid" class="w-4 h-4 align-middle text-primary-500 dark:text-primary-400"} button in the header. Try to change the `primary` and `gray` colors by clicking on the :u-icon{name="i-heroicons-swatch-20-solid" class="w-4 h-4 align-middle text-primary-500 dark:text-primary-400"} button in the header.
:: ::
As this module uses Tailwind CSS under the hood, you can use any of the [Tailwind CSS colors](https://tailwindcss.com/docs/customizing-colors#color-palette-reference) or your own custom colors. By default, the `primary` color is `green` and the `gray` color is `cool`. As this module uses Tailwind CSS under the hood, you can use any of the [Tailwind CSS colors](https://tailwindcss.com/docs/customizing-colors#color-palette-reference) or your own custom colors or groups, such as `brand.primary`. By default, the `primary` color is `green` and the `gray` color is `cool`.
When [using custom colors](https://tailwindcss.com/docs/customizing-colors#using-custom-colors) or [adding additional colors](https://tailwindcss.com/docs/customizing-colors#adding-additional-colors) through the `extend` key in your `tailwind.config.ts`, you'll need to make sure to define all the shades from `50` to `950` as most of them are used in the components config defined in [`ui.config/`](https://github.com/nuxt/ui/tree/dev/src/runtime/ui.config) directory. You can [generate your colors](https://tailwindcss.com/docs/customizing-colors#generating-colors) using tools such as https://uicolors.app/ for example. When [using custom colors](https://tailwindcss.com/docs/customizing-colors#using-custom-colors) or [adding additional colors](https://tailwindcss.com/docs/customizing-colors#adding-additional-colors) through the `extend` key in your `tailwind.config.ts`, you'll need to make sure to define all the shades from `50` to `950` as most of them are used in the components config defined in [`ui.config/`](https://github.com/nuxt/ui/tree/dev/src/runtime/ui.config) directory. You can [generate your colors](https://tailwindcss.com/docs/customizing-colors#generating-colors) using tools such as https://uicolors.app/ for example.

View File

@@ -246,7 +246,7 @@ When accessing the component via a template ref, you can use the following:
::field{name="updateQuery (query)"} ::field{name="updateQuery (query)"}
Updates the current query. Updates the current query.
:: ::
::field{name="results" type="ComputedRef<Fuse.FuseResult<Command>[]>"} ::field{name="results" type="ComputedRef<FuseResult<Command>[]>"}
The results exposed by [useFuse](https://vueuse.org/integrations/useFuse/#usefuse). The results exposed by [useFuse](https://vueuse.org/integrations/useFuse/#usefuse).
:: ::
::field{name="comboboxApi"} ::field{name="comboboxApi"}

View File

@@ -61,7 +61,7 @@ Set the `fullscreen` prop to `true` to enable it.
### Control programmatically ### Control programmatically
First of all, add the `Modals` component to your app, preferably inside `app.vue`. First of all, add the `Modals` component to your app, preferably inside `app.vue`. This component provides your application a place to render programmatically created modals.
```vue [app.vue] ```vue [app.vue]
<template> <template>
@@ -81,8 +81,8 @@ Then, you can use the `useModal` composable to control your modals within your a
:component-example{component="modal-example-component" hiddenCode hiddenPreview } :component-example{component="modal-example-component" hiddenCode hiddenPreview }
::code-group{class="[&>div:last-child>div:first-child]:!rounded-t-none"} ::code-group{class="[&>div:last-child>div:first-child]:!rounded-t-none"}
:component-example{component="modal-example-composable" label="app.vue" } :component-example{component="modal-example-composable" label="index.vue" }
:component-example{component="modal-example-component" hiddenPreview label="modal.vue" } :component-example{component="modal-example-component" hiddenPreview label="components/ModalExampleComponent.vue" }
:: ::
Additionally, you can close the modal within the modal component by calling `modal.close()`. Additionally, you can close the modal within the modal component by calling `modal.close()`.

View File

@@ -156,7 +156,11 @@ slots:
## Config ## Config
::tabs ::callout{icon="i-heroicons-light-bulb"}
:component-preset{label="Radio" slug="Radio"} Use the `ui` prop to override the radio group config and the `uiRadio` prop to override the radio config.
:component-preset{label="RadioGroup"} ::
::tabs
:component-preset{label="Radio (uiRadio)" slug="Radio"}
:component-preset{label="RadioGroup (ui)"}
:: ::

View File

@@ -148,11 +148,11 @@ const columns = [{
sortable: true sortable: true
}] }]
const { data, pending } = await useLazyFetch(() => `/api/users?orderBy=${sort.value.column}&order=${sort.value.direction}`) const { data, status } = await useLazyFetch(() => `/api/users?orderBy=${sort.value.column}&order=${sort.value.direction}`)
</script> </script>
<template> <template>
<UTable v-model:sort="sort" :loading="pending" :columns="columns" :rows="data" sort-mode="manual" /> <UTable v-model:sort="sort" :loading="status === 'pending'" :columns="columns" :rows="data" sort-mode="manual" />
</template> </template>
``` ```
@@ -359,11 +359,11 @@ This can be easily used with Nuxt `useAsyncData` composable.
<script setup lang="ts"> <script setup lang="ts">
const columns = [...] const columns = [...]
const { pending, data: people } = await useLazyAsyncData('people', () => $fetch('/api/people')) const { status, data: people } = await useLazyAsyncData('people', () => $fetch('/api/people'))
</script> </script>
<template> <template>
<UTable :rows="people" :columns="columns" :loading="pending" /> <UTable :rows="people" :columns="columns" :loading="status === 'pending'" />
</template> </template>
``` ```

View File

@@ -3,29 +3,29 @@
"private": true, "private": true,
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"@iconify-json/heroicons": "^1.1.22", "@iconify-json/heroicons": "^1.2.0",
"@iconify-json/simple-icons": "^1.1.109", "@iconify-json/simple-icons": "^1.2.3",
"@iconify-json/vscode-icons": "^1.1.36", "@iconify-json/vscode-icons": "^1.2.2",
"@nuxt/content": "^2.13.2", "@nuxt/content": "^2.13.2",
"@nuxt/eslint-config": "^0.3.13", "@nuxt/eslint-config": "^0.4.0",
"@nuxt/fonts": "^0.7.1", "@nuxt/fonts": "^0.8.0",
"@nuxt/image": "^1.7.0", "@nuxt/image": "^1.8.0",
"@nuxt/ui": "latest", "@nuxt/ui": "latest",
"@nuxt/ui-pro": "npm:@nuxt/ui-pro-edge@1.3.1-28698404.4d54eb2", "@nuxt/ui-pro": "npm:@nuxt/ui-pro-edge@1.3.1-28698404.4d54eb2",
"@nuxtjs/plausible": "^1.0.0", "@nuxtjs/plausible": "^1.0.2",
"@octokit/rest": "^21.0.1", "@octokit/rest": "^21.0.2",
"@vueuse/nuxt": "^10.11.0", "@vueuse/nuxt": "^11.1.0",
"date-fns": "^3.6.0", "date-fns": "^4.1.0",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"joi": "^17.13.3", "joi": "^17.13.3",
"nuxt": "^3.12.4", "nuxt": "^3.13.2",
"nuxt-cloudflare-analytics": "^1.0.8", "nuxt-cloudflare-analytics": "^1.0.8",
"nuxt-component-meta": "^0.6.4", "nuxt-component-meta": "^0.8.2",
"nuxt-og-image": "^3.0.0-rc.64", "nuxt-og-image": "^3.0.2",
"prettier": "^3.3.3", "prettier": "^3.3.3",
"ufo": "^1.5.4", "ufo": "^1.5.4",
"v-calendar": "^3.1.2", "v-calendar": "^3.1.2",
"valibot": "^0.36.0", "valibot": "^0.42.0",
"yup": "^1.4.0", "yup": "^1.4.0",
"zod": "^3.23.8" "zod": "^3.23.8"
} }

View File

@@ -443,6 +443,7 @@ const sectionRef = ref()
const demoRef = ref(null) const demoRef = ref(null)
const start = ref(0) const start = ref(0)
const { $ui } = useNuxtApp()
const { height } = useElementSize(demoRef) const { height } = useElementSize(demoRef)
const { top } = useElementBounding(sectionRef) const { top } = useElementBounding(sectionRef)
const { y } = useWindowScroll() const { y } = useWindowScroll()

View File

@@ -1,7 +1,8 @@
{ {
"name": "@nuxt/ui", "name": "@nuxt/ui",
"version": "2.18.2", "description": "A UI Library for Modern Web Apps, powered by Vue & Tailwind CSS.",
"packageManager": "pnpm@9.5.0", "version": "2.18.5",
"packageManager": "pnpm@9.10.0",
"repository": "nuxt/ui", "repository": "nuxt/ui",
"homepage": "https://ui.nuxt.com", "homepage": "https://ui.nuxt.com",
"type": "module", "type": "module",
@@ -17,9 +18,6 @@
"files": [ "files": [
"dist" "dist"
], ],
"engines": {
"node": ">=v16.20.2"
},
"scripts": { "scripts": {
"build": "nuxt-module-build build", "build": "nuxt-module-build build",
"prepack": "pnpm build", "prepack": "pnpm build",
@@ -35,51 +33,51 @@
}, },
"dependencies": { "dependencies": {
"@headlessui/tailwindcss": "^0.2.1", "@headlessui/tailwindcss": "^0.2.1",
"@headlessui/vue": "^1.7.22", "@headlessui/vue": "^1.7.23",
"@iconify-json/heroicons": "^1.1.22", "@iconify-json/heroicons": "^1.2.0",
"@nuxt/icon": "^1.3.1", "@nuxt/icon": "^1.5.1",
"@nuxt/kit": "^3.12.4", "@nuxt/kit": "^3.13.2",
"@nuxtjs/color-mode": "^3.4.2", "@nuxtjs/color-mode": "^3.5.1",
"@nuxtjs/tailwindcss": "^6.12.1", "@nuxtjs/tailwindcss": "^6.12.1",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.7", "@tailwindcss/forms": "^0.5.9",
"@tailwindcss/typography": "^0.5.13", "@tailwindcss/typography": "^0.5.15",
"@vueuse/core": "^10.11.0", "@vueuse/core": "^11.1.0",
"@vueuse/integrations": "^10.11.0", "@vueuse/integrations": "^11.1.0",
"@vueuse/math": "^10.11.0", "@vueuse/math": "^11.1.0",
"defu": "^6.1.4", "defu": "^6.1.4",
"fuse.js": "^6.6.2", "fuse.js": "^7.0.0",
"ohash": "^1.1.3", "ohash": "^1.1.4",
"pathe": "^1.1.2", "pathe": "^1.1.2",
"scule": "^1.3.0", "scule": "^1.3.0",
"tailwind-merge": "^2.4.0", "tailwind-merge": "^2.5.2",
"tailwindcss": "^3.4.7" "tailwindcss": "^3.4.12"
}, },
"devDependencies": { "devDependencies": {
"@nuxt/eslint-config": "^0.3.13", "@nuxt/eslint-config": "^0.4.0",
"@nuxt/module-builder": "^0.8.1", "@nuxt/module-builder": "^0.8.4",
"@nuxt/test-utils": "^3.13.1", "@nuxt/test-utils": "^3.14.2",
"@release-it/conventional-changelog": "^8.0.1", "@release-it/conventional-changelog": "^8.0.2",
"@vue/test-utils": "^2.4.6", "@vue/test-utils": "^2.4.6",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"happy-dom": "^14.12.3", "happy-dom": "^14.12.3",
"joi": "^17.13.3", "joi": "^17.13.3",
"nuxt": "^3.12.4", "nuxt": "^3.13.2",
"release-it": "^17.6.0", "release-it": "^17.6.0",
"unbuild": "^2.0.0", "unbuild": "^2.0.0",
"valibot": "^0.36.0", "valibot": "^0.42.0",
"valibot30": "npm:valibot@0.30.0", "valibot30": "npm:valibot@0.30.0",
"valibot31": "npm:valibot@0.31.0", "valibot31": "npm:valibot@0.31.0",
"vitest": "^2.0.4", "vitest": "^2.1.1",
"vitest-environment-nuxt": "^1.0.0", "vitest-environment-nuxt": "^1.0.1",
"vue-tsc": "^2.0.29", "vue-tsc": "^2.1.6",
"yup": "^1.4.0", "yup": "^1.4.0",
"zod": "^3.23.8" "zod": "^3.23.8"
}, },
"resolutions": { "resolutions": {
"@nuxt/ui": "workspace:*", "@nuxt/ui": "workspace:*",
"nuxt-component-meta": "0.6.4" "@nuxtjs/mdc": "0.9.0"
} }
} }

View File

@@ -9,6 +9,6 @@
}, },
"dependencies": { "dependencies": {
"@nuxt/ui": "latest", "@nuxt/ui": "latest",
"nuxt": "^3.12.4" "nuxt": "^3.13.2"
} }
} }

4646
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -2,11 +2,19 @@
"extends": [ "extends": [
"github>nuxt/renovate-config-nuxt" "github>nuxt/renovate-config-nuxt"
], ],
"lockFileMaintenance": {
"enabled": true
},
"ignoreDeps": [ "ignoreDeps": [
"@nuxt/module-builder", "@nuxt/eslint-config",
"nuxt-component-meta", "eslint",
"happy-dom",
"valibot30", "valibot30",
"valibot31", "valibot31"
"vue-tsc" ],
] "baseBranches": ["dev", "v3"],
"packageRules": [{
"matchBaseBranches": ["v3"],
"labels": ["v3"]
}]
} }

View File

@@ -3,7 +3,7 @@ import { defineNuxtModule, installModule, addComponentsDir, addImportsDir, creat
import { name, version } from '../package.json' import { name, version } from '../package.json'
import createTemplates from './templates' import createTemplates from './templates'
import * as config from './runtime/ui.config' import * as config from './runtime/ui.config'
import type { DeepPartial, Strategy } from './runtime/types/utils' import type { DeepPartial, Strategy } from './runtime/types'
import installTailwind from './tailwind' import installTailwind from './tailwind'
const _require = createRequire(import.meta.url) const _require = createRequire(import.meta.url)
@@ -23,12 +23,6 @@ type UI = {
[key: string]: any [key: string]: any
} & DeepPartial<typeof config, string> } & DeepPartial<typeof config, string>
declare module 'nuxt/schema' {
interface AppConfigInput {
// @ts-ignore
ui?: UI
}
}
declare module '@nuxt/schema' { declare module '@nuxt/schema' {
interface AppConfigInput { interface AppConfigInput {
// @ts-ignore // @ts-ignore

View File

@@ -73,7 +73,7 @@
<template v-for="(row, index) in rows" :key="index"> <template v-for="(row, index) in rows" :key="index">
<tr :class="[ui.tr.base, isSelected(row) && ui.tr.selected, $attrs.onSelect && ui.tr.active, row?.class]" @click="() => onSelect(row)"> <tr :class="[ui.tr.base, isSelected(row) && ui.tr.selected, $attrs.onSelect && ui.tr.active, row?.class]" @click="() => onSelect(row)">
<td v-if="modelValue" :class="ui.checkbox.padding"> <td v-if="modelValue" :class="ui.checkbox.padding">
<UCheckbox v-model="selected" :value="row" v-bind="ui.default.checkbox" aria-label="Select row" @click.stop /> <UCheckbox v-model="selected" :value="row" v-bind="ui.default.checkbox" aria-label="Select row" @click.capture.stop="() => onSelect(row)" />
</td> </td>
<td <td
@@ -121,7 +121,7 @@ import UProgress from '../elements/Progress.vue'
import UCheckbox from '../forms/Checkbox.vue' import UCheckbox from '../forms/Checkbox.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, get } from '../../utils' import { mergeConfig, get } from '../../utils'
import type { Strategy, Button, ProgressColor, ProgressAnimation } from '../../types' import type { Strategy, Button, ProgressColor, ProgressAnimation } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { table } from '#ui/ui.config' import { table } from '#ui/ui.config'
@@ -326,15 +326,18 @@ export default defineComponent({
} }
function selectAllRows () { function selectAllRows () {
props.rows.forEach((row) => { // Create a new array to ensure reactivity
// If the row is already selected, don't select it again const newSelected = [...selected.value]
if (isSelected(row)) {
return
}
// @ts-ignore // If the row is not already selected, add it to the newSelected array
selected.value.push(row) props.rows.forEach((row) => {
if (!isSelected(row)) {
newSelected.push(row)
}
}) })
// Reassign the array to trigger Vue's reactivity
selected.value = newSelected
} }
function onChange (checked: boolean) { function onChange (checked: boolean) {

View File

@@ -73,7 +73,7 @@ import UIcon from '../elements/Icon.vue'
import UButton from '../elements/Button.vue' import UButton from '../elements/Button.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, omit } from '../../utils' import { mergeConfig, omit } from '../../utils'
import type { AccordionItem, Strategy } from '../../types' import type { AccordionItem, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { accordion, button } from '#ui/ui.config' import { accordion, button } from '#ui/ui.config'
@@ -194,7 +194,7 @@ export default defineComponent({
attrs, attrs,
buttonRefs, buttonRefs,
closeOthers, closeOthers,
omit, omit: (omit as any),
onEnter, onEnter,
onBeforeLeave, onBeforeLeave,
onAfterEnter, onAfterEnter,

View File

@@ -47,7 +47,7 @@ import UIcon from '../elements/Icon.vue'
import UAvatar from '../elements/Avatar.vue' import UAvatar from '../elements/Avatar.vue'
import UButton from '../elements/Button.vue' import UButton from '../elements/Button.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import type { Avatar, Button, AlertColor, AlertVariant, AlertAction, Strategy } from '../../types' import type { Avatar, Button, AlertColor, AlertVariant, AlertAction, Strategy } from '../../types/index'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'

View File

@@ -27,7 +27,7 @@ import { twMerge, twJoin } from 'tailwind-merge'
import UIcon from '../elements/Icon.vue' import UIcon from '../elements/Icon.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { AvatarSize, AvatarChipColor, AvatarChipPosition, Strategy } from '../../types' import type { AvatarSize, AvatarChipColor, AvatarChipPosition, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { avatar } from '#ui/ui.config' import { avatar } from '#ui/ui.config'

View File

@@ -4,7 +4,7 @@ import { twMerge, twJoin } from 'tailwind-merge'
import UAvatar from './Avatar.vue' import UAvatar from './Avatar.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, getSlotsChildren } from '../../utils' import { mergeConfig, getSlotsChildren } from '../../utils'
import type { AvatarSize, Strategy } from '../../types' import type { AvatarSize, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { avatar, avatarGroup } from '#ui/ui.config' import { avatar, avatarGroup } from '#ui/ui.config'

View File

@@ -11,7 +11,7 @@ import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import { useInjectButtonGroup } from '../../composables/useButtonGroup' import { useInjectButtonGroup } from '../../composables/useButtonGroup'
import type { BadgeColor, BadgeSize, BadgeVariant, Strategy } from '../../types' import type { BadgeColor, BadgeSize, BadgeVariant, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { badge } from '#ui/ui.config' import { badge } from '#ui/ui.config'

View File

@@ -25,7 +25,7 @@ import ULink from '../elements/Link.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, nuxtLinkProps, getNuxtLinkProps } from '../../utils' import { mergeConfig, nuxtLinkProps, getNuxtLinkProps } from '../../utils'
import { useInjectButtonGroup } from '../../composables/useButtonGroup' import { useInjectButtonGroup } from '../../composables/useButtonGroup'
import type { ButtonColor, ButtonSize, ButtonVariant, Strategy } from '../../types' import type { ButtonColor, ButtonSize, ButtonVariant, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { button } from '#ui/ui.config' import { button } from '#ui/ui.config'

View File

@@ -4,7 +4,7 @@ import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, getSlotsChildren } from '../../utils' import { mergeConfig, getSlotsChildren } from '../../utils'
import { useProvideButtonGroup } from '../../composables/useButtonGroup' import { useProvideButtonGroup } from '../../composables/useButtonGroup'
import type { ButtonSize, Strategy } from '../../types' import type { ButtonSize, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { button, buttonGroup } from '#ui/ui.config' import { button, buttonGroup } from '#ui/ui.config'

View File

@@ -61,7 +61,7 @@ import type { PropType } from 'vue'
import { twMerge } from 'tailwind-merge' import { twMerge } from 'tailwind-merge'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import UButton from '../elements/Button.vue' import UButton from '../elements/Button.vue'
import type { Strategy, Button } from '../../types' import type { Strategy, Button } from '../../types/index'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useCarouselScroll } from '../../composables/useCarouselScroll' import { useCarouselScroll } from '../../composables/useCarouselScroll'
import { useScroll, useResizeObserver, useElementSize } from '@vueuse/core' import { useScroll, useResizeObserver, useElementSize } from '@vueuse/core'

View File

@@ -16,7 +16,7 @@ import type { PropType } from 'vue'
import { twJoin } from 'tailwind-merge' import { twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { ChipSize, ChipColor, ChipPosition, Strategy } from '../../types' import type { ChipSize, ChipColor, ChipPosition, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { chip } from '#ui/ui.config' import { chip } from '#ui/ui.config'

View File

@@ -67,7 +67,7 @@ import UKbd from '../elements/Kbd.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { usePopper } from '../../composables/usePopper' import { usePopper } from '../../composables/usePopper'
import { mergeConfig, getNuxtLinkProps } from '../../utils' import { mergeConfig, getNuxtLinkProps } from '../../utils'
import type { DropdownItem, PopperOptions, Strategy } from '../../types' import type { DropdownItem, PopperOptions, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { dropdown } from '#ui/ui.config' import { dropdown } from '#ui/ui.config'

View File

@@ -10,7 +10,7 @@ import type { PropType } from 'vue'
import { twMerge, twJoin } from 'tailwind-merge' import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { KbdSize, Strategy } from '../../types' import type { KbdSize, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { kbd } from '#ui/ui.config' import { kbd } from '#ui/ui.config'

View File

@@ -23,6 +23,7 @@
:rel="rel" :rel="rel"
:target="target" :target="target"
:class="active !== undefined ? (active ? activeClass : inactiveClass) : resolveLinkClass(route, $route, { isActive, isExactActive })" :class="active !== undefined ? (active ? activeClass : inactiveClass) : resolveLinkClass(route, $route, { isActive, isExactActive })"
:tabindex="disabled ? -1 : undefined"
@click="(e) => (!isExternal && !disabled) && navigate(e)" @click="(e) => (!isExternal && !disabled) && navigate(e)"
> >
<slot v-bind="{ isActive: active !== undefined ? active : (exact ? isExactActive : isActive) }" /> <slot v-bind="{ isActive: active !== undefined ? active : (exact ? isExactActive : isActive) }" />

View File

@@ -34,7 +34,7 @@ import { twJoin } from 'tailwind-merge'
import UIcon from '../elements/Icon.vue' import UIcon from '../elements/Icon.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy, MeterColor, MeterSize } from '../../types' import type { Strategy, MeterColor, MeterSize } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { meter } from '#ui/ui.config' import { meter } from '#ui/ui.config'

View File

@@ -5,7 +5,7 @@ import UIcon from '../elements/Icon.vue'
import Meter from './Meter.vue' import Meter from './Meter.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, getSlotsChildren } from '../../utils' import { mergeConfig, getSlotsChildren } from '../../utils'
import type { Strategy, MeterSize } from '../../types' import type { Strategy, MeterSize } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { meter, meterGroup } from '#ui/ui.config' import { meter, meterGroup } from '#ui/ui.config'

View File

@@ -33,7 +33,7 @@ import type { PropType } from 'vue'
import { twJoin } from 'tailwind-merge' import { twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy, ProgressSize, ProgressAnimation, ProgressColor } from '../../types' import type { Strategy, ProgressSize, ProgressAnimation, ProgressColor } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { progress } from '#ui/ui.config' import { progress } from '#ui/ui.config'

View File

@@ -36,7 +36,7 @@ import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy } from '../../types' import type { Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { checkbox } from '#ui/ui.config' import { checkbox } from '#ui/ui.config'

View File

@@ -1,11 +1,11 @@
<template> <template>
<form @submit.prevent="onSubmit"> <form @submit.prevent="onSubmit">
<slot /> <slot v-bind="{ errors }" />
</form> </form>
</template> </template>
<script lang="ts"> <script lang="ts">
import { provide, ref, type PropType, defineComponent, onUnmounted, onMounted } from 'vue' import { provide, ref, type PropType, defineComponent, onUnmounted, onMounted, readonly } from 'vue'
import { useEventBus } from '@vueuse/core' import { useEventBus } from '@vueuse/core'
import type { ZodSchema } from 'zod' import type { ZodSchema } from 'zod'
import type { ValidationError as JoiError, Schema as JoiSchema } from 'joi' import type { ValidationError as JoiError, Schema as JoiSchema } from 'joi'
@@ -127,16 +127,13 @@ export default defineComponent({
} }
async function onSubmit (payload: Event) { async function onSubmit (payload: Event) {
const event = payload as SubmitEvent const event = payload as FormSubmitEvent<any>
try { try {
if (props.validateOn?.includes('submit')) { if (props.validateOn?.includes('submit')) {
await validate() await validate()
} }
const submitEvent: FormSubmitEvent<any> = { event.data = props.state
...event, emit('submit', event)
data: props.state
}
emit('submit', submitEvent)
} catch (error) { } catch (error) {
if (!(error instanceof FormException)) { if (!(error instanceof FormException)) {
throw error throw error
@@ -184,7 +181,8 @@ export default defineComponent({
} as Form<any>) } as Form<any>)
return { return {
onSubmit onSubmit,
errors: readonly(errors)
} }
} }
}) })

View File

@@ -44,7 +44,7 @@ import { computed, defineComponent, provide, inject, ref, toRef } from 'vue'
import type { Ref, PropType } from 'vue' import type { Ref, PropType } from 'vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { FormError, InjectedFormGroupValue, FormGroupSize, Strategy } from '../../types' import type { FormError, InjectedFormGroupValue, FormGroupSize, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { formGroup } from '#ui/ui.config' import { formGroup } from '#ui/ui.config'

View File

@@ -4,13 +4,12 @@
:id="inputId" :id="inputId"
ref="input" ref="input"
:name="name" :name="name"
:value="modelValue"
:type="type" :type="type"
:required="required" :required="required"
:placeholder="placeholder" :placeholder="placeholder"
:disabled="disabled" :disabled="disabled"
:class="inputClass" :class="inputClass"
v-bind="attrs" v-bind="type === 'file' ? attrs : { ...attrs, value: modelValue }"
@input="onInput" @input="onInput"
@blur="onBlur" @blur="onBlur"
@change="onChange" @change="onChange"
@@ -41,7 +40,7 @@ import { useUI } from '../../composables/useUI'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { mergeConfig, looseToNumber } from '../../utils' import { mergeConfig, looseToNumber } from '../../utils'
import { useInjectButtonGroup } from '../../composables/useButtonGroup' import { useInjectButtonGroup } from '../../composables/useButtonGroup'
import type { InputSize, InputColor, InputVariant, Strategy } from '../../types' import type { InputSize, InputColor, InputVariant, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { input } from '#ui/ui.config' import { input } from '#ui/ui.config'

View File

@@ -111,7 +111,7 @@ import { usePopper } from '../../composables/usePopper'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { get, mergeConfig } from '../../utils' import { get, mergeConfig } from '../../utils'
import { useInjectButtonGroup } from '../../composables/useButtonGroup' import { useInjectButtonGroup } from '../../composables/useButtonGroup'
import type { InputSize, InputColor, InputVariant, PopperOptions, Strategy } from '../../types' import type { InputSize, InputColor, InputVariant, PopperOptions, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { input, inputMenu } from '#ui/ui.config' import { input, inputMenu } from '#ui/ui.config'

View File

@@ -35,7 +35,7 @@ import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy } from '../../types' import type { Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { radio } from '#ui/ui.config' import { radio } from '#ui/ui.config'

View File

@@ -36,7 +36,7 @@ import type { PropType } from 'vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { mergeConfig, get } from '../../utils' import { mergeConfig, get } from '../../utils'
import type { Strategy } from '../../types' import type { Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { radioGroup, radio } from '#ui/ui.config' import { radioGroup, radio } from '#ui/ui.config'
@@ -104,7 +104,7 @@ export default defineComponent({
const { ui, attrs } = useUI('radioGroup', toRef(props, 'ui'), config, toRef(props, 'class')) const { ui, attrs } = useUI('radioGroup', toRef(props, 'ui'), config, toRef(props, 'class'))
const { ui: uiRadio } = useUI('radio', toRef(props, 'uiRadio'), configRadio) const { ui: uiRadio } = useUI('radio', toRef(props, 'uiRadio'), configRadio)
const { emitFormChange, color, name } = useFormGroup(props, config) const { emitFormChange, color, name } = useFormGroup(props, config, false)
provide('radio-group', { color, name }) provide('radio-group', { color, name })
const onUpdate = (value: any) => { const onUpdate = (value: any) => {

View File

@@ -26,7 +26,7 @@ import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { RangeSize, RangeColor, Strategy } from '../../types' import type { RangeSize, RangeColor, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { range } from '#ui/ui.config' import { range } from '#ui/ui.config'

View File

@@ -61,7 +61,7 @@ import { useUI } from '../../composables/useUI'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { mergeConfig, get } from '../../utils' import { mergeConfig, get } from '../../utils'
import { useInjectButtonGroup } from '../../composables/useButtonGroup' import { useInjectButtonGroup } from '../../composables/useButtonGroup'
import type { SelectSize, SelectColor, SelectVariant, Strategy } from '../../types' import type { SelectSize, SelectColor, SelectVariant, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { select } from '#ui/ui.config' import { select } from '#ui/ui.config'

View File

@@ -147,7 +147,7 @@ import { usePopper } from '../../composables/usePopper'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { get, mergeConfig } from '../../utils' import { get, mergeConfig } from '../../utils'
import { useInjectButtonGroup } from '../../composables/useButtonGroup' import { useInjectButtonGroup } from '../../composables/useButtonGroup'
import type { SelectSize, SelectColor, SelectVariant, PopperOptions, Strategy } from '../../types' import type { SelectSize, SelectColor, SelectVariant, PopperOptions, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { select, selectMenu } from '#ui/ui.config' import { select, selectMenu } from '#ui/ui.config'

View File

@@ -28,7 +28,7 @@ import { defu } from 'defu'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { mergeConfig, looseToNumber } from '../../utils' import { mergeConfig, looseToNumber } from '../../utils'
import type { TextareaSize, TextareaColor, TextareaVariant, Strategy } from '../../types' import type { TextareaSize, TextareaColor, TextareaVariant, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { textarea } from '#ui/ui.config' import { textarea } from '#ui/ui.config'
@@ -154,6 +154,8 @@ export default defineComponent({
} }
textarea.value.rows = props.rows textarea.value.rows = props.rows
const overflow = textarea.value.style.overflow
textarea.value.style.overflow = 'hidden'
const styles = window.getComputedStyle(textarea.value) const styles = window.getComputedStyle(textarea.value)
const paddingTop = parseInt(styles.paddingTop) const paddingTop = parseInt(styles.paddingTop)
@@ -166,6 +168,8 @@ export default defineComponent({
if (newRows > props.rows) { if (newRows > props.rows) {
textarea.value.rows = props.maxrows ? Math.min(newRows, props.maxrows) : newRows textarea.value.rows = props.maxrows ? Math.min(newRows, props.maxrows) : newRows
} }
textarea.value.style.overflow = overflow
} }
} }

View File

@@ -38,7 +38,7 @@ import UIcon from '../elements/Icon.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useFormGroup } from '../../composables/useFormGroup' import { useFormGroup } from '../../composables/useFormGroup'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { ToggleSize, ToggleColor, Strategy } from '../../types' import type { ToggleSize, ToggleColor, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { toggle } from '#ui/ui.config' import { toggle } from '#ui/ui.config'

View File

@@ -22,7 +22,7 @@ import type { PropType } from 'vue'
import { twMerge, twJoin } from 'tailwind-merge' import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy } from '../../types' import type { Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { card } from '#ui/ui.config' import { card } from '#ui/ui.config'

View File

@@ -10,7 +10,7 @@ import type { PropType } from 'vue'
import { twMerge, twJoin } from 'tailwind-merge' import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy } from '../../types' import type { Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { container } from '#ui/ui.config' import { container } from '#ui/ui.config'

View File

@@ -26,7 +26,7 @@ import UIcon from '../elements/Icon.vue'
import UAvatar from '../elements/Avatar.vue' import UAvatar from '../elements/Avatar.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Avatar, DividerSize, Strategy } from '../../types' import type { Avatar, DividerSize, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { divider } from '#ui/ui.config' import { divider } from '#ui/ui.config'

View File

@@ -8,7 +8,7 @@ import type { PropType } from 'vue'
import { twMerge, twJoin } from 'tailwind-merge' import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy } from '../../types' import type { Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { skeleton } from '#ui/ui.config' import { skeleton } from '#ui/ui.config'

View File

@@ -41,7 +41,7 @@ import UIcon from '../elements/Icon.vue'
import ULink from '../elements/Link.vue' import ULink from '../elements/Link.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, getULinkProps } from '../../utils' import { mergeConfig, getULinkProps } from '../../utils'
import type { BreadcrumbLink, Strategy } from '../../types' import type { BreadcrumbLink, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { breadcrumb } from '#ui/ui.config' import { breadcrumb } from '#ui/ui.config'

View File

@@ -75,7 +75,7 @@ import UButton from '../elements/Button.vue'
import CommandPaletteGroup from './CommandPaletteGroup.vue' import CommandPaletteGroup from './CommandPaletteGroup.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Group, Command, Button, Strategy } from '../../types' import type { Group, Command, Button, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { commandPalette } from '#ui/ui.config' import { commandPalette } from '#ui/ui.config'

View File

@@ -76,7 +76,7 @@ import { ComboboxOption as HComboboxOption, provideUseId } from '@headlessui/vue
import UIcon from '../elements/Icon.vue' import UIcon from '../elements/Icon.vue'
import UAvatar from '../elements/Avatar.vue' import UAvatar from '../elements/Avatar.vue'
import UKbd from '../elements/Kbd.vue' import UKbd from '../elements/Kbd.vue'
import type { Command, Group } from '../../types' import type { Command, Group } from '../../types/index'
import { commandPalette } from '#ui/ui.config' import { commandPalette } from '#ui/ui.config'
import { useId } from '#imports' import { useId } from '#imports'

View File

@@ -61,7 +61,7 @@ import UBadge from '../elements/Badge.vue'
import ULink from '../elements/Link.vue' import ULink from '../elements/Link.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, getULinkProps } from '../../utils' import { mergeConfig, getULinkProps } from '../../utils'
import type { HorizontalNavigationLink, Strategy } from '../../types' import type { HorizontalNavigationLink, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { horizontalNavigation } from '#ui/ui.config' import { horizontalNavigation } from '#ui/ui.config'

View File

@@ -4,6 +4,7 @@
<UButton <UButton
v-if="firstButton && showFirst" v-if="firstButton && showFirst"
:size="size" :size="size"
:to="to?.(1)"
:disabled="!canGoFirstOrPrev || disabled" :disabled="!canGoFirstOrPrev || disabled"
:class="[ui.base, ui.rounded]" :class="[ui.base, ui.rounded]"
v-bind="{ ...(ui.default.firstButton || {}), ...firstButton }" v-bind="{ ...(ui.default.firstButton || {}), ...firstButton }"
@@ -17,6 +18,7 @@
<UButton <UButton
v-if="prevButton" v-if="prevButton"
:size="size" :size="size"
:to="to?.(currentPage - 1)"
:disabled="!canGoFirstOrPrev || disabled" :disabled="!canGoFirstOrPrev || disabled"
:class="[ui.base, ui.rounded]" :class="[ui.base, ui.rounded]"
v-bind="{ ...(ui.default.prevButton || {}), ...prevButton }" v-bind="{ ...(ui.default.prevButton || {}), ...prevButton }"
@@ -43,6 +45,7 @@
<UButton <UButton
v-if="nextButton" v-if="nextButton"
:size="size" :size="size"
:to="to?.(currentPage + 1)"
:disabled="!canGoLastOrNext || disabled" :disabled="!canGoLastOrNext || disabled"
:class="[ui.base, ui.rounded]" :class="[ui.base, ui.rounded]"
v-bind="{ ...(ui.default.nextButton || {}), ...nextButton }" v-bind="{ ...(ui.default.nextButton || {}), ...nextButton }"
@@ -56,6 +59,7 @@
<UButton <UButton
v-if="lastButton && showLast" v-if="lastButton && showLast"
:size="size" :size="size"
:to="to?.(pages.length)"
:disabled="!canGoLastOrNext || disabled" :disabled="!canGoLastOrNext || disabled"
:class="[ui.base, ui.rounded]" :class="[ui.base, ui.rounded]"
v-bind="{ ...(ui.default.lastButton || {}), ...lastButton }" v-bind="{ ...(ui.default.lastButton || {}), ...lastButton }"
@@ -74,7 +78,7 @@ import type { RouteLocationRaw } from '#vue-router'
import UButton from '../elements/Button.vue' import UButton from '../elements/Button.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Button, ButtonSize, Strategy } from '../../types' import type { Button, ButtonSize, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { pagination, button } from '#ui/ui.config' import { pagination, button } from '#ui/ui.config'

View File

@@ -53,14 +53,14 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { toRef, ref, watch, onMounted, defineComponent } from 'vue' import { toRef, ref, watch, onMounted, defineComponent, nextTick } from 'vue'
import type { PropType } from 'vue' import type { PropType } from 'vue'
import { TabGroup as HTabGroup, TabList as HTabList, Tab as HTab, TabPanels as HTabPanels, TabPanel as HTabPanel, provideUseId } from '@headlessui/vue' import { TabGroup as HTabGroup, TabList as HTabList, Tab as HTab, TabPanels as HTabPanels, TabPanel as HTabPanel, provideUseId } from '@headlessui/vue'
import { useResizeObserver } from '@vueuse/core' import { useResizeObserver } from '@vueuse/core'
import UIcon from '../elements/Icon.vue' import UIcon from '../elements/Icon.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { TabItem, Strategy } from '../../types' import type { TabItem, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { tabs } from '#ui/ui.config' import { tabs } from '#ui/ui.config'
@@ -164,7 +164,15 @@ export default defineComponent({
calcMarkerSize(selectedIndex.value) calcMarkerSize(selectedIndex.value)
}) })
onMounted(() => calcMarkerSize(selectedIndex.value)) watch(() => props.items, async () => {
await nextTick()
calcMarkerSize(selectedIndex.value)
}, { deep: true })
onMounted(async () => {
await nextTick()
calcMarkerSize(selectedIndex.value)
})
provideUseId(() => useId()) provideUseId(() => useId())

View File

@@ -63,7 +63,7 @@ import ULink from '../elements/Link.vue'
import UDivider from '../layout/Divider.vue' import UDivider from '../layout/Divider.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig, getULinkProps } from '../../utils' import { mergeConfig, getULinkProps } from '../../utils'
import type { VerticalNavigationLink, Strategy } from '../../types' import type { VerticalNavigationLink, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { verticalNavigation } from '#ui/ui.config' import { verticalNavigation } from '#ui/ui.config'

View File

@@ -22,7 +22,7 @@ import { twMerge, twJoin } from 'tailwind-merge'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { usePopper } from '../../composables/usePopper' import { usePopper } from '../../composables/usePopper'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { PopperOptions, Strategy } from '../../types' import type { PopperOptions, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { contextMenu } from '#ui/ui.config' import { contextMenu } from '#ui/ui.config'

View File

@@ -32,7 +32,7 @@ import type { PropType } from 'vue'
import { Dialog as HDialog, DialogPanel as HDialogPanel, TransitionRoot, TransitionChild, provideUseId } from '@headlessui/vue' import { Dialog as HDialog, DialogPanel as HDialogPanel, TransitionRoot, TransitionChild, provideUseId } from '@headlessui/vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy } from '../../types' import type { Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { modal } from '#ui/ui.config' import { modal } from '#ui/ui.config'

View File

@@ -52,7 +52,7 @@ import UButton from '../elements/Button.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useTimer } from '../../composables/useTimer' import { useTimer } from '../../composables/useTimer'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Avatar, Button, NotificationColor, NotificationAction, Strategy } from '../../types' import type { Avatar, Button, NotificationColor, NotificationAction, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { notification } from '#ui/ui.config' import { notification } from '#ui/ui.config'

View File

@@ -27,7 +27,7 @@ import UNotification from './Notification.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { useToast } from '../../composables/useToast' import { useToast } from '../../composables/useToast'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Notification, Strategy } from '../../types' import type { Notification, Strategy } from '../../types/index'
import { useState } from '#imports' import { useState } from '#imports'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'

View File

@@ -43,7 +43,7 @@ import { Popover as HPopover, PopoverButton as HPopoverButton, PopoverPanel as H
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { usePopper } from '../../composables/usePopper' import { usePopper } from '../../composables/usePopper'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { PopperOptions, Strategy } from '../../types' import type { PopperOptions, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { popover } from '#ui/ui.config' import { popover } from '#ui/ui.config'

View File

@@ -6,7 +6,7 @@
</TransitionChild> </TransitionChild>
<TransitionChild as="template" :appear="appear" v-bind="transitionClass"> <TransitionChild as="template" :appear="appear" v-bind="transitionClass">
<HDialogPanel :class="[ui.base, sideType === 'horizontal' ? [ui.width, 'h-full'] : [ui.height, 'w-full'], ui.background, ui.ring, ui.padding]"> <HDialogPanel :class="[ui.base, sideType === 'horizontal' ? [ui.width, 'h-full'] : [ui.height, 'w-full'], ui.background, ui.ring, ui.rounded, ui.padding, ui.shadow]">
<slot /> <slot />
</HDialogPanel> </HDialogPanel>
</TransitionChild> </TransitionChild>
@@ -20,7 +20,7 @@ import type { WritableComputedRef, PropType } from 'vue'
import { Dialog as HDialog, DialogPanel as HDialogPanel, TransitionRoot, TransitionChild, provideUseId } from '@headlessui/vue' import { Dialog as HDialog, DialogPanel as HDialogPanel, TransitionRoot, TransitionChild, provideUseId } from '@headlessui/vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { Strategy } from '../../types' import type { Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { slideover } from '#ui/ui.config' import { slideover } from '#ui/ui.config'

View File

@@ -36,7 +36,7 @@ import UKbd from '../elements/Kbd.vue'
import { useUI } from '../../composables/useUI' import { useUI } from '../../composables/useUI'
import { usePopper } from '../../composables/usePopper' import { usePopper } from '../../composables/usePopper'
import { mergeConfig } from '../../utils' import { mergeConfig } from '../../utils'
import type { PopperOptions, Strategy } from '../../types' import type { PopperOptions, Strategy } from '../../types/index'
// @ts-expect-error // @ts-expect-error
import appConfig from '#build/app.config' import appConfig from '#build/app.config'
import { tooltip } from '#ui/ui.config' import { tooltip } from '#ui/ui.config'

View File

@@ -1,10 +1,6 @@
import { inject, ref, computed } from 'vue' import { inject, ref, computed } from 'vue'
import { type UseEventBusReturn, useDebounceFn } from '@vueuse/core' import { type UseEventBusReturn, useDebounceFn } from '@vueuse/core'
import type { FormEvent, FormEventType, InjectedFormGroupValue } from '../types/form' import type { FormEvent, FormEventType, InjectedFormGroupValue } from '../types/form'
import { mergeConfig } from '../utils'
// @ts-expect-error
import appConfig from '#build/app.config'
import { formGroup } from '#ui/ui.config'
type InputProps = { type InputProps = {
id?: string id?: string
@@ -16,15 +12,15 @@ type InputProps = {
} }
const formGroupConfig = mergeConfig<typeof formGroup>(appConfig.ui.strategy, appConfig.ui.formGroup, formGroup) export const useFormGroup = (inputProps?: InputProps, config?: any, bind: boolean = true) => {
export const useFormGroup = (inputProps?: InputProps, config?: any) => {
const formBus = inject<UseEventBusReturn<FormEvent, string> | undefined>('form-events', undefined) const formBus = inject<UseEventBusReturn<FormEvent, string> | undefined>('form-events', undefined)
const formGroup = inject<InjectedFormGroupValue | undefined>('form-group', undefined) const formGroup = inject<InjectedFormGroupValue | undefined>('form-group', undefined)
const formInputs = inject<any>('form-inputs', undefined) const formInputs = inject<any>('form-inputs', undefined)
if (formGroup) { if (formGroup) {
if (inputProps?.id) { if (!bind || inputProps.legend) {
formGroup.inputId.value = undefined
} else if (inputProps?.id) {
// Updates for="..." attribute on label if inputProps.id is provided // Updates for="..." attribute on label if inputProps.id is provided
formGroup.inputId.value = inputProps?.id formGroup.inputId.value = inputProps?.id
} }
@@ -62,7 +58,7 @@ export const useFormGroup = (inputProps?: InputProps, config?: any) => {
name: computed(() => inputProps?.name ?? formGroup?.name.value), name: computed(() => inputProps?.name ?? formGroup?.name.value),
size: computed(() => { size: computed(() => {
const formGroupSize = config.size[formGroup?.size.value as string] ? formGroup?.size.value : null const formGroupSize = config.size[formGroup?.size.value as string] ? formGroup?.size.value : null
return inputProps?.size ?? formGroupSize ?? formGroupConfig?.default?.size return inputProps?.size ?? formGroupSize ?? config.default?.size
}), }),
color: computed(() => formGroup?.error?.value ? 'red' : inputProps?.color), color: computed(() => formGroup?.error?.value ? 'red' : inputProps?.color),
emitFormBlur, emitFormBlur,

View File

@@ -2,7 +2,7 @@ import { computed, toValue, useAttrs } from 'vue'
import type { Ref } from 'vue' import type { Ref } from 'vue'
import { useAppConfig } from '#imports' import { useAppConfig } from '#imports'
import { mergeConfig, omit, get } from '../utils' import { mergeConfig, omit, get } from '../utils'
import type { Strategy } from '../types' import type { Strategy } from '../types/index'
export const useUI = <T>(key, $ui?: Ref<Partial<T> & { strategy?: Strategy } | undefined>, $config?: Ref<T> | T, $wrapperClass?: Ref<string>, withAppConfig: boolean = false) => { export const useUI = <T>(key, $ui?: Ref<Partial<T> & { strategy?: Strategy } | undefined>, $config?: Ref<T> | T, $wrapperClass?: Ref<string>, withAppConfig: boolean = false) => {
const $attrs = useAttrs() const $attrs = useAttrs()

View File

@@ -1,5 +1,5 @@
import { computed } from 'vue' import { computed } from 'vue'
import { hexToRgb } from '../utils' import { get, parseConfigValue } from '../utils'
import { defineNuxtPlugin, useAppConfig, useNuxtApp, useHead } from '#imports' import { defineNuxtPlugin, useAppConfig, useNuxtApp, useHead } from '#imports'
import colors from '#tailwind-config/theme/colors' import colors from '#tailwind-config/theme/colors'
@@ -8,8 +8,8 @@ export default defineNuxtPlugin(() => {
const nuxtApp = useNuxtApp() const nuxtApp = useNuxtApp()
const root = computed(() => { const root = computed(() => {
const primary: Record<string, string> | undefined = colors[appConfig.ui.primary] const primary: Record<string, string> | undefined = get(colors, appConfig.ui.primary)
const gray: Record<string, string> | undefined = colors[appConfig.ui.gray] const gray: Record<string, string> | undefined = get(colors, appConfig.ui.gray)
if (!primary) { if (!primary) {
console.warn(`[@nuxt/ui] Primary color '${appConfig.ui.primary}' not found in Tailwind config`) console.warn(`[@nuxt/ui] Primary color '${appConfig.ui.primary}' not found in Tailwind config`)
@@ -19,10 +19,10 @@ export default defineNuxtPlugin(() => {
} }
return `:root { return `:root {
${Object.entries(primary || colors.green).map(([key, value]) => `--color-primary-${key}: ${hexToRgb(value)};`).join('\n')} ${Object.entries(primary || colors.green).map(([key, value]) => `--color-primary-${key}: ${parseConfigValue(value)};`).join('\n')}
--color-primary-DEFAULT: var(--color-primary-500); --color-primary-DEFAULT: var(--color-primary-500);
${Object.entries(gray || colors.cool).map(([key, value]) => `--color-gray-${key}: ${hexToRgb(value)};`).join('\n')} ${Object.entries(gray || colors.cool).map(([key, value]) => `--color-gray-${key}: ${parseConfigValue(value)};`).join('\n')}
} }
.dark { .dark {

View File

@@ -1,4 +1,4 @@
import Fuse from 'fuse.js' import { FuseResultMatch } from 'fuse.js'
import type { Avatar } from './avatar' import type { Avatar } from './avatar'
export interface Command { export interface Command {
@@ -13,7 +13,7 @@ export interface Command {
shortcuts?: string[] shortcuts?: string[]
group?: string group?: string
score?: number score?: number
matches?: Fuse.FuseResultMatch[] matches?: FuseResultMatch[]
[key: string]: any [key: string]: any
} }

Some files were not shown because too many files have changed in this diff Show More