@indielayer/ui 1.0.0-alpha.9 → 1.0.2

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 (293) hide show
  1. package/README.md +6 -3
  2. package/lib/common/icons.d.ts +15 -0
  3. package/lib/common/utils.d.ts +32 -0
  4. package/lib/components/alert/Alert.theme.d.ts +8 -0
  5. package/lib/components/alert/Alert.vue.d.ts +1 -12
  6. package/lib/components/alert/__tests__/Alert.spec.d.ts +1 -0
  7. package/lib/components/avatar/Avatar.theme.d.ts +8 -0
  8. package/lib/components/avatar/Avatar.vue.d.ts +5 -8
  9. package/lib/components/avatar/__tests__/Avatar.spec.d.ts +1 -0
  10. package/lib/components/badge/Badge.theme.d.ts +8 -0
  11. package/lib/components/badge/Badge.vue.d.ts +5 -6
  12. package/lib/components/badge/__tests__/Badge.spec.d.ts +1 -0
  13. package/lib/components/breadcrumbs/Breadcrumbs.theme.d.ts +8 -0
  14. package/lib/components/breadcrumbs/Breadcrumbs.vue.d.ts +19 -8
  15. package/lib/components/breadcrumbs/__tests__/Breadcrumbs.spec.d.ts +1 -0
  16. package/lib/components/button/Button.theme.d.ts +10 -0
  17. package/lib/components/button/Button.vue.d.ts +10 -16
  18. package/lib/components/button/ButtonGroup.theme.d.ts +6 -0
  19. package/lib/components/button/ButtonGroup.vue.d.ts +5 -2
  20. package/lib/components/button/__tests__/ Button.spec.d.ts +1 -0
  21. package/lib/components/button/__tests__/ ButtonGroup.spec.d.ts +1 -0
  22. package/lib/components/card/Card.theme.d.ts +7 -0
  23. package/lib/components/card/Card.vue.d.ts +2 -2
  24. package/lib/components/card/__tests__/Card.spec.d.ts +1 -0
  25. package/lib/components/checkbox/Checkbox.theme.d.ts +11 -0
  26. package/lib/components/checkbox/Checkbox.vue.d.ts +10 -14
  27. package/lib/components/checkbox/__tests__/Checkbox.spec.d.ts +1 -0
  28. package/lib/components/collapse/Collapse.theme.d.ts +9 -0
  29. package/lib/components/collapse/Collapse.vue.d.ts +12 -19
  30. package/lib/components/collapse/__tests__/Collapse.spec.d.ts +1 -0
  31. package/lib/components/container/Container.theme.d.ts +6 -0
  32. package/lib/components/container/Container.vue.d.ts +1 -1
  33. package/lib/components/container/__tests__/Container.spec.d.ts +1 -0
  34. package/lib/components/divider/Divider.theme.d.ts +9 -0
  35. package/lib/components/divider/Divider.vue.d.ts +1 -1
  36. package/lib/components/divider/__tests__/Divider.spec.d.ts +1 -0
  37. package/lib/components/drawer/Drawer.theme.d.ts +7 -0
  38. package/lib/components/drawer/Drawer.vue.d.ts +3 -15
  39. package/lib/components/drawer/__tests__/Drawer.spec.d.ts +1 -0
  40. package/lib/components/form/Form.theme.d.ts +6 -0
  41. package/lib/components/form/Form.vue.d.ts +9 -7
  42. package/lib/components/form/__tests__/Form.spec.d.ts +1 -0
  43. package/lib/components/helpers/InputError.d.ts +8 -0
  44. package/lib/components/icon/Icon.theme.d.ts +7 -0
  45. package/lib/components/icon/Icon.vue.d.ts +4 -8
  46. package/lib/components/icon/__tests__/Icon.spec.d.ts +1 -0
  47. package/lib/components/image/Image.theme.d.ts +6 -0
  48. package/lib/components/image/Image.vue.d.ts +1 -3
  49. package/lib/components/image/__tests__/Image.spec.d.ts +1 -0
  50. package/lib/components/index.d.ts +3 -3
  51. package/lib/components/input/Input.theme.d.ts +11 -0
  52. package/lib/components/input/Input.vue.d.ts +27 -25
  53. package/lib/components/input/__tests__/Input.spec.d.ts +1 -0
  54. package/lib/components/link/Link.theme.d.ts +8 -0
  55. package/lib/components/link/Link.vue.d.ts +3 -5
  56. package/lib/components/link/__tests__/Link.spec.d.ts +1 -0
  57. package/lib/components/menu/Menu.theme.d.ts +6 -0
  58. package/lib/components/menu/Menu.vue.d.ts +6 -3
  59. package/lib/components/menu/MenuItem.theme.d.ts +8 -0
  60. package/lib/components/menu/MenuItem.vue.d.ts +5 -30
  61. package/lib/components/menu/__tests__/Menu.spec.d.ts +1 -0
  62. package/lib/components/menu/__tests__/MenuItem.spec.d.ts +1 -0
  63. package/lib/components/modal/Modal.theme.d.ts +13 -0
  64. package/lib/components/modal/Modal.vue.d.ts +1 -6
  65. package/lib/components/modal/__tests__/Modal.spec.d.ts +1 -0
  66. package/lib/components/notifications/Notifications.theme.d.ts +8 -0
  67. package/lib/components/notifications/Notifications.vue.d.ts +11 -24
  68. package/lib/components/notifications/__tests__/Notifications.spec.d.ts +1 -0
  69. package/lib/components/pagination/Pagination.theme.d.ts +9 -0
  70. package/lib/components/pagination/Pagination.vue.d.ts +7 -16
  71. package/lib/components/pagination/PaginationItem.theme.d.ts +7 -0
  72. package/lib/components/pagination/PaginationItem.vue.d.ts +4 -3
  73. package/lib/components/pagination/__tests__/Pagination.spec.d.ts +1 -0
  74. package/lib/components/pagination/__tests__/PaginationItem.spec.d.ts +1 -0
  75. package/lib/components/popover/Popover.theme.d.ts +7 -0
  76. package/lib/components/popover/Popover.vue.d.ts +13 -13
  77. package/lib/components/popover/PopoverContainer.theme.d.ts +6 -0
  78. package/lib/components/popover/PopoverContainer.vue.d.ts +1 -1
  79. package/lib/components/popover/__tests__/Popover.spec.d.ts +1 -0
  80. package/lib/components/popover/__tests__/PopoverContainer.spec.d.ts +1 -0
  81. package/lib/components/progress/Progress.theme.d.ts +10 -0
  82. package/lib/components/progress/Progress.vue.d.ts +1 -3
  83. package/lib/components/progress/__tests__/Progress.spec.d.ts +1 -0
  84. package/lib/components/radio/Radio.theme.d.ts +12 -0
  85. package/lib/components/radio/Radio.vue.d.ts +12 -13
  86. package/lib/components/radio/__tests__/Radio.spec.d.ts +1 -0
  87. package/lib/components/scroll/Scroll.theme.d.ts +6 -0
  88. package/lib/components/scroll/Scroll.vue.d.ts +1 -7
  89. package/lib/components/scroll/__tests__/Scroll.spec.d.ts +1 -0
  90. package/lib/components/select/Select.theme.d.ts +13 -0
  91. package/lib/components/select/Select.vue.d.ts +8 -28
  92. package/lib/components/select/__tests__/Select.spec.d.ts +1 -0
  93. package/lib/components/skeleton/Skeleton.theme.d.ts +6 -0
  94. package/lib/components/skeleton/Skeleton.vue.d.ts +1 -1
  95. package/lib/components/skeleton/__tests__/Skeleton.spec.d.ts +1 -0
  96. package/lib/components/slider/Slider.theme.d.ts +10 -0
  97. package/lib/components/slider/Slider.vue.d.ts +8 -17
  98. package/lib/components/slider/__tests__/Slider.spec.d.ts +1 -0
  99. package/lib/components/spacer/Spacer.d.ts +2 -0
  100. package/lib/components/spacer/__tests__/Spacer.spec.d.ts +1 -0
  101. package/lib/components/spinner/Spinner.vue.d.ts +15 -6
  102. package/lib/components/spinner/__tests__/Spinner.spec.d.ts +1 -0
  103. package/lib/components/tab/Tab.theme.d.ts +9 -0
  104. package/lib/components/tab/Tab.vue.d.ts +4 -13
  105. package/lib/components/tab/TabGroup.theme.d.ts +10 -0
  106. package/lib/components/tab/TabGroup.vue.d.ts +4 -8
  107. package/lib/components/tab/__tests__/Tab.spec.d.ts +1 -0
  108. package/lib/components/tab/__tests__/TabGroup.spec.d.ts +1 -0
  109. package/lib/components/table/Table.theme.d.ts +8 -0
  110. package/lib/components/table/Table.vue.d.ts +6 -10
  111. package/lib/components/table/TableBody.d.ts +2 -0
  112. package/lib/components/table/TableCell.theme.d.ts +7 -0
  113. package/lib/components/table/TableCell.vue.d.ts +1 -1
  114. package/lib/components/table/TableHead.d.ts +2 -0
  115. package/lib/components/table/TableHeader.vue.d.ts +2 -2
  116. package/lib/components/table/TableRow.vue.d.ts +1 -1
  117. package/lib/components/table/__tests__/Table.spec.d.ts +1 -0
  118. package/lib/components/tag/Tag.theme.d.ts +9 -0
  119. package/lib/components/tag/Tag.vue.d.ts +5 -5
  120. package/lib/components/tag/__tests__/Tag.spec.d.ts +1 -0
  121. package/lib/components/textarea/Textarea.theme.d.ts +10 -0
  122. package/lib/components/textarea/Textarea.vue.d.ts +18 -24
  123. package/lib/components/textarea/__tests__/Textarea.spec.d.ts +1 -0
  124. package/lib/components/toggle/Toggle.theme.d.ts +11 -0
  125. package/lib/components/toggle/Toggle.vue.d.ts +10 -11
  126. package/lib/components/toggle/__tests__/Toggle.spec.d.ts +1 -0
  127. package/lib/components/tooltip/Tooltip.theme.d.ts +11 -0
  128. package/lib/components/tooltip/__tests__/Tooltip.spec.d.ts +1 -0
  129. package/lib/composables/colors-utils.d.ts +0 -1
  130. package/lib/composables/colors.d.ts +8 -4
  131. package/lib/composables/common.d.ts +1 -0
  132. package/lib/composables/css.d.ts +6 -5
  133. package/lib/composables/index.d.ts +1 -1
  134. package/lib/composables/inputtable.d.ts +1 -1
  135. package/lib/composables/interactive.d.ts +7 -2
  136. package/lib/composables/keys.d.ts +1 -0
  137. package/lib/composables/notifications.d.ts +1 -0
  138. package/lib/composables/theme.d.ts +20 -0
  139. package/lib/create.d.ts +3 -2
  140. package/lib/index.cjs.js +1 -15
  141. package/lib/index.es.js +4479 -3667
  142. package/lib/nuxt.js +2 -1
  143. package/lib/version.d.ts +1 -1
  144. package/package.json +16 -6
  145. package/src/common/icons.ts +15 -0
  146. package/src/common/utils.ts +68 -0
  147. package/src/components/alert/Alert.theme.ts +57 -0
  148. package/src/components/alert/Alert.vue +51 -127
  149. package/src/components/alert/__tests__/Alert.spec.ts +14 -0
  150. package/src/components/avatar/Avatar.theme.ts +39 -0
  151. package/src/components/avatar/Avatar.vue +61 -97
  152. package/src/components/avatar/__tests__/Avatar.spec.ts +11 -0
  153. package/src/components/badge/Badge.theme.ts +13 -0
  154. package/src/components/badge/Badge.vue +58 -65
  155. package/src/components/badge/__tests__/Badge.spec.ts +11 -0
  156. package/src/components/breadcrumbs/Breadcrumbs.theme.ts +9 -0
  157. package/src/components/breadcrumbs/Breadcrumbs.vue +34 -24
  158. package/src/components/breadcrumbs/__tests__/Breadcrumbs.spec.ts +11 -0
  159. package/src/components/button/Button.theme.ts +234 -0
  160. package/src/components/button/Button.vue +94 -356
  161. package/src/components/button/ButtonGroup.theme.ts +5 -0
  162. package/src/components/button/ButtonGroup.vue +30 -29
  163. package/src/components/button/__tests__/ Button.spec.ts +11 -0
  164. package/src/components/button/__tests__/ ButtonGroup.spec.ts +11 -0
  165. package/src/components/card/Card.theme.ts +7 -0
  166. package/src/components/card/Card.vue +18 -11
  167. package/src/components/card/__tests__/Card.spec.ts +11 -0
  168. package/src/components/checkbox/Checkbox.theme.ts +92 -0
  169. package/src/components/checkbox/Checkbox.vue +69 -156
  170. package/src/components/checkbox/__tests__/Checkbox.spec.ts +11 -0
  171. package/src/components/collapse/Collapse.theme.ts +11 -0
  172. package/src/components/collapse/Collapse.vue +99 -118
  173. package/src/components/collapse/__tests__/Collapse.spec.ts +11 -0
  174. package/src/components/container/Container.theme.ts +7 -0
  175. package/src/components/container/Container.vue +17 -9
  176. package/src/components/container/__tests__/Container.spec.ts +11 -0
  177. package/src/components/divider/Divider.theme.ts +11 -0
  178. package/src/components/divider/Divider.vue +22 -18
  179. package/src/components/divider/__tests__/Divider.spec.ts +11 -0
  180. package/src/components/drawer/Drawer.theme.ts +9 -0
  181. package/src/components/drawer/Drawer.vue +167 -179
  182. package/src/components/drawer/__tests__/Drawer.spec.ts +11 -0
  183. package/src/components/form/Form.theme.ts +7 -0
  184. package/src/components/form/Form.vue +90 -73
  185. package/src/components/form/__tests__/Form.spec.ts +11 -0
  186. package/src/components/helpers/InputError.tsx +14 -0
  187. package/src/components/icon/Icon.theme.ts +16 -0
  188. package/src/components/icon/Icon.vue +72 -88
  189. package/src/components/icon/__tests__/Icon.spec.ts +11 -0
  190. package/src/components/image/Image.theme.ts +7 -0
  191. package/src/components/image/Image.vue +22 -23
  192. package/src/components/image/__tests__/Image.spec.ts +11 -0
  193. package/src/components/index.ts +3 -3
  194. package/src/components/input/Input.theme.ts +44 -0
  195. package/src/components/input/Input.vue +97 -130
  196. package/src/components/input/__tests__/Input.spec.ts +11 -0
  197. package/src/components/link/Link.theme.ts +26 -0
  198. package/src/components/link/Link.vue +41 -66
  199. package/src/components/link/__tests__/Link.spec.ts +11 -0
  200. package/src/components/menu/Menu.theme.ts +7 -0
  201. package/src/components/menu/Menu.vue +54 -45
  202. package/src/components/menu/MenuItem.theme.ts +107 -0
  203. package/src/components/menu/MenuItem.vue +97 -199
  204. package/src/components/menu/__tests__/Menu.spec.ts +11 -0
  205. package/src/components/menu/__tests__/MenuItem.spec.ts +11 -0
  206. package/src/components/modal/Modal.theme.ts +29 -0
  207. package/src/components/modal/Modal.vue +78 -101
  208. package/src/components/modal/__tests__/Modal.spec.ts +11 -0
  209. package/src/components/notifications/Notifications.theme.ts +11 -0
  210. package/src/components/notifications/Notifications.vue +233 -249
  211. package/src/components/notifications/__tests__/Notifications.spec.ts +11 -0
  212. package/src/components/pagination/Pagination.theme.ts +27 -0
  213. package/src/components/pagination/Pagination.vue +142 -164
  214. package/src/components/pagination/PaginationItem.theme.ts +14 -0
  215. package/src/components/pagination/PaginationItem.vue +26 -33
  216. package/src/components/pagination/__tests__/Pagination.spec.ts +11 -0
  217. package/src/components/pagination/__tests__/PaginationItem.spec.ts +11 -0
  218. package/src/components/popover/Popover.theme.ts +9 -0
  219. package/src/components/popover/Popover.vue +153 -101
  220. package/src/components/popover/PopoverContainer.theme.ts +7 -0
  221. package/src/components/popover/PopoverContainer.vue +17 -9
  222. package/src/components/popover/__tests__/Popover.spec.ts +11 -0
  223. package/src/components/popover/__tests__/PopoverContainer.spec.ts +11 -0
  224. package/src/components/progress/Progress.theme.ts +26 -0
  225. package/src/components/progress/Progress.vue +29 -53
  226. package/src/components/progress/__tests__/Progress.spec.ts +11 -0
  227. package/src/components/radio/Radio.theme.ts +121 -0
  228. package/src/components/radio/Radio.vue +81 -158
  229. package/src/components/radio/__tests__/Radio.spec.ts +11 -0
  230. package/src/components/scroll/Scroll.theme.ts +7 -0
  231. package/src/components/scroll/Scroll.vue +34 -36
  232. package/src/components/scroll/__tests__/Scroll.spec.ts +11 -0
  233. package/src/components/select/Select.theme.ts +54 -0
  234. package/src/components/select/Select.vue +219 -273
  235. package/src/components/select/__tests__/Select.spec.ts +11 -0
  236. package/src/components/skeleton/Skeleton.theme.ts +7 -0
  237. package/src/components/skeleton/Skeleton.vue +17 -9
  238. package/src/components/skeleton/__tests__/Skeleton.spec.ts +11 -0
  239. package/src/components/slider/Slider.theme.ts +30 -0
  240. package/src/components/slider/Slider.vue +137 -168
  241. package/src/components/slider/__tests__/Slider.spec.ts +11 -0
  242. package/src/components/spacer/{Spacer.vue → Spacer.tsx} +3 -6
  243. package/src/components/spacer/__tests__/Spacer.spec.ts +11 -0
  244. package/src/components/spinner/Spinner.vue +10 -34
  245. package/src/components/spinner/__tests__/Spinner.spec.ts +11 -0
  246. package/src/components/tab/Tab.theme.ts +22 -0
  247. package/src/components/tab/Tab.vue +89 -93
  248. package/src/components/tab/TabGroup.theme.ts +43 -0
  249. package/src/components/tab/TabGroup.vue +94 -127
  250. package/src/components/tab/__tests__/Tab.spec.ts +11 -0
  251. package/src/components/tab/__tests__/TabGroup.spec.ts +11 -0
  252. package/src/components/table/Table.theme.ts +19 -0
  253. package/src/components/table/Table.vue +136 -147
  254. package/src/components/table/{TableBody.vue → TableBody.tsx} +3 -8
  255. package/src/components/table/TableCell.theme.ts +27 -0
  256. package/src/components/table/TableCell.vue +30 -58
  257. package/src/components/table/TableHead.tsx +14 -0
  258. package/src/components/table/TableHeader.vue +18 -20
  259. package/src/components/table/TableRow.vue +23 -20
  260. package/src/components/table/__tests__/Table.spec.ts +11 -0
  261. package/src/components/tag/Tag.theme.ts +32 -0
  262. package/src/components/tag/Tag.vue +40 -68
  263. package/src/components/tag/__tests__/Tag.spec.ts +11 -0
  264. package/src/components/textarea/Textarea.theme.ts +62 -0
  265. package/src/components/textarea/Textarea.vue +100 -115
  266. package/src/components/textarea/__tests__/Textarea.spec.ts +11 -0
  267. package/src/components/toggle/Toggle.theme.ts +51 -0
  268. package/src/components/toggle/Toggle.vue +51 -81
  269. package/src/components/toggle/__tests__/Toggle.spec.ts +11 -0
  270. package/src/components/tooltip/Tooltip.theme.ts +51 -0
  271. package/src/components/tooltip/Tooltip.vue +9 -14
  272. package/src/components/tooltip/__tests__/Tooltip.spec.ts +11 -0
  273. package/src/composables/colors-utils.ts +68 -68
  274. package/src/composables/colors.ts +18 -6
  275. package/src/composables/common.ts +1 -0
  276. package/src/composables/css.ts +7 -2
  277. package/src/composables/index.ts +1 -1
  278. package/src/composables/inputtable.ts +1 -1
  279. package/src/composables/interactive.ts +8 -4
  280. package/src/composables/keys.ts +1 -0
  281. package/src/composables/notifications.ts +10 -0
  282. package/src/composables/theme.ts +88 -0
  283. package/src/create.ts +8 -3
  284. package/src/exports/nuxt.js +2 -1
  285. package/src/version.ts +1 -1
  286. package/volar.d.ts +1 -0
  287. package/lib/components/spacer/Spacer.vue.d.ts +0 -2
  288. package/lib/components/table/TableBody.vue.d.ts +0 -2
  289. package/lib/components/table/TableHead.vue.d.ts +0 -2
  290. package/lib/composables/notification.d.ts +0 -1
  291. package/lib/style.css +0 -1
  292. package/src/components/table/TableHead.vue +0 -15
  293. package/src/composables/notification.ts +0 -10
