webcoreui 1.4.0 → 1.5.0-beta.1

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 (262) hide show
  1. package/README.md +15 -1
  2. package/astro.d.ts +62 -56
  3. package/astro.js +4 -0
  4. package/components/Accordion/Accordion.astro +1 -1
  5. package/components/Accordion/Accordion.svelte +60 -58
  6. package/components/Accordion/Accordion.tsx +3 -1
  7. package/components/Alert/Alert.astro +2 -1
  8. package/components/Alert/Alert.svelte +12 -5
  9. package/components/Alert/Alert.tsx +10 -3
  10. package/components/Alert/alert.ts +2 -18
  11. package/components/AspectRatio/AspectRatio.astro +1 -1
  12. package/components/AspectRatio/AspectRatio.svelte +27 -22
  13. package/components/AspectRatio/AspectRatio.tsx +6 -3
  14. package/components/AspectRatio/aspectratio.ts +0 -10
  15. package/components/Avatar/Avatar.astro +1 -1
  16. package/components/Avatar/Avatar.svelte +7 -5
  17. package/components/Avatar/Avatar.tsx +3 -2
  18. package/components/Avatar/avatar.module.scss +3 -5
  19. package/components/Badge/Badge.astro +2 -1
  20. package/components/Badge/Badge.svelte +11 -4
  21. package/components/Badge/Badge.tsx +8 -3
  22. package/components/Badge/badge.module.scss +5 -6
  23. package/components/Badge/badge.ts +11 -13
  24. package/components/Banner/Banner.astro +1 -1
  25. package/components/Banner/Banner.svelte +11 -5
  26. package/components/Banner/Banner.tsx +6 -2
  27. package/components/Banner/banner.module.scss +4 -6
  28. package/components/Banner/banner.ts +0 -10
  29. package/components/BottomNavigation/BottomNavigation.astro +1 -1
  30. package/components/BottomNavigation/BottomNavigation.svelte +7 -4
  31. package/components/BottomNavigation/BottomNavigation.tsx +3 -2
  32. package/components/BottomNavigation/bottomnavigation.module.scss +68 -70
  33. package/components/Breadcrumb/Breadcrumb.astro +1 -1
  34. package/components/Breadcrumb/Breadcrumb.svelte +5 -3
  35. package/components/Breadcrumb/Breadcrumb.tsx +3 -1
  36. package/components/Button/Button.astro +2 -1
  37. package/components/Button/Button.svelte +11 -4
  38. package/components/Button/Button.tsx +7 -2
  39. package/components/Button/button.module.scss +9 -12
  40. package/components/Button/button.ts +23 -20
  41. package/components/Card/Card.astro +9 -2
  42. package/components/Card/Card.svelte +21 -8
  43. package/components/Card/Card.tsx +23 -6
  44. package/components/Card/card.module.scss +12 -9
  45. package/components/Card/card.ts +3 -16
  46. package/components/Carousel/Carousel.astro +3 -3
  47. package/components/Carousel/Carousel.svelte +24 -19
  48. package/components/Carousel/Carousel.tsx +9 -4
  49. package/components/Carousel/carousel.module.scss +3 -5
  50. package/components/Carousel/carousel.ts +0 -12
  51. package/components/CarouselItem/CarouselItem.astro +14 -0
  52. package/components/CarouselItem/CarouselItem.svelte +18 -0
  53. package/components/CarouselItem/CarouselItem.tsx +18 -0
  54. package/components/CarouselItem/carouselItem.ts +4 -0
  55. package/components/Checkbox/Checkbox.astro +3 -6
  56. package/components/Checkbox/Checkbox.svelte +13 -10
  57. package/components/Checkbox/Checkbox.tsx +8 -5
  58. package/components/Checkbox/checkbox.module.scss +4 -6
  59. package/components/Checkbox/checkbox.ts +2 -17
  60. package/components/Collapsible/Collapsible.astro +1 -1
  61. package/components/Collapsible/Collapsible.svelte +13 -6
  62. package/components/Collapsible/Collapsible.tsx +8 -2
  63. package/components/Collapsible/collapsible.module.scss +5 -5
  64. package/components/Collapsible/collapsible.ts +0 -15
  65. package/components/ConditionalWrapper/ConditionalWrapper.astro +1 -1
  66. package/components/ConditionalWrapper/ConditionalWrapper.svelte +8 -2
  67. package/components/ConditionalWrapper/ConditionalWrapper.tsx +7 -2
  68. package/components/ConditionalWrapper/conditionalwrapper.ts +2 -14
  69. package/components/ContextMenu/ContextMenu.astro +2 -1
  70. package/components/ContextMenu/ContextMenu.svelte +17 -9
  71. package/components/ContextMenu/ContextMenu.tsx +8 -2
  72. package/components/ContextMenu/contextmenu.ts +2 -17
  73. package/components/Copy/Copy.astro +2 -2
  74. package/components/Copy/Copy.svelte +10 -5
  75. package/components/Copy/Copy.tsx +7 -3
  76. package/components/Copy/copy.ts +2 -12
  77. package/components/Counter/Counter.astro +3 -2
  78. package/components/Counter/Counter.svelte +16 -10
  79. package/components/Counter/Counter.tsx +11 -7
  80. package/components/Counter/counter.module.scss +3 -5
  81. package/components/Counter/counter.ts +2 -11
  82. package/components/DataTable/DataTable.astro +1 -1
  83. package/components/DataTable/DataTable.svelte +23 -15
  84. package/components/DataTable/DataTable.tsx +7 -2
  85. package/components/DataTable/datatable.ts +0 -12
  86. package/components/Flex/Flex.astro +2 -1
  87. package/components/Flex/Flex.svelte +12 -6
  88. package/components/Flex/Flex.tsx +8 -3
  89. package/components/Flex/flex.ts +2 -15
  90. package/components/Footer/Footer.astro +1 -1
  91. package/components/Footer/Footer.svelte +13 -8
  92. package/components/Footer/Footer.tsx +6 -2
  93. package/components/Footer/footer.ts +0 -10
  94. package/components/Grid/Grid.astro +2 -1
  95. package/components/Grid/Grid.svelte +12 -6
  96. package/components/Grid/Grid.tsx +8 -3
  97. package/components/Grid/grid.ts +2 -15
  98. package/components/Group/Group.astro +1 -1
  99. package/components/Group/Group.svelte +9 -4
  100. package/components/Group/Group.tsx +6 -2
  101. package/components/Group/group.ts +0 -10
  102. package/components/Icon/Icon.astro +1 -1
  103. package/components/Icon/Icon.svelte +16 -9
  104. package/components/Icon/Icon.tsx +3 -2
  105. package/components/Image/Image.astro +2 -1
  106. package/components/Image/Image.svelte +54 -51
  107. package/components/Image/Image.tsx +3 -1
  108. package/components/Image/image.ts +2 -3
  109. package/components/ImageLoader/ImageLoader.astro +1 -1
  110. package/components/ImageLoader/ImageLoader.svelte +5 -3
  111. package/components/ImageLoader/ImageLoader.tsx +3 -1
  112. package/components/Input/Input.astro +3 -2
  113. package/components/Input/Input.svelte +19 -9
  114. package/components/Input/Input.tsx +11 -3
  115. package/components/Input/input.ts +26 -53
  116. package/components/Kbd/Kbd.astro +1 -1
  117. package/components/Kbd/Kbd.svelte +9 -4
  118. package/components/Kbd/Kbd.tsx +6 -2
  119. package/components/Kbd/kbd.ts +0 -10
  120. package/components/List/List.astro +1 -1
  121. package/components/List/List.svelte +13 -9
  122. package/components/List/List.tsx +10 -6
  123. package/components/List/list.ts +0 -8
  124. package/components/Masonry/Masonry.astro +1 -1
  125. package/components/Masonry/Masonry.svelte +14 -9
  126. package/components/Masonry/Masonry.tsx +7 -3
  127. package/components/Masonry/masonry.module.scss +4 -6
  128. package/components/Masonry/masonry.ts +2 -13
  129. package/components/Menu/Menu.astro +1 -1
  130. package/components/Menu/Menu.svelte +13 -7
  131. package/components/Menu/Menu.tsx +6 -2
  132. package/components/Menu/menu.ts +0 -10
  133. package/components/Modal/Modal.astro +2 -3
  134. package/components/Modal/Modal.svelte +12 -8
  135. package/components/Modal/Modal.tsx +6 -4
  136. package/components/Modal/modal.module.scss +5 -5
  137. package/components/Modal/modal.ts +2 -14
  138. package/components/OTPInput/OTPInput.astro +3 -5
  139. package/components/OTPInput/OTPInput.svelte +10 -10
  140. package/components/OTPInput/OTPInput.tsx +10 -8
  141. package/components/OTPInput/otpinput.module.scss +0 -12
  142. package/components/OTPInput/otpinput.ts +2 -4
  143. package/components/Pagination/Pagination.astro +1 -1
  144. package/components/Pagination/Pagination.svelte +8 -4
  145. package/components/Pagination/Pagination.tsx +6 -2
  146. package/components/Pagination/pagination.ts +0 -8
  147. package/components/Popover/Popover.astro +3 -7
  148. package/components/Popover/Popover.svelte +11 -10
  149. package/components/Popover/Popover.tsx +9 -12
  150. package/components/Popover/popover.ts +2 -15
  151. package/components/Progress/Progress.astro +1 -1
  152. package/components/Progress/Progress.svelte +8 -6
  153. package/components/Progress/Progress.tsx +3 -1
  154. package/components/Progress/progress.module.scss +15 -17
  155. package/components/Radio/Radio.astro +4 -4
  156. package/components/Radio/Radio.svelte +15 -8
  157. package/components/Radio/Radio.tsx +8 -5
  158. package/components/Radio/radio.module.scss +4 -6
  159. package/components/Radio/radio.ts +3 -14
  160. package/components/RangeSlider/RangeSlider.astro +5 -2
  161. package/components/RangeSlider/RangeSlider.svelte +20 -35
  162. package/components/RangeSlider/RangeSlider.tsx +11 -4
  163. package/components/RangeSlider/rangeslider.module.scss +14 -16
  164. package/components/RangeSlider/rangeslider.ts +1 -9
  165. package/components/Rating/Rating.astro +1 -1
  166. package/components/Rating/Rating.svelte +10 -7
  167. package/components/Rating/Rating.tsx +3 -1
  168. package/components/Rating/rating.module.scss +13 -15
  169. package/components/Ribbon/Ribbon.astro +1 -1
  170. package/components/Ribbon/Ribbon.svelte +9 -4
  171. package/components/Ribbon/Ribbon.tsx +6 -2
  172. package/components/Ribbon/ribbon.module.scss +9 -11
  173. package/components/Ribbon/ribbon.ts +0 -10
  174. package/components/Select/Select.astro +3 -1
  175. package/components/Select/Select.svelte +179 -171
  176. package/components/Select/Select.tsx +11 -4
  177. package/components/Select/select.ts +2 -12
  178. package/components/Sheet/Sheet.astro +2 -1
  179. package/components/Sheet/Sheet.svelte +7 -5
  180. package/components/Sheet/Sheet.tsx +5 -4
  181. package/components/Sheet/sheet.ts +3 -10
  182. package/components/Sidebar/Sidebar.astro +1 -1
  183. package/components/Sidebar/Sidebar.svelte +9 -4
  184. package/components/Sidebar/Sidebar.tsx +6 -2
  185. package/components/Sidebar/sidebar.ts +0 -10
  186. package/components/Skeleton/Skeleton.astro +1 -1
  187. package/components/Skeleton/Skeleton.svelte +7 -5
  188. package/components/Skeleton/Skeleton.tsx +3 -1
  189. package/components/Skeleton/skeleton.module.scss +6 -9
  190. package/components/Slider/Slider.astro +7 -5
  191. package/components/Slider/Slider.svelte +18 -10
  192. package/components/Slider/Slider.tsx +12 -6
  193. package/components/Slider/slider.module.scss +12 -14
  194. package/components/Slider/slider.ts +3 -12
  195. package/components/SpeedDial/SpeedDial.astro +1 -1
  196. package/components/SpeedDial/SpeedDial.svelte +6 -4
  197. package/components/SpeedDial/SpeedDial.tsx +4 -2
  198. package/components/SpeedDial/speeddial.module.scss +4 -6
  199. package/components/Spinner/Spinner.astro +1 -1
  200. package/components/Spinner/Spinner.svelte +7 -5
  201. package/components/Spinner/Spinner.tsx +3 -1
  202. package/components/Spinner/spinner.module.scss +13 -14
  203. package/components/Spoiler/Spoiler.astro +1 -1
  204. package/components/Spoiler/Spoiler.svelte +11 -5
  205. package/components/Spoiler/Spoiler.tsx +6 -2
  206. package/components/Spoiler/spoiler.module.scss +3 -5
  207. package/components/Spoiler/spoiler.ts +0 -10
  208. package/components/Stepper/Stepper.astro +1 -1
  209. package/components/Stepper/Stepper.svelte +7 -5
  210. package/components/Stepper/Stepper.tsx +3 -1
  211. package/components/Stepper/stepper.defaults.scss +5 -0
  212. package/components/Stepper/stepper.module.scss +11 -13
  213. package/components/Switch/Switch.astro +7 -2
  214. package/components/Switch/Switch.svelte +17 -8
  215. package/components/Switch/Switch.tsx +8 -4
  216. package/components/Switch/switch.module.scss +5 -7
  217. package/components/Switch/switch.ts +2 -16
  218. package/components/Tab/Tab.astro +25 -0
  219. package/components/Tab/Tab.svelte +28 -0
  220. package/components/Tab/Tab.tsx +30 -0
  221. package/components/Tab/tab.ts +6 -0
  222. package/components/Table/Table.astro +1 -1
  223. package/components/Table/Table.svelte +5 -3
  224. package/components/Table/Table.tsx +3 -1
  225. package/components/Tabs/Tabs.astro +58 -25
  226. package/components/Tabs/Tabs.svelte +47 -14
  227. package/components/Tabs/Tabs.tsx +42 -11
  228. package/components/Tabs/tabs.module.scss +7 -6
  229. package/components/Tabs/tabs.ts +0 -10
  230. package/components/Textarea/Textarea.astro +3 -6
  231. package/components/Textarea/Textarea.svelte +13 -10
  232. package/components/Textarea/Textarea.tsx +9 -7
  233. package/components/Textarea/textarea.ts +2 -17
  234. package/components/ThemeSwitcher/ThemeSwitcher.astro +1 -1
  235. package/components/ThemeSwitcher/ThemeSwitcher.svelte +14 -8
  236. package/components/ThemeSwitcher/ThemeSwitcher.tsx +7 -2
  237. package/components/ThemeSwitcher/themeswitcher.module.scss +10 -12
  238. package/components/ThemeSwitcher/themeswitcher.ts +0 -13
  239. package/components/Timeline/Timeline.astro +1 -1
  240. package/components/Timeline/Timeline.svelte +11 -6
  241. package/components/Timeline/Timeline.tsx +6 -2
  242. package/components/Timeline/timeline.module.scss +6 -8
  243. package/components/Timeline/timeline.ts +0 -10
  244. package/components/TimelineItem/TimelineItem.astro +1 -1
  245. package/components/TimelineItem/TimelineItem.svelte +9 -4
  246. package/components/TimelineItem/TimelineItem.tsx +8 -3
  247. package/components/TimelineItem/timelineitem.module.scss +4 -4
  248. package/components/TimelineItem/timelineitem.ts +0 -12
  249. package/components/Toast/Toast.astro +2 -1
  250. package/components/Toast/Toast.svelte +9 -7
  251. package/components/Toast/Toast.tsx +5 -4
  252. package/components/Toast/toast.ts +3 -11
  253. package/package.json +19 -19
  254. package/react.d.ts +145 -138
  255. package/react.js +4 -0
  256. package/scss/config/functions.scss +41 -0
  257. package/scss/config/mixins.scss +65 -0
  258. package/scss/config.scss +1 -0
  259. package/scss/global/theme.scss +209 -194
  260. package/scss/setup.scss +6 -3
  261. package/svelte.d.ts +145 -138
  262. package/svelte.js +4 -0
