webcoreui 0.8.1 → 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 (175) hide show
  1. package/README.md +36 -6
  2. package/astro.d.ts +23 -0
  3. package/astro.js +8 -0
  4. package/components/Accordion/Accordion.astro +15 -10
  5. package/components/Accordion/Accordion.svelte +14 -12
  6. package/components/Accordion/Accordion.tsx +2 -2
  7. package/components/Accordion/accordion.module.scss +1 -0
  8. package/components/Alert/Alert.svelte +17 -12
  9. package/components/Alert/Alert.tsx +1 -1
  10. package/components/Alert/alert.ts +10 -3
  11. package/components/AspectRatio/AspectRatio.svelte +7 -4
  12. package/components/AspectRatio/aspectratio.ts +6 -0
  13. package/components/Avatar/Avatar.svelte +11 -9
  14. package/components/Badge/Badge.svelte +14 -10
  15. package/components/Badge/badge.ts +3 -2
  16. package/components/Banner/Banner.astro +10 -4
  17. package/components/Banner/Banner.svelte +14 -10
  18. package/components/Banner/Banner.tsx +1 -0
  19. package/components/Banner/banner.ts +6 -0
  20. package/components/BottomNavigation/BottomNavigation.astro +51 -0
  21. package/components/BottomNavigation/BottomNavigation.svelte +47 -0
  22. package/components/BottomNavigation/BottomNavigation.tsx +63 -0
  23. package/components/BottomNavigation/bottomnavigation.module.scss +70 -0
  24. package/components/BottomNavigation/bottomnavigation.ts +16 -0
  25. package/components/Breadcrumb/Breadcrumb.astro +1 -1
  26. package/components/Breadcrumb/Breadcrumb.svelte +8 -6
  27. package/components/Breadcrumb/Breadcrumb.tsx +2 -2
  28. package/components/Button/Button.svelte +12 -8
  29. package/components/Button/Button.tsx +2 -2
  30. package/components/Button/button.ts +2 -3
  31. package/components/Card/Card.svelte +14 -10
  32. package/components/Card/card.module.scss +1 -0
  33. package/components/Card/card.ts +6 -0
  34. package/components/Carousel/Carousel.astro +46 -41
  35. package/components/Carousel/carousel.ts +3 -0
  36. package/components/Checkbox/Checkbox.astro +8 -2
  37. package/components/Checkbox/Checkbox.svelte +12 -8
  38. package/components/Checkbox/Checkbox.tsx +3 -1
  39. package/components/Checkbox/checkbox.module.scss +4 -0
  40. package/components/Checkbox/checkbox.ts +1 -0
  41. package/components/Collapsible/Collapsible.astro +8 -5
  42. package/components/Collapsible/Collapsible.svelte +54 -49
  43. package/components/Collapsible/collapsible.ts +8 -0
  44. package/components/ConditionalWrapper/ConditionalWrapper.svelte +10 -6
  45. package/components/ConditionalWrapper/conditionalwrapper.ts +6 -0
  46. package/components/Copy/Copy.astro +80 -0
  47. package/components/Copy/Copy.svelte +68 -0
  48. package/components/Copy/Copy.tsx +74 -0
  49. package/components/Copy/copy.module.scss +37 -0
  50. package/components/Copy/copy.ts +20 -0
  51. package/components/DataTable/DataTable.astro +103 -93
  52. package/components/DataTable/DataTable.svelte +276 -272
  53. package/components/DataTable/datatable.ts +5 -2
  54. package/components/Flex/Flex.astro +34 -0
  55. package/components/Flex/Flex.svelte +31 -0
  56. package/components/Flex/Flex.tsx +30 -0
  57. package/components/Flex/flex.ts +28 -0
  58. package/components/Footer/Footer.svelte +12 -9
  59. package/components/Footer/footer.ts +6 -0
  60. package/components/Grid/Grid.astro +32 -0
  61. package/components/Grid/Grid.svelte +29 -0
  62. package/components/Grid/Grid.tsx +28 -0
  63. package/components/Grid/grid.ts +24 -0
  64. package/components/Group/Group.svelte +7 -4
  65. package/components/Group/group.ts +6 -0
  66. package/components/Icon/Icon.astro +19 -5
  67. package/components/Icon/Icon.svelte +23 -7
  68. package/components/Icon/Icon.tsx +19 -5
  69. package/components/Icon/icon.ts +10 -3
  70. package/components/Icon/map.ts +10 -10
  71. package/components/Input/Input.astro +1 -1
  72. package/components/Input/Input.svelte +26 -20
  73. package/components/Input/Input.tsx +4 -1
  74. package/components/Input/input.ts +10 -3
  75. package/components/Kbd/Kbd.svelte +7 -4
  76. package/components/Kbd/kbd.ts +6 -0
  77. package/components/List/List.astro +65 -60
  78. package/components/List/List.svelte +149 -147
  79. package/components/List/List.tsx +1 -1
  80. package/components/List/list.module.scss +3 -0
  81. package/components/Masonry/Masonry.svelte +12 -10
  82. package/components/Menu/Menu.astro +8 -3
  83. package/components/Menu/Menu.svelte +19 -10
  84. package/components/Menu/Menu.tsx +3 -1
  85. package/components/Menu/menu.ts +6 -0
  86. package/components/Modal/Modal.astro +1 -0
  87. package/components/Modal/Modal.svelte +18 -13
  88. package/components/Modal/Modal.tsx +2 -1
  89. package/components/Modal/modal.ts +6 -1
  90. package/components/Pagination/Pagination.astro +75 -69
  91. package/components/Pagination/Pagination.svelte +30 -26
  92. package/components/Pagination/Pagination.tsx +5 -4
  93. package/components/Pagination/pagination.module.scss +4 -0
  94. package/components/Popover/Popover.svelte +10 -6
  95. package/components/Popover/popover.ts +6 -0
  96. package/components/Progress/Progress.svelte +12 -10
  97. package/components/Progress/progress.ts +1 -1
  98. package/components/Radio/Radio.astro +3 -1
  99. package/components/Radio/Radio.svelte +14 -10
  100. package/components/Radio/Radio.tsx +5 -3
  101. package/components/Radio/radio.ts +5 -2
  102. package/components/Rating/Rating.svelte +16 -14
  103. package/components/Ribbon/Ribbon.svelte +9 -6
  104. package/components/Ribbon/ribbon.ts +6 -0
  105. package/components/Select/Select.astro +85 -42
  106. package/components/Select/Select.svelte +62 -21
  107. package/components/Select/Select.tsx +41 -7
  108. package/components/Select/select.ts +4 -1
  109. package/components/Sheet/Sheet.svelte +9 -5
  110. package/components/Sheet/sheet.ts +6 -2
  111. package/components/Sidebar/Sidebar.svelte +7 -4
  112. package/components/Sidebar/sidebar.ts +6 -0
  113. package/components/Skeleton/Skeleton.astro +2 -2
  114. package/components/Skeleton/Skeleton.svelte +11 -9
  115. package/components/Skeleton/Skeleton.tsx +2 -2
  116. package/components/Slider/Slider.svelte +15 -13
  117. package/components/Slider/slider.module.scss +4 -0
  118. package/components/Slider/slider.ts +4 -2
  119. package/components/Spinner/Spinner.svelte +7 -5
  120. package/components/Spoiler/Spoiler.astro +13 -8
  121. package/components/Spoiler/Spoiler.svelte +13 -10
  122. package/components/Spoiler/spoiler.ts +6 -0
  123. package/components/Stepper/Stepper.svelte +9 -7
  124. package/components/Switch/Switch.astro +3 -2
  125. package/components/Switch/Switch.svelte +15 -11
  126. package/components/Switch/Switch.tsx +3 -1
  127. package/components/Switch/switch.ts +1 -0
  128. package/components/Table/Table.svelte +11 -9
  129. package/components/Table/table.ts +1 -1
  130. package/components/Tabs/Tabs.astro +8 -5
  131. package/components/Tabs/Tabs.svelte +14 -11
  132. package/components/Tabs/tabs.ts +7 -1
  133. package/components/Textarea/Textarea.astro +3 -1
  134. package/components/Textarea/Textarea.svelte +51 -47
  135. package/components/Textarea/textarea.ts +24 -18
  136. package/components/ThemeSwitcher/ThemeSwitcher.astro +43 -37
  137. package/components/ThemeSwitcher/ThemeSwitcher.svelte +14 -10
  138. package/components/ThemeSwitcher/themeswitcher.ts +7 -0
  139. package/components/Timeline/Timeline.svelte +12 -9
  140. package/components/Timeline/timeline.ts +7 -2
  141. package/components/TimelineItem/TimelineItem.svelte +8 -5
  142. package/components/TimelineItem/timelineitem.ts +6 -0
  143. package/components/Toast/Toast.svelte +18 -10
  144. package/components/Toast/toast.ts +6 -1
  145. package/icons/alert.svg +2 -2
  146. package/icons/check.svg +2 -2
  147. package/icons/chevron-down.svg +3 -0
  148. package/icons/chevron-left.svg +3 -0
  149. package/icons/chevron-right.svg +3 -0
  150. package/icons/chevron-up.svg +3 -0
  151. package/icons/circle-check.svg +3 -3
  152. package/icons/copy.svg +3 -0
  153. package/icons/info.svg +3 -3
  154. package/icons.d.ts +5 -5
  155. package/icons.js +5 -5
  156. package/index.d.ts +75 -2
  157. package/index.js +2 -0
  158. package/package.json +31 -22
  159. package/react.d.ts +23 -0
  160. package/react.js +8 -0
  161. package/scss/global/utility.scss +48 -3
  162. package/svelte.d.ts +111 -88
  163. package/svelte.js +8 -0
  164. package/utils/DOMUtils.ts +2 -2
  165. package/utils/bodyFreeze.ts +13 -0
  166. package/utils/classNames.ts +1 -1
  167. package/utils/getLayoutClasses.ts +141 -0
  168. package/utils/modal.ts +16 -4
  169. package/utils/popover.ts +30 -4
  170. package/icons/arrow-down.svg +0 -3
  171. package/icons/arrow-left.svg +0 -3
  172. package/icons/arrow-right.svg +0 -3
  173. package/icons/components.svg +0 -3
  174. package/icons/file.svg +0 -3
  175. package/scss/webcore.config.scss +0 -0