@@ -1,126 +1,176 @@
1
1
  <script lang="ts">
2
- import { computed, defineComponent, ref, useCssModule, watch, type PropType } from 'vue'
3
- import { onClickOutside } from '@vueuse/core'
4
-
5
2
  const validators = {
6
3
  align: ['bottom','center','left','right','top'],
7
4
  position: ['bottom','left','right','top'],
8
5
  }
9
6
 
10
- export default defineComponent({
7
+ export default {
11
8
  name: 'XPopover',
12
-
13
9
  validators,
10
+ }
11
+ </script>
12
+
13
+ <script setup lang="ts">
14
+ import { computed, ref, useCssModule, watch, type PropType } from 'vue'
15
+ import { onClickOutside, useEventListener } from '@vueuse/core'
16
+ import { useTheme } from '../../composables/theme'
17
+
18
+ import theme from './Popover.theme'
14
19
 
15
- props: {
16
- align: {
17
- type: String as PropType<'bottom' | 'center' | 'left' | 'right' | 'top'>,
18
- default: 'center',
19
- validator: (value: string) => validators.align.includes(value),
20
- },
21
- position: {
22
- type: String as PropType<'bottom' | 'left' | 'right' | 'top'>,
23
- default: 'bottom',
24
- validator: (value: string) => validators.position.includes(value),
25
- },
26
- dismissOnClick: {
27
- type: Boolean,
28
- default: true,
29
- },
30
- disabled: Boolean,
31
- hover: Boolean,
32
- block: Boolean,
20
+ const props = defineProps({
21
+ align: {
22
+ type: String as PropType<'bottom' | 'center' | 'left' | 'right' | 'top'>,
23
+ default: 'center',
24
+ validator: (value: string) => validators.align.includes(value),
33
25
  },
26
+ position: {
27
+ type: String as PropType<'bottom' | 'left' | 'right' | 'top'>,
28
+ default: 'bottom',
29
+ validator: (value: string) => validators.position.includes(value),
30
+ },
31
+ dismissOnClick: {
32
+ type: Boolean,
33
+ default: true,
34
+ },
35
+ autoAlign: {
36
+ type: Boolean,
37
+ default: true,
38
+ },
39
+ disabled: Boolean,
40
+ hover: Boolean,
41
+ block: Boolean,
42
+ })
34
43
 
35
- emits: ['open', 'close', 'toggle'],
44
+ const emit = defineEmits(['open', 'close', 'toggle'])
36
45
 
37
- expose: ['open', 'close', 'toggle', 'isOpen'],
46
+ const elRef = ref<HTMLElement | null>(null)
47
+ const contentRef = ref<HTMLElement | null>(null)
48
+ const isOpen = ref(false)
38
49
 
39
- setup(props, { emit }) {
40
- const elRef = ref<HTMLElement>()
41
- const isOpen = ref(false)
50
+ let stopClickOutside: undefined | (()=> void) = undefined
42
51
 
43
- let stopClickOutside: undefined | (()=> void) = undefined
52
+ watch(isOpen, (newValue) => {
53
+ if (props.hover) return
44
54
 
45
- watch(isOpen, (newValue, oldValue) => {
46
- if (props.hover) return
55
+ if (newValue) {
56
+ checkVisibility()
57
+ } else {
58
+ resetOutbounds()
59
+ }
47
60
 
48
- if (stopClickOutside) {
49
- stopClickOutside()
50
- stopClickOutside = undefined
51
- }
61
+ if (stopClickOutside) {
62
+ stopClickOutside()
63
+ stopClickOutside = undefined
64
+ }
52
65
 
53
- if (newValue) {
54
- setTimeout(() => {
55
- stopClickOutside = onClickOutside(elRef, close)
56
- })
57
- }
66
+ if (newValue) {
67
+ setTimeout(() => {
68
+ stopClickOutside = onClickOutside(elRef, close)
58
69
  })
70
+ }
71
+ })
59
72
 
60
- const $style = useCssModule()
61
- const classes = computed(() => {
62
- const c = []
63
-
64
- c.push({
65
- // align-left
66
- 'left-0 right-auto': props.align === 'left' && ['bottom', 'top'].includes(props.position),
67
- // align-center
68
- 'left-1/2 right-auto -translate-x-1/2': props.align === 'center' && ['bottom', 'top'].includes(props.position),
69
- // align-right
70
- 'right-0 left-auto': props.align === 'right' && ['bottom', 'top'].includes(props.position),
71
- // align-top
72
- 'top-0 bottom-auto': props.align === 'top' && ['left', 'right'].includes(props.position),
73
- // align-middle
74
- '-translate-y-1/2 top-1/2 bottom-auto': props.align === 'center' && ['left', 'right'].includes(props.position),
75
- // align-bottom
76
- 'bottom-0': props.align === 'bottom' && ['left', 'right'].includes(props.position),
77
- })
78
-
79
- if (props.position === 'top') c.push(`bottom-full pb-2 ${$style.popoverTop}`)
80
- if (props.position === 'right') c.push(`left-full pl-2 ${$style.popoverRight}`)
81
- if (props.position === 'bottom') c.push(`top-full bottom-0 ${$style.popoverBottom}`)
82
- if (props.position === 'left') c.push(`right-full left-auto pr-2 ${$style.popoverLeft}`)
83
-
84
- if (props.block) c.push('min-w-full')
85
-
86
- return c
87
- })
73
+ const $style = useCssModule()
74
+ const isOutLeft = ref(false)
75
+ const isOutRight = ref(false)
76
+ const isOutTop = ref(false)
77
+ const isOutBottom = ref(false)
78
+ const contentClasses = computed(() => {
79
+ const c = []
88
80
 
89
- function close() {
90
- if (props.disabled) return
91
- isOpen.value = false
92
- emit('close')
93
- }
94
-
95
- function open() {
96
- if (props.disabled) return
97
- isOpen.value = true
98
- emit('open')
99
- }
100
-
101
- function toggle() {
102
- if (props.disabled) return
103
- isOpen.value = !isOpen.value
104
- emit('toggle', isOpen.value)
105
- }
106
-
107
- return {
108
- elRef,
109
- isOpen,
110
- classes,
111
- close,
112
- open,
113
- toggle,
114
- }
115
- },
81
+ let align = props.align
82
+ let position = props.position
83
+
84
+ if (isOutTop.value) {
85
+ if (position === 'top') position = 'bottom'
86
+ else if ((position === 'left' || position === 'right')) align = 'top'
87
+ }
88
+
89
+ if (isOutBottom.value) {
90
+ if (position === 'bottom') position = 'top'
91
+ else if ((position === 'left' || position === 'right')) align = 'bottom'
92
+ }
93
+
94
+ if (isOutLeft.value) {
95
+ if (position === 'left') position = 'right'
96
+ else if ((position === 'top' || position === 'bottom')) align = 'left'
97
+ }
98
+
99
+ if (isOutRight.value) {
100
+ if (position === 'right') position = 'left'
101
+ else if ((position === 'top' || position === 'bottom')) align = 'right'
102
+ }
103
+
104
+ if (position === 'top') c.push(`bottom-full ${$style.popoverTop}`)
105
+ if (position === 'bottom') c.push(`top-full bottom-0 ${$style.popoverBottom}`)
106
+ if (position === 'right') c.push(`left-full ${$style.popoverRight}`)
107
+ if (position === 'left') c.push(`right-full left-auto ${$style.popoverLeft}`)
108
+
109
+ if (align === 'left' && ['bottom', 'top'].includes(position)) c.push('left-0 right-auto')
110
+ if (align === 'center' && ['bottom', 'top'].includes(position)) c.push('left-1/2 right-auto -translate-x-1/2')
111
+ if (align === 'right' && ['bottom', 'top'].includes(position)) c.push('right-0 left-auto')
112
+ if (align === 'top' && ['left', 'right'].includes(position)) c.push('top-0 bottom-auto')
113
+ if (align === 'center' && ['left', 'right'].includes(position)) c.push('-translate-y-1/2 top-1/2 bottom-auto')
114
+ if (align === 'bottom' && ['left', 'right'].includes(position)) c.push('bottom-0')
115
+
116
+ if (props.block) c.push('min-w-full')
117
+
118
+ return c
116
119
  })
120
+
121
+ if (props.hover) {
122
+ useEventListener(elRef, 'mouseenter', checkVisibility)
123
+ useEventListener(elRef, 'mouseleave', resetOutbounds)
124
+ }
125
+
126
+ function resetOutbounds() {
127
+ isOutLeft.value = false
128
+ isOutRight.value = false
129
+ isOutTop.value = false
130
+ isOutBottom.value = false
131
+ }
132
+
133
+ function checkVisibility() {
134
+ if (!contentRef.value) return
135
+ const clientRect = contentRef.value.getBoundingClientRect()
136
+
137
+ isOutLeft.value = clientRect.left < 0
138
+ isOutRight.value = clientRect.right > (window.innerWidth || document.documentElement.clientWidth)
139
+ isOutTop.value = clientRect.top < 0
140
+ isOutBottom.value = clientRect.bottom > (window.innerHeight || document.documentElement.clientHeight)
141
+ }
142
+
143
+ function close() {
144
+ if (props.disabled) return
145
+ isOpen.value = false
146
+ emit('close')
147
+ }
148
+
149
+ function open() {
150
+ if (props.disabled) return
151
+ isOpen.value = true
152
+ emit('open')
153
+ }
154
+
155
+ function toggle() {
156
+ if (props.disabled) return
157
+ isOpen.value = !isOpen.value
158
+ emit('toggle', isOpen.value)
159
+ }
160
+
161
+ const { styles, classes, className } = useTheme('popover', theme, props)
162
+
163
+ defineExpose({ open, close, toggle, isOpen })
117
164
  </script>
118
165
 
119
166
  <template>
120
167
  <div
121
168
  ref="elRef"
122
169
  class="inline-block relative"
170
+ :style="styles"
123
171
  :class="[
172
+ className,
173
+ classes.wrapper,
124
174
  $style.popover,
125
175
  [hover ? $style.hover : ''],
126
176
  [isOpen ? $style['is-open'] : ''],
@@ -132,10 +182,12 @@ export default defineComponent({
132
182
  </div>
133
183
 
134
184
  <div
135
- class="absolute w-fit bottom-0 left-0 right-0 sm:p-0 transform transition-transform z-40 max-w-xs"
185
+ ref="contentRef"
186
+ class="absolute transform transition-transform z-40 h-fit"
136
187
  :class="[
137
188
  $style.popoverContent,
138
- classes
189
+ contentClasses,
190
+ classes.content
139
191
  ]"
140
192
  @click="dismissOnClick ? close() : null"
141
193
  >
@@ -158,7 +210,7 @@ export default defineComponent({
158
210
  --tw-translate-x: -0.5rem;
159
211
  }
160
212
  .popoverBottom {
161
- --tw-translate-y: -0.25rem;
213
+ --tw-translate-y: -0.5rem;
162
214
  }
163
215
  .popoverLeft {
164
216
  --tw-translate-x: 0.5rem;
@@ -173,12 +225,12 @@ export default defineComponent({
173
225
 
174
226
  &.hover:hover .popoverTop,
175
227
  &.is-open .popoverTop {
176
- --tw-translate-y: 0.25rem;
228
+ --tw-translate-y: -0.25rem;
177
229
  }
178
230
 
179
231
  &.hover:hover .popoverRight,
180
232
  &.is-open .popoverRight {
181
- --tw-translate-x: 0px;
233
+ --tw-translate-x: 0.25rem;
182
234
  }
183
235
 
184
236
  &.hover:hover .popoverBottom,
@@ -188,7 +240,7 @@ export default defineComponent({
188
240
 
189
241
  &.hover:hover .popoverLeft,
190
242
  &.is-open .popoverLeft {
191
- --tw-translate-x: 0px;
243
+ --tw-translate-x: -0.25rem;
192
244
  }
193
245
  }
194
246
  </style>
@@ -0,0 +1,7 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: 'block w-full bg-white dark:bg-gray-700 shadow-lg rounded-md border border-gray-200 dark:border-gray-800',
6
+ },
7
+ }
@@ -1,22 +1,30 @@
1
1
  <script lang="ts">
2
- import { defineComponent } from 'vue'
2
+ export default { name: 'XPopoverContainer' }
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ import { useTheme } from '../../composables/theme'
3
7
 
4
- export default defineComponent({
5
- name: 'XPopoverContainer',
8
+ import theme from './PopoverContainer.theme'
6
9
 
7
- props: {
8
- tag: {
9
- default: 'div',
10
- type: String,
11
- },
10
+ const props = defineProps({
11
+ tag: {
12
+ default: 'div',
13
+ type: String,
12
14
  },
13
15
  })
16
+
17
+ const { styles, classes, className } = useTheme('popover-container', theme, props)
14
18
  </script>
15
19
 
16
20
  <template>
17
21
  <component
18
22
  :is="tag"
19
- class="block w-full bg-white dark:bg-gray-700 shadow-lg rounded-md border border-gray-200 dark:border-gray-800"
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 Popover from '../Popover.vue'
4
+
5
+ describe('Popover', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Popover)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import PopoverContainer from '../PopoverContainer.vue'
4
+
5
+ describe('PopoverContainer', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(PopoverContainer)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,26 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: ({ props }: ThemeParams) => `relative rounded bg-gray-100 dark:bg-gray-700 overflow-hidden pointer-events-none ${props.thick ? 'h-1.5' : 'h-1'}`,
6
+
7
+ list: 'flex flex-col items-end w-full sm:w-[520px] px-4',
8
+
9
+ item: 'w-full flex items-center rounded-md px-4 py-3 bg-gray-800 dark:bg-gray-50 text-white dark:text-gray-900',
10
+ },
11
+
12
+ styles: ({ props, colors, css }: ThemeParams) => {
13
+ const color = colors.getPalette(props.color)
14
+ const vars = []
15
+
16
+ vars.push(css.variables({
17
+ bg: color[500],
18
+ }))
19
+
20
+ if (props.gradient) vars.push({
21
+ '--tw-gradient-stops': `${color[100]}, ${color[800]}`,
22
+ })
23
+
24
+ return vars
25
+ },
26
+ }
@@ -1,67 +1,43 @@
1
1
  <script lang="ts">
2
- import { computed, defineComponent, type PropType } from 'vue'
3
- import { useCSS } from '../../composables/css'
4
- import { useColors } from '../../composables/colors'
5
-
6
- // const validators = {
7
- // variant: ['bar','score'],
8
- // }
2
+ export default { name: 'XProgress' }
3
+ </script>
9
4
 
10
- export default defineComponent({
11
- name: 'XProgress',
5
+ <script setup lang="ts">
6
+ import { useColors } from '../../composables/colors'
7
+ import { useTheme } from '../../composables/theme'
12
8
 
13
- // validators,
9
+ import theme from './Progress.theme'
14
10
 
15
- props: {
16
- ...useColors.props('primary'),
17
- percentage: {
18
- type: Number,
19
- default: 0,
20
- validator: (value: number) => value >= 0 && value <= 100,
21
- },
22
- // variant: {
23
- // type: String as PropType<'bar' | 'score'>,
24
- // default: 'bar',
25
- // validator: (value: string) => validators.variant.includes(value),
26
- // },
27
- gradient: Boolean,
28
- animate: {
29
- type: Boolean,
30
- default: true,
31
- },
32
- thick: Boolean,
11
+ const props = defineProps({
12
+ ...useColors.props('primary'),
13
+ percentage: {
14
+ type: Number,
15
+ default: 0,
16
+ validator: (value: number) => value >= 0 && value <= 100,
33
17
  },
34
-
35
- setup(props) {
36
- const css = useCSS('progress')
37
- const colors = useColors()
38
- const style = computed(() => {
39
- const color = colors.getPalette(props.color)
40
- const vars = []
41
-
42
- vars.push(css.variables({
43
- bg: color[500],
44
- }))
45
-
46
- if (props.gradient) vars.push({
47
- '--tw-gradient-stops': `${color[100]}, ${color[800]}`,
48
- })
49
-
50
- return vars
51
- })
52
-
53
- return {
54
- style,
55
- }
18
+ // variant: {
19
+ // type: String as PropType<'bar' | 'score'>,
20
+ // default: 'bar',
21
+ // validator: (value: string) => validators.variant.includes(value),
22
+ // },
23
+ gradient: Boolean,
24
+ animate: {
25
+ type: Boolean,
26
+ default: true,
56
27
  },
28
+ thick: Boolean,
57
29
  })
30
+
31
+ const { styles, classes, className } = useTheme('progress', theme, props)
58
32
  </script>
59
33
 
60
34
  <template>
61
35
  <div
62
- class="relative rounded bg-gray-100 dark:bg-gray-700 overflow-hidden pointer-events-none"
63
- :class="[thick ? 'h-1.5' : 'h-1']"
64
- :style="style"
36
+ :style="styles"
37
+ :class="[
38
+ className,
39
+ classes.wrapper
40
+ ]"
65
41
  >
66
42
  <div
67
43
  class="h-full"
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Progress from '../Progress.vue'
4
+
5
+ describe('Progress', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Progress)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,121 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: 'inline-block relative cursor-pointer focus:outline-none group',
6
+
7
+ circle: ({ props }: ThemeParams) => {
8
+ let c = 'rounded-full flex justify-center items-center shrink-0 border-2 outline-offset-2 outline-slate-300 dark:outline-slate-500 group-focus:outline-1 group-focus:outline'
9
+
10
+ if (props.size === 'xs' || props.size === 'sm') c += ' h-4 w-4'
11
+ if (props.size === 'xl') c += ' h-6 w-6'
12
+ else c += ' h-5 w-5'
13
+
14
+ return c
15
+ },
16
+
17
+ circleIcon: ({ props, data }: ThemeParams) => {
18
+ const c = []
19
+
20
+ if (!data.selected) c.push('opacity-0')
21
+
22
+ if (props.size === 'sm' || props.size === 'xs') c.push('h-2')
23
+ else if (props.size === 'lg') c.push('h-2.5')
24
+ else if (props.size === 'xl') c.push('h-3')
25
+ else c.push('h-[0.6rem]')
26
+
27
+ return c
28
+ },
29
+
30
+ label: ({ props, data }: ThemeParams) => {
31
+ let c = 'font-medium text-gray-800 dark:text-gray-200 pl-2'
32
+
33
+ if (props.size === 'xs') c += ' text-xs'
34
+ else if (props.size === 'sm') c += ' text-sm'
35
+ else if (props.size === 'lg') c += ' text-lg'
36
+ else if (props.size === 'xl') c += ' text-xl'
37
+
38
+ return c
39
+ },
40
+
41
+ content: ({ props }: ThemeParams) => {
42
+ let c = 'pl-2'
43
+
44
+ if (props.size === 'xs') c += ' text-xs'
45
+ else if (props.size === 'sm') c += ' text-sm'
46
+ else if (props.size === 'lg') c += ' text-lg'
47
+ else if (props.size === 'xl') c += ' text-xl'
48
+
49
+ return c
50
+ },
51
+ },
52
+
53
+ styles: ({ props, colors, css, data }: ThemeParams) => {
54
+ const gray = colors.getPalette('gray')
55
+ const color = colors.getPalette(props.color)
56
+ const vars = []
57
+
58
+ if (props.loading) {
59
+ return css.variables({
60
+ bg: 'transparent',
61
+ border: 'transparent',
62
+ dark: {
63
+ bg: 'transparent',
64
+ border: 'transparent',
65
+ },
66
+ })
67
+ }
68
+
69
+ if (props.disabled) {
70
+ if (data.selected) {
71
+ vars.push(css.variables({
72
+ bg: 'transparent',
73
+ border: gray[200],
74
+ circle: gray[200],
75
+ dark: {
76
+ bg: 'transparent',
77
+ border: gray[700],
78
+ circle: gray[700],
79
+ },
80
+ }))
81
+ } else {
82
+ vars.push(css.variables({
83
+ bg: gray[200],
84
+ border: gray[200],
85
+ dark: {
86
+ bg: gray[700],
87
+ border: gray[700],
88
+ },
89
+ }))
90
+ }
91
+ } else {
92
+ if (data.selected) {
93
+ vars.push(css.variables({
94
+ bg: 'transparent',
95
+ border: color[500],
96
+ circle: color[500],
97
+ dark: {
98
+ bg: 'transparent',
99
+ border: color[500],
100
+ circle: color[500],
101
+ },
102
+ }))
103
+ } else {
104
+ vars.push(css.variables({
105
+ bg: '#fff',
106
+ border: props.glow ? color[300] : gray[300],
107
+ dark: {
108
+ bg: gray[900],
109
+ border: props.glow ? color[300] : gray[300],
110
+ },
111
+ }))
112
+ }
113
+
114
+ if (props.glow) {
115
+ vars.push(css.get('glow', colors.getColorOpacity(color[500], 0.5)))
116
+ }
117
+ }
118
+
119
+ return vars
120
+ },
121
+ }