@@ -1,172 +1,180 @@
1
- <script lang="ts">
2
- import { onMount } from 'svelte'
3
- import type { SvelteSelectProps } from './select'
4
-
5
- import Input from '../Input/Input.svelte'
6
- import List from '../List/List.svelte'
7
- import Modal from '../Modal/Modal.svelte'
8
- import Popover from '../Popover/Popover.svelte'
9
-
10
- import { classNames } from '../../utils/classNames'
11
- import { debounce } from '../../utils/debounce'
12
- import { on } from '../../utils/DOMUtils'
13
- import { modal } from '../../utils/modal'
14
- import { closePopover, popover, type PopoverPosition } from '../../utils/popover'
15
-
16
- import ChevronDown from '../../icons/chevron-down.svg?raw'
17
-
18
- import styles from './select.module.scss'
19
-
20
- import type { ListEventType, ListProps } from '../List/list'
21
-
22
- const {
23
- name,
24
- value,
25
- placeholder,
26
- label,
27
- subText,
28
- disabled,
29
- updateValue = true,
30
- position = 'bottom',
31
- className,
32
- onChange,
33
- onClose,
34
- ...rest
35
- }: SvelteSelectProps = $props()
36
-
37
- let popoverInstance: any
38
- let val: string | undefined = $state('')
39
- let focusByTab = false
40
-
41
- const classes = classNames([
42
- styles.select,
43
- disabled && styles.disabled,
44
- className
45
- ])
46
-
47
- const popoverClasses = classNames([
48
- `w-options-${name}`,
49
- styles.popover
50
- ])
51
-
52
- const inferredValue = rest.itemGroups
53
- .map((group: ListProps['itemGroups'][0]) => group.items)
54
- .flat()
55
- .find((item: ListProps['itemGroups'][0]['items'][0]) => item.value === value)?.name
56
-
57
- val = (value && inferredValue) ? inferredValue : value
58
-
59
- const inputRestProps = Object.fromEntries(
60
- Object.entries(rest).filter(([key]) => key.includes('data'))
61
- )
62
-
63
- const select = (event: ListEventType) => {
64
- closePopover(`.w-options-${name}`)
65
-
66
- if (updateValue) {
67
- val = event.name
68
- }
69
-
70
- onChange?.({
71
- ...event,
72
- select: name
73
- })
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte'
3
+ import type { SelectEventType, SelectProps } from './select'
4
+
5
+ import Input from '../Input/Input.svelte'
6
+ import List from '../List/List.svelte'
7
+ import Modal from '../Modal/Modal.svelte'
8
+ import Popover from '../Popover/Popover.svelte'
9
+
10
+ import { classNames } from '../../utils/classNames'
11
+ import { debounce } from '../../utils/debounce'
12
+ import { on } from '../../utils/DOMUtils'
13
+ import { modal, type ModalCallback } from '../../utils/modal'
14
+ import { closePopover, popover, type PopoverCallback, type PopoverPosition } from '../../utils/popover'
15
+
16
+ import ChevronDown from '../../icons/chevron-down.svg?raw'
17
+
18
+ import styles from './select.module.scss'
19
+
20
+ import type { ListEventType, ListProps } from '../List/list'
21
+
22
+ export type Props = SelectProps & {
23
+ onChange?: (event: SelectEventType) => void
24
+ onClose?: (event: ModalCallback | PopoverCallback) => void
74
25
  }
75
-
76
- onMount(() => {
77
- let observer: ResizeObserver | undefined
78
-
79
- on(document, 'keydown', (event: KeyboardEvent) => {
80
- if (event.key === 'Tab') {
81
- focusByTab = true
82
- }
83
- })
84
-
85
- on(document, 'mousedown', () => focusByTab = false)
86
-
87
- if (position === 'modal') {
88
- modal({
89
- trigger: `.w-select-${name}`,
90
- modal: `.w-options-${name}`,
91
- onOpen: ({ modal }) => {
92
- const search = modal.querySelector('input')
93
-
94
- if (search) {
95
- search.focus()
96
- }
97
- },
98
- onClose(event) {
99
- onClose?.(event)
100
- }
101
- })
102
- } else {
103
- const resize = debounce(() => {
104
- const selectElement = document.querySelector(`.w-select-${name}`) as HTMLInputElement
105
-
106
- if (selectElement) {
107
- const { width } = selectElement.getBoundingClientRect()
108
- const dialogElement = document.querySelector(`.w-options-${name}`) as HTMLDialogElement
109
-
110
- dialogElement.style.width = `${width}px`
111
- }
112
- })
113
-
114
- observer = new ResizeObserver(() => resize())
115
- observer.observe(document.body)
116
-
117
- popoverInstance = popover({
118
- trigger: `.w-select-${name}`,
119
- popover: `.w-options-${name}`,
120
- position: position as PopoverPosition,
121
- onOpen({ popover }) {
122
- const search = popover.querySelector('input')
123
-
124
- if (search) {
125
- search.focus()
126
- }
127
- },
128
- onClose(event) {
129
- onClose?.(event)
130
- }
131
- })
132
- }
133
-
134
- on(`.w-select-${name}`, 'focus', (event: Event) => {
135
- if (focusByTab) {
136
- (event.currentTarget as HTMLInputElement).click()
137
- }
138
- })
139
-
140
- return () => {
141
- popoverInstance?.remove()
142
- observer?.unobserve(document.body)
143
- }
144
- })
145
- </script>
146
-
147
- <Input
148
- type="text"
149
- value={val}
150
- readonly={true}
151
- disabled={disabled}
152
- placeholder={placeholder}
153
- label={label}
154
- subText={subText}
155
- className={`w-select-${name}`}
156
- labelClassName={classes}
157
- {...inputRestProps}
158
- >
159
- {@html ChevronDown}
160
- </Input>
161
- {#if position === 'modal'}
162
- <Modal
163
- className={popoverClasses}
164
- showCloseIcon={false}
165
- >
166
- <List onSelect={select} {...rest} />
167
- </Modal>
168
- {:else}
169
- <Popover className={popoverClasses}>
170
- <List onSelect={select} {...rest} />
171
- </Popover>
172
- {/if}
26
+
27
+ const {
28
+ name,
29
+ value,
30
+ placeholder,
31
+ label,
32
+ subText,
33
+ disabled,
34
+ required,
35
+ updateValue = true,
36
+ position = 'bottom',
37
+ className,
38
+ onChange,
39
+ onClose,
40
+ ...rest
41
+ }: Props = $props()
42
+
43
+ let popoverInstance: any
44
+ let focusByTab = false
45
+
46
+ const classes = $derived(classNames([
47
+ styles.select,
48
+ disabled && styles.disabled,
49
+ className
50
+ ]))
51
+
52
+ const popoverClasses = $derived(classNames([
53
+ `w-options-${name}`,
54
+ styles.popover
55
+ ]))
56
+
57
+ const inferredValue = $derived(rest.itemGroups
58
+ .map((group: ListProps['itemGroups'][0]) => group.items)
59
+ .flat()
60
+ .find((item: ListProps['itemGroups'][0]['items'][0]) => item.value === value)?.name)
61
+
62
+ let val = $derived((value && inferredValue) ? inferredValue : value)
63
+
64
+ const inputRestProps = $derived(
65
+ Object.fromEntries(
66
+ Object.entries(rest).filter(([key]) => key.includes('data'))
67
+ )
68
+ )
69
+
70
+ const select = (event: ListEventType) => {
71
+ closePopover(`.w-options-${name}`)
72
+
73
+ if (updateValue) {
74
+ val = event.name
75
+ }
76
+
77
+ onChange?.({
78
+ ...event,
79
+ select: name
80
+ })
81
+ }
82
+
83
+ onMount(() => {
84
+ let observer: ResizeObserver | undefined
85
+
86
+ on(document, 'keydown', (event: KeyboardEvent) => {
87
+ if (event.key === 'Tab') {
88
+ focusByTab = true
89
+ }
90
+ })
91
+
92
+ on(document, 'mousedown', () => focusByTab = false)
93
+
94
+ if (position === 'modal') {
95
+ modal({
96
+ trigger: `.w-select-${name}`,
97
+ modal: `.w-options-${name}`,
98
+ onOpen: ({ modal }) => {
99
+ const search = modal.querySelector('input')
100
+
101
+ if (search) {
102
+ search.focus()
103
+ }
104
+ },
105
+ onClose(event) {
106
+ onClose?.(event)
107
+ }
108
+ })
109
+ } else {
110
+ const resize = debounce(() => {
111
+ const selectElement = document.querySelector(`.w-select-${name}`) as HTMLInputElement
112
+
113
+ if (selectElement) {
114
+ const { width } = selectElement.getBoundingClientRect()
115
+ const dialogElement = document.querySelector(`.w-options-${name}`) as HTMLDialogElement
116
+
117
+ dialogElement.style.width = `${width}px`
118
+ }
119
+ })
120
+
121
+ observer = new ResizeObserver(() => resize())
122
+ observer.observe(document.body)
123
+
124
+ popoverInstance = popover({
125
+ trigger: `.w-select-${name}`,
126
+ popover: `.w-options-${name}`,
127
+ position: position as PopoverPosition,
128
+ onOpen({ popover }) {
129
+ const search = popover.querySelector('input')
130
+
131
+ if (search) {
132
+ search.focus()
133
+ }
134
+ },
135
+ onClose(event) {
136
+ onClose?.(event)
137
+ }
138
+ })
139
+ }
140
+
141
+ on(`.w-select-${name}`, 'focus', (event: Event) => {
142
+ if (focusByTab) {
143
+ (event.currentTarget as HTMLInputElement).click()
144
+ }
145
+ })
146
+
147
+ return () => {
148
+ popoverInstance?.remove()
149
+ observer?.unobserve(document.body)
150
+ }
151
+ })
152
+ </script>
153
+
154
+ <Input
155
+ type="text"
156
+ value={val}
157
+ readonly={true}
158
+ disabled={disabled}
159
+ required={required}
160
+ placeholder={placeholder}
161
+ label={label}
162
+ subText={subText}
163
+ className={`w-select-${name}`}
164
+ labelClassName={classes}
165
+ {...inputRestProps}
166
+ >
167
+ {@html ChevronDown}
168
+ </Input>
169
+ {#if position === 'modal'}
170
+ <Modal
171
+ className={popoverClasses}
172
+ showCloseIcon={false}
173
+ >
174
+ <List onSelect={select} {...rest} />
175
+ </Modal>
176
+ {:else}
177
+ <Popover className={popoverClasses}>
178
+ <List onSelect={select} {...rest} />
179
+ </Popover>
180
+ {/if}
@@ -1,5 +1,5 @@
1
1
  import React, { useEffect,useState } from 'react'
2
- import type { ReactSelectProps } from './select'
2
+ import type { SelectEventType, SelectProps } from './select'
3
3
 
4
4
  import Input from '../Input/Input.tsx'
5
5
  import List from '../List/List.tsx'
@@ -9,8 +9,8 @@ import Popover from '../Popover/Popover.tsx'
9
9
  import { classNames } from '../../utils/classNames'
10
10
  import { debounce } from '../../utils/debounce'
11
11
  import { on } from '../../utils/DOMUtils'
12
- import { modal } from '../../utils/modal'
13
- import { closePopover, popover, type PopoverPosition } from '../../utils/popover'
12
+ import { modal, type ModalCallback } from '../../utils/modal'
13
+ import { closePopover, popover, type PopoverCallback, type PopoverPosition } from '../../utils/popover'
14
14
 
15
15
  import ChevronDown from '../../icons/chevron-down.svg?raw'
16
16
 
@@ -18,6 +18,11 @@ import styles from './select.module.scss'
18
18
 
19
19
  import type { ListEventType } from '../List/list'
20
20
 
21
+ export type Props = SelectProps & {
22
+ onChange?: (event: SelectEventType) => void
23
+ onClose?: (event: ModalCallback | PopoverCallback) => void
24
+ }
25
+
21
26
  const Select = ({
22
27
  name,
23
28
  value,
@@ -25,13 +30,14 @@ const Select = ({
25
30
  label,
26
31
  subText,
27
32
  disabled,
33
+ required,
28
34
  updateValue = true,
29
35
  position = 'bottom',
30
36
  className,
31
37
  onChange,
32
38
  onClose,
33
39
  ...rest
34
- }: ReactSelectProps) => {
40
+ }: Props) => {
35
41
  const inferredValue = rest.itemGroups.map(group => group.items)
36
42
  .flat()
37
43
  .find(item => item.value === value)?.name
@@ -147,6 +153,7 @@ const Select = ({
147
153
  value={val}
148
154
  readOnly={true}
149
155
  disabled={disabled}
156
+ required={required}
150
157
  placeholder={placeholder}
151
158
  label={label}
152
159
  subText={subText}
@@ -1,5 +1,4 @@
1
- import type { ModalCallback } from '../../utils/modal'
2
- import type { PopoverCallback, PopoverPosition } from '../../utils/popover'
1
+ import type { PopoverPosition } from '../../utils/popover'
3
2
 
4
3
  import type { ListEventType, ListProps } from '../List/list'
5
4
 
@@ -14,16 +13,7 @@ export type SelectProps = {
14
13
  label?: string
15
14
  subText?: string
16
15
  disabled?: boolean
16
+ required?: boolean
17
17
  updateValue?: boolean
18
18
  position?: PopoverPosition | 'modal'
19
19
  } & ListProps
20
-
21
- export type SvelteSelectProps = {
22
- onChange?: (event: SelectEventType) => void
23
- onClose?: (event: ModalCallback | PopoverCallback) => void
24
- } & SelectProps
25
-
26
- export type ReactSelectProps = {
27
- onChange?: (event: SelectEventType) => void
28
- onClose?: (event: ModalCallback | PopoverCallback) => void
29
- } & SelectProps
@@ -1,4 +1,5 @@
1
1
  ---
2
+ import type { HTMLAttributes } from 'astro/types'
2
3
  import type { SheetProps } from './sheet'
3
4
 
4
5
  import Modal from '../Modal/Modal.astro'
@@ -7,7 +8,7 @@ import { classNames } from '../../utils/classNames'
7
8
 
8
9
  import styles from './sheet.module.scss'
9
10
 
10
- interface Props extends SheetProps {}
11
+ export type Props = SheetProps<HTMLAttributes<'dialog'>>
11
12
 
12
13
  const {
13
14
  position,
@@ -1,24 +1,26 @@
1
1
  <script lang="ts">
2
- import type { SvelteSheetProps } from './sheet'
2
+ import type { SheetProps } from './sheet'
3
3
 
4
- import Modal from '../Modal/Modal.svelte'
4
+ import Modal, { type Props as ModalProps } from '../Modal/Modal.svelte'
5
5
 
6
6
  import { classNames } from '../../utils/classNames'
7
7
 
8
8
  import styles from './sheet.module.scss'
9
9
 
10
+ export type Props = SheetProps & ModalProps
11
+
10
12
  const {
11
13
  position,
12
14
  className,
13
15
  children,
14
16
  ...rest
15
- }: SvelteSheetProps = $props()
17
+ }: Props = $props()
16
18
 
17
- const classes = classNames([
19
+ const classes = $derived(classNames([
18
20
  styles.sheet,
19
21
  position && styles[position],
20
22
  className
21
- ])
23
+ ]))
22
24
  </script>
23
25
 
24
26
  <Modal
@@ -1,18 +1,19 @@
1
- import React from 'react'
2
- import type { ReactSheetProps } from './sheet'
1
+ import type { SheetProps } from './sheet'
3
2
 
4
- import Modal from '../Modal/Modal.tsx'
3
+ import Modal, { type Props as ModalProps } from '../Modal/Modal.tsx'
5
4
 
6
5
  import { classNames } from '../../utils/classNames'
7
6
 
8
7
  import styles from './sheet.module.scss'
9
8
 
9
+ export type Props = SheetProps & ModalProps
10
+
10
11
  const Sheet = ({
11
12
  position,
12
13
  className,
13
14
  children,
14
15
  ...rest
15
- }: ReactSheetProps) => {
16
+ }: Props) => {
16
17
  const classes = classNames([
17
18
  styles.sheet,
18
19
  position && styles[position],
@@ -1,14 +1,7 @@
1
- import type {
2
- ModalProps,
3
- ReactModalProps,
4
- SvelteModalProps
5
- } from '../Modal/modal'
1
+ import type { ModalProps } from '../Modal/modal'
6
2
 
7
- export type SheetProps = {
3
+ export type SheetProps<T extends object = object> = {
8
4
  position?: 'left'
9
5
  | 'top'
10
6
  | 'bottom'
11
- } & ModalProps
12
-
13
- export type SvelteSheetProps = SheetProps & SvelteModalProps
14
- export type ReactSheetProps = SheetProps & ReactModalProps
7
+ } & ModalProps<T>
@@ -6,7 +6,7 @@ import Icon from '../Icon/Icon.astro'
6
6
 
7
7
  import styles from './sidebar.module.scss'
8
8
 
9
- interface Props extends SidebarProps {}
9
+ export type Props = SidebarProps
10
10
 
11
11
  const {
12
12
  groups,
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
- import type { SvelteSidebarProps } from './sidebar'
2
+ import type { Snippet } from 'svelte'
3
+ import type { SidebarProps } from './sidebar'
3
4
 
4
5
  import Badge from '../Badge/Badge.svelte'
5
6
 
@@ -7,16 +8,20 @@
7
8
 
8
9
  import styles from './sidebar.module.scss'
9
10
 
11
+ export type Props = SidebarProps & {
12
+ children?: Snippet
13
+ }
14
+
10
15
  const {
11
16
  groups,
12
17
  children,
13
18
  className
14
- }: SvelteSidebarProps = $props()
19
+ }: Props = $props()
15
20
 
16
- const classes = classNames([
21
+ const classes = $derived(classNames([
17
22
  styles.sidebar,
18
23
  className
19
- ])
24
+ ]))
20
25
  </script>
21
26
 
22
27
  <aside class={classes}>
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import type { ReactSidebarProps } from './sidebar'
2
+ import type { SidebarProps } from './sidebar'
3
3
 
4
4
  import Badge from '../Badge/Badge.tsx'
5
5
 
@@ -7,11 +7,15 @@ import { classNames } from '../../utils/classNames'
7
7
 
8
8
  import styles from './sidebar.module.scss'
9
9
 
10
+ export type Props = SidebarProps & {
11
+ children?: React.ReactNode
12
+ }
13
+
10
14
  const Sidebar = ({
11
15
  groups,
12
16
  children,
13
17
  className
14
- }: ReactSidebarProps) => {
18
+ }: Props) => {
15
19
  const classes = classNames([
16
20
  styles.sidebar,
17
21
  className
@@ -1,5 +1,3 @@
1
- import type { Snippet } from 'svelte'
2
-
3
1
  import type { ButtonProps } from '../Button/button'
4
2
 
5
3
  export type SidebarProps = {
@@ -17,11 +15,3 @@ export type SidebarProps = {
17
15
  }[]
18
16
  className?: string
19
17
  }
20
-
21
- export type SvelteSidebarProps = {
22
- children?: Snippet
23
- } & SidebarProps
24
-
25
- export type ReactSidebarProps = {
26
- children?: React.ReactNode
27
- } & SidebarProps
@@ -5,7 +5,7 @@ import { classNames } from '../../utils/classNames'
5
5
 
6
6
  import styles from './skeleton.module.scss'
7
7
 
8
- interface Props extends SkeletonProps {}
8
+ export type Props = SkeletonProps
9
9
 
10
10
  const {
11
11
  animate = 'wave',
@@ -5,6 +5,8 @@
5
5
 
6
6
  import styles from './skeleton.module.scss'
7
7
 
8
+ export type Props = SkeletonProps
9
+
8
10
  const {
9
11
  animate = 'wave',
10
12
  type = 'rounded',
@@ -13,21 +15,21 @@
13
15
  color,
14
16
  waveColor,
15
17
  className
16
- }: SkeletonProps = $props()
18
+ }: Props = $props()
17
19
 
18
- const classes = classNames([
20
+ const classes = $derived(classNames([
19
21
  animate && styles[animate],
20
22
  styles[type!],
21
23
  styles.skeleton,
22
24
  className
23
- ])
25
+ ]))
24
26
 
25
- const styleVariables = classNames([
27
+ const styleVariables = $derived(classNames([
26
28
  width && `max-width: ${width}px;`,
27
29
  height && `max-height: ${height}px;`,
28
30
  color && `--w-skeleton-color: ${color};`,
29
31
  waveColor && `--w-skeleton-wave-color: ${waveColor};`
30
- ])
32
+ ]))
31
33
  </script>
32
34
 
33
35
  <div class={classes} style={styleVariables}>&nbsp;</div>
@@ -5,6 +5,8 @@ import { classNames } from '../../utils/classNames'
5
5
 
6
6
  import styles from './skeleton.module.scss'
7
7
 
8
+ export type Props = SkeletonProps
9
+
8
10
  const Skeleton = ({
9
11
  animate = 'wave',
10
12
  type = 'rounded',
@@ -13,7 +15,7 @@ const Skeleton = ({
13
15
  color,
14
16
  waveColor,
15
17
  className
16
- }: SkeletonProps) => {
18
+ }: Props) => {
17
19
  const classes = classNames([
18
20
  animate && styles[animate],
19
21
  styles[type],