webcoreui 0.2.0 → 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 (136) hide show
  1. package/README.md +12 -1
  2. package/astro.d.ts +15 -1
  3. package/astro.js +14 -0
  4. package/components/Accordion/Accordion.astro +2 -0
  5. package/components/Accordion/Accordion.svelte +2 -0
  6. package/components/Accordion/Accordion.tsx +2 -0
  7. package/components/Alert/Alert.astro +3 -2
  8. package/components/Alert/Alert.svelte +4 -3
  9. package/components/Alert/Alert.tsx +7 -3
  10. package/components/Avatar/Avatar.astro +2 -1
  11. package/components/Avatar/Avatar.svelte +2 -1
  12. package/components/Avatar/Avatar.tsx +3 -3
  13. package/components/Avatar/avatar.module.scss +2 -0
  14. package/components/Badge/Badge.astro +1 -0
  15. package/components/Badge/Badge.svelte +3 -2
  16. package/components/Badge/Badge.tsx +2 -1
  17. package/components/Button/Button.astro +4 -5
  18. package/components/Button/Button.svelte +2 -1
  19. package/components/Button/Button.tsx +2 -1
  20. package/components/Button/button.ts +1 -1
  21. package/components/Card/Card.astro +11 -3
  22. package/components/Card/Card.svelte +5 -2
  23. package/components/Card/Card.tsx +5 -2
  24. package/components/Card/card.ts +1 -0
  25. package/components/Checkbox/Checkbox.astro +1 -0
  26. package/components/Checkbox/Checkbox.svelte +7 -5
  27. package/components/Checkbox/Checkbox.tsx +4 -2
  28. package/components/Collapsible/Collapsible.astro +64 -0
  29. package/components/Collapsible/Collapsible.svelte +49 -0
  30. package/components/Collapsible/Collapsible.tsx +55 -0
  31. package/components/Collapsible/collapsible.module.scss +29 -0
  32. package/components/Collapsible/collapsible.ts +14 -0
  33. package/components/ConditionalWrapper/ConditionalWrapper.astro +2 -1
  34. package/components/ConditionalWrapper/ConditionalWrapper.tsx +1 -2
  35. package/components/Group/Group.astro +22 -0
  36. package/components/Group/Group.svelte +20 -0
  37. package/components/Group/Group.tsx +22 -0
  38. package/components/Group/group.module.scss +43 -0
  39. package/components/Group/group.ts +8 -0
  40. package/components/Icon/map.ts +2 -0
  41. package/components/Input/Input.astro +8 -1
  42. package/components/Input/Input.svelte +15 -3
  43. package/components/Input/Input.tsx +10 -3
  44. package/components/Input/input.module.scss +4 -1
  45. package/components/Input/input.ts +9 -4
  46. package/components/List/List.astro +169 -0
  47. package/components/List/List.svelte +147 -0
  48. package/components/List/List.tsx +168 -0
  49. package/components/List/list.module.scss +91 -0
  50. package/components/List/list.ts +37 -0
  51. package/components/Menu/Menu.astro +2 -1
  52. package/components/Menu/Menu.svelte +7 -5
  53. package/components/Menu/Menu.tsx +116 -113
  54. package/components/Modal/Modal.astro +6 -4
  55. package/components/Modal/Modal.svelte +8 -6
  56. package/components/Modal/Modal.tsx +79 -76
  57. package/components/Modal/modal.module.scss +1 -1
  58. package/components/Modal/modal.ts +1 -0
  59. package/components/Popover/Popover.astro +26 -0
  60. package/components/Popover/Popover.svelte +23 -0
  61. package/components/Popover/Popover.tsx +55 -0
  62. package/components/Popover/popover.module.scss +52 -0
  63. package/components/Popover/popover.ts +10 -0
  64. package/components/Progress/Progress.astro +2 -1
  65. package/components/Progress/Progress.svelte +2 -1
  66. package/components/Progress/Progress.tsx +3 -2
  67. package/components/Radio/Radio.astro +1 -0
  68. package/components/Radio/Radio.svelte +4 -2
  69. package/components/Radio/Radio.tsx +3 -2
  70. package/components/Rating/Rating.astro +3 -1
  71. package/components/Rating/Rating.svelte +9 -7
  72. package/components/Rating/Rating.tsx +4 -2
  73. package/components/Select/Select.astro +135 -0
  74. package/components/Select/Select.svelte +122 -0
  75. package/components/Select/Select.tsx +142 -0
  76. package/components/Select/select.module.scss +25 -0
  77. package/components/Select/select.ts +21 -0
  78. package/components/Sheet/Sheet.astro +30 -0
  79. package/components/Sheet/Sheet.svelte +25 -0
  80. package/components/Sheet/Sheet.tsx +33 -0
  81. package/components/Sheet/sheet.module.scss +68 -0
  82. package/components/Sheet/sheet.ts +10 -0
  83. package/components/Slider/Slider.astro +2 -1
  84. package/components/Slider/Slider.svelte +2 -1
  85. package/components/Slider/Slider.tsx +49 -48
  86. package/components/Spinner/Spinner.astro +4 -3
  87. package/components/Spinner/Spinner.svelte +3 -2
  88. package/components/Spinner/Spinner.tsx +4 -3
  89. package/components/Switch/Switch.astro +2 -1
  90. package/components/Switch/Switch.svelte +5 -4
  91. package/components/Switch/Switch.tsx +2 -2
  92. package/components/Switch/switch.module.scss +1 -1
  93. package/components/Table/Table.astro +1 -0
  94. package/components/Table/Table.svelte +2 -1
  95. package/components/Table/Table.tsx +2 -1
  96. package/components/Tabs/Tabs.astro +2 -1
  97. package/components/Tabs/Tabs.svelte +2 -1
  98. package/components/Tabs/Tabs.tsx +4 -3
  99. package/components/Textarea/Textarea.astro +45 -0
  100. package/components/Textarea/Textarea.svelte +47 -0
  101. package/components/Textarea/Textarea.tsx +52 -0
  102. package/components/Textarea/textarea.module.scss +36 -0
  103. package/components/Textarea/textarea.ts +18 -0
  104. package/components/ThemeSwitcher/ThemeSwitcher.astro +108 -107
  105. package/components/ThemeSwitcher/ThemeSwitcher.svelte +5 -4
  106. package/components/ThemeSwitcher/ThemeSwitcher.tsx +91 -90
  107. package/components/Timeline/Timeline.astro +3 -2
  108. package/components/Timeline/Timeline.svelte +3 -2
  109. package/components/Timeline/Timeline.tsx +3 -2
  110. package/components/TimelineItem/TimelineItem.svelte +2 -1
  111. package/components/TimelineItem/TimelineItem.tsx +2 -1
  112. package/components/Toast/Toast.astro +3 -1
  113. package/components/Toast/Toast.svelte +14 -7
  114. package/components/Toast/Toast.tsx +3 -1
  115. package/icons/moon.svg +1 -1
  116. package/icons/search.svg +3 -0
  117. package/icons.d.ts +1 -0
  118. package/icons.js +1 -0
  119. package/index.d.ts +99 -0
  120. package/index.js +2 -0
  121. package/package.json +23 -4
  122. package/react.d.ts +14 -0
  123. package/react.js +14 -0
  124. package/scss/config/mixins.scss +12 -10
  125. package/scss/config/variables.scss +1 -0
  126. package/scss/config.scss +1 -0
  127. package/scss/global/utility.scss +2 -0
  128. package/svelte.d.ts +15 -1
  129. package/svelte.js +14 -0
  130. package/utils/cookies.ts +4 -4
  131. package/utils/debounce.ts +24 -0
  132. package/utils/event.ts +2 -2
  133. package/utils/interpolate.ts +5 -5
  134. package/utils/modal.ts +90 -27
  135. package/utils/popover.ts +223 -0
  136. package/utils/toast.ts +6 -8
