webcoreui 0.2.0 → 0.3.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 (37) hide show
  1. package/README.md +8 -0
  2. package/astro.d.ts +8 -0
  3. package/astro.js +8 -0
  4. package/components/Alert/Alert.tsx +4 -1
  5. package/components/Avatar/avatar.module.scss +2 -0
  6. package/components/Collapsible/Collapsible.astro +63 -0
  7. package/components/Collapsible/Collapsible.svelte +48 -0
  8. package/components/Collapsible/Collapsible.tsx +54 -0
  9. package/components/Collapsible/collapsible.module.scss +29 -0
  10. package/components/Collapsible/collapsible.ts +14 -0
  11. package/components/Modal/modal.module.scss +1 -1
  12. package/components/Popover/Popover.astro +23 -0
  13. package/components/Popover/Popover.svelte +21 -0
  14. package/components/Popover/Popover.tsx +27 -0
  15. package/components/Popover/popover.module.scss +51 -0
  16. package/components/Popover/popover.ts +8 -0
  17. package/components/Sheet/Sheet.astro +29 -0
  18. package/components/Sheet/Sheet.svelte +24 -0
  19. package/components/Sheet/Sheet.tsx +32 -0
  20. package/components/Sheet/sheet.module.scss +68 -0
  21. package/components/Sheet/sheet.ts +10 -0
  22. package/components/Textarea/Textarea.astro +44 -0
  23. package/components/Textarea/Textarea.svelte +45 -0
  24. package/components/Textarea/Textarea.tsx +50 -0
  25. package/components/Textarea/textarea.module.scss +36 -0
  26. package/components/Textarea/textarea.ts +18 -0
  27. package/components/Toast/Toast.svelte +11 -6
  28. package/index.d.ts +69 -0
  29. package/index.js +2 -0
  30. package/package.json +2 -1
  31. package/react.d.ts +8 -0
  32. package/react.js +8 -0
  33. package/svelte.d.ts +8 -0
  34. package/svelte.js +8 -0
  35. package/utils/debounce.ts +24 -0
  36. package/utils/popover.ts +201 -0
  37. package/utils/toast.ts +0 -6
