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.
- package/README.md +37 -1
- package/astro.d.ts +12 -0
- package/astro.js +12 -0
- package/components/Accordion/accordion.module.scss +1 -2
- package/components/Alert/Alert.tsx +4 -1
- package/components/Alert/alert.module.scss +3 -3
- package/components/Avatar/avatar.module.scss +2 -0
- package/components/Badge/badge.module.scss +1 -1
- package/components/Button/button.module.scss +2 -2
- package/components/Button/button.ts +1 -1
- package/components/Card/card.module.scss +0 -1
- package/components/Checkbox/checkbox.module.scss +4 -4
- package/components/Collapsible/Collapsible.astro +63 -0
- package/components/Collapsible/Collapsible.svelte +48 -0
- package/components/Collapsible/Collapsible.tsx +54 -0
- package/components/Collapsible/collapsible.module.scss +29 -0
- package/components/Collapsible/collapsible.ts +14 -0
- package/components/Icon/map.ts +2 -0
- package/components/Input/input.module.scss +2 -2
- package/components/Menu/Menu.astro +7 -3
- package/components/Menu/Menu.svelte +11 -3
- package/components/Menu/Menu.tsx +7 -1
- package/components/Menu/menu.module.scss +4 -1
- package/components/Menu/menu.ts +1 -0
- package/components/Modal/Modal.astro +70 -0
- package/components/Modal/Modal.svelte +71 -0
- package/components/Modal/Modal.tsx +76 -0
- package/components/Modal/modal.module.scss +103 -0
- package/components/Modal/modal.ts +18 -0
- package/components/Popover/Popover.astro +23 -0
- package/components/Popover/Popover.svelte +21 -0
- package/components/Popover/Popover.tsx +27 -0
- package/components/Popover/popover.module.scss +51 -0
- package/components/Popover/popover.ts +8 -0
- package/components/Progress/progress.module.scss +3 -3
- package/components/Radio/radio.module.scss +1 -2
- package/components/Rating/Rating.astro +2 -2
- package/components/Rating/Rating.svelte +2 -2
- package/components/Rating/Rating.tsx +2 -2
- package/components/Rating/rating.module.scss +1 -1
- package/components/Sheet/Sheet.astro +29 -0
- package/components/Sheet/Sheet.svelte +24 -0
- package/components/Sheet/Sheet.tsx +32 -0
- package/components/Sheet/sheet.module.scss +68 -0
- package/components/Sheet/sheet.ts +10 -0
- package/components/Slider/Slider.astro +44 -0
- package/components/Slider/Slider.svelte +42 -0
- package/components/Slider/Slider.tsx +48 -0
- package/components/Slider/slider.module.scss +68 -0
- package/components/Slider/slider.ts +20 -0
- package/components/Switch/switch.module.scss +1 -1
- package/components/Table/Table.astro +6 -1
- package/components/Table/Table.svelte +3 -1
- package/components/Table/Table.tsx +7 -1
- package/components/Table/table.module.scss +11 -1
- package/components/Table/table.ts +1 -0
- package/components/Tabs/tabs.module.scss +6 -1
- package/components/Textarea/Textarea.astro +44 -0
- package/components/Textarea/Textarea.svelte +45 -0
- package/components/Textarea/Textarea.tsx +50 -0
- package/components/Textarea/textarea.module.scss +36 -0
- package/components/Textarea/textarea.ts +18 -0
- package/components/ThemeSwitcher/ThemeSwitcher.astro +1 -0
- package/components/ThemeSwitcher/ThemeSwitcher.svelte +2 -1
- package/components/ThemeSwitcher/ThemeSwitcher.tsx +2 -1
- package/components/Timeline/timeline.module.scss +4 -4
- package/components/TimelineItem/TimelineItem.tsx +1 -6
- package/components/TimelineItem/timelineitem.module.scss +2 -3
- package/components/TimelineItem/timelineitem.ts +5 -0
- package/components/Toast/Toast.svelte +11 -6
- package/icons/close.svg +3 -0
- package/icons.d.ts +1 -0
- package/icons.js +1 -0
- package/index.d.ts +69 -0
- package/index.js +4 -0
- package/package.json +2 -1
- package/react.d.ts +14 -2
- package/react.js +12 -0
- package/scss/config/color-palette.scss +1 -0
- package/scss/config/mixins.scss +152 -155
- package/scss/config/typography.scss +8 -9
- package/scss/global/theme.scss +71 -38
- package/scss/global/tooltip.scss +5 -3
- package/scss/global/utility.scss +76 -58
- package/scss/resets.scss +10 -5
- package/scss/setup.scss +2 -2
- package/svelte.d.ts +12 -0
- package/svelte.js +12 -0
- package/utils/debounce.ts +24 -0
- package/utils/interpolate.ts +23 -0
- package/utils/modal.ts +59 -0
- package/utils/popover.ts +201 -0
- 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,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
|
|
@@ -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
|
|
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(
|
|
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
|
}
|
|
@@ -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(
|
|
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
|
|
@@ -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
|
-
|
|
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,
|