@indielayer/ui 1.0.0-alpha.7 → 1.0.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 (209) hide show
  1. package/README.md +6 -3
  2. package/lib/index.cjs.js +1 -15
  3. package/lib/index.es.js +4453 -3651
  4. package/lib/nuxt.js +2 -1
  5. package/package.json +16 -6
  6. package/src/common/icons.ts +15 -0
  7. package/src/common/utils.ts +68 -0
  8. package/src/components/alert/Alert.theme.ts +57 -0
  9. package/src/components/alert/Alert.vue +51 -127
  10. package/src/components/alert/__tests__/Alert.spec.ts +14 -0
  11. package/src/components/avatar/Avatar.theme.ts +39 -0
  12. package/src/components/avatar/Avatar.vue +58 -96
  13. package/src/components/avatar/__tests__/Avatar.spec.ts +11 -0
  14. package/src/components/badge/Badge.theme.ts +13 -0
  15. package/src/components/badge/Badge.vue +58 -65
  16. package/src/components/badge/__tests__/Badge.spec.ts +11 -0
  17. package/src/components/breadcrumbs/Breadcrumbs.theme.ts +9 -0
  18. package/src/components/breadcrumbs/Breadcrumbs.vue +34 -24
  19. package/src/components/breadcrumbs/__tests__/Breadcrumbs.spec.ts +11 -0
  20. package/src/components/button/Button.theme.ts +234 -0
  21. package/src/components/button/Button.vue +94 -356
  22. package/src/components/button/ButtonGroup.theme.ts +5 -0
  23. package/src/components/button/ButtonGroup.vue +30 -29
  24. package/src/components/button/__tests__/ Button.spec.ts +11 -0
  25. package/src/components/button/__tests__/ ButtonGroup.spec.ts +11 -0
  26. package/src/components/card/Card.theme.ts +7 -0
  27. package/src/components/card/Card.vue +18 -11
  28. package/src/components/card/__tests__/Card.spec.ts +11 -0
  29. package/src/components/checkbox/Checkbox.theme.ts +92 -0
  30. package/src/components/checkbox/Checkbox.vue +69 -156
  31. package/src/components/checkbox/__tests__/Checkbox.spec.ts +11 -0
  32. package/src/components/collapse/Collapse.theme.ts +11 -0
  33. package/src/components/collapse/Collapse.vue +99 -118
  34. package/src/components/collapse/__tests__/Collapse.spec.ts +11 -0
  35. package/src/components/container/Container.theme.ts +7 -0
  36. package/src/components/container/Container.vue +17 -9
  37. package/src/components/container/__tests__/Container.spec.ts +11 -0
  38. package/src/components/divider/Divider.theme.ts +11 -0
  39. package/src/components/divider/Divider.vue +22 -18
  40. package/src/components/divider/__tests__/Divider.spec.ts +11 -0
  41. package/src/components/drawer/Drawer.theme.ts +9 -0
  42. package/src/components/drawer/Drawer.vue +160 -177
  43. package/src/components/drawer/__tests__/Drawer.spec.ts +11 -0
  44. package/src/components/form/Form.theme.ts +7 -0
  45. package/src/components/form/Form.vue +90 -73
  46. package/src/components/form/__tests__/Form.spec.ts +11 -0
  47. package/src/components/helpers/InputError.tsx +14 -0
  48. package/src/components/icon/Icon.theme.ts +16 -0
  49. package/src/components/icon/Icon.vue +72 -88
  50. package/src/components/icon/__tests__/Icon.spec.ts +11 -0
  51. package/src/components/image/Image.theme.ts +7 -0
  52. package/src/components/image/Image.vue +22 -23
  53. package/src/components/image/__tests__/Image.spec.ts +11 -0
  54. package/src/components/index.ts +3 -3
  55. package/src/components/input/Input.theme.ts +44 -0
  56. package/src/components/input/Input.vue +97 -130
  57. package/src/components/input/__tests__/Input.spec.ts +11 -0
  58. package/src/components/link/Link.theme.ts +26 -0
  59. package/src/components/link/Link.vue +41 -66
  60. package/src/components/link/__tests__/Link.spec.ts +11 -0
  61. package/src/components/menu/Menu.theme.ts +7 -0
  62. package/src/components/menu/Menu.vue +54 -45
  63. package/src/components/menu/MenuItem.theme.ts +107 -0
  64. package/src/components/menu/MenuItem.vue +97 -199
  65. package/src/components/menu/__tests__/Menu.spec.ts +11 -0
  66. package/src/components/menu/__tests__/MenuItem.spec.ts +11 -0
  67. package/src/components/modal/Modal.theme.ts +29 -0
  68. package/src/components/modal/Modal.vue +78 -101
  69. package/src/components/modal/__tests__/Modal.spec.ts +11 -0
  70. package/src/components/notifications/Notifications.theme.ts +11 -0
  71. package/src/components/notifications/Notifications.vue +233 -247
  72. package/src/components/notifications/__tests__/Notifications.spec.ts +11 -0
  73. package/src/components/pagination/Pagination.theme.ts +27 -0
  74. package/src/components/pagination/Pagination.vue +142 -164
  75. package/src/components/pagination/PaginationItem.theme.ts +14 -0
  76. package/src/components/pagination/PaginationItem.vue +26 -33
  77. package/src/components/pagination/__tests__/Pagination.spec.ts +11 -0
  78. package/src/components/pagination/__tests__/PaginationItem.spec.ts +11 -0
  79. package/src/components/popover/Popover.theme.ts +9 -0
  80. package/src/components/popover/Popover.vue +153 -101
  81. package/src/components/popover/PopoverContainer.theme.ts +7 -0
  82. package/src/components/popover/PopoverContainer.vue +17 -9
  83. package/src/components/popover/__tests__/Popover.spec.ts +11 -0
  84. package/src/components/popover/__tests__/PopoverContainer.spec.ts +11 -0
  85. package/src/components/progress/Progress.theme.ts +26 -0
  86. package/src/components/progress/Progress.vue +29 -53
  87. package/src/components/progress/__tests__/Progress.spec.ts +11 -0
  88. package/src/components/radio/Radio.theme.ts +121 -0
  89. package/src/components/radio/Radio.vue +81 -158
  90. package/src/components/radio/__tests__/Radio.spec.ts +11 -0
  91. package/src/components/scroll/Scroll.theme.ts +7 -0
  92. package/src/components/scroll/Scroll.vue +34 -36
  93. package/src/components/scroll/__tests__/Scroll.spec.ts +11 -0
  94. package/src/components/select/Select.theme.ts +54 -0
  95. package/src/components/select/Select.vue +219 -273
  96. package/src/components/select/__tests__/Select.spec.ts +11 -0
  97. package/src/components/skeleton/Skeleton.theme.ts +7 -0
  98. package/src/components/skeleton/Skeleton.vue +17 -9
  99. package/src/components/skeleton/__tests__/Skeleton.spec.ts +11 -0
  100. package/src/components/slider/Slider.theme.ts +30 -0
  101. package/src/components/slider/Slider.vue +135 -168
  102. package/src/components/slider/__tests__/Slider.spec.ts +11 -0
  103. package/src/components/spacer/{Spacer.vue → Spacer.tsx} +3 -6
  104. package/src/components/spacer/__tests__/Spacer.spec.ts +11 -0
  105. package/src/components/spinner/Spinner.vue +10 -34
  106. package/src/components/spinner/__tests__/Spinner.spec.ts +11 -0
  107. package/src/components/tab/Tab.theme.ts +22 -0
  108. package/src/components/tab/Tab.vue +89 -93
  109. package/src/components/tab/TabGroup.theme.ts +43 -0
  110. package/src/components/tab/TabGroup.vue +94 -127
  111. package/src/components/tab/__tests__/Tab.spec.ts +11 -0
  112. package/src/components/tab/__tests__/TabGroup.spec.ts +11 -0
  113. package/src/components/table/Table.theme.ts +19 -0
  114. package/src/components/table/Table.vue +136 -147
  115. package/src/components/table/{TableBody.vue → TableBody.tsx} +3 -8
  116. package/src/components/table/TableCell.theme.ts +27 -0
  117. package/src/components/table/TableCell.vue +30 -58
  118. package/src/components/table/TableHead.tsx +14 -0
  119. package/src/components/table/TableHeader.vue +18 -20
  120. package/src/components/table/TableRow.vue +23 -20
  121. package/src/components/table/__tests__/Table.spec.ts +11 -0
  122. package/src/components/tag/Tag.theme.ts +32 -0
  123. package/src/components/tag/Tag.vue +40 -68
  124. package/src/components/tag/__tests__/Tag.spec.ts +11 -0
  125. package/src/components/textarea/Textarea.theme.ts +62 -0
  126. package/src/components/textarea/Textarea.vue +100 -115
  127. package/src/components/textarea/__tests__/Textarea.spec.ts +11 -0
  128. package/src/components/toggle/Toggle.theme.ts +51 -0
  129. package/src/components/toggle/Toggle.vue +51 -81
  130. package/src/components/toggle/__tests__/Toggle.spec.ts +11 -0
  131. package/src/components/tooltip/Tooltip.theme.ts +51 -0
  132. package/src/components/tooltip/Tooltip.vue +9 -14
  133. package/src/components/tooltip/__tests__/Tooltip.spec.ts +11 -0
  134. package/src/composables/colors-utils.ts +68 -68
  135. package/src/composables/colors.ts +18 -6
  136. package/src/composables/common.ts +1 -0
  137. package/src/composables/css.ts +7 -2
  138. package/src/composables/index.ts +1 -1
  139. package/src/composables/inputtable.ts +1 -1
  140. package/src/composables/interactive.ts +8 -4
  141. package/src/composables/keys.ts +1 -0
  142. package/src/composables/notifications.ts +10 -0
  143. package/src/composables/theme.ts +88 -0
  144. package/src/create.ts +9 -4
  145. package/src/exports/nuxt.js +2 -1
  146. package/src/version.ts +1 -1
  147. package/volar.d.ts +1 -0
  148. package/lib/components/alert/Alert.vue.d.ts +0 -42
  149. package/lib/components/avatar/Avatar.vue.d.ts +0 -49
  150. package/lib/components/badge/Badge.vue.d.ts +0 -75
  151. package/lib/components/breadcrumbs/Breadcrumbs.vue.d.ts +0 -30
  152. package/lib/components/button/Button.vue.d.ts +0 -87
  153. package/lib/components/button/ButtonGroup.vue.d.ts +0 -49
  154. package/lib/components/card/Card.vue.d.ts +0 -17
  155. package/lib/components/checkbox/Checkbox.vue.d.ts +0 -81
  156. package/lib/components/collapse/Collapse.vue.d.ts +0 -47
  157. package/lib/components/container/Container.vue.d.ts +0 -14
  158. package/lib/components/divider/Divider.vue.d.ts +0 -10
  159. package/lib/components/drawer/Drawer.vue.d.ts +0 -73
  160. package/lib/components/form/Form.vue.d.ts +0 -46
  161. package/lib/components/icon/Icon.vue.d.ts +0 -40
  162. package/lib/components/image/Image.vue.d.ts +0 -8
  163. package/lib/components/index.d.ts +0 -45
  164. package/lib/components/input/Input.vue.d.ts +0 -117
  165. package/lib/components/link/Link.vue.d.ts +0 -36
  166. package/lib/components/menu/Menu.vue.d.ts +0 -62
  167. package/lib/components/menu/MenuItem.vue.d.ts +0 -114
  168. package/lib/components/modal/Modal.vue.d.ts +0 -34
  169. package/lib/components/notifications/Notifications.vue.d.ts +0 -104
  170. package/lib/components/pagination/Pagination.vue.d.ts +0 -58
  171. package/lib/components/pagination/PaginationItem.vue.d.ts +0 -32
  172. package/lib/components/popover/Popover.vue.d.ts +0 -64
  173. package/lib/components/popover/PopoverContainer.vue.d.ts +0 -14
  174. package/lib/components/progress/Progress.vue.d.ts +0 -42
  175. package/lib/components/radio/Radio.vue.d.ts +0 -79
  176. package/lib/components/scroll/Scroll.vue.d.ts +0 -29
  177. package/lib/components/select/Select.vue.d.ts +0 -100
  178. package/lib/components/skeleton/Skeleton.vue.d.ts +0 -14
  179. package/lib/components/slider/Slider.vue.d.ts +0 -96
  180. package/lib/components/spacer/Spacer.vue.d.ts +0 -2
  181. package/lib/components/spinner/Spinner.vue.d.ts +0 -16
  182. package/lib/components/tab/Tab.vue.d.ts +0 -52
  183. package/lib/components/tab/TabGroup.vue.d.ts +0 -61
  184. package/lib/components/table/Table.vue.d.ts +0 -82
  185. package/lib/components/table/TableBody.vue.d.ts +0 -2
  186. package/lib/components/table/TableCell.vue.d.ts +0 -33
  187. package/lib/components/table/TableHead.vue.d.ts +0 -2
  188. package/lib/components/table/TableHeader.vue.d.ts +0 -33
  189. package/lib/components/table/TableRow.vue.d.ts +0 -23
  190. package/lib/components/tag/Tag.vue.d.ts +0 -45
  191. package/lib/components/textarea/Textarea.vue.d.ts +0 -106
  192. package/lib/components/toggle/Toggle.vue.d.ts +0 -79
  193. package/lib/components/tooltip/Tooltip.vue.d.ts +0 -2
  194. package/lib/composables/colors-utils.d.ts +0 -8
  195. package/lib/composables/colors.d.ts +0 -26
  196. package/lib/composables/common.d.ts +0 -14
  197. package/lib/composables/css.d.ts +0 -5
  198. package/lib/composables/index.d.ts +0 -7
  199. package/lib/composables/inputtable.d.ts +0 -37
  200. package/lib/composables/interactive.d.ts +0 -10
  201. package/lib/composables/keys.d.ts +0 -7
  202. package/lib/composables/notification.d.ts +0 -1
  203. package/lib/create.d.ts +0 -12
  204. package/lib/index.d.ts +0 -6
  205. package/lib/install.d.ts +0 -4
  206. package/lib/style.css +0 -1
  207. package/lib/version.d.ts +0 -2
  208. package/src/components/table/TableHead.vue +0 -15
  209. package/src/composables/notification.ts +0 -10
