webcoreui 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +37 -1
  2. package/astro.d.ts +12 -0
  3. package/astro.js +12 -0
  4. package/components/Accordion/accordion.module.scss +1 -2
  5. package/components/Alert/Alert.tsx +4 -1
  6. package/components/Alert/alert.module.scss +3 -3
  7. package/components/Avatar/avatar.module.scss +2 -0
  8. package/components/Badge/badge.module.scss +1 -1
  9. package/components/Button/button.module.scss +2 -2
  10. package/components/Button/button.ts +1 -1
  11. package/components/Card/card.module.scss +0 -1
  12. package/components/Checkbox/checkbox.module.scss +4 -4
  13. package/components/Collapsible/Collapsible.astro +63 -0
  14. package/components/Collapsible/Collapsible.svelte +48 -0
  15. package/components/Collapsible/Collapsible.tsx +54 -0
  16. package/components/Collapsible/collapsible.module.scss +29 -0
  17. package/components/Collapsible/collapsible.ts +14 -0
  18. package/components/Icon/map.ts +2 -0
  19. package/components/Input/input.module.scss +2 -2
  20. package/components/Menu/Menu.astro +7 -3
  21. package/components/Menu/Menu.svelte +11 -3
  22. package/components/Menu/Menu.tsx +7 -1
  23. package/components/Menu/menu.module.scss +4 -1
  24. package/components/Menu/menu.ts +1 -0
  25. package/components/Modal/Modal.astro +70 -0
  26. package/components/Modal/Modal.svelte +71 -0
  27. package/components/Modal/Modal.tsx +76 -0
  28. package/components/Modal/modal.module.scss +103 -0
  29. package/components/Modal/modal.ts +18 -0
  30. package/components/Popover/Popover.astro +23 -0
  31. package/components/Popover/Popover.svelte +21 -0
  32. package/components/Popover/Popover.tsx +27 -0
  33. package/components/Popover/popover.module.scss +51 -0
  34. package/components/Popover/popover.ts +8 -0
  35. package/components/Progress/progress.module.scss +3 -3
  36. package/components/Radio/radio.module.scss +1 -2
  37. package/components/Rating/Rating.astro +2 -2
  38. package/components/Rating/Rating.svelte +2 -2
  39. package/components/Rating/Rating.tsx +2 -2
  40. package/components/Rating/rating.module.scss +1 -1
  41. package/components/Sheet/Sheet.astro +29 -0
  42. package/components/Sheet/Sheet.svelte +24 -0
  43. package/components/Sheet/Sheet.tsx +32 -0
  44. package/components/Sheet/sheet.module.scss +68 -0
  45. package/components/Sheet/sheet.ts +10 -0
  46. package/components/Slider/Slider.astro +44 -0
  47. package/components/Slider/Slider.svelte +42 -0
  48. package/components/Slider/Slider.tsx +48 -0
  49. package/components/Slider/slider.module.scss +68 -0
  50. package/components/Slider/slider.ts +20 -0
  51. package/components/Switch/switch.module.scss +1 -1
  52. package/components/Table/Table.astro +6 -1
  53. package/components/Table/Table.svelte +3 -1
  54. package/components/Table/Table.tsx +7 -1
  55. package/components/Table/table.module.scss +11 -1
  56. package/components/Table/table.ts +1 -0
  57. package/components/Tabs/tabs.module.scss +6 -1
  58. package/components/Textarea/Textarea.astro +44 -0
  59. package/components/Textarea/Textarea.svelte +45 -0
  60. package/components/Textarea/Textarea.tsx +50 -0
  61. package/components/Textarea/textarea.module.scss +36 -0
  62. package/components/Textarea/textarea.ts +18 -0
  63. package/components/ThemeSwitcher/ThemeSwitcher.astro +1 -0
  64. package/components/ThemeSwitcher/ThemeSwitcher.svelte +2 -1
  65. package/components/ThemeSwitcher/ThemeSwitcher.tsx +2 -1
  66. package/components/Timeline/timeline.module.scss +4 -4
  67. package/components/TimelineItem/TimelineItem.tsx +1 -6
  68. package/components/TimelineItem/timelineitem.module.scss +2 -3
  69. package/components/TimelineItem/timelineitem.ts +5 -0
  70. package/components/Toast/Toast.svelte +11 -6
  71. package/icons/close.svg +3 -0
  72. package/icons.d.ts +1 -0
  73. package/icons.js +1 -0
  74. package/index.d.ts +69 -0
  75. package/index.js +4 -0
  76. package/package.json +2 -1
  77. package/react.d.ts +14 -2
  78. package/react.js +12 -0
  79. package/scss/config/color-palette.scss +1 -0
  80. package/scss/config/mixins.scss +152 -155
  81. package/scss/config/typography.scss +8 -9
  82. package/scss/global/theme.scss +71 -38
  83. package/scss/global/tooltip.scss +5 -3
  84. package/scss/global/utility.scss +76 -58
  85. package/scss/resets.scss +10 -5
  86. package/scss/setup.scss +2 -2
  87. package/svelte.d.ts +12 -0
  88. package/svelte.js +12 -0
  89. package/utils/debounce.ts +24 -0
  90. package/utils/interpolate.ts +23 -0
  91. package/utils/modal.ts +59 -0
  92. package/utils/popover.ts +201 -0
  93. package/utils/toast.ts +0 -6
