@soave/ui 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/css-variables.d.ts +2 -1
- package/dist/adapters/css-variables.d.ts.map +1 -0
- package/dist/adapters/headless.d.ts +2 -1
- package/dist/adapters/headless.d.ts.map +1 -0
- package/dist/adapters/index.d.ts +6 -5
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/tailwind.d.ts +2 -1
- package/dist/adapters/tailwind.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +2 -1
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters.d.ts +2 -0
- package/dist/{adapters/css-variables.mjs → adapters.mjs} +33 -2
- package/dist/adapters.mjs.map +1 -0
- package/dist/components/Button.vue.d.ts +35 -0
- package/dist/components/Button.vue.d.ts.map +1 -0
- package/dist/components/Card.vue.d.ts +29 -0
- package/dist/components/Card.vue.d.ts.map +1 -0
- package/dist/components/Checkbox.vue.d.ts +39 -0
- package/dist/components/Checkbox.vue.d.ts.map +1 -0
- package/dist/components/Dialog.vue.d.ts +46 -0
- package/dist/components/Dialog.vue.d.ts.map +1 -0
- package/dist/components/Input.vue.d.ts +24 -0
- package/dist/components/Input.vue.d.ts.map +1 -0
- package/dist/components/RadioGroup.vue.d.ts +32 -0
- package/dist/components/RadioGroup.vue.d.ts.map +1 -0
- package/dist/components/RadioItem.vue.d.ts +40 -0
- package/dist/components/RadioItem.vue.d.ts.map +1 -0
- package/dist/components/Select.vue.d.ts +50 -0
- package/dist/components/Select.vue.d.ts.map +1 -0
- package/dist/components/SelectContent.vue.d.ts +25 -0
- package/dist/components/SelectContent.vue.d.ts.map +1 -0
- package/dist/components/SelectItem.vue.d.ts +36 -0
- package/dist/components/SelectItem.vue.d.ts.map +1 -0
- package/dist/components/SelectTrigger.vue.d.ts +36 -0
- package/dist/components/SelectTrigger.vue.d.ts.map +1 -0
- package/dist/components/Switch.vue.d.ts +46 -0
- package/dist/components/Switch.vue.d.ts.map +1 -0
- package/dist/components/Textarea.vue.d.ts +41 -0
- package/dist/components/Textarea.vue.d.ts.map +1 -0
- package/dist/components/index.d.ts +14 -13
- package/dist/components/index.d.ts.map +1 -0
- package/dist/composables/index.d.ts +18 -17
- package/dist/composables/index.d.ts.map +1 -0
- package/dist/composables/useButton.d.ts +3 -2
- package/dist/composables/useButton.d.ts.map +1 -0
- package/dist/composables/useCard.d.ts +3 -2
- package/dist/composables/useCard.d.ts.map +1 -0
- package/dist/composables/useCheckbox.d.ts +3 -2
- package/dist/composables/useCheckbox.d.ts.map +1 -0
- package/dist/composables/useDialog.d.ts +2 -1
- package/dist/composables/useDialog.d.ts.map +1 -0
- package/dist/composables/useDropdown.d.ts +3 -2
- package/dist/composables/useDropdown.d.ts.map +1 -0
- package/dist/composables/useFileInput.d.ts +3 -2
- package/dist/composables/useFileInput.d.ts.map +1 -0
- package/dist/composables/useForm.d.ts +3 -2
- package/dist/composables/useForm.d.ts.map +1 -0
- package/dist/composables/useInput.d.ts +3 -2
- package/dist/composables/useInput.d.ts.map +1 -0
- package/dist/composables/usePopover.d.ts +3 -2
- package/dist/composables/usePopover.d.ts.map +1 -0
- package/dist/composables/useRadio.d.ts +3 -2
- package/dist/composables/useRadio.d.ts.map +1 -0
- package/dist/composables/useSelect.d.ts +3 -2
- package/dist/composables/useSelect.d.ts.map +1 -0
- package/dist/composables/useSwitch.d.ts +3 -2
- package/dist/composables/useSwitch.d.ts.map +1 -0
- package/dist/composables/useTextarea.d.ts +3 -2
- package/dist/composables/useTextarea.d.ts.map +1 -0
- package/dist/composables/useTheme.d.ts +3 -2
- package/dist/composables/useTheme.d.ts.map +1 -0
- package/dist/composables/useToast.d.ts +2 -1
- package/dist/composables/useToast.d.ts.map +1 -0
- package/dist/composables/useTooltip.d.ts +3 -2
- package/dist/composables/useTooltip.d.ts.map +1 -0
- package/dist/composables/useUIConfig.d.ts +5 -4
- package/dist/composables/useUIConfig.d.ts.map +1 -0
- package/dist/composables.d.ts +2 -0
- package/dist/composables.mjs +30 -0
- package/dist/composables.mjs.map +1 -0
- package/dist/constants/errors.d.ts +1 -0
- package/dist/constants/errors.d.ts.map +1 -0
- package/dist/constants/index.d.ts +3 -2
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/logs.d.ts +1 -0
- package/dist/constants/logs.d.ts.map +1 -0
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +760 -6
- package/dist/index.mjs.map +1 -0
- package/dist/{adapters/tailwind.mjs → tailwind-B-R7fPT1.js} +16 -7
- package/dist/tailwind-B-R7fPT1.js.map +1 -0
- package/dist/types/alert.d.ts +2 -1
- package/dist/types/alert.d.ts.map +1 -0
- package/dist/types/button.d.ts +2 -1
- package/dist/types/button.d.ts.map +1 -0
- package/dist/types/card.d.ts +2 -1
- package/dist/types/card.d.ts.map +1 -0
- package/dist/types/checkbox.d.ts +2 -1
- package/dist/types/checkbox.d.ts.map +1 -0
- package/dist/types/composables.d.ts +10 -1
- package/dist/types/composables.d.ts.map +1 -0
- package/dist/types/config.d.ts +6 -5
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/dialog.d.ts +2 -1
- package/dist/types/dialog.d.ts.map +1 -0
- package/dist/types/dropdown.d.ts +3 -2
- package/dist/types/dropdown.d.ts.map +1 -0
- package/dist/types/file-input.d.ts +2 -1
- package/dist/types/file-input.d.ts.map +1 -0
- package/dist/types/form.d.ts +2 -1
- package/dist/types/form.d.ts.map +1 -0
- package/dist/types/index.d.ts +22 -21
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/input.d.ts +2 -1
- package/dist/types/input.d.ts.map +1 -0
- package/dist/types/popover.d.ts +3 -2
- package/dist/types/popover.d.ts.map +1 -0
- package/dist/types/radio.d.ts +2 -1
- package/dist/types/radio.d.ts.map +1 -0
- package/dist/types/select.d.ts +2 -1
- package/dist/types/select.d.ts.map +1 -0
- package/dist/types/sheet.d.ts +2 -1
- package/dist/types/sheet.d.ts.map +1 -0
- package/dist/types/switch.d.ts +2 -1
- package/dist/types/switch.d.ts.map +1 -0
- package/dist/types/textarea.d.ts +2 -1
- package/dist/types/textarea.d.ts.map +1 -0
- package/dist/types/theme.d.ts +1 -0
- package/dist/types/theme.d.ts.map +1 -0
- package/dist/types/toast.d.ts +1 -0
- package/dist/types/toast.d.ts.map +1 -0
- package/dist/types/tooltip.d.ts +3 -2
- package/dist/types/tooltip.d.ts.map +1 -0
- package/dist/types/utils.d.ts +1 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/useTheme-C2uPqAtQ.js +1175 -0
- package/dist/useTheme-C2uPqAtQ.js.map +1 -0
- package/dist/utils/cn.d.ts +2 -1
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/deepMerge.d.ts +2 -1
- package/dist/utils/deepMerge.d.ts.map +1 -0
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/index.d.ts.map +1 -0
- package/package.json +6 -4
- package/dist/adapters/headless.mjs +0 -7
- package/dist/adapters/index.mjs +0 -11
- package/dist/adapters/types.mjs +0 -10
- package/dist/build.config.d.ts +0 -2
- package/dist/build.config.mjs +0 -14
- package/dist/components/Button.vue +0 -41
- package/dist/components/Card.vue +0 -24
- package/dist/components/Checkbox.vue +0 -47
- package/dist/components/Dialog.vue +0 -105
- package/dist/components/Input.vue +0 -48
- package/dist/components/RadioGroup.vue +0 -45
- package/dist/components/RadioItem.vue +0 -65
- package/dist/components/Select.vue +0 -114
- package/dist/components/SelectContent.vue +0 -54
- package/dist/components/SelectItem.vue +0 -61
- package/dist/components/SelectTrigger.vue +0 -75
- package/dist/components/Switch.vue +0 -45
- package/dist/components/Textarea.vue +0 -55
- package/dist/components/index.mjs +0 -13
- package/dist/composables/index.mjs +0 -17
- package/dist/composables/useButton.mjs +0 -22
- package/dist/composables/useCard.mjs +0 -11
- package/dist/composables/useCheckbox.mjs +0 -18
- package/dist/composables/useDialog.mjs +0 -19
- package/dist/composables/useDropdown.mjs +0 -170
- package/dist/composables/useFileInput.mjs +0 -137
- package/dist/composables/useForm.mjs +0 -159
- package/dist/composables/useInput.mjs +0 -31
- package/dist/composables/usePopover.mjs +0 -113
- package/dist/composables/useRadio.mjs +0 -23
- package/dist/composables/useSelect.mjs +0 -42
- package/dist/composables/useSwitch.mjs +0 -17
- package/dist/composables/useTextarea.mjs +0 -29
- package/dist/composables/useTheme.mjs +0 -89
- package/dist/composables/useToast.mjs +0 -64
- package/dist/composables/useTooltip.mjs +0 -125
- package/dist/composables/useUIConfig.mjs +0 -53
- package/dist/constants/errors.mjs +0 -18
- package/dist/constants/index.mjs +0 -2
- package/dist/constants/logs.mjs +0 -17
- package/dist/env.d.ts +0 -11
- package/dist/styles/css-variables.css +0 -1
- package/dist/styles/index.d.ts +0 -1
- package/dist/styles/index.mjs +0 -1
- package/dist/types/alert.mjs +0 -0
- package/dist/types/button.mjs +0 -0
- package/dist/types/card.mjs +0 -0
- package/dist/types/checkbox.mjs +0 -0
- package/dist/types/composables.mjs +0 -0
- package/dist/types/config.mjs +0 -15
- package/dist/types/dialog.mjs +0 -1
- package/dist/types/dropdown.mjs +0 -1
- package/dist/types/file-input.mjs +0 -0
- package/dist/types/form.mjs +0 -0
- package/dist/types/index.mjs +0 -21
- package/dist/types/input.mjs +0 -0
- package/dist/types/popover.mjs +0 -1
- package/dist/types/radio.mjs +0 -1
- package/dist/types/select.mjs +0 -1
- package/dist/types/sheet.mjs +0 -1
- package/dist/types/switch.mjs +0 -0
- package/dist/types/textarea.mjs +0 -0
- package/dist/types/theme.mjs +0 -42
- package/dist/types/toast.mjs +0 -0
- package/dist/types/tooltip.mjs +0 -1
- package/dist/types/utils.mjs +0 -0
- package/dist/utils/cn.mjs +0 -5
- package/dist/utils/deepMerge.mjs +0 -18
- package/dist/utils/index.mjs +0 -2
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<button
|
|
3
|
-
type="button"
|
|
4
|
-
:disabled="composable.state.value.disabled"
|
|
5
|
-
:data-state="composable.state.value.checked ? 'checked' : 'unchecked'"
|
|
6
|
-
v-bind="composable.aria_attributes.value"
|
|
7
|
-
@click="handleClick"
|
|
8
|
-
@keydown="handleKeyDown"
|
|
9
|
-
>
|
|
10
|
-
<slot :checked="composable.state.value.checked" :disabled="composable.state.value.disabled" />
|
|
11
|
-
</button>
|
|
12
|
-
</template>
|
|
13
|
-
|
|
14
|
-
<script setup lang="ts">
|
|
15
|
-
import { inject, toRef } from "vue"
|
|
16
|
-
import type { Ref, ComputedRef, InjectionKey } from "vue"
|
|
17
|
-
import { useRadioItem } from "../../composables/useRadio"
|
|
18
|
-
|
|
19
|
-
interface RadioGroupContext {
|
|
20
|
-
model_value: Ref<string>
|
|
21
|
-
disabled: ComputedRef<boolean>
|
|
22
|
-
updateValue: (value: string) => void
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const RADIO_GROUP_KEY: InjectionKey<RadioGroupContext> = Symbol("radio-group")
|
|
26
|
-
|
|
27
|
-
const props = withDefaults(defineProps<{
|
|
28
|
-
value: string
|
|
29
|
-
size?: "sm" | "md" | "lg"
|
|
30
|
-
disabled?: boolean
|
|
31
|
-
}>(), {
|
|
32
|
-
size: "md",
|
|
33
|
-
disabled: false
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
const context = inject<RadioGroupContext | null>(RADIO_GROUP_KEY, null)
|
|
37
|
-
|
|
38
|
-
if (!context) {
|
|
39
|
-
throw new Error("RadioItem must be used within RadioGroup")
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const composable = useRadioItem(toRef(() => props))
|
|
43
|
-
|
|
44
|
-
const handleClick = () => {
|
|
45
|
-
if (!composable.state.value.disabled) {
|
|
46
|
-
context.updateValue(props.value)
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const handleKeyDown = (event: KeyboardEvent) => {
|
|
51
|
-
if (composable.state.value.disabled) return
|
|
52
|
-
|
|
53
|
-
switch (event.key) {
|
|
54
|
-
case "Enter":
|
|
55
|
-
case " ":
|
|
56
|
-
event.preventDefault()
|
|
57
|
-
context.updateValue(props.value)
|
|
58
|
-
break
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
defineExpose({
|
|
63
|
-
state: composable.state
|
|
64
|
-
})
|
|
65
|
-
</script>
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div ref="root_ref">
|
|
3
|
-
<slot
|
|
4
|
-
:is_open="context.is_open.value"
|
|
5
|
-
:selected_value="model"
|
|
6
|
-
:open="context.open"
|
|
7
|
-
:close="context.close"
|
|
8
|
-
:toggle="context.toggle"
|
|
9
|
-
/>
|
|
10
|
-
</div>
|
|
11
|
-
</template>
|
|
12
|
-
|
|
13
|
-
<script setup lang="ts">
|
|
14
|
-
import { ref, provide, watch, onMounted, onUnmounted, computed } from "vue"
|
|
15
|
-
import type { Ref, ComputedRef, InjectionKey } from "vue"
|
|
16
|
-
|
|
17
|
-
interface SelectContext {
|
|
18
|
-
model_value: Ref<string>
|
|
19
|
-
is_open: Ref<boolean>
|
|
20
|
-
disabled: ComputedRef<boolean>
|
|
21
|
-
size: ComputedRef<"sm" | "md" | "lg">
|
|
22
|
-
placeholder: ComputedRef<string>
|
|
23
|
-
trigger_ref: Ref<HTMLElement | null>
|
|
24
|
-
updateValue: (value: string) => void
|
|
25
|
-
open: () => void
|
|
26
|
-
close: () => void
|
|
27
|
-
toggle: () => void
|
|
28
|
-
setTriggerRef: (element: HTMLElement | null) => void
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const SELECT_KEY: InjectionKey<SelectContext> = Symbol("select")
|
|
32
|
-
|
|
33
|
-
const props = withDefaults(defineProps<{
|
|
34
|
-
size?: "sm" | "md" | "lg"
|
|
35
|
-
disabled?: boolean
|
|
36
|
-
placeholder?: string
|
|
37
|
-
}>(), {
|
|
38
|
-
size: "md",
|
|
39
|
-
disabled: false,
|
|
40
|
-
placeholder: ""
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
const model = defineModel<string>({ default: "" })
|
|
44
|
-
|
|
45
|
-
const root_ref = ref<HTMLElement | null>(null)
|
|
46
|
-
const trigger_ref = ref<HTMLElement | null>(null)
|
|
47
|
-
const is_open = ref(false)
|
|
48
|
-
|
|
49
|
-
const open = () => {
|
|
50
|
-
if (!props.disabled) {
|
|
51
|
-
is_open.value = true
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const close = () => {
|
|
56
|
-
is_open.value = false
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const toggle = () => {
|
|
60
|
-
if (is_open.value) {
|
|
61
|
-
close()
|
|
62
|
-
} else {
|
|
63
|
-
open()
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const updateValue = (value: string) => {
|
|
68
|
-
model.value = value
|
|
69
|
-
close()
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const setTriggerRef = (element: HTMLElement | null) => {
|
|
73
|
-
trigger_ref.value = element
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const handleClickOutside = (event: MouseEvent) => {
|
|
77
|
-
if (!is_open.value) return
|
|
78
|
-
const target = event.target as Node
|
|
79
|
-
if (root_ref.value && !root_ref.value.contains(target)) {
|
|
80
|
-
close()
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const context: SelectContext = {
|
|
85
|
-
model_value: model,
|
|
86
|
-
is_open,
|
|
87
|
-
disabled: computed(() => props.disabled),
|
|
88
|
-
size: computed(() => props.size ?? "md"),
|
|
89
|
-
placeholder: computed(() => props.placeholder ?? ""),
|
|
90
|
-
trigger_ref,
|
|
91
|
-
updateValue,
|
|
92
|
-
open,
|
|
93
|
-
close,
|
|
94
|
-
toggle,
|
|
95
|
-
setTriggerRef
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
provide(SELECT_KEY, context)
|
|
99
|
-
|
|
100
|
-
onMounted(() => {
|
|
101
|
-
document.addEventListener("mousedown", handleClickOutside)
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
onUnmounted(() => {
|
|
105
|
-
document.removeEventListener("mousedown", handleClickOutside)
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
defineExpose({
|
|
109
|
-
is_open,
|
|
110
|
-
open,
|
|
111
|
-
close,
|
|
112
|
-
toggle
|
|
113
|
-
})
|
|
114
|
-
</script>
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div
|
|
3
|
-
v-if="composable.state.value.is_open"
|
|
4
|
-
role="listbox"
|
|
5
|
-
tabindex="-1"
|
|
6
|
-
@keydown="handleKeyDown"
|
|
7
|
-
>
|
|
8
|
-
<slot />
|
|
9
|
-
</div>
|
|
10
|
-
</template>
|
|
11
|
-
|
|
12
|
-
<script setup lang="ts">
|
|
13
|
-
import { inject } from "vue"
|
|
14
|
-
import type { Ref, ComputedRef, InjectionKey } from "vue"
|
|
15
|
-
import { useSelectContent } from "../../composables/useSelect"
|
|
16
|
-
|
|
17
|
-
interface SelectContext {
|
|
18
|
-
model_value: Ref<string>
|
|
19
|
-
is_open: Ref<boolean>
|
|
20
|
-
disabled: ComputedRef<boolean>
|
|
21
|
-
size: ComputedRef<"sm" | "md" | "lg">
|
|
22
|
-
placeholder: ComputedRef<string>
|
|
23
|
-
trigger_ref: Ref<HTMLElement | null>
|
|
24
|
-
updateValue: (value: string) => void
|
|
25
|
-
open: () => void
|
|
26
|
-
close: () => void
|
|
27
|
-
toggle: () => void
|
|
28
|
-
setTriggerRef: (element: HTMLElement | null) => void
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const SELECT_KEY: InjectionKey<SelectContext> = Symbol("select")
|
|
32
|
-
|
|
33
|
-
const context = inject<SelectContext | null>(SELECT_KEY, null)
|
|
34
|
-
|
|
35
|
-
if (!context) {
|
|
36
|
-
throw new Error("SelectContent must be used within Select")
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const composable = useSelectContent()
|
|
40
|
-
|
|
41
|
-
const handleKeyDown = (event: KeyboardEvent) => {
|
|
42
|
-
switch (event.key) {
|
|
43
|
-
case "Escape":
|
|
44
|
-
event.preventDefault()
|
|
45
|
-
context.close()
|
|
46
|
-
context.trigger_ref.value?.focus()
|
|
47
|
-
break
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
defineExpose({
|
|
52
|
-
state: composable.state
|
|
53
|
-
})
|
|
54
|
-
</script>
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div
|
|
3
|
-
role="option"
|
|
4
|
-
:aria-selected="composable.state.value.selected"
|
|
5
|
-
:aria-disabled="composable.state.value.disabled"
|
|
6
|
-
:data-state="composable.state.value.selected ? 'selected' : undefined"
|
|
7
|
-
:data-disabled="composable.state.value.disabled ? '' : undefined"
|
|
8
|
-
@click="handleClick"
|
|
9
|
-
@keydown.enter="handleClick"
|
|
10
|
-
@keydown.space.prevent="handleClick"
|
|
11
|
-
>
|
|
12
|
-
<slot :selected="composable.state.value.selected" :disabled="composable.state.value.disabled" />
|
|
13
|
-
</div>
|
|
14
|
-
</template>
|
|
15
|
-
|
|
16
|
-
<script setup lang="ts">
|
|
17
|
-
import { inject, toRef } from "vue"
|
|
18
|
-
import type { Ref, ComputedRef, InjectionKey } from "vue"
|
|
19
|
-
import { useSelectItem } from "../../composables/useSelect"
|
|
20
|
-
|
|
21
|
-
interface SelectContext {
|
|
22
|
-
model_value: Ref<string>
|
|
23
|
-
is_open: Ref<boolean>
|
|
24
|
-
disabled: ComputedRef<boolean>
|
|
25
|
-
size: ComputedRef<"sm" | "md" | "lg">
|
|
26
|
-
placeholder: ComputedRef<string>
|
|
27
|
-
trigger_ref: Ref<HTMLElement | null>
|
|
28
|
-
updateValue: (value: string) => void
|
|
29
|
-
open: () => void
|
|
30
|
-
close: () => void
|
|
31
|
-
toggle: () => void
|
|
32
|
-
setTriggerRef: (element: HTMLElement | null) => void
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const SELECT_KEY: InjectionKey<SelectContext> = Symbol("select")
|
|
36
|
-
|
|
37
|
-
const props = withDefaults(defineProps<{
|
|
38
|
-
value: string
|
|
39
|
-
disabled?: boolean
|
|
40
|
-
}>(), {
|
|
41
|
-
disabled: false
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
const context = inject<SelectContext | null>(SELECT_KEY, null)
|
|
45
|
-
|
|
46
|
-
if (!context) {
|
|
47
|
-
throw new Error("SelectItem must be used within Select")
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const composable = useSelectItem(toRef(() => ({ value: props.value, disabled: props.disabled })))
|
|
51
|
-
|
|
52
|
-
const handleClick = () => {
|
|
53
|
-
if (!composable.state.value.disabled) {
|
|
54
|
-
context.updateValue(props.value)
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
defineExpose({
|
|
59
|
-
state: composable.state
|
|
60
|
-
})
|
|
61
|
-
</script>
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<button
|
|
3
|
-
ref="trigger_element"
|
|
4
|
-
type="button"
|
|
5
|
-
:disabled="composable.state.value.disabled"
|
|
6
|
-
:aria-expanded="composable.state.value.is_open"
|
|
7
|
-
aria-haspopup="listbox"
|
|
8
|
-
@click="handleClick"
|
|
9
|
-
@keydown="handleKeyDown"
|
|
10
|
-
>
|
|
11
|
-
<slot :is_open="composable.state.value.is_open" :disabled="composable.state.value.disabled" />
|
|
12
|
-
</button>
|
|
13
|
-
</template>
|
|
14
|
-
|
|
15
|
-
<script setup lang="ts">
|
|
16
|
-
import { ref, inject, onMounted } from "vue"
|
|
17
|
-
import type { Ref, ComputedRef, InjectionKey } from "vue"
|
|
18
|
-
import { useSelectTrigger } from "../../composables/useSelect"
|
|
19
|
-
|
|
20
|
-
interface SelectContext {
|
|
21
|
-
model_value: Ref<string>
|
|
22
|
-
is_open: Ref<boolean>
|
|
23
|
-
disabled: ComputedRef<boolean>
|
|
24
|
-
size: ComputedRef<"sm" | "md" | "lg">
|
|
25
|
-
placeholder: ComputedRef<string>
|
|
26
|
-
trigger_ref: Ref<HTMLElement | null>
|
|
27
|
-
updateValue: (value: string) => void
|
|
28
|
-
open: () => void
|
|
29
|
-
close: () => void
|
|
30
|
-
toggle: () => void
|
|
31
|
-
setTriggerRef: (element: HTMLElement | null) => void
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const SELECT_KEY: InjectionKey<SelectContext> = Symbol("select")
|
|
35
|
-
|
|
36
|
-
const trigger_element = ref<HTMLElement | null>(null)
|
|
37
|
-
const context = inject<SelectContext | null>(SELECT_KEY, null)
|
|
38
|
-
|
|
39
|
-
if (!context) {
|
|
40
|
-
throw new Error("SelectTrigger must be used within Select")
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const composable = useSelectTrigger()
|
|
44
|
-
|
|
45
|
-
const handleClick = () => {
|
|
46
|
-
if (!composable.state.value.disabled) {
|
|
47
|
-
context.toggle()
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const handleKeyDown = (event: KeyboardEvent) => {
|
|
52
|
-
if (composable.state.value.disabled) return
|
|
53
|
-
|
|
54
|
-
switch (event.key) {
|
|
55
|
-
case "Enter":
|
|
56
|
-
case " ":
|
|
57
|
-
case "ArrowDown":
|
|
58
|
-
event.preventDefault()
|
|
59
|
-
context.open()
|
|
60
|
-
break
|
|
61
|
-
case "ArrowUp":
|
|
62
|
-
event.preventDefault()
|
|
63
|
-
context.open()
|
|
64
|
-
break
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
onMounted(() => {
|
|
69
|
-
context.setTriggerRef(trigger_element.value)
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
defineExpose({
|
|
73
|
-
state: composable.state
|
|
74
|
-
})
|
|
75
|
-
</script>
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<button
|
|
3
|
-
type="button"
|
|
4
|
-
:disabled="composable.state.value.disabled"
|
|
5
|
-
:data-state="model ? 'checked' : 'unchecked'"
|
|
6
|
-
v-bind="composable.aria_attributes.value"
|
|
7
|
-
@click="handleClick"
|
|
8
|
-
>
|
|
9
|
-
<slot :checked="model">
|
|
10
|
-
<span :data-state="model ? 'checked' : 'unchecked'" />
|
|
11
|
-
</slot>
|
|
12
|
-
</button>
|
|
13
|
-
</template>
|
|
14
|
-
|
|
15
|
-
<script setup lang="ts">
|
|
16
|
-
import { toRef } from "vue"
|
|
17
|
-
import { useSwitch } from "../../composables/useSwitch"
|
|
18
|
-
|
|
19
|
-
const props = withDefaults(defineProps<{
|
|
20
|
-
size?: "sm" | "md" | "lg"
|
|
21
|
-
disabled?: boolean
|
|
22
|
-
}>(), {
|
|
23
|
-
size: "md",
|
|
24
|
-
disabled: false
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
const model = defineModel<boolean>({ default: false })
|
|
28
|
-
|
|
29
|
-
const emit = defineEmits<{
|
|
30
|
-
change: [checked: boolean]
|
|
31
|
-
}>()
|
|
32
|
-
|
|
33
|
-
const composable = useSwitch(toRef(() => props), model)
|
|
34
|
-
|
|
35
|
-
const handleClick = () => {
|
|
36
|
-
if (!composable.state.value.disabled) {
|
|
37
|
-
model.value = !model.value
|
|
38
|
-
emit("change", model.value)
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
defineExpose({
|
|
43
|
-
state: composable.state
|
|
44
|
-
})
|
|
45
|
-
</script>
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<textarea
|
|
3
|
-
:value="modelValue"
|
|
4
|
-
:disabled="composable.state.value.disabled"
|
|
5
|
-
:readonly="composable.state.value.readonly"
|
|
6
|
-
:placeholder="placeholder"
|
|
7
|
-
:rows="rows"
|
|
8
|
-
:id="id"
|
|
9
|
-
v-bind="composable.aria_attributes.value"
|
|
10
|
-
@input="handleInput"
|
|
11
|
-
@focus="composable.handleFocus"
|
|
12
|
-
@blur="composable.handleBlur"
|
|
13
|
-
/>
|
|
14
|
-
</template>
|
|
15
|
-
|
|
16
|
-
<script setup lang="ts">
|
|
17
|
-
import { toRef } from "vue"
|
|
18
|
-
import { useTextarea } from "../../composables/useTextarea"
|
|
19
|
-
import type { TextareaSize, TextareaResize } from "../../types/textarea"
|
|
20
|
-
|
|
21
|
-
const props = withDefaults(defineProps<{
|
|
22
|
-
size?: TextareaSize
|
|
23
|
-
placeholder?: string
|
|
24
|
-
disabled?: boolean
|
|
25
|
-
readonly?: boolean
|
|
26
|
-
error?: string
|
|
27
|
-
error_id?: string
|
|
28
|
-
rows?: number
|
|
29
|
-
resize?: TextareaResize
|
|
30
|
-
modelValue?: string
|
|
31
|
-
id?: string
|
|
32
|
-
}>(), {
|
|
33
|
-
size: "md",
|
|
34
|
-
disabled: false,
|
|
35
|
-
readonly: false,
|
|
36
|
-
rows: 3,
|
|
37
|
-
resize: "vertical"
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
const emit = defineEmits<{
|
|
41
|
-
"update:modelValue": [value: string]
|
|
42
|
-
}>()
|
|
43
|
-
|
|
44
|
-
const composable = useTextarea(toRef(() => props))
|
|
45
|
-
|
|
46
|
-
const handleInput = (event: Event) => {
|
|
47
|
-
const target = event.target as HTMLTextAreaElement
|
|
48
|
-
emit("update:modelValue", target.value)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
defineExpose({
|
|
52
|
-
state: composable.state,
|
|
53
|
-
is_focused: composable.is_focused
|
|
54
|
-
})
|
|
55
|
-
</script>
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { default as Button } from "./Button.vue";
|
|
2
|
-
export { default as Input } from "./Input.vue";
|
|
3
|
-
export { default as Textarea } from "./Textarea.vue";
|
|
4
|
-
export { default as Card } from "./Card.vue";
|
|
5
|
-
export { default as Checkbox } from "./Checkbox.vue";
|
|
6
|
-
export { default as Switch } from "./Switch.vue";
|
|
7
|
-
export { default as Dialog } from "./Dialog.vue";
|
|
8
|
-
export { default as Select } from "./Select.vue";
|
|
9
|
-
export { default as SelectTrigger } from "./SelectTrigger.vue";
|
|
10
|
-
export { default as SelectContent } from "./SelectContent.vue";
|
|
11
|
-
export { default as SelectItem } from "./SelectItem.vue";
|
|
12
|
-
export { default as RadioGroup } from "./RadioGroup.vue";
|
|
13
|
-
export { default as RadioItem } from "./RadioItem.vue";
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export { useButton } from "./useButton.mjs";
|
|
2
|
-
export { useInput } from "./useInput.mjs";
|
|
3
|
-
export { useCard } from "./useCard.mjs";
|
|
4
|
-
export { useDialog } from "./useDialog.mjs";
|
|
5
|
-
export { useForm } from "./useForm.mjs";
|
|
6
|
-
export { useUIProvider, useUI, useUIConfig, useStyleAdapter, UI_PROVIDER_KEY, UI_CONFIG_KEY } from "./useUIConfig.mjs";
|
|
7
|
-
export { useCheckbox } from "./useCheckbox.mjs";
|
|
8
|
-
export { useRadioItem } from "./useRadio.mjs";
|
|
9
|
-
export { useSwitch } from "./useSwitch.mjs";
|
|
10
|
-
export { useTextarea } from "./useTextarea.mjs";
|
|
11
|
-
export { useSelectTrigger, useSelectContent, useSelectItem } from "./useSelect.mjs";
|
|
12
|
-
export { useFileInput } from "./useFileInput.mjs";
|
|
13
|
-
export { useToast, toast } from "./useToast.mjs";
|
|
14
|
-
export { useTooltip } from "./useTooltip.mjs";
|
|
15
|
-
export { usePopover } from "./usePopover.mjs";
|
|
16
|
-
export { useDropdown } from "./useDropdown.mjs";
|
|
17
|
-
export { useTheme, generateThemeCSS } from "./useTheme.mjs";
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { computed, readonly } from "vue";
|
|
2
|
-
import { useUI } from "./useUIConfig.mjs";
|
|
3
|
-
export const useButton = (props) => {
|
|
4
|
-
const ui_config = useUI("button");
|
|
5
|
-
const state = computed(() => ({
|
|
6
|
-
variant: props.value.variant ?? ui_config.default_variant,
|
|
7
|
-
size: props.value.size ?? ui_config.default_size,
|
|
8
|
-
disabled: props.value.disabled ?? false,
|
|
9
|
-
loading: props.value.loading ?? false,
|
|
10
|
-
type: props.value.type ?? "button"
|
|
11
|
-
}));
|
|
12
|
-
const aria_attributes = computed(() => ({
|
|
13
|
-
"aria-disabled": state.value.disabled || void 0,
|
|
14
|
-
"aria-busy": state.value.loading || void 0,
|
|
15
|
-
role: "button",
|
|
16
|
-
type: state.value.type
|
|
17
|
-
}));
|
|
18
|
-
return {
|
|
19
|
-
state: readonly(state),
|
|
20
|
-
aria_attributes: readonly(aria_attributes)
|
|
21
|
-
};
|
|
22
|
-
};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { computed, readonly } from "vue";
|
|
2
|
-
import { useUI } from "./useUIConfig.mjs";
|
|
3
|
-
export const useCard = (props) => {
|
|
4
|
-
const ui_config = useUI("card");
|
|
5
|
-
const state = computed(() => ({
|
|
6
|
-
padding: props.value.padding ?? ui_config.default_padding
|
|
7
|
-
}));
|
|
8
|
-
return {
|
|
9
|
-
state: readonly(state)
|
|
10
|
-
};
|
|
11
|
-
};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { computed, readonly } from "vue";
|
|
2
|
-
export const useCheckbox = (props, checked) => {
|
|
3
|
-
const state = computed(() => ({
|
|
4
|
-
size: props.value.size ?? "md",
|
|
5
|
-
disabled: props.value.disabled ?? false,
|
|
6
|
-
indeterminate: props.value.indeterminate ?? false,
|
|
7
|
-
checked: checked.value
|
|
8
|
-
}));
|
|
9
|
-
const aria_attributes = computed(() => ({
|
|
10
|
-
role: "checkbox",
|
|
11
|
-
"aria-checked": state.value.indeterminate ? "mixed" : state.value.checked,
|
|
12
|
-
"aria-disabled": state.value.disabled || void 0
|
|
13
|
-
}));
|
|
14
|
-
return {
|
|
15
|
-
state: readonly(state),
|
|
16
|
-
aria_attributes: readonly(aria_attributes)
|
|
17
|
-
};
|
|
18
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { ref, readonly } from "vue";
|
|
2
|
-
export const useDialog = () => {
|
|
3
|
-
const is_open = ref(false);
|
|
4
|
-
const open = () => {
|
|
5
|
-
is_open.value = true;
|
|
6
|
-
};
|
|
7
|
-
const close = () => {
|
|
8
|
-
is_open.value = false;
|
|
9
|
-
};
|
|
10
|
-
const toggle = () => {
|
|
11
|
-
is_open.value = !is_open.value;
|
|
12
|
-
};
|
|
13
|
-
return {
|
|
14
|
-
is_open: readonly(is_open),
|
|
15
|
-
open,
|
|
16
|
-
close,
|
|
17
|
-
toggle
|
|
18
|
-
};
|
|
19
|
-
};
|