@@ -5,13 +5,15 @@
5
5
 
6
6
  import styles from './skeleton.module.scss'
7
7
 
8
- export let animate: SkeletonProps['animate'] = 'wave'
9
- export let type: SkeletonProps['type'] = 'rounded'
10
- export let width: SkeletonProps['width'] = 0
11
- export let height: SkeletonProps['height'] = 0
12
- export let color: SkeletonProps['color'] = ''
13
- export let waveColor: SkeletonProps['waveColor'] = ''
14
- export let className: SkeletonProps['className'] = ''
8
+ const {
9
+ animate = 'wave',
10
+ type = 'rounded',
11
+ width,
12
+ height,
13
+ color,
14
+ waveColor,
15
+ className
16
+ }: SkeletonProps = $props()
15
17
 
16
18
  const classes = classNames([
17
19
  animate && styles[animate],
@@ -21,8 +23,8 @@
21
23
  ])
22
24
 
23
25
  const styleVariables = classNames([
24
- width && `width: ${width}px;`,
25
- height && `height: ${height}px;`,
26
+ width && `max-width: ${width}px;`,
27
+ height && `max-height: ${height}px;`,
26
28
  color && `--w-skeleton-color: ${color};`,
27
29
  waveColor && `--w-skeleton-wave-color: ${waveColor};`
28
30
  ])