@@ -1,22 +1,30 @@
1
1
  <script lang="ts">
2
- import { defineComponent } from 'vue'
2
+ export default { name: 'XContainer' }
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ import { useTheme } from '../../composables/theme'
3
7
 
4
- export default defineComponent({
5
- name: 'XContainer',
8
+ import theme from './Container.theme'
6
9
 
7
- props: {
8
- tag: {
9
- type: String,
10
- default: 'div',
11
- },
10
+ const props = defineProps({
11
+ tag: {
12
+ type: String,
13
+ default: 'div',
12
14
  },
13
15
  })
16
+
17
+ const { styles, classes, className } = useTheme('container', theme, props)
14
18
  </script>
15
19
 
16
20
  <template>
17
21
  <component
18
22
  :is="tag"
19
- class="max-w-screen-2xl mx-auto px-4"
23
+ :style="styles"
24
+ :class="[
25
+ className,
26
+ classes.wrapper
27
+ ]"
20
28
  >
21
29
  <slot></slot>
22
30
  </component>
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Container from '../Container.vue'
4
+
5
+ describe('Container', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Container)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,11 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: ({ props }: ThemeParams) => `flex justify-center items-center ${props.vertical ? 'h-full flex-col' : 'w-full'}`,
6
+
7
+ label: 'font-medium text-sm text-gray-600 dark:text-gray-300',
8
+
9
+ line: 'bg-gray-200 dark:bg-slate-700 flex-grow',
10
+ },
11
+ }
@@ -1,28 +1,30 @@
1
1
  <script lang="ts">
