@soave/ui 0.3.1 → 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.
Files changed (214) hide show
  1. package/dist/adapters/css-variables.d.ts +2 -1
  2. package/dist/adapters/css-variables.d.ts.map +1 -0
  3. package/dist/adapters/headless.d.ts +2 -1
  4. package/dist/adapters/headless.d.ts.map +1 -0
  5. package/dist/adapters/index.d.ts +6 -5
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/tailwind.d.ts +2 -1
  8. package/dist/adapters/tailwind.d.ts.map +1 -0
  9. package/dist/adapters/types.d.ts +2 -1
  10. package/dist/adapters/types.d.ts.map +1 -0
  11. package/dist/adapters.d.ts +2 -0
  12. package/dist/{adapters/css-variables.mjs → adapters.mjs} +33 -2
  13. package/dist/adapters.mjs.map +1 -0
  14. package/dist/components/Button.vue.d.ts +35 -0
  15. package/dist/components/Button.vue.d.ts.map +1 -0
  16. package/dist/components/Card.vue.d.ts +29 -0
  17. package/dist/components/Card.vue.d.ts.map +1 -0
  18. package/dist/components/Checkbox.vue.d.ts +39 -0
  19. package/dist/components/Checkbox.vue.d.ts.map +1 -0
  20. package/dist/components/Dialog.vue.d.ts +46 -0
  21. package/dist/components/Dialog.vue.d.ts.map +1 -0
  22. package/dist/components/Input.vue.d.ts +24 -0
  23. package/dist/components/Input.vue.d.ts.map +1 -0
  24. package/dist/components/RadioGroup.vue.d.ts +32 -0
  25. package/dist/components/RadioGroup.vue.d.ts.map +1 -0
  26. package/dist/components/RadioItem.vue.d.ts +40 -0
  27. package/dist/components/RadioItem.vue.d.ts.map +1 -0
  28. package/dist/components/Select.vue.d.ts +50 -0
  29. package/dist/components/Select.vue.d.ts.map +1 -0
  30. package/dist/components/SelectContent.vue.d.ts +25 -0
  31. package/dist/components/SelectContent.vue.d.ts.map +1 -0
  32. package/dist/components/SelectItem.vue.d.ts +36 -0
  33. package/dist/components/SelectItem.vue.d.ts.map +1 -0
  34. package/dist/components/SelectTrigger.vue.d.ts +36 -0
  35. package/dist/components/SelectTrigger.vue.d.ts.map +1 -0
  36. package/dist/components/Switch.vue.d.ts +46 -0
  37. package/dist/components/Switch.vue.d.ts.map +1 -0
  38. package/dist/components/Textarea.vue.d.ts +41 -0
  39. package/dist/components/Textarea.vue.d.ts.map +1 -0
  40. package/dist/components/index.d.ts +14 -13
  41. package/dist/components/index.d.ts.map +1 -0
  42. package/dist/composables/index.d.ts +18 -17
  43. package/dist/composables/index.d.ts.map +1 -0
  44. package/dist/composables/useButton.d.ts +3 -2
  45. package/dist/composables/useButton.d.ts.map +1 -0
  46. package/dist/composables/useCard.d.ts +3 -2
  47. package/dist/composables/useCard.d.ts.map +1 -0
  48. package/dist/composables/useCheckbox.d.ts +3 -2
  49. package/dist/composables/useCheckbox.d.ts.map +1 -0
  50. package/dist/composables/useDialog.d.ts +2 -1
  51. package/dist/composables/useDialog.d.ts.map +1 -0
  52. package/dist/composables/useDropdown.d.ts +3 -2
  53. package/dist/composables/useDropdown.d.ts.map +1 -0
  54. package/dist/composables/useFileInput.d.ts +3 -2
  55. package/dist/composables/useFileInput.d.ts.map +1 -0
  56. package/dist/composables/useForm.d.ts +3 -2
  57. package/dist/composables/useForm.d.ts.map +1 -0
  58. package/dist/composables/useInput.d.ts +3 -2
  59. package/dist/composables/useInput.d.ts.map +1 -0
  60. package/dist/composables/usePopover.d.ts +3 -2
  61. package/dist/composables/usePopover.d.ts.map +1 -0
  62. package/dist/composables/useRadio.d.ts +3 -2
  63. package/dist/composables/useRadio.d.ts.map +1 -0
  64. package/dist/composables/useSelect.d.ts +3 -2
  65. package/dist/composables/useSelect.d.ts.map +1 -0
  66. package/dist/composables/useSwitch.d.ts +3 -2
  67. package/dist/composables/useSwitch.d.ts.map +1 -0
  68. package/dist/composables/useTextarea.d.ts +3 -2
  69. package/dist/composables/useTextarea.d.ts.map +1 -0
  70. package/dist/composables/useTheme.d.ts +3 -2
  71. package/dist/composables/useTheme.d.ts.map +1 -0
  72. package/dist/composables/useToast.d.ts +2 -1
  73. package/dist/composables/useToast.d.ts.map +1 -0
  74. package/dist/composables/useTooltip.d.ts +3 -2
  75. package/dist/composables/useTooltip.d.ts.map +1 -0
  76. package/dist/composables/useUIConfig.d.ts +5 -4
  77. package/dist/composables/useUIConfig.d.ts.map +1 -0
  78. package/dist/composables.d.ts +2 -0
  79. package/dist/composables.mjs +30 -0
  80. package/dist/composables.mjs.map +1 -0
  81. package/dist/constants/errors.d.ts +1 -0
  82. package/dist/constants/errors.d.ts.map +1 -0
  83. package/dist/constants/index.d.ts +3 -2
  84. package/dist/constants/index.d.ts.map +1 -0
  85. package/dist/constants/logs.d.ts +1 -0
  86. package/dist/constants/logs.d.ts.map +1 -0
  87. package/dist/index.d.ts +7 -6
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.mjs +760 -6
  90. package/dist/index.mjs.map +1 -0
  91. package/dist/{adapters/tailwind.mjs → tailwind-B-R7fPT1.js} +16 -7
  92. package/dist/tailwind-B-R7fPT1.js.map +1 -0
  93. package/dist/types/alert.d.ts +2 -1
  94. package/dist/types/alert.d.ts.map +1 -0
  95. package/dist/types/button.d.ts +2 -1
  96. package/dist/types/button.d.ts.map +1 -0
  97. package/dist/types/card.d.ts +2 -1
  98. package/dist/types/card.d.ts.map +1 -0
  99. package/dist/types/checkbox.d.ts +2 -1
  100. package/dist/types/checkbox.d.ts.map +1 -0
  101. package/dist/types/composables.d.ts +10 -1
  102. package/dist/types/composables.d.ts.map +1 -0
  103. package/dist/types/config.d.ts +6 -5
  104. package/dist/types/config.d.ts.map +1 -0
  105. package/dist/types/dialog.d.ts +2 -1
  106. package/dist/types/dialog.d.ts.map +1 -0
  107. package/dist/types/dropdown.d.ts +3 -2
  108. package/dist/types/dropdown.d.ts.map +1 -0
  109. package/dist/types/file-input.d.ts +2 -1
  110. package/dist/types/file-input.d.ts.map +1 -0
  111. package/dist/types/form.d.ts +2 -1
  112. package/dist/types/form.d.ts.map +1 -0
  113. package/dist/types/index.d.ts +22 -21
  114. package/dist/types/index.d.ts.map +1 -0
  115. package/dist/types/input.d.ts +2 -1
  116. package/dist/types/input.d.ts.map +1 -0
  117. package/dist/types/popover.d.ts +3 -2
  118. package/dist/types/popover.d.ts.map +1 -0
  119. package/dist/types/radio.d.ts +2 -1
  120. package/dist/types/radio.d.ts.map +1 -0
  121. package/dist/types/select.d.ts +2 -1
  122. package/dist/types/select.d.ts.map +1 -0
  123. package/dist/types/sheet.d.ts +2 -1
  124. package/dist/types/sheet.d.ts.map +1 -0
  125. package/dist/types/switch.d.ts +2 -1
  126. package/dist/types/switch.d.ts.map +1 -0
  127. package/dist/types/textarea.d.ts +2 -1
  128. package/dist/types/textarea.d.ts.map +1 -0
  129. package/dist/types/theme.d.ts +1 -0
  130. package/dist/types/theme.d.ts.map +1 -0
  131. package/dist/types/toast.d.ts +1 -0
  132. package/dist/types/toast.d.ts.map +1 -0
  133. package/dist/types/tooltip.d.ts +3 -2
  134. package/dist/types/tooltip.d.ts.map +1 -0
  135. package/dist/types/utils.d.ts +1 -0
  136. package/dist/types/utils.d.ts.map +1 -0
  137. package/dist/useTheme-C2uPqAtQ.js +1175 -0
  138. package/dist/useTheme-C2uPqAtQ.js.map +1 -0
  139. package/dist/utils/cn.d.ts +2 -1
  140. package/dist/utils/cn.d.ts.map +1 -0
  141. package/dist/utils/deepMerge.d.ts +2 -1
  142. package/dist/utils/deepMerge.d.ts.map +1 -0
  143. package/dist/utils/index.d.ts +3 -2
  144. package/dist/utils/index.d.ts.map +1 -0
  145. package/package.json +6 -4
  146. package/dist/adapters/headless.mjs +0 -7
  147. package/dist/adapters/index.mjs +0 -11
  148. package/dist/adapters/types.mjs +0 -10
  149. package/dist/build.config.d.ts +0 -2
  150. package/dist/build.config.mjs +0 -14
  151. package/dist/components/Button.vue +0 -36
  152. package/dist/components/Card.vue +0 -23
  153. package/dist/components/Checkbox.vue +0 -44
  154. package/dist/components/Dialog.vue +0 -99
  155. package/dist/components/Input.vue +0 -48
  156. package/dist/components/RadioGroup.vue +0 -35
  157. package/dist/components/RadioItem.vue +0 -55
  158. package/dist/components/Select.vue +0 -95
  159. package/dist/components/SelectContent.vue +0 -40
  160. package/dist/components/SelectItem.vue +0 -44
  161. package/dist/components/SelectTrigger.vue +0 -61
  162. package/dist/components/Switch.vue +0 -43
  163. package/dist/components/Textarea.vue +0 -55
  164. package/dist/components/index.mjs +0 -13
  165. package/dist/composables/index.mjs +0 -17
  166. package/dist/composables/useButton.mjs +0 -22
  167. package/dist/composables/useCard.mjs +0 -11
  168. package/dist/composables/useCheckbox.mjs +0 -18
  169. package/dist/composables/useDialog.mjs +0 -19
  170. package/dist/composables/useDropdown.mjs +0 -170
  171. package/dist/composables/useFileInput.mjs +0 -137
  172. package/dist/composables/useForm.mjs +0 -159
  173. package/dist/composables/useInput.mjs +0 -31
  174. package/dist/composables/usePopover.mjs +0 -113
  175. package/dist/composables/useRadio.mjs +0 -23
  176. package/dist/composables/useSelect.mjs +0 -42
  177. package/dist/composables/useSwitch.mjs +0 -17
  178. package/dist/composables/useTextarea.mjs +0 -29
  179. package/dist/composables/useTheme.mjs +0 -89
  180. package/dist/composables/useToast.mjs +0 -64
  181. package/dist/composables/useTooltip.mjs +0 -125
  182. package/dist/composables/useUIConfig.mjs +0 -53
  183. package/dist/constants/errors.mjs +0 -18
  184. package/dist/constants/index.mjs +0 -2
  185. package/dist/constants/logs.mjs +0 -17
  186. package/dist/env.d.ts +0 -11
  187. package/dist/styles/css-variables.css +0 -1
  188. package/dist/styles/index.d.ts +0 -1
  189. package/dist/styles/index.mjs +0 -1
  190. package/dist/types/alert.mjs +0 -0
  191. package/dist/types/button.mjs +0 -0
  192. package/dist/types/card.mjs +0 -0
  193. package/dist/types/checkbox.mjs +0 -0
  194. package/dist/types/composables.mjs +0 -0
  195. package/dist/types/config.mjs +0 -15
  196. package/dist/types/dialog.mjs +0 -1
  197. package/dist/types/dropdown.mjs +0 -1
  198. package/dist/types/file-input.mjs +0 -0
  199. package/dist/types/form.mjs +0 -0
  200. package/dist/types/index.mjs +0 -21
  201. package/dist/types/input.mjs +0 -0
  202. package/dist/types/popover.mjs +0 -1
  203. package/dist/types/radio.mjs +0 -1
  204. package/dist/types/select.mjs +0 -1
  205. package/dist/types/sheet.mjs +0 -1
  206. package/dist/types/switch.mjs +0 -0
  207. package/dist/types/textarea.mjs +0 -0
  208. package/dist/types/theme.mjs +0 -42
  209. package/dist/types/toast.mjs +0 -0
  210. package/dist/types/tooltip.mjs +0 -1
  211. package/dist/types/utils.mjs +0 -0
  212. package/dist/utils/cn.mjs +0 -5
  213. package/dist/utils/deepMerge.mjs +0 -18
  214. package/dist/utils/index.mjs +0 -2
