webcoreui 0.9.0 → 0.10.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 (138) hide show
  1. package/README.md +20 -6
  2. package/components/Accordion/Accordion.astro +15 -10
  3. package/components/Accordion/Accordion.svelte +14 -12
  4. package/components/Accordion/Accordion.tsx +2 -2
  5. package/components/Alert/Alert.svelte +17 -12
  6. package/components/Alert/Alert.tsx +1 -1
  7. package/components/Alert/alert.ts +10 -3
  8. package/components/AspectRatio/AspectRatio.svelte +7 -4
  9. package/components/AspectRatio/aspectratio.ts +6 -0
  10. package/components/Avatar/Avatar.svelte +11 -9
  11. package/components/Badge/Badge.svelte +14 -10
  12. package/components/Badge/badge.ts +2 -1
  13. package/components/Banner/Banner.astro +10 -4
  14. package/components/Banner/Banner.svelte +14 -10
  15. package/components/Banner/Banner.tsx +1 -0
  16. package/components/Banner/banner.ts +6 -0
  17. package/components/BottomNavigation/BottomNavigation.svelte +7 -5
  18. package/components/Breadcrumb/Breadcrumb.astro +1 -1
  19. package/components/Breadcrumb/Breadcrumb.svelte +8 -6
  20. package/components/Breadcrumb/Breadcrumb.tsx +2 -2
  21. package/components/Button/Button.svelte +12 -8
  22. package/components/Button/Button.tsx +2 -2
  23. package/components/Button/button.ts +2 -3
  24. package/components/Card/Card.svelte +14 -10
  25. package/components/Card/card.ts +6 -0
  26. package/components/Carousel/Carousel.astro +46 -41
  27. package/components/Carousel/carousel.ts +3 -0
  28. package/components/Checkbox/Checkbox.svelte +12 -9
  29. package/components/Checkbox/checkbox.module.scss +4 -0
  30. package/components/Collapsible/Collapsible.astro +8 -5
  31. package/components/Collapsible/Collapsible.svelte +54 -49
  32. package/components/Collapsible/collapsible.ts +8 -0
  33. package/components/ConditionalWrapper/ConditionalWrapper.svelte +10 -6
  34. package/components/ConditionalWrapper/conditionalwrapper.ts +6 -0
  35. package/components/Copy/Copy.astro +17 -11
  36. package/components/Copy/Copy.svelte +68 -61
  37. package/components/Copy/Copy.tsx +1 -0
  38. package/components/Copy/copy.ts +8 -2
  39. package/components/DataTable/DataTable.astro +103 -93
  40. package/components/DataTable/DataTable.svelte +276 -272
  41. package/components/DataTable/datatable.ts +5 -2
  42. package/components/Flex/Flex.svelte +14 -10
  43. package/components/Flex/flex.ts +6 -0
  44. package/components/Footer/Footer.svelte +12 -9
  45. package/components/Footer/footer.ts +6 -0
  46. package/components/Grid/Grid.svelte +12 -8
  47. package/components/Grid/grid.ts +6 -0
  48. package/components/Group/Group.svelte +7 -4
  49. package/components/Group/group.ts +6 -0
  50. package/components/Icon/Icon.astro +19 -5
  51. package/components/Icon/Icon.svelte +23 -7
  52. package/components/Icon/Icon.tsx +19 -5
  53. package/components/Icon/icon.ts +9 -3
  54. package/components/Icon/map.ts +8 -10
  55. package/components/Input/Input.svelte +24 -20
  56. package/components/Input/input.ts +10 -3
  57. package/components/Kbd/Kbd.svelte +7 -4
  58. package/components/Kbd/kbd.ts +6 -0
  59. package/components/List/List.astro +65 -60
  60. package/components/List/List.svelte +149 -147
  61. package/components/List/List.tsx +1 -1
  62. package/components/Masonry/Masonry.svelte +12 -10
  63. package/components/Menu/Menu.astro +8 -3
  64. package/components/Menu/Menu.svelte +15 -10
  65. package/components/Menu/Menu.tsx +3 -1
  66. package/components/Menu/menu.ts +6 -0
  67. package/components/Modal/Modal.astro +1 -0
  68. package/components/Modal/Modal.svelte +18 -13
  69. package/components/Modal/Modal.tsx +2 -1
  70. package/components/Modal/modal.ts +6 -1
  71. package/components/Pagination/Pagination.astro +75 -69
  72. package/components/Pagination/Pagination.svelte +29 -26
  73. package/components/Pagination/Pagination.tsx +5 -4
  74. package/components/Pagination/pagination.module.scss +4 -0
  75. package/components/Popover/Popover.svelte +10 -6
  76. package/components/Popover/popover.ts +6 -0
  77. package/components/Progress/Progress.svelte +12 -10
  78. package/components/Progress/progress.ts +1 -1
  79. package/components/Radio/Radio.svelte +12 -9
  80. package/components/Radio/radio.ts +4 -2
  81. package/components/Rating/Rating.svelte +16 -14
  82. package/components/Ribbon/Ribbon.svelte +9 -6
  83. package/components/Ribbon/ribbon.ts +6 -0
  84. package/components/Select/Select.astro +73 -63
  85. package/components/Select/Select.svelte +27 -22
  86. package/components/Select/Select.tsx +8 -6
  87. package/components/Sheet/Sheet.svelte +9 -5
  88. package/components/Sheet/sheet.ts +6 -2
  89. package/components/Sidebar/Sidebar.svelte +7 -4
  90. package/components/Sidebar/sidebar.ts +6 -0
  91. package/components/Skeleton/Skeleton.svelte +9 -7
  92. package/components/Slider/Slider.svelte +15 -13
  93. package/components/Slider/slider.module.scss +4 -0
  94. package/components/Slider/slider.ts +4 -2
  95. package/components/Spinner/Spinner.svelte +7 -5
  96. package/components/Spoiler/Spoiler.astro +13 -8
  97. package/components/Spoiler/Spoiler.svelte +13 -10
  98. package/components/Spoiler/spoiler.ts +6 -0
  99. package/components/Stepper/Stepper.svelte +9 -7
  100. package/components/Switch/Switch.svelte +15 -12
  101. package/components/Table/Table.svelte +11 -9
  102. package/components/Table/table.ts +1 -1
  103. package/components/Tabs/Tabs.astro +8 -5
  104. package/components/Tabs/Tabs.svelte +14 -11
  105. package/components/Tabs/tabs.ts +7 -1
  106. package/components/Textarea/Textarea.svelte +14 -11
  107. package/components/Textarea/textarea.ts +9 -4
  108. package/components/ThemeSwitcher/ThemeSwitcher.astro +43 -37
  109. package/components/ThemeSwitcher/ThemeSwitcher.svelte +14 -10
  110. package/components/ThemeSwitcher/themeswitcher.ts +7 -0
  111. package/components/Timeline/Timeline.svelte +12 -9
  112. package/components/Timeline/timeline.ts +7 -2
  113. package/components/TimelineItem/TimelineItem.svelte +8 -5
  114. package/components/TimelineItem/timelineitem.ts +6 -0
  115. package/components/Toast/Toast.svelte +18 -10
  116. package/components/Toast/toast.ts +6 -1
  117. package/icons/alert.svg +2 -2
  118. package/icons/check.svg +2 -2
  119. package/icons/chevron-down.svg +3 -0
  120. package/icons/chevron-left.svg +3 -0
  121. package/icons/chevron-right.svg +3 -0
  122. package/icons/chevron-up.svg +3 -0
  123. package/icons/circle-check.svg +3 -3
  124. package/icons/info.svg +3 -3
  125. package/icons.d.ts +4 -5
  126. package/icons.js +4 -5
  127. package/index.d.ts +1 -0
  128. package/index.js +1 -0
  129. package/package.json +20 -20
  130. package/react.d.ts +3 -3
  131. package/svelte.d.ts +98 -98
  132. package/utils/bodyFreeze.ts +13 -0
  133. package/utils/modal.ts +12 -0
  134. package/icons/arrow-down.svg +0 -3
  135. package/icons/arrow-left.svg +0 -3
  136. package/icons/arrow-right.svg +0 -3
  137. package/icons/components.svg +0 -3
  138. package/icons/file.svg +0 -3