2
- import { defineComponent } from 'vue'
2
+ export default { name: 'XDivider' }
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ import { useTheme } from '../../composables/theme'
3
7
 
4
- export default defineComponent({
5
- name: 'XDivider',
8
+ import theme from './Divider.theme'
6
9
 
7
- props: {
8
- label: String,
9
- vertical: Boolean,
10
- },
10
+ const props = defineProps({
11
+ label: String,
12
+ vertical: Boolean,
11
13
  })
14
+
15
+ const { styles, classes, className } = useTheme('divider', theme, props)
12
16
  </script>
13
17
 
14
18
  <template>
15
19
  <div
20
+ :style="styles"
16
21
  :class="[
17
- {
18
- 'h-full flex-col': vertical,
19
- 'w-full': !vertical
20
- },
22
+ className,
23
+ classes.wrapper
21
24
  ]"
22
- class="flex justify-center items-center"
23
25
  >
24
26
  <div
25
- class="bg-gray-200 dark:bg-slate-700 flex-grow"
27
+ :class="classes.line"
26
28
  :style="[
27
29
  {
28
30
  width: vertical ? '1px' : 'auto',
@@ -33,14 +35,16 @@ export default defineComponent({
33
35
  <div
34
36
  v-if="label"
35
37
  class="font-medium text-sm text-gray-600 dark:text-gray-300"
36
- :class="[{
37
- 'my-2': vertical,
38
- 'mx-4': !vertical
39
- }]"
38
+ :class="[
39
+ classes.label,
40
+ {
41
+ 'my-2': vertical,
42
+ 'mx-4': !vertical
43
+ }]"
40
44
  v-text="label"
41
45
  ></div>
42
46
  <div
43
- class="bg-gray-200 dark:bg-slate-700 flex-grow"
47
+ :class="classes.line"
44
48
  :style="[
45
49
  {
46
50
  width: vertical ? '1px' : 'auto',
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Divider from '../Divider.vue'
4
+
5
+ describe('Divider', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Divider)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,9 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: 'flex flex-col max-h-full bg-white dark:bg-gray-800',
6
+
7
+ backdrop: 'absolute z-40 inset-0 duration-150 ease-in-out',
8
+ },
9
+ }
@@ -1,206 +1,188 @@
1
1
  <script lang="ts">