@@ -0,0 +1,68 @@
1
+ @import '../../scss/config.scss';
2
+
3
+ .sheet {
4
+ @include position(t0, 'r-100%', lauto);
5
+ @include visibility(1);
6
+ @include border-radius(none);
7
+ @include size(100%);
8
+ @include border(0);
9
+ @include border(left, primary-50);
10
+
11
+ transform: none;
12
+
13
+ &[data-show="true"] {
14
+ @include position(r0);
15
+
16
+ transform: none;
17
+ }
18
+
19
+ &.left {
20
+ @include position('l-100%', rauto);
21
+ @include border(0);
22
+ @include border(right, primary-50);
23
+
24
+ &[data-show="true"] {
25
+ @include position(l0);
26
+ }
27
+ }
28
+
29
+ &.top {
30
+ @include position(t0, l0);
31
+ @include size(hauto);
32
+ @include border(0);
33
+ @include border(bottom, primary-50);
34
+
35
+ transform: translateY(-100%);
36
+ min-width: 100%;
37
+
38
+ &[data-show="true"] {
39
+ transform: translateY(0);
40
+ }
41
+ }
42
+
43
+ &.bottom {
44
+ @include position(b0, l0);
45
+ @include size(hauto);
46
+ @include border(0);
47
+ @include border(top, primary-50);
48
+
49
+ transform: translateY(100%);
50
+ top: auto;
51
+ min-width: 100%;
52
+
53
+ &[data-show="true"] {
54
+ transform: translateY(0);
55
+ }
56
+ }
57
+ }
58
+
59
+ @include media(xs) {
60
+ .sheet {
61
+ @include position(r-500px);
62
+ @include size(w500px);
63
+
64
+ &.left {
65
+ @include position(l-500px);
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,10 @@
1
+ import type { ModalProps, ReactModalProps } from '../Modal/modal'
2
+
3
+ export type SheetProps = {
4
+ position?: 'left'
5
+ | 'top'
6
+ | 'bottom'
7
+ | null
8
+ } & ModalProps
9
+
10
+ export type ReactSheetProps = SheetProps & ReactModalProps
@@ -0,0 +1,44 @@
1
+ ---
2
+ import type { SliderProps } from './slider'
3
+
4
+ import styles from './slider.module.scss'
5
+ import { classNames } from '../../utils/classNames'
6
+
7
+ interface Props extends SliderProps {}
8
+
9
+ const {
10
+ min,
11
+ max,
12
+ value,
13
+ step,
14
+ disabled,
15
+ color,
16
+ background,
17
+ thumb,
18
+ id,
19
+ className
20
+ } = Astro.props
21
+
22
+ const classes = [
23
+ styles.slider,
24
+ className
25
+ ]
26
+
27
+ const styleVariables = classNames([
28
+ color && `--w-slider-color: ${color};`,
29
+ background && `--w-slider-background: ${background};`,
30
+ thumb && `--w-slider-thumb: ${thumb};`
31
+ ])
32
+ ---
33
+
34
+ <input
35
+ type="range"
36
+ min={min}
37
+ max={max}
38
+ value={value || min}
39
+ step={step}
40
+ disabled={disabled}
41
+ class:list={classes}
42
+ id={id}
43
+ style={styleVariables}
44
+ />
@@ -0,0 +1,42 @@
1
+ <script lang="ts">
2
+ import type { SvelteSliderProps } from './slider'
3
+
4
+ import styles from './slider.module.scss'
5
+ import { classNames } from '../../utils/classNames'
6
+
7
+ export let min: SvelteSliderProps['min'] = 0
8
+ export let max: SvelteSliderProps['max'] = 100
9
+ export let value: SvelteSliderProps['value'] = 0
10
+ export let step: SvelteSliderProps['step'] = 1
11
+ export let disabled: SvelteSliderProps['disabled'] = false
12
+ export let color: SvelteSliderProps['color'] = ''
13
+ export let background: SvelteSliderProps['background'] = ''
14
+ export let thumb: SvelteSliderProps['thumb'] = ''
15
+ export let id: SvelteSliderProps['id'] = ''
16
+ export let className: SvelteSliderProps['className'] = ''
17
+ export let onChange: SvelteSliderProps['onChange'] = () => {}
18
+
19
+ const classes = classNames([
20
+ styles.slider,
21
+ className
22
+ ])
23
+
24
+ const styleVariables = classNames([
25
+ color && `--w-slider-color: ${color};`,
26
+ background && `--w-slider-background: ${background};`,
27
+ thumb && `--w-slider-thumb: ${thumb};`
28
+ ])
29
+ </script>
30
+
31
+ <input
32
+ type="range"
33
+ min={min}
34
+ max={max}
35
+ value={value || min}
36
+ step={step}
37
+ disabled={disabled}
38
+ class={classes}
39
+ id={id || null}
40
+ style={styleVariables || null}
41
+ on:change={onChange}
42
+ />
@@ -0,0 +1,48 @@
1
+ import React from 'react'
2
+ import type { ReactSliderProps } from './slider'
3
+
4
+ import styles from './slider.module.scss'
5
+ import { classNames } from '../../utils/classNames'
6
+
7
+ const Slider = ({
8
+ min,
9
+ max,
10
+ value,
11
+ step,
12
+ disabled,
13
+ color,
14
+ background,
15
+ thumb,
16
+ id,
17
+ className,
18
+ onChange
19
+ }: ReactSliderProps) => {
20
+ const classes = classNames([
21
+ styles.slider,
22
+ className
23
+ ])
24
+
25
+ const styleVariables = {
26
+ ...(color && { '--w-slider-color': color }),
27
+ ...(background && { '--w-slider-background': background }),
28
+ ...(thumb && { '--w-slider-thumb': thumb })
29
+ } as React.CSSProperties
30
+
31
+ return (
32
+ <input
33
+ type="range"
34
+ min={min}
35
+ max={max}
36
+ defaultValue={value || min}
37
+ step={step}
38
+ disabled={disabled}
39
+ className={classes}
40
+ id={id}
41
+ style={styleVariables}
42
+ onChange={onChange}
43
+ />
44
+
45
+ )
46
+ }
47
+
48
+ export default Slider
@@ -0,0 +1,68 @@
1
+ @import '../../scss/config.scss';
2
+
3
+ body {
4
+ --w-slider-background: var(--w-color-primary-50);
5
+ --w-slider-color: var(--w-color-primary);
6
+ --w-slider-thumb: var(--w-color-primary-50);
7
+ }
8
+
9
+ .slider {
10
+ @include border-radius(xl);
11
+ @include size('w100%');
12
+ @include visibility(hidden);
13
+ @include size(h10px);
14
+ @include spacing(m0);
15
+
16
+ -webkit-appearance: none;
17
+ appearance: none;
18
+ cursor: pointer;
19
+
20
+ &[disabled]::-webkit-slider-runnable-track {
21
+ @include background(primary-50);
22
+ }
23
+
24
+ &[disabled]::-moz-range-track {
25
+ @include background(primary-50);
26
+ }
27
+
28
+ &[disabled]::-webkit-slider-thumb {
29
+ @include background(primary-50);
30
+ @include border(primary-30);
31
+ box-shadow: -995px 0 0 990px var(--w-color-primary-30);
32
+ }
33
+
34
+ &[disabled]::-moz-range-thumb {
35
+ @include background(primary-50);
36
+ @include border(primary-30);
37
+ box-shadow: -995px 0 0 990px var(--w-color-primary-30);
38
+ }
39
+ }
40
+
41
+ .slider::-webkit-slider-runnable-track {
42
+ @include background(var(--w-slider-background));
43
+ }
44
+
45
+ .slider::-moz-range-track {
46
+ @include background(var(--w-slider-background));
47
+ @include size(h10px);
48
+ }
49
+
50
+ .slider::-webkit-slider-thumb {
51
+ @include background(var(--w-slider-thumb));
52
+ @include size(10px);
53
+ @include border-radius(max);
54
+ @include border(var(--w-slider-color));
55
+
56
+ -webkit-appearance: none;
57
+ appearance: none;
58
+ box-shadow: -995px 0 0 990px var(--w-slider-color);
59
+ }
60
+
61
+ .slider::-moz-range-thumb {
62
+ @include background(var(--w-slider-thumb));
63
+ @include size(9px);
64
+ @include border-radius(max);
65
+ @include border(var(--w-slider-color));
66
+
67
+ box-shadow: -995px 0 0 990px var(--w-slider-color);
68
+ }
@@ -0,0 +1,20 @@
1
+ export type SliderProps = {
2
+ min: number
3
+ max: number
4
+ value?: number
5
+ step?: number
6
+ disabled?: boolean
7
+ color?: string
8
+ background?: string
9
+ thumb?: string
10
+ id?: string
11
+ className?: string
12
+ }
13
+
14
+ export type SvelteSliderProps = {
15
+ onChange?: (e: any) => any
16
+ } & SliderProps
17
+
18
+ export type ReactSliderProps = {
19
+ onChange?: (e: any) => any
20
+ } & SliderProps
@@ -36,7 +36,7 @@ body {
36
36
  }
37
37
 
38
38
  .label {
39
- @include typography(sm);
39
+ @include typography(md);
40
40
  }
41
41
  }
42
42
 
@@ -12,6 +12,7 @@ const {
12
12
  striped,
13
13
  offsetStripe,
14
14
  compact,
15
+ maxHeight,
15
16
  className
16
17
  } = Astro.props
17
18
 
@@ -21,11 +22,15 @@ const classes = [
21
22
  striped && styles[`striped-${striped}s`],
22
23
  offsetStripe && styles.offset,
23
24
  compact && styles.compact,
25
+ maxHeight && styles.scroll,
24
26
  className
25
27
  ]
26
28
  ---
27
29
 
28
- <div class:list={classes}>
30
+ <div
31
+ class:list={classes}
32
+ style={maxHeight ? `max-height:${maxHeight}` : undefined}
33
+ >
29
34
  <table>
30
35
  {headings?.length && (
31
36
  <thead>
@@ -11,6 +11,7 @@
11
11
  export let striped: TableProps['striped'] = null
12
12
  export let offsetStripe: TableProps['offsetStripe'] = false
13
13
  export let compact: TableProps['compact'] = false
14
+ export let maxHeight: TableProps['maxHeight'] = 0
14
15
  export let className: TableProps['className'] = ''
15
16
 
16
17
  const classes = classNames([
@@ -19,11 +20,12 @@
19
20
  striped && styles[`striped-${striped}s`],
20
21
  offsetStripe && styles.offset,
21
22
  compact && styles.compact,
23
+ maxHeight && styles.scroll,
22
24
  className
23
25
  ])
24
26
  </script>
25
27
 
26
- <div class={classes}>
28
+ <div class={classes} style={maxHeight ? `max-height:${maxHeight}` : null}>
27
29
  <table>
28
30
  {#if headings?.length}
29
31
  <thead>
@@ -12,6 +12,7 @@ const Table = ({
12
12
  striped,
13
13
  offsetStripe,
14
14
  compact,
15
+ maxHeight,
15
16
  className
16
17
  }: TableProps) => {
17
18
  const classes = classNames([
@@ -20,11 +21,16 @@ const Table = ({
20
21
  striped && styles[`striped-${striped}s`],
21
22
  offsetStripe && styles.offset,
22
23
  compact && styles.compact,
24
+ maxHeight && styles.scroll,
23
25
  className
24
26
  ])
25
27
 
28
+ const styleVariables = {
29
+ ...(maxHeight && { 'max-height': maxHeight })
30
+ } as React.CSSProperties
31
+
26
32
  return (
27
- <div className={classes}>
33
+ <div className={classes} style={styleVariables}>
28
34
  <table>
29
35
  {headings?.length && (
30
36
  <thead>
@@ -5,7 +5,7 @@
5
5
 
6
6
  table {
7
7
  @include size('w100%');
8
- @include typography(md, left);
8
+ @include typography(left);
9
9
 
10
10
  border-collapse: collapse;
11
11
  }
@@ -57,4 +57,14 @@
57
57
  @include spacing(py-xxs, px-sm);
58
58
  }
59
59
  }
60
+
61
+ &.scroll {
62
+ @include spacing(pr-sm);
63
+
64
+ thead {
65
+ @include position(sticky, t0);
66
+ @include background(primary-70);
67
+ box-shadow: 0 .5px 0 var(--w-color-primary-50);
68
+ }
69
+ }
60
70
  }
@@ -6,5 +6,6 @@ export type TableProps = {
6
6
  striped?: 'column' | 'row' | null
7
7
  offsetStripe?: boolean
8
8
  compact?: boolean
9
+ maxHeight?: number
9
10
  className?: string
10
11
  }
@@ -7,6 +7,7 @@
7
7
  @include border-radius(md);
8
8
  @include spacing(p-xs);
9
9
  @include size(wmax-content);
10
+ @include border(0);
10
11
 
11
12
  button {
12
13
  @include transition();
@@ -46,6 +47,10 @@
46
47
  &.outline .items button {
47
48
  @include border(bottom, 0);
48
49
  }
50
+
51
+ &:not(.outline) .items {
52
+ @include border(0);
53
+ }
49
54
 
50
55
  .items {
51
56
  @include layout(column, xs);
@@ -76,7 +81,7 @@
76
81
  button {
77
82
  @include transition(color);
78
83
  @include background(transparent);
79
- @include typography(md, primary-20);
84
+ @include typography(default, primary-20);
80
85
  @include border(0);
81
86
  @include spacing(p-md);
82
87
  @include layout(flex, v-center, sm);
@@ -0,0 +1,44 @@
1
+ ---
2
+ import type { TextareaProps } from './textarea'
3
+ import ConditionalWrapper from '../ConditionalWrapper/ConditionalWrapper.astro'
4
+
5
+ import styles from './textarea.module.scss'
6
+
7
+ interface Props extends TextareaProps {}
8
+
9
+ const {
10
+ label,
11
+ placeholder,
12
+ subText,
13
+ value = '',
14
+ disabled,
15
+ className
16
+ } = Astro.props
17
+
18
+ const classes = [
19
+ styles.textarea,
20
+ className
21
+ ]
22
+
23
+ const useLabel = !!(label || subText)
24
+ ---
25
+
26
+ <ConditionalWrapper condition={useLabel}>
27
+ <label slot="wrapper" class={styles['label-wrapper']}>
28
+ {label && (
29
+ <div class={styles.label}>{label}</div>
30
+ )}
31
+ children
32
+ {subText && (
33
+ <div class={styles.subtext}>
34
+ <Fragment set:html={subText} />
35
+ </div>
36
+ )}
37
+ </label>
38
+
39
+ <textarea
40
+ placeholder={placeholder}
41
+ disabled={disabled}
42
+ class:list={classes}
43
+ >{value}</textarea>
44
+ </ConditionalWrapper>
@@ -0,0 +1,45 @@
1
+ <script lang="ts">
2
+ import type { SvelteTextareaProps } from './textarea'
3
+ import ConditionalWrapper from '../ConditionalWrapper/ConditionalWrapper.svelte'
4
+
5
+ import styles from './textarea.module.scss'
6
+ import { classNames } from '../../utils/classNames'
7
+
8
+ export let label: SvelteTextareaProps['label'] = ''
9
+ export let placeholder: SvelteTextareaProps['placeholder'] = ''
10
+ export let subText: SvelteTextareaProps['subText'] = ''
11
+ export let value: SvelteTextareaProps['value'] = ''
12
+ export let disabled: SvelteTextareaProps['disabled'] = false
13
+ export let className: SvelteTextareaProps['className'] = ''
14
+ export let onChange: SvelteTextareaProps['onChange'] = () => {}
15
+ export let onKeyUp: SvelteTextareaProps['onKeyUp'] = () => {}
16
+
17
+ const classes = classNames([
18
+ styles.textarea,
19
+ className
20
+ ])
21
+
22
+ const useLabel = !!(label || subText)
23
+ </script>
24
+
25
+ <ConditionalWrapper
26
+ condition={useLabel}
27
+ element="label"
28
+ class={styles['label-wrapper']}
29
+ >
30
+ {#if label}
31
+ <div class={styles.label}>{label}</div>
32
+ {/if}
33
+ <textarea
34
+ placeholder={placeholder}
35
+ disabled={disabled}
36
+ class={classes}
37
+ on:change={onChange}
38
+ on:keyup={onKeyUp}
39
+ >{value}</textarea>
40
+ {#if subText}
41
+ <div class={styles.subtext}>
42
+ {@html subText}
43
+ </div>
44
+ {/if}
45
+ </ConditionalWrapper>
@@ -0,0 +1,50 @@
1
+ import React from 'react'
2
+ import type { ReactTextareaProps } from './textarea'
3
+ import ConditionalWrapper from '../ConditionalWrapper/ConditionalWrapper.tsx'
4
+
5
+ import styles from './textarea.module.scss'
6
+ import { classNames } from '../../utils/classNames'
7
+
8
+ const Textarea = ({
9
+ label,
10
+ placeholder,
11
+ subText,
12
+ value = '',
13
+ disabled,
14
+ className,
15
+ ...rest
16
+ }: ReactTextareaProps) => {
17
+ const classes = classNames([
18
+ styles.textarea,
19
+ className
20
+ ])
21
+
22
+ const useLabel = !!(label || subText)
23
+
24
+ return (
25
+ <ConditionalWrapper condition={useLabel} wrapper={children => (
26
+ <label className={styles['label-wrapper']}>
27
+ {label && (
28
+ <div className={styles.label}>{label}</div>
29
+ )}
30
+ {children}
31
+ {subText && (
32
+ <div
33
+ className={styles.subtext}
34
+ dangerouslySetInnerHTML={{ __html: subText }}
35
+ />
36
+ )}
37
+ </label>
38
+ )}>
39
+ <textarea
40
+ placeholder={placeholder}
41
+ disabled={disabled}
42
+ className={classes}
43
+ defaultValue={value}
44
+ {...rest}
45
+ />
46
+ </ConditionalWrapper>
47
+ )
48
+ }
49
+
50
+ export default Textarea
@@ -0,0 +1,36 @@
1
+ @import '../../scss/config.scss';
2
+
3
+ .textarea {
4
+ @include size('w100%');
5
+ @include background(transparent);
6
+ @include border-radius(sm);
7
+ @include border(primary-50);
8
+ @include spacing(p-sm);
9
+ @include typography(regular, primary, hlg);
10
+
11
+ min-height: 50px;
12
+ resize: vertical;
13
+
14
+ &[disabled] {
15
+ @include typography(primary-30);
16
+ cursor: no-drop;
17
+ }
18
+
19
+ &::placeholder {
20
+ @include typography(primary-30);
21
+ }
22
+ }
23
+
24
+ .label-wrapper {
25
+ @include layout(flex, column);
26
+
27
+ .label {
28
+ @include typography(primary-20);
29
+ @include spacing(mb-xs);
30
+ }
31
+
32
+ .subtext {
33
+ @include typography(md, primary-30);
34
+ @include spacing(mt-xs);
35
+ }
36
+ }
@@ -0,0 +1,18 @@
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
@@ -38,6 +38,7 @@ const buttonClasses = [
38
38
  <button
39
39
  style={!useIcons ? `background:${theme};` : undefined}
40
40
  data-theme={themes[theme]}
41
+ aria-label={themes[theme]}
41
42
  class:list={buttonClasses}
42
43
  >
43
44
  {index === 0 && <slot name="primaryIcon" />}
@@ -61,9 +61,10 @@
61
61
  >
62
62
  {#each Object.keys(themes) as theme, index}
63
63
  <button
64
+ on:click={() => setTheme(toggle ? index : themes[theme])}
64
65
  style={!useIcons ? `background:${theme};` : undefined}
65
66
  data-active={currentTheme === themes[theme]}
66
- on:click={() => setTheme(toggle ? index : themes[theme])}
67
+ aria-label={themes[theme]}
67
68
  class={classNames([
68
69
  styles.switch,
69
70
  useIcons && styles.icons
@@ -70,8 +70,9 @@ const ThemeSwitcher = ({
70
70
  {Object.keys(themes as {}).map((theme, index) => (
71
71
  <button
72
72
  key={index}
73
- data-active={currentTheme === themes[theme]}
74
73
  onClick={() => setTheme(toggle ? index : themes[theme])}
74
+ data-active={currentTheme === themes[theme]}
75
+ aria-label={themes[theme]}
75
76
  style={!useIcons ? { background: theme } : undefined}
76
77
  className={classNames([
77
78
  styles.switch,