@@ -1,55 +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 { useRadioItem } from "../../composables/useRadio"
17
- import type { RadioItemProps, RadioGroupContext } from "../../types/radio"
18
- import { RADIO_GROUP_KEY } from "../../types/radio"
19
- import { COMPONENT_ERRORS } from "../../constants/errors"
20
-
21
- const props = withDefaults(defineProps<RadioItemProps>(), {
22
- size: "md",
23
- disabled: false
24
- })
25
-
26
- const context = inject<RadioGroupContext | null>(RADIO_GROUP_KEY, null)
27
-
28
- if (!context) {
29
- throw new Error(COMPONENT_ERRORS.PROVIDER_NOT_FOUND)
30
- }
31
-
32
- const composable = useRadioItem(toRef(() => props))
33
-
34
- const handleClick = () => {
35
- if (!composable.state.value.disabled) {
36
- context.updateValue(props.value)
37
- }
38
- }
39
-
40
- const handleKeyDown = (event: KeyboardEvent) => {
41
- if (composable.state.value.disabled) return
42
-
43
- switch (event.key) {
44
- case "Enter":
45
- case " ":
46
- event.preventDefault()
47
- context.updateValue(props.value)
48
- break
49
- }
50
- }
51
-
52
- defineExpose({
53
- state: composable.state
54
- })
55
- </script>
@@ -1,95 +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 { SelectProps, SelectContext } from "../../types/select"
16
- import { SELECT_KEY } from "../../types/select"
17
-
18
- const props = withDefaults(defineProps<SelectProps>(), {
19
- size: "md",
20
- disabled: false,
21
- placeholder: ""
22
- })
23
-
24
- const model = defineModel<string>({ default: "" })
25
-
26
- const root_ref = ref<HTMLElement | null>(null)
27
- const trigger_ref = ref<HTMLElement | null>(null)
28
- const is_open = ref(false)
29
-
30
- const open = () => {
31
- if (!props.disabled) {
32
- is_open.value = true
33
- }
34
- }
35
-
36
- const close = () => {
37
- is_open.value = false
38
- }
39
-
40
- const toggle = () => {
41
- if (is_open.value) {
42
- close()
43
- } else {
44
- open()
45
- }
46
- }
47
-
48
- const updateValue = (value: string) => {
49
- model.value = value
50
- close()
51
- }
52
-
53
- const setTriggerRef = (element: HTMLElement | null) => {
54
- trigger_ref.value = element
55
- }
56
-
57
- const handleClickOutside = (event: MouseEvent) => {
58
- if (!is_open.value) return
59
- const target = event.target as Node
60
- if (root_ref.value && !root_ref.value.contains(target)) {
61
- close()
62
- }
63
- }
64
-
65
- const context: SelectContext = {
66
- model_value: model,
67
- is_open,
68
- disabled: computed(() => props.disabled),
69
- size: computed(() => props.size ?? "md"),
70
- placeholder: computed(() => props.placeholder ?? ""),
71
- trigger_ref,
72
- updateValue,
73
- open,
74
- close,
75
- toggle,
76
- setTriggerRef
77
- }
78
-
79
- provide(SELECT_KEY, context)
80
-
81
- onMounted(() => {
82
- document.addEventListener("mousedown", handleClickOutside)
83
- })
84
-
85
- onUnmounted(() => {
86
- document.removeEventListener("mousedown", handleClickOutside)
87
- })
88
-
89
- defineExpose({
90
- is_open,
91
- open,
92
- close,
93
- toggle
94
- })
95
- </script>
@@ -1,40 +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 { useSelectContent } from "../../composables/useSelect"
15
- import type { SelectContext } from "../../types/select"
16
- import { SELECT_KEY } from "../../types/select"
17
- import { COMPONENT_ERRORS } from "../../constants/errors"
18
-
19
- const context = inject<SelectContext | null>(SELECT_KEY, null)
20
-
21
- if (!context) {
22
- throw new Error(COMPONENT_ERRORS.PROVIDER_NOT_FOUND)
23
- }
24
-
25
- const composable = useSelectContent()
26
-
27
- const handleKeyDown = (event: KeyboardEvent) => {
28
- switch (event.key) {
29
- case "Escape":
30
- event.preventDefault()
31
- context.close()
32
- context.trigger_ref.value?.focus()
33
- break
34
- }
35
- }
36
-
37
- defineExpose({
38
- state: composable.state
39
- })
40
- </script>
@@ -1,44 +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 { useSelectItem } from "../../composables/useSelect"
19
- import type { SelectContext, SelectItemProps } from "../../types/select"
20
- import { SELECT_KEY } from "../../types/select"
21
- import { COMPONENT_ERRORS } from "../../constants/errors"
22
-
23
- const props = withDefaults(defineProps<SelectItemProps>(), {
24
- disabled: false
25
- })
26
-
27
- const context = inject<SelectContext | null>(SELECT_KEY, null)
28
-
29
- if (!context) {
30
- throw new Error(COMPONENT_ERRORS.PROVIDER_NOT_FOUND)
31
- }
32
-
33
- const composable = useSelectItem(toRef(() => ({ value: props.value, disabled: props.disabled })))
34
-
35
- const handleClick = () => {
36
- if (!composable.state.value.disabled) {
37
- context.updateValue(props.value)
38
- }
39
- }
40
-
41
- defineExpose({
42
- state: composable.state
43
- })
44
- </script>
@@ -1,61 +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 { useSelectTrigger } from "../../composables/useSelect"
18
- import type { SelectContext } from "../../types/select"
19
- import { SELECT_KEY } from "../../types/select"
20
- import { COMPONENT_ERRORS } from "../../constants/errors"
21
-
22
- const trigger_element = ref<HTMLElement | null>(null)
23
- const context = inject<SelectContext | null>(SELECT_KEY, null)
24
-
25
- if (!context) {
26
- throw new Error(COMPONENT_ERRORS.PROVIDER_NOT_FOUND)
27
- }
28
-
29
- const composable = useSelectTrigger()
30
-
31
- const handleClick = () => {
32
- if (!composable.state.value.disabled) {
33
- context.toggle()
34
- }
35
- }
36
-
37
- const handleKeyDown = (event: KeyboardEvent) => {
38
- if (composable.state.value.disabled) return
39
-
40
- switch (event.key) {
41
- case "Enter":
42
- case " ":
43
- case "ArrowDown":
44
- event.preventDefault()
45
- context.open()
46
- break
47
- case "ArrowUp":
48
- event.preventDefault()
49
- context.open()
50
- break
51
- }
52
- }
53
-
54
- onMounted(() => {
55
- context.setTriggerRef(trigger_element.value)
56
- })
57
-
58
- defineExpose({
59
- state: composable.state
60
- })
61
- </script>
@@ -1,43 +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
- import type { SwitchProps } from "../../types/switch"
19
-
20
- const props = withDefaults(defineProps<SwitchProps>(), {
21
- size: "md",
22
- disabled: false
23
- })
24
-
25
- const model = defineModel<boolean>({ default: false })
26
-
27
- const emit = defineEmits<{
28
- change: [checked: boolean]
29
- }>()
30
-
31
- const composable = useSwitch(toRef(() => props), model)
32
-
33
- const handleClick = () => {
34
- if (!composable.state.value.disabled) {
35
- model.value = !model.value
36
- emit("change", model.value)
37
- }
38
- }
39
-
40
- defineExpose({
41
- state: composable.state
42
- })
43
- </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
- };
@@ -1,170 +0,0 @@
1
- import { ref, computed, onMounted, onUnmounted } from "vue";
2
- let dropdown_counter = 0;
3
- export function useDropdown(props) {
4
- const is_open = ref(false);
5
- const trigger_ref = ref(null);
6
- const content_ref = ref(null);
7
- const dropdown_id = `dropdown-${++dropdown_counter}`;
8
- const active_item_index = ref(-1);
9
- const items_count = ref(0);
10
- let item_counter = 0;
11
- const open = () => {
12
- is_open.value = true;
13
- active_item_index.value = 0;
14
- };
15
- const close = () => {
16
- is_open.value = false;
17
- active_item_index.value = -1;
18
- };
19
- const toggle = () => {
20
- if (is_open.value) {
21
- close();
22
- } else {
23
- open();
24
- }
25
- };
26
- const handleTriggerClick = () => {
27
- toggle();
28
- };
29
- const handleTriggerKeyDown = (event) => {
30
- switch (event.key) {
31
- case "Enter":
32
- case " ":
33
- case "ArrowDown":
34
- event.preventDefault();
35
- open();
36
- break;
37
- case "ArrowUp":
38
- event.preventDefault();
39
- open();
40
- active_item_index.value = items_count.value - 1;
41
- break;
42
- }
43
- };
44
- const handleContentKeyDown = (event) => {
45
- switch (event.key) {
46
- case "ArrowDown":
47
- event.preventDefault();
48
- active_item_index.value = Math.min(active_item_index.value + 1, items_count.value - 1);
49
- break;
50
- case "ArrowUp":
51
- event.preventDefault();
52
- active_item_index.value = Math.max(active_item_index.value - 1, 0);
53
- break;
54
- case "Home":
55
- event.preventDefault();
56
- active_item_index.value = 0;
57
- break;
58
- case "End":
59
- event.preventDefault();
60
- active_item_index.value = items_count.value - 1;
61
- break;
62
- case "Escape":
63
- event.preventDefault();
64
- close();
65
- trigger_ref.value?.focus();
66
- break;
67
- case "Tab":
68
- close();
69
- break;
70
- }
71
- };
72
- const handleClickOutside = (event) => {
73
- if (!is_open.value) return;
74
- const target = event.target;
75
- const trigger = trigger_ref.value;
76
- const content = content_ref.value;
77
- if (trigger && trigger.contains(target)) return;
78
- if (content && content.contains(target)) return;
79
- close();
80
- };
81
- const registerItem = () => {
82
- const index = item_counter++;
83
- items_count.value = item_counter;
84
- return index;
85
- };
86
- const setActiveItem = (index) => {
87
- active_item_index.value = index;
88
- };
89
- const position_styles = computed(() => {
90
- if (!trigger_ref.value || !is_open.value) {
91
- return {};
92
- }
93
- const side = props.value.side ?? "bottom";
94
- const align = props.value.align ?? "start";
95
- const offset = 4;
96
- const styles = {
97
- position: "absolute",
98
- zIndex: "50"
99
- };
100
- switch (side) {
101
- case "top":
102
- styles.bottom = "100%";
103
- styles.marginBottom = `${offset}px`;
104
- break;
105
- case "bottom":
106
- styles.top = "100%";
107
- styles.marginTop = `${offset}px`;
108
- break;
109
- case "left":
110
- styles.right = "100%";
111
- styles.marginRight = `${offset}px`;
112
- break;
113
- case "right":
114
- styles.left = "100%";
115
- styles.marginLeft = `${offset}px`;
116
- break;
117
- }
118
- if (side === "top" || side === "bottom") {
119
- switch (align) {
120
- case "start":
121
- styles.left = "0";
122
- break;
123
- case "center":
124
- styles.left = "50%";
125
- styles.transform = "translateX(-50%)";
126
- break;
127
- case "end":
128
- styles.right = "0";
129
- break;
130
- }
131
- } else {
132
- switch (align) {
133
- case "start":
134
- styles.top = "0";
135
- break;
136
- case "center":
137
- styles.top = "50%";
138
- styles.transform = "translateY(-50%)";
139
- break;
140
- case "end":
141
- styles.bottom = "0";
142
- break;
143
- }
144
- }
145
- return styles;
146
- });
147
- onMounted(() => {
148
- document.addEventListener("mousedown", handleClickOutside);
149
- });
150
- onUnmounted(() => {
151
- document.removeEventListener("mousedown", handleClickOutside);
152
- });
153
- return {
154
- is_open,
155
- trigger_ref,
156
- content_ref,
157
- dropdown_id,
158
- active_item_index,
159
- items_count,
160
- position_styles,
161
- open,
162
- close,
163
- toggle,
164
- handleTriggerClick,
165
- handleTriggerKeyDown,
166
- handleContentKeyDown,
167
- registerItem,
168
- setActiveItem
169
- };
170
- }