2
- import { computed, defineComponent, onMounted, ref, watch, watchEffect, type PropType } from 'vue'
2
+ export default {
3
+ name: 'XDrawer',
4
+ inheritAttrs: false,
5
+ }
6
+ </script>
7
+
8
+ <script setup lang="ts">
9
+ import { computed, onMounted, ref, watch, watchEffect, type PropType } from 'vue'
3
10
  import { breakpointsTailwind, SwipeDirection, useBreakpoints, useEventListener, useSwipe, type Breakpoints } from '@vueuse/core'
11
+ import { useTheme } from '../../composables/theme'
4
12
 
5
13
  import XScroll from '../../components/scroll/Scroll.vue'
6
14
 
7
- export default defineComponent({
8
- name: 'XDrawer',
15
+ import theme from './Drawer.theme'
9
16
 
10
- components: {
11
- XScroll,
17
+ const props = defineProps({
18
+ modelValue: Boolean,
19
+ position: {
20
+ type: String as PropType<'left' | 'right' | 'top' | 'bottom'>,
21
+ default: 'left',
12
22
  },
13
-
14
- inheritAttrs: false,
15
-
16
- props: {
17
- modelValue: Boolean,
18
- position: {
19
- type: String as PropType<'left' | 'right' | 'top' | 'bottom'>,
20
- default: 'left',
21
- },
22
- to: {
23
- type: [String, Object] as PropType<string | HTMLElement>,
24
- default: 'body',
25
- },
26
- width: {
27
- type: [String, Number],
28
- default: 320,
29
- },
30
- height: {
31
- type: [String, Number],
32
- default: 320,
33
- },
34
- breakpoint: [String, Number],
35
- backdrop: {
36
- type: Boolean,
37
- default: true,
38
- },
23
+ teleportTo: {
24
+ type: [String, Object] as PropType<string | HTMLElement>,
25
+ default: 'body',
39
26
  },
27
+ width: {
28
+ type: [String, Number],
29
+ default: 320,
30
+ },
31
+ height: {
32
+ type: [String, Number],
33
+ default: 320,
34
+ },
35
+ breakpoint: [String, Number],
36
+ backdrop: {
37
+ type: Boolean,
38
+ default: true,
39
+ },
40
+ })
40
41
 
41
- emits: ['update:modelValue'],
42
-
43
- expose: ['open', 'close'],
44
-
45
- setup(props, { emit }) {
46
- const detached = ref<boolean>(true)
47
- const visible = ref<boolean>(true)
48
- const value = ref<boolean>(props.modelValue)
49
- const backdropRef = ref<HTMLElement | null>(null)
50
- const drawerRef = ref<HTMLElement | null>(null)
51
-
52
- const isTailwindBreakpoint = typeof props.breakpoint === 'string'
53
- const breakpoints = useBreakpoints(isTailwindBreakpoint ? breakpointsTailwind : { md: props.breakpoint || 768 } as Breakpoints)
54
- const point = breakpoints.smaller(isTailwindBreakpoint ? props.breakpoint : 'md')
42
+ const emit = defineEmits(['update:modelValue'])
55
43
 
56
- watchEffect(() => {
57
- if (props.breakpoint) {
58
- close()
59
- detached.value = point.value
60
- }
61
- })
44
+ const detached = ref<boolean>(true)
45
+ const value = ref<boolean>(props.modelValue)
46
+ const backdropRef = ref<HTMLElement | null>(null)
47
+ const drawerRef = ref<HTMLElement | null>(null)
62
48
 
63
- useEventListener(backdropRef, 'pointerdown', close)
49
+ const isTailwindBreakpoint = typeof props.breakpoint === 'string'
50
+ const breakpoints = useBreakpoints(isTailwindBreakpoint ? breakpointsTailwind : { md: props.breakpoint || 768 } as Breakpoints)
51
+ const point = breakpoints.smaller(isTailwindBreakpoint ? props.breakpoint : 'md')
64
52
 
65
- watch(() => props.modelValue, (val) => {
66
- value.value = val
67
- })
53
+ watchEffect(() => {
54
+ if (props.breakpoint) {
55
+ close()
56
+ detached.value = point.value
57
+ }
58
+ })
68
59
 
69
- useEventListener(document, 'keydown', onKeyDown)
60
+ useEventListener(backdropRef, 'pointerdown', close)
70
61
 
71
- function onKeyDown(event: KeyboardEvent) {
72
- if (event.key === 'Escape' && value.value) close()
73
- }
62
+ watch(() => props.modelValue, (val) => {
63
+ value.value = val
64
+ })
74
65
 
75
- const { lengthX, lengthY } = useSwipe(drawerRef, {
76
- // passive: false,
77
- // onSwipe(e: TouchEvent) {
78
- // if (lengthX.value < 0) {
79
- // const length = Math.abs(lengthX.value)
80
- // left.value = `${length}px`
81
- // } else {
82
- // left.value = '0'
83
- // }
84
- // },
85
- // onSwipeEnd(e: TouchEvent, direction: SwipeDirection) {
86
- // if (lengthX.value < 0 && props.width && (Math.abs(lengthX.value) / props.width) >= 0.5) {
87
- // left.value = '100%'
88
- // } else {
89
- // left.value = '0'
90
- // }
91
- // },
92
- onSwipeEnd(e: TouchEvent, direction: SwipeDirection) {
93
- if (detached.value) {
94
- if (
95
- (props.position === 'left' && direction === 'LEFT') ||
66
+ useEventListener(document, 'keydown', onKeyDown)
67
+
68
+ function onKeyDown(event: KeyboardEvent) {
69
+ if (event.key === 'Escape' && value.value) close()
70
+ }
71
+
72
+ const { lengthX, lengthY } = useSwipe(drawerRef, {
73
+ // passive: false,
74
+ // onSwipe(e: TouchEvent) {
75
+ // if (lengthX.value < 0) {
76
+ // const length = Math.abs(lengthX.value)
77
+ // left.value = `${length}px`
78
+ // } else {
79
+ // left.value = '0'
80
+ // }
81
+ // },
82
+ // onSwipeEnd(e: TouchEvent, direction: SwipeDirection) {
83
+ // if (lengthX.value < 0 && props.width && (Math.abs(lengthX.value) / props.width) >= 0.5) {
84
+ // left.value = '100%'
85
+ // } else {
86
+ // left.value = '0'
87
+ // }
88
+ // },
89
+ onSwipeEnd(e: TouchEvent, direction: SwipeDirection) {
90
+ if (detached.value) {
91
+ if (
92
+ (props.position === 'left' && direction === 'LEFT') ||
96
93
  (props.position === 'right' && direction === 'RIGHT') ||
97
94
  (props.position === 'top' && direction === 'UP') ||
98
95
  (props.position === 'bottom' && direction === 'DOWN')
99
- ) close()
100
- }
101
- },
102
- })
103
-
104
- function close(e?: PointerEvent) {
105
- if (e && e.target !== backdropRef.value) return
106
- value.value = false
107
- emit('update:modelValue', false)
96
+ ) close()
108
97
  }
98
+ },
99
+ })
109
100
 
110
- function open() {
111
- value.value = true
112
- emit('update:modelValue', true)
113
- }
101
+ function close(e?: PointerEvent) {
102
+ if (e && e.target !== backdropRef.value) return
103
+ value.value = false
104
+ emit('update:modelValue', false)
105
+ }
114
106
 
115
- const styles = computed(() => {
116
- const styles: Record<string, string> = {}
107
+ function open() {
108
+ value.value = true
109
+ emit('update:modelValue', true)
110
+ }
117
111
 
118
- if (props.position === 'left' || props.position === 'right') styles['width'] = props.width + 'px'
119
- else if (props.position === 'top' || props.position === 'bottom') styles['height'] = props.height + 'px'
112
+ const autoStyles = computed(() => {
113
+ const s: Record<string, string> = {}
120
114
 
121
- return styles
122
- })
115
+ if (props.position === 'left' || props.position === 'right') s['width'] = props.width + 'px'
116
+ else if (props.position === 'top' || props.position === 'bottom') s['height'] = props.height + 'px'
123
117
 
124
- const classes = computed(() => {
125
- const classes = []
118
+ return s
119
+ })
126
120
 
127
- if (detached.value) {
128
- classes.push('absolute shadow-lg')
121
+ const autoClasses = computed(() => {
122
+ const c = []
129
123
 
130
- if (props.position === 'top') classes.push('top-0 inset-x-0')
131
- else if (props.position === 'bottom') classes.push('bottom-0 inset-x-0')
132
- else if (props.position === 'left') classes.push('left-0 inset-y-0')
133
- else if (props.position === 'right') classes.push('right-0 inset-y-0')
134
- }
124
+ if (detached.value) {
125
+ c.push('absolute shadow-lg')
135
126
 
136
- return classes
137
- })
127
+ if (props.position === 'top') c.push('top-0 inset-x-0')
128
+ else if (props.position === 'bottom') c.push('bottom-0 inset-x-0')
129
+ else if (props.position === 'left') c.push('left-0 inset-y-0')
130
+ else if (props.position === 'right') c.push('right-0 inset-y-0')
131
+ }
138
132
 
139
- function onBeforeEnter(el: HTMLElement) {
140
- if (props.position === 'top') el.style.top = `-${props.height}px`
141
- else if (props.position === 'bottom') el.style.bottom = `-${props.height}px`
142
- else if (props.position === 'left') el.style.left = `-${props.width}px`
143
- else if (props.position === 'right') el.style.right = `-${props.width}px`
144
- }
133
+ return c
134
+ })
145
135
 
146
- function onEnter(el: HTMLElement, done: ()=> void) {
147
- if (!detached.value) {
148
- done()
149
-
150
- return
151
- }
152
- el.addEventListener('transitionend', done)
153
- setTimeout(() => {
154
- if (props.backdrop) el.classList.add('bg-gray-500/30')
155
- if (props.position === 'top') el.style.top = '0'
156
- else if (props.position === 'bottom') el.style.bottom = '0'
157
- else if (props.position === 'left') el.style.left = '0'
158
- else if (props.position === 'right') el.style.right = '0'
159
- }, 1)
160
- }
136
+ function onBeforeEnter(el: HTMLElement) {
137
+ if (props.position === 'top') el.style.top = `-${props.height}px`
138
+ else if (props.position === 'bottom') el.style.bottom = `-${props.height}px`
139
+ else if (props.position === 'left') el.style.left = `-${props.width}px`
140
+ else if (props.position === 'right') el.style.right = `-${props.width}px`
141
+ }
142
+
143
+ function onEnter(el: HTMLElement, done: ()=> void) {
144
+ if (!detached.value) {
145
+ done()
146
+
147
+ return
148
+ }
149
+ el.addEventListener('transitionend', done)
150
+ setTimeout(() => {
151
+ if (props.backdrop) el.classList.add('bg-gray-500/30')
152
+ if (props.position === 'top') el.style.top = '0'
153
+ else if (props.position === 'bottom') el.style.bottom = '0'
154
+ else if (props.position === 'left') el.style.left = '0'
155
+ else if (props.position === 'right') el.style.right = '0'
156
+ }, 1)
157
+ }
158
+
159
+ function onBeforeLeave(el: HTMLElement) {}
160
+
161
+ function onLeave(el: HTMLElement, done: ()=> void) {
162
+ el.addEventListener('transitionend', done)
163
+ setTimeout(() => {
164
+ if (props.backdrop) el.classList.remove('bg-gray-500/30')
165
+ if (props.position === 'top') el.style.top = `-${props.height}px`
166
+ else if (props.position === 'bottom') el.style.bottom = `-${props.height}px`
167
+ else if (props.position === 'left') el.style.left = `-${props.width}px`
168
+ else if (props.position === 'right') el.style.right = `-${props.width}px`
169
+ }, 1)
170
+ }
171
+
172
+ const deferShow = ref<boolean>(!!(props.teleportTo && (props.teleportTo instanceof HTMLElement || document.querySelector(props.teleportTo))))
173
+
174
+ onMounted(() => {
175
+ deferShow.value = true
176
+ })
161
177
 
162
- function onBeforeLeave(el: HTMLElement) {}
163
-
164
- function onLeave(el: HTMLElement, done: ()=> void) {
165
- el.addEventListener('transitionend', done)
166
- setTimeout(() => {
167
- if (props.backdrop) el.classList.remove('bg-gray-500/30')
168
- if (props.position === 'top') el.style.top = `-${props.height}px`
169
- else if (props.position === 'bottom') el.style.bottom = `-${props.height}px`
170
- else if (props.position === 'left') el.style.left = `-${props.width}px`
171
- else if (props.position === 'right') el.style.right = `-${props.width}px`
172
- }, 1)
173
- }
178
+ const { styles, classes, className } = useTheme('drawer', theme, props)
174
179
 
175
- const deferShow = ref<boolean>(!!(props.to && (props.to instanceof HTMLElement || document.querySelector(props.to))))
176
-
177
- onMounted(() => {
178
- deferShow.value = true
179
- })
180
-
181
- return {
182
- deferShow,
183
- backdropRef,
184
- drawerRef,
185
- visible,
186
- classes,
187
- styles,
188
- detached,
189
- value,
190
- open,
191
- close,
192
- onBeforeEnter,
193
- onEnter,
194
- onBeforeLeave,
195
- onLeave,
196
- }
197
- },
198
- })
180
+ defineExpose({ open, close })
199
181
  </script>
200
182
 
201
183
  <template>
202
- <Teleport v-if="deferShow" :to="to" :disabled="!detached">
203
- <Transition
184
+ <teleport v-if="deferShow" :to="teleportTo" :disabled="!detached">
185
+ <transition
204
186
  :css="false"
205
187
  @before-enter="onBeforeEnter"
206
188
  @enter="onEnter"
@@ -212,9 +194,7 @@ export default defineComponent({
212
194
  ref="backdropRef"
213
195
  :class="[
214
196
  $attrs.class,
215
- {
216
- 'absolute z-40 inset-0 duration-150 ease-in-out': detached,
217
- },
197
+ detached ? classes.backdrop : ''
218
198
  ]"
219
199
  >
220
200
  <div
@@ -224,9 +204,12 @@ export default defineComponent({
224
204
  ></div>
225
205
  <div
226
206
  ref="drawerRef"
227
- class="flex flex-col max-h-full bg-white dark:bg-gray-800"
228
- :class="classes"
229
- :style="styles"
207
+ :class="[
208
+ className,
209
+ autoClasses,
210
+ classes.wrapper
211
+ ]"
212
+ :style="[autoStyles, styles]"
230
213
  >
231
214
  <slot name="header"></slot>
232
215
  <x-scroll
@@ -239,6 +222,6 @@ export default defineComponent({
239
222
  <slot name="footer"></slot>
240
223
  </div>
241
224
  </div>
242
- </Transition>
243
- </Teleport>
225
+ </transition>
226
+ </teleport>
244
227
  </template>
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Drawer from '../Drawer.vue'
4
+
5
+ describe('Drawer', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Drawer)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,7 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: '',
6
+ },
7
+ }