@@ -22,8 +22,8 @@ const Skeleton = ({
22
22
  ])
23
23
 
24
24
  const styleVariables = {
25
- ...(width && { width: `${width}px` }),
26
- ...(height && { height: `${height}px` }),
25
+ ...(width && { maxWidth: `${width}px` }),
26
+ ...(height && { maxHeight: `${height}px` }),
27
27
  ...(color && { '--w-skeleton-color': color }),
28
28
  ...(waveColor && { '--w-skeleton-wave-color': waveColor })
29
29
  } as React.CSSProperties
@@ -5,17 +5,19 @@
5
5
 
6
6
  import styles from './slider.module.scss'
7
7
 
8
- export let min: SvelteSliderProps['min'] = 0
9
- export let max: SvelteSliderProps['max'] = 100
10
- export let value: SvelteSliderProps['value'] = 0
11
- export let step: SvelteSliderProps['step'] = 1
12
- export let disabled: SvelteSliderProps['disabled'] = false
13
- export let color: SvelteSliderProps['color'] = ''
14
- export let background: SvelteSliderProps['background'] = ''
15
- export let thumb: SvelteSliderProps['thumb'] = ''
16
- export let id: SvelteSliderProps['id'] = ''
17
- export let className: SvelteSliderProps['className'] = ''
18
- export let onChange: SvelteSliderProps['onChange'] = () => {}
8
+ const {
9
+ min,
10
+ max,
11
+ value,
12
+ step,
13
+ disabled,
14
+ color,
15
+ background,
16
+ thumb,
17
+ id,
18
+ className,
19
+ onChange
20
+ }: SvelteSliderProps = $props()
19
21
 