@@ -1,147 +1,149 @@
1
- <script lang="ts">
2
- import type { ListEventType,SvelteListProps } from './list'
3
-
4
- import ConditionalWrapper from '../ConditionalWrapper/ConditionalWrapper.svelte'
5
- import Input from '../Input/Input.svelte'
6
-
7
- import { classNames } from '../../utils/classNames'
8
-
9
- import searchIcon from '../../icons/search.svg?raw'
10
-
11
- import styles from './list.module.scss'
12
-
13
- export let showSearchBar: SvelteListProps['showSearchBar'] = false
14
- export let showSearchBarIcon: SvelteListProps['showSearchBarIcon'] = false
15
- export let searchBarPlaceholder: SvelteListProps['searchBarPlaceholder'] = ''
16
- export let noResultsLabel: SvelteListProps['noResultsLabel'] = 'No results.'
17
- export let maxHeight: SvelteListProps['maxHeight'] = ''
18
- export let id: SvelteListProps['id'] = ''
19
- export let className: SvelteListProps['className'] = ''
20
- export let wrapperClassName: SvelteListProps['wrapperClassName'] = ''
21
- export let itemGroups: SvelteListProps['itemGroups'] = []
22
- export let onSelect: SvelteListProps['onSelect'] = () => {}
23
-
24
- let searchValue = ''
25
- let numberOfResults = 1
26
-
27
- const classes = classNames([
28
- styles.list,
29
- !showSearchBar && styles.container,
30
- className
31
- ])
32
-
33
- const wrapperClasses = classNames([
34
- styles.container,
35
- wrapperClassName
36
- ])
37
-
38
- const search = (event: InputEvent) => {
39
- searchValue = (event.target as HTMLInputElement).value
40
-
41
- numberOfResults = itemGroups
42
- .map(group => group.items)
43
- .flat()
44
- .filter(item => {
45
- return item.value?.toLowerCase().includes(searchValue)
46
- || item.subText?.toLowerCase().includes(searchValue)
47
- || item.name.toLowerCase().includes(searchValue)
48
- }).length
49
- }
50
-
51
- const select = (event: MouseEvent | KeyboardEvent) => {
52
- const li = event.target as HTMLLIElement
53
-
54
- itemGroups = itemGroups.map(group => {
55
- group.items = group.items.map(item => {
56
- item.selected = li.dataset.name === item.name
57
-
58
- return item
59
- })
60
-
61
- return group
62
- })
63
-
64
- onSelect?.({
65
- ...li.dataset,
66
- list: li.parentElement
67
- } as ListEventType)
68
- }
69
-
70
- const selectByKey = (event: KeyboardEvent) => {
71
- if (event.key === 'Enter') {
72
- select(event)
73
- }
74
- }
75
- </script>
76
-
77
- <ConditionalWrapper
78
- condition={!!showSearchBar}
79
- class={wrapperClasses}
80
- >
81
- {#if showSearchBar}
82
- <Input
83
- type="search"
84
- placeholder={searchBarPlaceholder}
85
- onInput={search}
86
- >
87
- {#if showSearchBarIcon}
88
- {@html searchIcon}
89
- {/if}
90
- </Input>
91
- {/if}
92
- <ul
93
- class={classes}
94
- id={id || null}
95
- style={maxHeight ? `max-height: ${maxHeight}` : null}
96
- >
97
- {#each itemGroups as group}
98
- {#if group.title}
99
- <li class={styles.title}
100
- data-hidden={searchValue ? true : null}
101
- >
102
- {group.title}
103
- </li>
104
- {/if}
105
- {#each group.items as item}
106
- <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
107
- <li
108
- tabIndex={item.href || item.disabled ? undefined : 0}
109
- data-value={item.value}
110
- data-name={item.name}
111
- data-disabled={item.disabled}
112
- data-selected={item.selected ? true : undefined}
113
- data-hidden={(
114
- !item.value?.toLowerCase().includes(searchValue)
115
- && !item.subText?.toLowerCase().includes(searchValue)
116
- && !item.name.toLowerCase().includes(searchValue)
117
- ) ? true : null}
118
- on:click={item.disabled ? null : select}
119
- on:keyup={item.disabled ? null : selectByKey}
120
- >
121
- <ConditionalWrapper
122
- condition={!!item.href}
123
- element="a"
124
- href={item.href}
125
- target={item.target}
126
- >
127
- <ConditionalWrapper
128
- condition={!!(item.icon && item.subText)}
129
- >
130
- {#if item.icon}
131
- {@html item.icon}
132
- {/if}
133
- <div>{item.name}</div>
134
- </ConditionalWrapper>
135
- {#if item.subText}
136
- <span>{item.subText}</span>
137
- {/if}
138
- </ConditionalWrapper>
139
- </li>
140
- {/each}
141
- {/each}
142
-
143
- {#if showSearchBar && !numberOfResults}
144
- <li data-id="w-no-results">{noResultsLabel}</li>
145
- {/if}
146
- </ul>
147
- </ConditionalWrapper>
1
+ <script lang="ts">
2
+ import type { ListEventType,SvelteListProps } from './list'
3
+
4
+ import ConditionalWrapper from '../ConditionalWrapper/ConditionalWrapper.svelte'
5
+ import Input from '../Input/Input.svelte'
6
+
7
+ import { classNames } from '../../utils/classNames'
8
+
9
+ import searchIcon from '../../icons/search.svg?raw'
10
+
11
+ import styles from './list.module.scss'
12
+
13
+ let {
14
+ showSearchBar,
15
+ showSearchBarIcon,
16
+ searchBarPlaceholder,
17
+ noResultsLabel = 'No results.',
18
+ maxHeight,
19
+ id,
20
+ className,
21
+ wrapperClassName,
22
+ itemGroups = $bindable([]),
23
+ onSelect
24
+ }: SvelteListProps = $props()
25
+
26
+ let searchValue = $state('')
27
+ let numberOfResults = $state(1)
28
+
29
+ const classes = classNames([
30
+ styles.list,
31
+ !showSearchBar && styles.container,
32
+ className
33
+ ])
34
+
35
+ const wrapperClasses = classNames([
36
+ styles.container,
37
+ wrapperClassName
38
+ ])
39
+
40
+ const search = (event: InputEvent) => {
41
+ searchValue = (event.target as HTMLInputElement).value.toLowerCase()
42
+
43
+ numberOfResults = itemGroups
44
+ .map(group => group.items)
45
+ .flat()
46
+ .filter(item => {
47
+ return item.value?.toLowerCase().includes(searchValue)
48
+ || item.subText?.toLowerCase().includes(searchValue)
49
+ || item.name.toLowerCase().includes(searchValue)
50
+ }).length
51
+ }
52
+
53
+ const select = (event: MouseEvent | KeyboardEvent) => {
54
+ const li = event.target as HTMLLIElement
55
+
56
+ itemGroups = itemGroups.map(group => {
57
+ group.items = group.items.map(item => {
58
+ item.selected = li.dataset.name === item.name
59
+
60
+ return item
61
+ })
62
+
63
+ return group
64
+ })
65
+
66
+ onSelect?.({
67
+ ...li.dataset,
68
+ list: li.parentElement
69
+ } as ListEventType)
70
+ }
71
+
72
+ const selectByKey = (event: KeyboardEvent) => {
73
+ if (event.key === 'Enter') {
74
+ select(event)
75
+ }
76
+ }
77
+ </script>
78
+
79
+ <ConditionalWrapper
80
+ condition={!!showSearchBar}
81
+ class={wrapperClasses}
82
+ >
83
+ {#if showSearchBar}
84
+ <Input
85
+ type="search"
86
+ placeholder={searchBarPlaceholder}
87
+ onInput={search}
88
+ >
89
+ {#if showSearchBarIcon}
90
+ {@html searchIcon}
91
+ {/if}
92
+ </Input>
93
+ {/if}
94
+ <ul
95
+ class={classes}
96
+ id={id}
97
+ style={maxHeight ? `max-height: ${maxHeight}` : null}
98
+ >
99
+ {#each itemGroups as group}
100
+ {#if group.title}
101
+ <li class={styles.title}
102
+ data-hidden={searchValue ? true : null}
103
+ >
104
+ {group.title}
105
+ </li>
106
+ {/if}
107
+ {#each group.items as item}
108
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
109
+ <li
110
+ tabIndex={item.href || item.disabled ? undefined : 0}
111
+ data-value={item.value}
112
+ data-name={item.name}
113
+ data-disabled={item.disabled}
114
+ data-selected={item.selected ? true : undefined}
115
+ data-hidden={(
116
+ !item.value?.toLowerCase().includes(searchValue)
117
+ && !item.subText?.toLowerCase().includes(searchValue)
118
+ && !item.name.toLowerCase().includes(searchValue)
119
+ ) ? true : null}
120
+ onclick={item.disabled ? null : select}
121
+ onkeyup={item.disabled ? null : selectByKey}
122
+ >
123
+ <ConditionalWrapper
124
+ condition={!!item.href}
125
+ element="a"
126
+ href={item.href}
127
+ target={item.target}
128
+ >
129
+ <ConditionalWrapper
130
+ condition={!!(item.icon && item.subText)}
131
+ >
132
+ {#if item.icon}
133
+ {@html item.icon}
134
+ {/if}
135
+ <div>{item.name}</div>
136
+ </ConditionalWrapper>
137
+ {#if item.subText}
138
+ <span>{item.subText}</span>
139
+ {/if}
140
+ </ConditionalWrapper>
141
+ </li>
142
+ {/each}
143
+ {/each}
144
+
145
+ {#if showSearchBar && !numberOfResults}
146
+ <li data-id="w-no-results">{noResultsLabel}</li>
147
+ {/if}
148
+ </ul>
149
+ </ConditionalWrapper>
@@ -42,7 +42,7 @@ const List = ({
42
42
  : undefined
43
43
 
44
44
  const search = (event: React.FormEvent<HTMLInputElement>) => {
45
- const value = (event.target as HTMLInputElement).value
45
+ const value = (event.target as HTMLInputElement).value.toLowerCase()
46
46
 
47
47
  setSearchValue(value)
48
48
  setNumberOfResults(
@@ -5,12 +5,14 @@
5
5
 
6
6
  import styles from './masonry.module.scss'
7
7
 
8
- export let items: SvelteMasonryProps['items'] = []
9
- export let element: SvelteMasonryProps['element'] = 'section'
10
- export let gap: SvelteMasonryProps['gap'] = ''
11
- export let columns: SvelteMasonryProps['columns'] = 3
12
- export let sequential: SvelteMasonryProps['sequential'] = false
13
- export let className: SvelteMasonryProps['className'] = ''
8
+ const {
9
+ items,
10
+ element = 'section',
11
+ gap,
12
+ columns = 3,
13
+ sequential,
14
+ className
15
+ }: SvelteMasonryProps = $props()
14
16
 
15
17
  const classes = classNames([
16
18
  styles.masonry,
@@ -36,15 +38,15 @@
36
38
  <div class={styles.column}>
37
39
  {#each group as item}
38
40
  {#if item.component}
39
- <svelte:component this={item.component} {...item.props}>
41
+ <item.component {...item.props}>
40
42
  {#if typeof item.children === 'object' && item.children.component}
41
- <svelte:component this={item.children.component} {...item.children.props}>
43
+ <item.children.component {...item.children.props}>
42
44
  {@html item.children.children}
43
- </svelte:component>
45
+ </item.children.component>
44
46
  {:else}
45
47
  {@html item.children}
46
48
  {/if}
47
- </svelte:component>
49
+ </item.component>
48
50
  {:else}
49
51
  {@html item.html}
50
52
  {/if}
@@ -99,9 +99,10 @@ const wrapMenu = (logo?.url || logo?.html) && items?.length && Astro.slots.has('
99
99
  </header>
100
100
 
101
101
  <script>
102
- document
103
- .querySelector('[data-id="hamburger"]')
104
- ?.addEventListener('click', event => {
102
+ import { on } from '../../utils/DOMUtils'
103
+
104
+ const addToggle = () => {
105
+ on('[data-id="hamburger"]', 'click', (event: Event) => {
105
106
  const hamburger = event.currentTarget as HTMLDivElement
106
107
  const header = hamburger.parentElement?.parentElement as HTMLHeadElement
107
108
 
@@ -109,4 +110,8 @@ const wrapMenu = (logo?.url || logo?.html) && items?.length && Astro.slots.has('
109
110
  ? 'false'
110
111
  : 'true'
111
112
  })
113
+ }
114
+
115
+ on(document, 'astro:after-swap', addToggle)
116
+ addToggle()
112
117
  </script>
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { MenuProps } from './menu'
2
+ import type { SvelteMenuProps } from './menu'
3
3
 
4
4
  import ConditionalWrapper from '../ConditionalWrapper/ConditionalWrapper.svelte'
5
5
 
@@ -7,11 +7,14 @@
7
7
 
8
8
  import styles from './menu.module.scss'
9
9
 
10
- export let items: MenuProps['items'] = []
11
- export let logo: MenuProps['logo'] = null
12
- export let centerLogo: MenuProps['centerLogo'] = false
13
- export let className: MenuProps['className'] = ''
14
- export let wrapperClassName: MenuProps['wrapperClassName'] = ''
10
+ const {
11
+ items,
12
+ logo,
13
+ centerLogo,
14
+ className,
15
+ wrapperClassName,
16
+ children
17
+ }: SvelteMenuProps = $props()
15
18
 
16
19
  const classes = classNames([
17
20
  styles.menu,
@@ -23,9 +26,11 @@
23
26
  wrapperClassName
24
27
  ])
25
28
 
26
- const wrapMenu = (logo?.url || logo?.html) && items?.length && $$slots.default
29
+ const wrapMenu = (logo?.url || logo?.html)
30
+ && items?.length
31
+ && children
27
32
 
28
- let active = false
33
+ let active = $state(false)
29
34
 
30
35
  const toggleMenu = () => active = !active
31
36
  </script>
@@ -70,7 +75,7 @@
70
75
  {#if items?.length}
71
76
  <button
72
77
  class={styles.hamburger}
73
- on:click={toggleMenu}
78
+ onclick={toggleMenu}
74
79
  aria-label="menu"
75
80
  >
76
81
  <span class={styles.meat}></span>
@@ -97,6 +102,6 @@
97
102
  </a>
98
103
  {/if}
99
104
 
100
- <slot />
105
+ {@render children?.()}
101
106
  </div>
102
107
  </header>
@@ -28,7 +28,9 @@ const Menu = ({
28
28
  wrapperClassName
29
29
  ])
30
30
 
31
- const wrapMenu = (logo?.url || logo?.html) && items?.length && children
31
+ const wrapMenu = (logo?.url || logo?.html)
32
+ && items?.length
33
+ && children
32
34
 
33
35
  const toggleMenu = () => setActive(!active)
34
36
 
@@ -1,3 +1,5 @@
1
+ import type { Snippet } from 'svelte'
2
+
1
3
  import type { ButtonProps } from '../Button/button'
2
4
 
3
5
  export type MenuProps = {
@@ -19,6 +21,10 @@ export type MenuProps = {
19
21
  wrapperClassName?: string
20
22
  }
21
23
 
24
+ export type SvelteMenuProps = {
25
+ children?: Snippet
26
+ } & MenuProps
27
+
22
28
  export type ReactMenuProps = {
23
29
  children?: React.ReactNode
24
30
  } & MenuProps
@@ -58,6 +58,7 @@ const classes = [
58
58
  theme="flat"
59
59
  className={styles.close}
60
60
  data-id="close"
61
+ aria-label="close"
61
62
  >
62
63
  <Fragment set:html={closeIcon} />
63
64
  </Button>
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { ModalProps } from './modal'
2
+ import type { SvelteModalProps } from './modal'
3
3
 
4
4
  import Button from '../Button/Button.svelte'
5
5
 
@@ -13,15 +13,19 @@
13
13
 
14
14
  import styles from './modal.module.scss'
15
15
 
16
- export let title: ModalProps['title'] = ''
17
- export let subTitle: ModalProps['subTitle'] = ''
18
- export let showCloseIcon: ModalProps['showCloseIcon'] = true
19
- export let closeOnEsc: ModalProps['closeOnEsc'] = true
20
- export let closeOnOverlay: ModalProps['closeOnOverlay'] = true
21
- export let transparent: ModalProps['transparent'] = false
22
- export let theme: ModalProps['theme'] = null
23
- export let id : ModalProps['className'] = ''
24
- export let className: ModalProps['className'] = ''
16
+ const {
17
+ title,
18
+ subTitle,
19
+ showCloseIcon = true,
20
+ closeOnEsc = true,
21
+ closeOnOverlay = true,
22
+ transparent,
23
+ theme,
24
+ id,
25
+ className,
26
+ children,
27
+ ...rest
28
+ }: SvelteModalProps = $props()
25
29
 
26
30
  const iconMap = {
27
31
  info,
@@ -48,13 +52,14 @@
48
52
  class={classes}
49
53
  id={id}
50
54
  data-close={close.length ? close : undefined}
51
- {...$$restProps}
55
+ {...rest}
52
56
  >
53
57
  {#if showCloseIcon}
54
58
  <Button
55
59
  theme="flat"
56
60
  className={styles.close}
57
61
  data-id="close"
62
+ aria-label="close"
58
63
  >
59
64
  {@html closeIcon}
60
65
  </Button>
@@ -70,6 +75,6 @@
70
75
  {#if subTitle}
71
76
  <div class={styles.subTitle}>{subTitle}</div>
72
77
  {/if}
73
- <slot />
78
+ {@render children?.()}
74
79
  </dialog>
75
- <div class={styles.overlay} />
80
+ <div class={styles.overlay}></div>
@@ -58,8 +58,9 @@ const Modal = ({
58
58
  <Button
59
59
  theme="flat"
60
60
  className={styles.close}
61
- data-id="close"
62
61
  dangerouslySetInnerHTML={{ __html: closeIcon }}
62
+ data-id="close"
63
+ aria-label="close"
63
64
  />
64
65
  )}
65
66
  {title && (
@@ -1,3 +1,5 @@
1
+ import type { Snippet } from 'svelte'
2
+
1
3
  export type ModalProps = {
2
4
  title?: string
3
5
  subTitle?: string
@@ -11,10 +13,13 @@ export type ModalProps = {
11
13
  | 'success'
12
14
  | 'warning'
13
15
  | 'alert'
14
- | null
15
16
  [key: string]: any
16
17
  }
17
18
 
19
+ export type SvelteModalProps = {
20
+ children: Snippet
21
+ } & ModalProps
22
+
18
23
  export type ReactModalProps = {
19
24
  children?: React.ReactNode
20
25
  } & ModalProps