@@ -0,0 +1,201 @@
1
+ import { closeModal } from './modal'
2
+ import { debounce } from './debounce'
3
+
4
+ type PopoverPosition = 'top'
5
+ | 'top-start'
6
+ | 'top-end'
7
+ | 'left'
8
+ | 'left-start'
9
+ | 'left-end'
10
+ | 'right'
11
+ | 'right-start'
12
+ | 'right-end'
13
+ | 'bottom'
14
+ | 'bottom-start'
15
+ | 'bottom-end'
16
+
17
+ type Popover = {
18
+ trigger: string
19
+ popover: string
20
+ position?: PopoverPosition
21
+ offset?: number
22
+ closeOnBlur?: boolean
23
+ }
24
+
25
+ export const popover = ({
26
+ trigger,
27
+ popover,
28
+ position,
29
+ offset = 10,
30
+ closeOnBlur = true
31
+ }: Popover) => {
32
+ const triggerDOM = document.querySelector(trigger) as HTMLElement
33
+ const popoverDOM = document.querySelector(popover) as HTMLElement
34
+
35
+ if (triggerDOM && popover) {
36
+ document.body.appendChild(popoverDOM)
37
+
38
+ if (position) {
39
+ popoverDOM.dataset.position = position.split('-')[0]
40
+ }
41
+
42
+ const handleOpen = () => {
43
+ const triggerPosition = triggerDOM.getBoundingClientRect()
44
+ const popoverPosition = popoverDOM.getBoundingClientRect()
45
+
46
+ const topSide = triggerPosition.top
47
+ + window.scrollY
48
+ - popoverPosition.height
49
+ - offset
50
+
51
+ const bottomSide = triggerPosition.top
52
+ + window.scrollY
53
+ + triggerPosition.height
54
+ + offset
55
+
56
+ const leftSide = triggerPosition.left
57
+ - popoverPosition.width
58
+ - offset
59
+
60
+ const rightSide = triggerPosition.left
61
+ + triggerPosition.width
62
+ + offset
63
+
64
+ const hcenter = triggerPosition.left
65
+ - ((popoverPosition.width - triggerPosition.width) / 2)
66
+
67
+ const hEnd = triggerPosition.left
68
+ - (popoverPosition.width - triggerPosition.width)
69
+
70
+ const vcenter = triggerPosition.top
71
+ + window.scrollY
72
+ - ((popoverPosition.height - triggerPosition.height) / 2)
73
+
74
+ const vStart = triggerPosition.top + window.scrollY
75
+ const vEnd = triggerPosition.top
76
+ + window.scrollY
77
+ - (popoverPosition.height - triggerPosition.height)
78
+
79
+ const positions = {
80
+ 'top-start': {
81
+ top: topSide,
82
+ left: triggerPosition.left
83
+ },
84
+ 'top': {
85
+ top: topSide,
86
+ left: hcenter
87
+ },
88
+ 'top-end': {
89
+ top: topSide,
90
+ left: hEnd
91
+ },
92
+ 'left-start': {
93
+ top: vStart,
94
+ left: leftSide
95
+ },
96
+ 'left': {
97
+ top: vcenter,
98
+ left: leftSide
99
+ },
100
+ 'left-end': {
101
+ top: vEnd,
102
+ left: leftSide
103
+ },
104
+ 'right-start': {
105
+ top: vStart,
106
+ left: rightSide
107
+ },
108
+ 'right': {
109
+ top: vcenter,
110
+ left: rightSide
111
+ },
112
+ 'right-end': {
113
+ top: vEnd,
114
+ left: rightSide
115
+ },
116
+ 'bottom-start': {
117
+ top: bottomSide,
118
+ left: triggerPosition.left
119
+ },
120
+ 'bottom': {
121
+ top: bottomSide,
122
+ left: hcenter
123
+ },
124
+ 'bottom-end': {
125
+ top: bottomSide,
126
+ left: hEnd
127
+ }
128
+ }
129
+
130
+ const { top, left } = positions[position as keyof typeof positions] || positions.bottom
131
+
132
+ popoverDOM.style.top = `${top}px`
133
+ popoverDOM.style.left = `${left}px`
134
+
135
+ setTimeout(() => {
136
+ popoverDOM.dataset.show = popoverDOM.dataset.show === 'true'
137
+ ? ''
138
+ : 'true'
139
+ }, 0)
140
+
141
+ setTimeout(() => {
142
+ if (!popoverDOM.dataset.show) {
143
+ popoverDOM.removeAttribute('data-show')
144
+ }
145
+ }, 300)
146
+ }
147
+
148
+ const handleClose = (event: MouseEvent) => {
149
+ const target = event.target as HTMLElement
150
+ const hidePopover = !popoverDOM.contains(target)
151
+ && !triggerDOM.contains(target)
152
+ && popoverDOM.dataset.show
153
+
154
+ if (hidePopover) {
155
+ popoverDOM.dataset.show = ''
156
+ }
157
+
158
+ setTimeout(() => {
159
+ if (!popoverDOM.dataset.show) {
160
+ popoverDOM.removeAttribute('data-show')
161
+ }
162
+ }, 300)
163
+ }
164
+
165
+ const removeOnResize = debounce(() => {
166
+ popoverDOM.dataset.show = ''
167
+
168
+ setTimeout(() => {
169
+ if (!popoverDOM.dataset.show) {
170
+ popoverDOM.removeAttribute('data-show')
171
+ }
172
+ }, 300)
173
+ })
174
+
175
+ const observer = new ResizeObserver(() => {
176
+ if (popoverDOM.dataset.show) {
177
+ removeOnResize()
178
+ }
179
+ })
180
+
181
+ triggerDOM.addEventListener('click', handleOpen)
182
+ observer.observe(document.body)
183
+
184
+ if (closeOnBlur) {
185
+ document.addEventListener('click', handleClose)
186
+ }
187
+
188
+ return {
189
+ remove() {
190
+ triggerDOM.removeEventListener('click', handleOpen);
191
+ observer.disconnect()
192
+
193
+ if (closeOnBlur) {
194
+ document.removeEventListener('click', handleClose)
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+
201
+ export const closePopover = closeModal
package/utils/toast.ts CHANGED
@@ -6,7 +6,6 @@ type Toast = {
6
6
  timeout?: number
7
7
  title?: AlertProps['title']
8
8
  content?: string
9
- theme?: AlertProps['theme']
10
9
  position?: ToastProps['position']
11
10
  }
12
11
 
@@ -23,17 +22,12 @@ export const toast = (config: Toast | string) => {
23
22
  timeout,
24
23
  title,
25
24
  content,
26
- theme,
27
25
  position
28
26
  } = (typeof config === 'string' ? {} : config) as Toast
29
27
 
30
28
  const htmlElement = document.querySelector(element) as HTMLElement
31
29
 
32
30
  if (htmlElement) {
33
- if (theme) {
34
- htmlElement.dataset.theme = theme
35
- }
36
-
37
31
  if (position) {
38
32
  htmlElement.dataset.position = position
39
33
  }