20
22
  const classes = classNames([
21
23
  styles.slider,
@@ -37,7 +39,7 @@
37
39
  step={step}
38
40
  disabled={disabled}
39
41
  class={classes}
40
- id={id || null}
42
+ id={id}
41
43
  style={styleVariables || null}
42
- on:change={onChange}
44
+ onchange={onChange}
43
45
  />
@@ -17,6 +17,10 @@ body {
17
17
  appearance: none;
18
18
  cursor: pointer;
19
19
 
20
+ &[disabled] {
21
+ cursor: no-drop;
22
+ }
23
+
20
24
  &[disabled]::-webkit-slider-runnable-track {
21
25
  @include background(primary-50);
22
26
  }
@@ -1,3 +1,5 @@
1
+ import type { InputTarget } from '../Input/input'
2
+
1
3
  export type SliderProps = {
2
4
  min: number
3
5
  max: number
@@ -12,9 +14,9 @@ export type SliderProps = {
12
14
  }
13
15
 
14
16
  export type SvelteSliderProps = {
15
- onChange?: (e: any) => any
17
+ onChange?: (event: Event & InputTarget) => void
16
18
  } & SliderProps
17
19
 
18
20
  export type ReactSliderProps = {
19
- onChange?: (e: any) => any
21
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void
20
22
  } & SliderProps
@@ -5,11 +5,13 @@
5
5
 
6
6
  import styles from './spinner.module.scss'
7
7
 
8
- export let color: SpinnerProps['color'] = ''
9
- export let width: SpinnerProps['width'] = 0
10
- export let speed: SpinnerProps['speed'] = 0
11
- export let size: SpinnerProps['size'] = 0
12
- export let dashArray: SpinnerProps['dashArray'] = 0
8
+ const {
9
+ color,
10
+ width,
11
+ speed,
12
+ size,
13
+ dashArray
14
+ }: SpinnerProps = $props()
13
15
 
14
16
  const classes = classNames([
15
17
  styles.spinner,
@@ -39,12 +39,17 @@ const style = color
39
39
  <script>
40
40
  import { on } from '../../utils/DOMUtils'
41
41
 
42
- on('[data-id="w-spoiler"]', 'click', (event: Event) => {
43
- const target = event.currentTarget as HTMLDivElement
44
-
45
- target.dataset.visible = 'true'
46
- target.removeAttribute('data-tooltip')
47
- target.removeAttribute('role')
48
- target.removeAttribute('tabindex')
49
- }, true)
42
+ const addEventListeners = () => {
43
+ on('[data-id="w-spoiler"]', 'click', (event: Event) => {
44
+ const target = event.currentTarget as HTMLDivElement
45
+
46
+ target.dataset.visible = 'true'
47
+ target.removeAttribute('data-tooltip')
48
+ target.removeAttribute('role')
49
+ target.removeAttribute('tabindex')
50
+ }, true)
51
+ }
52
+
53
+ on(document, 'astro:after-swap', addEventListeners)
54
+ addEventListeners()
50
55
  </script>
@@ -1,15 +1,18 @@
1
1
  <script lang="ts">
2
- import type { SpoilerProps } from './spoiler'
2
+ import type { SvelteSpoilerProps } from './spoiler'
3
3
 
4
4
  import { classNames } from '../../utils/classNames'
5
5
 
6
6
  import styles from './spoiler.module.scss'
7
7
 
8
- export let color: SpoilerProps['color'] = ''
9
- export let animated: SpoilerProps['animated'] = true
10
- export let block: SpoilerProps['block'] = false
11
- export let tooltip: SpoilerProps['tooltip'] = ''
12
- export let tooltipPosition: SpoilerProps['tooltipPosition'] = null
8
+ const {
9
+ color,
10
+ animated = true,
11
+ block,
12
+ tooltip,
13
+ tooltipPosition,
14
+ children
15
+ }: SvelteSpoilerProps = $props()
13
16
 
14
17
  const classes = classNames([
15
18
  styles.spoiler,
@@ -34,12 +37,12 @@
34
37
  <span
35
38
  class={classes}
36
39
  style={style}
37
- data-tooltip={tooltip || null}
40
+ data-tooltip={tooltip}
38
41
  data-position={tooltipPosition}
39
42
  role="button"
40
43
  tabindex="0"
41
- on:click={toggle}
42
- on:keyup={toggle}
44
+ onclick={toggle}
45
+ onkeyup={toggle}
43
46
  >
44
- <slot />
47
+ {@render children?.()}
45
48
  </span>
@@ -1,3 +1,5 @@
1
+ import type { Snippet } from 'svelte'
2
+
1
3
  export type SpoilerProps = {
2
4
  color?: string
3
5
  animated?: boolean
@@ -6,6 +8,10 @@ export type SpoilerProps = {
6
8
  tooltipPosition?: 'bottom' | null
7
9
  }
8
10
 
11
+ export type SvelteSpoilerProps = {
12
+ children: Snippet
13
+ } & SpoilerProps
14
+
9
15
  export type ReactSpoilerProps = {
10
16
  children: React.ReactNode
11
17
  } & SpoilerProps
@@ -7,13 +7,15 @@
7
7
 
8
8
  import styles from './stepper.module.scss'
9
9
 
10
- export let items: StepperProps['items'] = []
11
- export let color: StepperProps['color'] = ''
12
- export let completedColor: StepperProps['completedColor'] = ''
13
- export let activeColor: StepperProps['activeColor'] = ''
14
- export let borderless: StepperProps['vertical'] = false
15
- export let vertical: StepperProps['vertical'] = false
16
- export let className: StepperProps['className'] = ''
10
+ const {
11
+ items,
12
+ color,
13
+ completedColor,
14
+ activeColor,
15
+ borderless,
16
+ vertical,
17
+ className
18
+ }: StepperProps = $props()
17
19
 
18
20
  const classes = classNames([
19
21
  styles.stepper,
@@ -16,7 +16,8 @@ const {
16
16
  small,
17
17
  square,
18
18
  disabled,
19
- className
19
+ className,
20
+ ...rest
20
21
  } = Astro.props
21
22
 
22
23
  const classes = [
@@ -35,7 +36,7 @@ const styleVariables = classNames([
35
36
  ---
36
37
 
37
38
  <label class:list={classes} style={styleVariables}>
38
- <input type="checkbox" checked={toggled} disabled={disabled} />
39
+ <input type="checkbox" checked={toggled} disabled={disabled} {...rest} />
39
40
  <span class={styles.toggle}></span>
40
41
  {label && <span class={styles.label}>{label}</span>}
41
42
  </label>
@@ -5,16 +5,19 @@
5
5
 
6
6
  import styles from './switch.module.scss'
7
7
 
8
- export let label: SvelteSwitchProps['label'] = ''
9
- export let toggled: SvelteSwitchProps['toggled'] = false
10
- export let offColor: SvelteSwitchProps['offColor'] = ''
11
- export let onColor: SvelteSwitchProps['onColor'] = ''
12
- export let reverse: SvelteSwitchProps['reverse'] = false
13
- export let small: SvelteSwitchProps['small'] = false
14
- export let square: SvelteSwitchProps['square'] = false
15
- export let disabled: SvelteSwitchProps['disabled'] = false
16
- export let className: SvelteSwitchProps['className'] = ''
17
- export let onClick: SvelteSwitchProps['onClick'] = () => {}
8
+ const {
9
+ label,
10
+ toggled,
11
+ offColor,
12
+ onColor,
13
+ reverse,
14
+ small,
15
+ square,
16
+ disabled,
17
+ className,
18
+ onClick,
19
+ ...rest
20
+ }: SvelteSwitchProps = $props()
18
21
 
19
22
  const classes = classNames([
20
23
  styles.switch,
@@ -36,7 +39,8 @@
36
39
  type="checkbox"
37
40
  checked={toggled}
38
41
  disabled={disabled}
39
- on:click={onClick}
42
+ onclick={onClick}
43
+ {...rest}
40
44
  />
41
45
  <span class={styles.toggle}></span>
42
46
  {#if label}
@@ -15,7 +15,8 @@ const Switch = ({
15
15
  square,
16
16
  disabled,
17
17
  className,
18
- onClick
18
+ onClick,
19
+ ...rest
19
20
  }: ReactSwitchProps) => {
20
21
  const classes = classNames([
21
22
  styles.switch,
@@ -38,6 +39,7 @@ const Switch = ({
38
39
  defaultChecked={toggled}
39
40
  disabled={disabled}
40
41
  onClick={onClick}
42
+ {...rest}
41
43
  />
42
44
  <span className={styles.toggle}></span>
43
45
  {label && <span className={styles.label}>{label}</span>}
@@ -10,6 +10,7 @@ export type SwitchProps = {
10
10
  onColor?: string
11
11
  offColor?: string
12
12
  className?: string
13
+ [key: string]: any
13
14
  }
14
15
 
15
16
  export type SvelteSwitchProps = {
@@ -5,15 +5,17 @@
5
5
 
6
6
  import styles from './table.module.scss'
7
7
 
8
- export let headings: TableProps['headings'] = []
9
- export let footer: TableProps['footer'] = []
10
- export let data: TableProps['data'] = []
11
- export let hover: TableProps['hover'] = false
12
- export let striped: TableProps['striped'] = null
13
- export let offsetStripe: TableProps['offsetStripe'] = false
14
- export let compact: TableProps['compact'] = false
15
- export let maxHeight: TableProps['maxHeight'] = ''
16
- export let className: TableProps['className'] = ''
8
+ const {
9
+ headings,
10
+ footer,
11
+ data,
12
+ hover,
13
+ striped,
14
+ offsetStripe,
15
+ compact,
16
+ maxHeight,
17
+ className
18
+ }: TableProps = $props()
17
19
 
18
20
  const classes = classNames([
19
21
  styles.table,
@@ -3,7 +3,7 @@ export type TableProps = {
3
3
  footer?: string[]
4
4
  data: string[][]
5
5
  hover?: boolean
6
- striped?: 'column' | 'row' | null
6
+ striped?: 'column' | 'row'
7
7
  offsetStripe?: boolean
8
8
  compact?: boolean
9
9
  maxHeight?: string
@@ -42,10 +42,10 @@ const classes = [
42
42
  </section>
43
43
 
44
44
  <script>
45
- const tabs = document.querySelectorAll('[data-id="w-tabs"]')
45
+ import { on } from '../../utils/DOMUtils'
46
46
 
47
- Array.from(tabs).forEach(element => {
48
- element.addEventListener('click', event => {
47
+ const addEventListeners = () => {
48
+ on('[data-id="w-tabs"]', 'click', (event: Event) => {
49
49
  const target = event.target as HTMLDivElement
50
50
 
51
51
  if (target.dataset.value) {
@@ -72,6 +72,9 @@ const classes = [
72
72
  }
73
73
  })
74
74
  }
75
- })
76
- })
75
+ }, true)
76
+ }
77
+
78
+ on(document, 'astro:after-swap', addEventListeners)
79
+ addEventListeners()
77
80
  </script>
@@ -1,18 +1,21 @@
1
1
  <script lang="ts">
2
- import type { TabsProps } from './tabs'
2
+ import type { SvelteTabsProps } from './tabs'
3
3
 
4
4
  import { classNames } from '../../utils/classNames'
5
5
 
6
6
  import styles from './tabs.module.scss'
7
7
 
8
- export let items: TabsProps['items'] = []
9
- export let theme: TabsProps['theme'] = null
10
- export let vertical: TabsProps['vertical'] = false
11
- export let even: TabsProps['even'] = false
12
- export let className: TabsProps['className'] = ''
8
+ const {
9
+ items,
10
+ theme,
11
+ vertical,
12
+ even,
13
+ className,
14
+ children
15
+ }: SvelteTabsProps = $props()
13
16
 
14
- let active = ''
15
- let tabContainer: HTMLDivElement
17
+ let active = $state('')
18
+ let tabContainer: HTMLDivElement | undefined = $state()
16
19
 
17
20
  const classes = classNames([
18
21
  styles.tabs,
@@ -23,7 +26,7 @@
23
26
  ])
24
27
 
25
28
  const setTab = (tab: string) => {
26
- const tabs = tabContainer.querySelectorAll('[data-tab]')
29
+ const tabs = tabContainer!.querySelectorAll('[data-tab]')
27
30
 
28
31
  active = tab
29
32
 
@@ -44,7 +47,7 @@
44
47
  <button
45
48
  data-active={active ? active === item.value : item.active}
46
49
  disabled={item.disabled}
47
- on:click={() => setTab(item.value)}
50
+ onclick={() => setTab(item.value)}
48
51
  >
49
52
  {@html item.label}
50
53
  </button>
@@ -52,6 +55,6 @@
52
55
  </div>
53
56
  </div>
54
57
  <div class={styles.content} bind:this={tabContainer}>
55
- <slot />
58
+ {@render children?.()}
56
59
  </div>
57
60
  </section>
@@ -1,3 +1,5 @@
1
+ import type { Snippet } from 'svelte'
2
+
1
3
  export type TabsProps = {
2
4
  items: {
3
5
  label: string
@@ -5,12 +7,16 @@ export type TabsProps = {
5
7
  active?: boolean
6
8
  disabled?: boolean
7
9
  }[]
8
- theme?: 'boxed' | 'outline' | null
10
+ theme?: 'boxed' | 'outline'
9
11
  vertical?: boolean
10
12
  even?: boolean
11
13
  className?: string
12
14
  }
13
15
 
16
+ export type SvelteTabsProps = {
17
+ children: Snippet
18
+ } & TabsProps
19
+
14
20
  export type ReactTabsProps = {
15
21
  children: React.ReactNode
16
22
  } & TabsProps
@@ -13,7 +13,8 @@ const {
13
13
  subText,
14
14
  value = '',
15
15
  disabled,
16
- className
16
+ className,
17
+ ...rest
17
18
  } = Astro.props
18
19
 
19
20
  const classes = [
@@ -41,5 +42,6 @@ const useLabel = !!(label || subText)
41
42
  placeholder={placeholder}
42
43
  disabled={disabled}
43
44
  class:list={classes}
45
+ {...rest}
44
46
  >{value}</textarea>
45
47
  </ConditionalWrapper>
@@ -1,47 +1,51 @@
1
- <script lang="ts">
2
- import type { SvelteTextareaProps } from './textarea'
3
-
4
- import ConditionalWrapper from '../ConditionalWrapper/ConditionalWrapper.svelte'
5
-
6
- import { classNames } from '../../utils/classNames'
7
-
8
- import styles from './textarea.module.scss'
9
-
10
- export let label: SvelteTextareaProps['label'] = ''
11
- export let placeholder: SvelteTextareaProps['placeholder'] = ''
12
- export let subText: SvelteTextareaProps['subText'] = ''
13
- export let value: SvelteTextareaProps['value'] = ''
14
- export let disabled: SvelteTextareaProps['disabled'] = false
15
- export let className: SvelteTextareaProps['className'] = ''
16
- export let onChange: SvelteTextareaProps['onChange'] = () => {}
17
- export let onKeyUp: SvelteTextareaProps['onKeyUp'] = () => {}
18
-
19
- const classes = classNames([
20
- styles.textarea,
21
- className
22
- ])
23
-
24
- const useLabel = !!(label || subText)
25
- </script>
26
-
27
- <ConditionalWrapper
28
- condition={useLabel}
29
- element="label"
30
- class={styles['label-wrapper']}
31
- >
32
- {#if label}
33
- <div class={styles.label}>{label}</div>
34
- {/if}
35
- <textarea
36
- placeholder={placeholder}
37
- disabled={disabled}
38
- class={classes}
39
- on:change={onChange}
40
- on:keyup={onKeyUp}
41
- >{value}</textarea>
42
- {#if subText}
43
- <div class={styles.subtext}>
44
- {@html subText}
45
- </div>
46
- {/if}
47
- </ConditionalWrapper>
1
+ <script lang="ts">
2
+ import type { SvelteTextareaProps } from './textarea'
3
+
4
+ import ConditionalWrapper from '../ConditionalWrapper/ConditionalWrapper.svelte'
5
+
6
+ import { classNames } from '../../utils/classNames'
7
+
8
+ import styles from './textarea.module.scss'
9
+
10
+ const {
11
+ label,
12
+ placeholder,
13
+ subText,
14
+ value = '',
15
+ disabled,
16
+ className,
17
+ onChange,
18
+ onKeyUp,
19
+ ...rest
20
+ }: SvelteTextareaProps = $props()
21
+
22
+ const classes = classNames([
23
+ styles.textarea,
24
+ className
25
+ ])
26
+
27
+ const useLabel = !!(label || subText)
28
+ </script>
29
+
30
+ <ConditionalWrapper
31
+ condition={useLabel}
32
+ element="label"
33
+ class={styles['label-wrapper']}
34
+ >
35
+ {#if label}
36
+ <div class={styles.label}>{label}</div>
37
+ {/if}
38
+ <textarea
39
+ placeholder={placeholder}
40
+ disabled={disabled}
41
+ class={classes}
42
+ onchange={onChange}
43
+ onkeyup={onKeyUp}
44
+ {...rest}
45
+ >{value}</textarea>
46
+ {#if subText}
47
+ <div class={styles.subtext}>
48
+ {@html subText}
49
+ </div>
50
+ {/if}
51
+ </ConditionalWrapper>
@@ -1,18 +1,24 @@
1
- export type TextareaProps = {
2
- label?: string
3
- placeholder?: string
4
- subText?: string
5
- value?: string
6
- disabled?: boolean
7
- className?: string
8
- }
9
-
10
- export type SvelteTextareaProps = {
11
- onChange?: (e: any) => any
12
- onKeyUp?: (e: any) => any
13
- } & TextareaProps
14
-
15
- export type ReactTextareaProps = {
16
- onChange?: (e: any) => any
17
- onKeyUp?: (e: any) => any
18
- } & TextareaProps
1
+ type Target = {
2
+ target: HTMLTextAreaElement
3
+ currentTarget: HTMLTextAreaElement
4
+ }
5
+
6
+ export type TextareaProps = {
7
+ label?: string
8
+ placeholder?: string
9
+ subText?: string
10
+ value?: string
11
+ disabled?: boolean
12
+ className?: string
13
+ [key: string]: any
14
+ }
15
+
16
+ export type SvelteTextareaProps = {
17
+ onChange?: (event: Event & Target) => void
18
+ onKeyUp?: (event: KeyboardEvent & Target) => void
19
+ } & TextareaProps
20
+
21
+ export type ReactTextareaProps = {
22
+ onChange?: (event: React.ChangeEvent<HTMLTextAreaElement> & Target) => void
23
+ onKeyUp?: (event: React.KeyboardEvent<HTMLTextAreaElement> & Target) => void
24
+ } & TextareaProps