package/utils/modal.ts CHANGED
@@ -1,59 +1,122 @@
1
- export const modal = (element: string) => {
2
- const htmlElement = document.querySelector(element) as HTMLElement
1
+ type Callback = {
2
+ trigger: Element | null
3
+ modal: HTMLElement
4
+ }
5
+
6
+ type Modal = {
7
+ trigger: string
8
+ modal: string
9
+ onOpen?: (args: Callback) => unknown
10
+ onClose?: (args: Callback) => unknown
11
+ }
12
+
13
+ export const modal = (config: Modal | string) => {
14
+ const {
15
+ trigger,
16
+ modal,
17
+ onOpen,
18
+ onClose
19
+ } = (typeof config === 'string' ? {} : config) as Modal
20
+
21
+ const modalSelector = typeof config === 'string' ? config : modal
22
+
23
+ const triggerDOM = document.querySelector(trigger)
24
+ const modalDOM = document.querySelector(modalSelector) as HTMLElement
25
+
26
+ if (modalDOM) {
27
+ const closeOptions = modalDOM.dataset.close?.split(',')
3
28
 
4
- if (htmlElement) {
5
29
  const handleClose = {
6
- icon: () => {
7
- const close = htmlElement.querySelector('[data-id="close"]')
30
+ icon() {
31
+ const close = modalDOM.querySelector('[data-id="close"]')
8
32
 
9
33
  const listener = () => {
10
- htmlElement.dataset.show = ''
34
+ modalDOM.dataset.show = ''
11
35
 
12
- close?.removeEventListener('click', listener)
36
+ onClose?.({
37
+ trigger: triggerDOM,
38
+ modal: modalDOM
39
+ })
13
40
  }
14
41
 
15
- close?.addEventListener('click', listener)
42
+ return {
43
+ add: () => close?.addEventListener('click', listener),
44
+ remove: () => close?.removeEventListener('click', listener)
45
+ }
16
46
  },
17
-
18
- esc: () => {
47
+
48
+ esc() {
19
49
  const listener = (event: KeyboardEvent) => {
20
- if (event.key === 'Escape') {
21
- htmlElement.dataset.show = ''
50
+ if (modalDOM.dataset.show && event.key === 'Escape') {
51
+ modalDOM.dataset.show = ''
52
+
53
+ onClose?.({
54
+ trigger: triggerDOM,
55
+ modal: modalDOM
56
+ })
22
57
 
23
- document.removeEventListener('keydown', listener)
24
58
  }
25
59
  }
26
60
 
27
- document.addEventListener('keydown', listener)
61
+ return {
62
+ add: () => document.addEventListener('keydown', listener),
63
+ remove: () => document.removeEventListener('keydown', listener)
64
+ }
28
65
  },
29
-
30
- overlay: () => {
31
- const close = htmlElement.nextElementSibling
66
+
67
+ overlay() {
68
+ const close = modalDOM.nextElementSibling
32
69
 
33
70
  const listener = () => {
34
- htmlElement.dataset.show = ''
71
+ modalDOM.dataset.show = ''
35
72
 
36
- close?.removeEventListener('click', listener)
73
+ onClose?.({
74
+ trigger: triggerDOM,
75
+ modal: modalDOM
76
+ })
37
77
  }
38
78
 
39
- close?.addEventListener('click', listener)
79
+ return {
80
+ add: () => close?.addEventListener('click', listener),
81
+ remove: () => close?.removeEventListener('click', listener)
82
+ }
40
83
  }
41
84
  }
42
85
 
43
- const closeOptions = htmlElement.dataset.close?.split(',')
86
+ const handleOpen = () => {
87
+ modalDOM.dataset.show = 'true'
88
+
89
+ onOpen?.({
90
+ trigger: triggerDOM,
91
+ modal: modalDOM
92
+ })
93
+ }
44
94
 
45
- htmlElement.dataset.show = 'true'
95
+ triggerDOM?.addEventListener('click', handleOpen)
46
96
 
47
97
  closeOptions?.forEach(option => {
48
- handleClose[option as keyof typeof handleClose]()
98
+ handleClose[option as keyof typeof handleClose]().add()
49
99
  })
100
+
101
+ return {
102
+ open() {
103
+ handleOpen()
104
+ },
105
+ remove() {
106
+ triggerDOM?.removeEventListener('click', handleOpen)
107
+
108
+ closeOptions?.forEach(option => {
109
+ handleClose[option as keyof typeof handleClose]().remove()
110
+ })
111
+ }
112
+ }
50
113
  }
51
114
  }
52
115
 
53
- export const closeModal = (element: string) => {
54
- const htmlElement = document.querySelector(element) as HTMLElement
116
+ export const closeModal = (modal: string) => {
117
+ const modalDOM = document.querySelector(modal) as HTMLElement
55
118
 
56
- if (htmlElement) {
57
- htmlElement.dataset.show = ''
119
+ if (modalDOM) {
120
+ modalDOM.dataset.show = ''
58
121
  }
59
122
  }
@@ -0,0 +1,223 @@
1
+ import { debounce } from './debounce'
2
+ import { closeModal } from './modal'
3
+
4
+ export 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 Callback = {
18
+ trigger: HTMLElement
19
+ popover: HTMLElement
20
+ position: PopoverPosition | undefined
21
+ }
22
+
23
+ type Popover = {
24
+ trigger: string
25
+ popover: string
26
+ position?: PopoverPosition
27
+ offset?: number
28
+ closeOnBlur?: boolean
29
+ onOpen?: (args: Callback) => unknown
30
+ onClose?: (args: Callback) => unknown
31
+ }
32
+
33
+ export const popover = ({
34
+ trigger,
35
+ popover,
36
+ position,
37
+ offset = 10,
38
+ closeOnBlur = true,
39
+ onOpen,
40
+ onClose
41
+ }: Popover) => {
42
+ const triggerDOM = document.querySelector(trigger) as HTMLElement
43
+ const popoverDOM = document.querySelector(popover) as HTMLElement
44
+
45
+ if (triggerDOM && popoverDOM) {
46
+ document.body.appendChild(popoverDOM)
47
+
48
+ if (position) {
49
+ popoverDOM.dataset.position = position.split('-')[0]
50
+ }
51
+
52
+ const handleOpen = () => {
53
+ const triggerPosition = triggerDOM.getBoundingClientRect()
54
+ const popoverPosition = popoverDOM.getBoundingClientRect()
55
+
56
+ const topSide = triggerPosition.top
57
+ + window.scrollY
58
+ - popoverPosition.height
59
+ - offset
60
+
61
+ const bottomSide = triggerPosition.top
62
+ + window.scrollY
63
+ + triggerPosition.height
64
+ + offset
65
+
66
+ const leftSide = triggerPosition.left
67
+ - popoverPosition.width
68
+ - offset
69
+
70
+ const rightSide = triggerPosition.left
71
+ + triggerPosition.width
72
+ + offset
73
+
74
+ const hcenter = triggerPosition.left
75
+ - ((popoverPosition.width - triggerPosition.width) / 2)
76
+
77
+ const hEnd = triggerPosition.left
78
+ - (popoverPosition.width - triggerPosition.width)
79
+
80
+ const vcenter = triggerPosition.top
81
+ + window.scrollY
82
+ - ((popoverPosition.height - triggerPosition.height) / 2)
83
+
84
+ const vStart = triggerPosition.top + window.scrollY
85
+ const vEnd = triggerPosition.top
86
+ + window.scrollY
87
+ - (popoverPosition.height - triggerPosition.height)
88
+
89
+ const positions = {
90
+ 'top-start': {
91
+ top: topSide,
92
+ left: triggerPosition.left
93
+ },
94
+ 'top': {
95
+ top: topSide,
96
+ left: hcenter
97
+ },
98
+ 'top-end': {
99
+ top: topSide,
100
+ left: hEnd
101
+ },
102
+ 'left-start': {
103
+ top: vStart,
104
+ left: leftSide
105
+ },
106
+ 'left': {
107
+ top: vcenter,
108
+ left: leftSide
109
+ },
110
+ 'left-end': {
111
+ top: vEnd,
112
+ left: leftSide
113
+ },
114
+ 'right-start': {
115
+ top: vStart,
116
+ left: rightSide
117
+ },
118
+ 'right': {
119
+ top: vcenter,
120
+ left: rightSide
121
+ },
122
+ 'right-end': {
123
+ top: vEnd,
124
+ left: rightSide
125
+ },
126
+ 'bottom-start': {
127
+ top: bottomSide,
128
+ left: triggerPosition.left
129
+ },
130
+ 'bottom': {
131
+ top: bottomSide,
132
+ left: hcenter
133
+ },
134
+ 'bottom-end': {
135
+ top: bottomSide,
136
+ left: hEnd
137
+ }
138
+ }
139
+
140
+ const { top, left } = positions[position as keyof typeof positions] || positions.bottom
141
+
142
+ popoverDOM.style.top = `${top}px`
143
+ popoverDOM.style.left = `${left}px`
144
+
145
+ setTimeout(() => {
146
+ popoverDOM.dataset.show = popoverDOM.dataset.show === 'true'
147
+ ? ''
148
+ : 'true'
149
+ }, 0)
150
+
151
+ setTimeout(() => {
152
+ if (!popoverDOM.dataset.show) {
153
+ popoverDOM.removeAttribute('data-show')
154
+ }
155
+ }, 300)
156
+
157
+ onOpen?.({
158
+ trigger: triggerDOM,
159
+ popover: popoverDOM,
160
+ position
161
+ })
162
+ }
163
+
164
+ const handleClose = (event: MouseEvent) => {
165
+ const target = event.target as HTMLElement
166
+ const hidePopover = !popoverDOM.contains(target)
167
+ && !triggerDOM.contains(target)
168
+ && popoverDOM.dataset.show
169
+
170
+ if (hidePopover) {
171
+ popoverDOM.dataset.show = ''
172
+
173
+ onClose?.({
174
+ trigger: triggerDOM,
175
+ popover: popoverDOM,
176
+ position
177
+ })
178
+ }
179
+
180
+ setTimeout(() => {
181
+ if (!popoverDOM.dataset.show) {
182
+ popoverDOM.removeAttribute('data-show')
183
+ }
184
+ }, 300)
185
+ }
186
+
187
+ const removeOnResize = debounce(() => {
188
+ popoverDOM.dataset.show = ''
189
+
190
+ setTimeout(() => {
191
+ if (!popoverDOM.dataset.show) {
192
+ popoverDOM.removeAttribute('data-show')
193
+ }
194
+ }, 300)
195
+ })
196
+
197
+ const observer = new ResizeObserver(() => {
198
+ if (popoverDOM.dataset.show) {
199
+ removeOnResize()
200
+ }
201
+ })
202
+
203
+ triggerDOM.addEventListener('click', handleOpen)
204
+ observer.observe(document.body)
205
+
206
+ if (closeOnBlur) {
207
+ document.addEventListener('click', handleClose)
208
+ }
209
+
210
+ return {
211
+ remove() {
212
+ triggerDOM.removeEventListener('click', handleOpen)
213
+ observer.disconnect()
214
+
215
+ if (closeOnBlur) {
216
+ document.removeEventListener('click', handleClose)
217
+ }
218
+ }
219
+ }
220
+ }
221
+ }
222
+
223
+ 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
  }
@@ -41,13 +35,17 @@ export const toast = (config: Toast | string) => {
41
35
  if (title) {
42
36
  const titleElement = htmlElement.querySelector('[data-id="title"]')
43
37
 
44
- titleElement ? titleElement.innerHTML = title : null
38
+ if (titleElement) {
39
+ titleElement.innerHTML = title
40
+ }
45
41
  }
46
42
 
47
43
  if (content) {
48
44
  const contentElement = htmlElement.querySelector('[data-id="body"]')
49
45
 
50
- contentElement ? contentElement.innerHTML = content : null
46
+ if (contentElement) {
47
+ contentElement.innerHTML = content
48
+ }
51
49
  }
52
50
 
53
51
  setTimeout(() => {