@@ -34,6 +32,7 @@
import { computed, defineComponent } from 'vue'
import type { PropType } from 'vue'
import { defu } from 'defu'
+import { classNames } from '../../utils'
import { useAppConfig } from '#imports'
// TODO: Remove
// @ts-expect-error
@@ -80,19 +79,26 @@ export default defineComponent({
type: Boolean,
default: false
},
+ color: {
+ type: String,
+ default: () => appConfig.ui.checkbox.default.color,
+ validator (value: string) {
+ return appConfig.ui.colors.includes(value)
+ }
+ },
ui: {
type: Object as PropType
>,
default: () => appConfig.ui.checkbox
}
},
- emits: ['update:modelValue', 'focus', 'blur'],
+ emits: ['update:modelValue'],
setup (props, { emit }) {
// TODO: Remove
const appConfig = useAppConfig()
const ui = computed>(() => defu({}, props.ui, appConfig.ui.checkbox))
- const isChecked = computed({
+ const toggle = computed({
get () {
return props.modelValue
},
@@ -101,10 +107,22 @@ export default defineComponent({
}
})
+ const inputClass = computed(() => {
+ return classNames(
+ ui.value.base,
+ ui.value.rounded,
+ ui.value.background,
+ ui.value.border,
+ ui.value.ring.replaceAll('{color}', props.color),
+ ui.value.color.replaceAll('{color}', props.color)
+ )
+ })
+
return {
// eslint-disable-next-line vue/no-dupe-keys
ui,
- isChecked
+ toggle,
+ inputClass
}
}
})
diff --git a/src/runtime/components/forms/Input.vue b/src/runtime/components/forms/Input.vue
index c597a42bdd..c992cdebef 100644
--- a/src/runtime/components/forms/Input.vue
+++ b/src/runtime/components/forms/Input.vue
@@ -13,8 +13,6 @@
:class="inputClass"
v-bind="$attrs"
@input="onInput"
- @focus="$emit('focus', $event)"
- @blur="$emit('blur', $event)"
>
@@ -140,7 +138,7 @@ export default defineComponent({
default: () => appConfig.ui.input
}
},
- emits: ['update:modelValue', 'focus', 'blur'],
+ emits: ['update:modelValue'],
setup (props, { emit, slots }) {
// TODO: Remove
const appConfig = useAppConfig()
diff --git a/src/runtime/components/forms/Radio.vue b/src/runtime/components/forms/Radio.vue
index fd6a7a9445..85ed506a74 100644
--- a/src/runtime/components/forms/Radio.vue
+++ b/src/runtime/components/forms/Radio.vue
@@ -3,17 +3,15 @@
@@ -32,6 +30,7 @@
import { computed, defineComponent } from 'vue'
import type { PropType } from 'vue'
import { defu } from 'defu'
+import { classNames } from '../../utils'
import { useAppConfig } from '#imports'
// TODO: Remove
// @ts-expect-error
@@ -70,19 +69,26 @@ export default defineComponent({
type: Boolean,
default: false
},
+ color: {
+ type: String,
+ default: () => appConfig.ui.radio.default.color,
+ validator (value: string) {
+ return appConfig.ui.colors.includes(value)
+ }
+ },
ui: {
type: Object as PropType
>,
default: () => appConfig.ui.radio
}
},
- emits: ['update:modelValue', 'focus', 'blur'],
+ emits: ['update:modelValue'],
setup (props, { emit }) {
// TODO: Remove
const appConfig = useAppConfig()
const ui = computed>(() => defu({}, props.ui, appConfig.ui.radio))
- const isChecked = computed({
+ const pick = computed({
get () {
return props.modelValue
},
@@ -91,10 +97,21 @@ export default defineComponent({
}
})
+ const inputClass = computed(() => {
+ return classNames(
+ ui.value.base,
+ ui.value.background,
+ ui.value.border,
+ ui.value.ring.replaceAll('{color}', props.color),
+ ui.value.color.replaceAll('{color}', props.color)
+ )
+ })
+
return {
// eslint-disable-next-line vue/no-dupe-keys
ui,
- isChecked
+ pick,
+ inputClass
}
}
})
diff --git a/src/runtime/components/forms/Select.vue b/src/runtime/components/forms/Select.vue
index 256f315398..976095aafd 100644
--- a/src/runtime/components/forms/Select.vue
+++ b/src/runtime/components/forms/Select.vue
@@ -165,7 +165,7 @@ export default defineComponent({
default: () => appConfig.ui.select
}
},
- emits: ['update:modelValue', 'focus', 'blur'],
+ emits: ['update:modelValue'],
setup (props, { emit, slots }) {
// TODO: Remove
const appConfig = useAppConfig()
diff --git a/src/runtime/components/forms/Textarea.vue b/src/runtime/components/forms/Textarea.vue
index 496d9b61de..d5a5ca81fd 100644
--- a/src/runtime/components/forms/Textarea.vue
+++ b/src/runtime/components/forms/Textarea.vue
@@ -13,8 +13,6 @@
:class="textareaClass"
v-bind="$attrs"
@input="onInput"
- @focus="$emit('focus', $event)"
- @blur="$emit('blur', $event)"
/>
@@ -103,7 +101,7 @@ export default defineComponent({
default: () => appConfig.ui.textarea
}
},
- emits: ['update:modelValue', 'focus', 'blur'],
+ emits: ['update:modelValue'],
setup (props, { emit }) {
const textarea = ref(null)
diff --git a/src/runtime/components/forms/Toggle.vue b/src/runtime/components/forms/Toggle.vue
index 25dd59e605..6403d4836c 100644
--- a/src/runtime/components/forms/Toggle.vue
+++ b/src/runtime/components/forms/Toggle.vue
@@ -3,14 +3,14 @@
v-model="active"
:name="name"
:disabled="disabled"
- :class="[active ? ui.active : ui.inactive, ui.base]"
+ :class="switchClass"
>
-
+
-
+
@@ -22,6 +22,7 @@ import type { PropType } from 'vue'
import { defu } from 'defu'
import { Switch } from '@headlessui/vue'
import UIcon from '../elements/Icon.vue'
+import { classNames } from '../../utils'
import { useAppConfig } from '#imports'
// TODO: Remove
// @ts-expect-error
@@ -56,6 +57,13 @@ export default defineComponent({
type: String,
default: () => appConfig.ui.toggle.default.offIcon
},
+ color: {
+ type: String,
+ default: () => appConfig.ui.toggle.default.color,
+ validator (value: string) {
+ return appConfig.ui.colors.includes(value)
+ }
+ },
ui: {
type: Object as PropType>,
default: () => appConfig.ui.toggle
@@ -77,10 +85,34 @@ export default defineComponent({
}
})
+ const switchClass = computed(()=>{
+ return classNames(
+ ui.value.base,
+ ui.value.rounded,
+ ui.value.ring.replaceAll('{color}', props.color),
+ (active.value ? ui.value.active : ui.value.inactive).replaceAll('{color}', props.color)
+ )
+ })
+
+ const onIconClass = computed(()=>{
+ return classNames(
+ ui.value.icon.on.replaceAll('{color}', props.color)
+ )
+ })
+
+ const offIconClass = computed(()=>{
+ return classNames(
+ ui.value.icon.off.replaceAll('{color}', props.color)
+ )
+ })
+
return {
// eslint-disable-next-line vue/no-dupe-keys
ui,
- active
+ active,
+ switchClass,
+ onIconClass,
+ offIconClass
}
}
})
diff --git a/src/runtime/components/navigation/CommandPalette.vue b/src/runtime/components/navigation/CommandPalette.vue
index aa59bd6138..9635250264 100644
--- a/src/runtime/components/navigation/CommandPalette.vue
+++ b/src/runtime/components/navigation/CommandPalette.vue
@@ -78,8 +78,8 @@ import type { Group, Command } from '../../types/command-palette'
import UIcon from '../elements/Icon.vue'
import UButton from '../elements/Button.vue'
import type { Button } from '../../types/button'
-import { classNames } from '../../utils'
import CommandPaletteGroup from './CommandPaletteGroup.vue'
+import { classNames } from '../../utils'
import { useAppConfig } from '#imports'
// TODO: Remove
// @ts-expect-error