@scalewing/react 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/CHANGELOG.md +48 -0
- package/README.md +23 -2
- package/dist/components/Accordion.d.ts +8 -0
- package/dist/components/Accordion.js +14 -0
- package/dist/components/AppHeader.d.ts +5 -0
- package/dist/components/AppHeader.js +7 -0
- package/dist/components/Badge.d.ts +13 -0
- package/dist/components/Badge.js +7 -0
- package/dist/components/BarChart.d.ts +16 -0
- package/dist/components/BarChart.js +13 -0
- package/dist/components/Box.d.ts +4 -4
- package/dist/components/Box.js +1 -1
- package/dist/components/Button.d.ts +17 -0
- package/dist/components/Button.js +7 -0
- package/dist/components/Card.d.ts +2 -2
- package/dist/components/Card.js +2 -2
- package/dist/components/Dialog.d.ts +8 -0
- package/dist/components/Dialog.js +36 -0
- package/dist/components/Field.d.ts +11 -0
- package/dist/components/Field.js +6 -0
- package/dist/components/Nav.d.ts +3 -0
- package/dist/components/Nav.js +7 -0
- package/dist/components/SegmentedControl.d.ts +19 -0
- package/dist/components/SegmentedControl.js +28 -0
- package/dist/components/Select.d.ts +17 -0
- package/dist/components/Select.js +107 -0
- package/dist/components/Split.d.ts +8 -0
- package/dist/components/Split.js +117 -0
- package/dist/components/Table.d.ts +32 -0
- package/dist/components/Table.js +24 -0
- package/dist/components/Text.d.ts +3 -3
- package/dist/components/Text.js +2 -1
- package/dist/components/Toast.d.ts +10 -0
- package/dist/components/Toast.js +61 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +13 -0
- package/dist/palette/amber.css +21 -0
- package/dist/palette/capri.css +21 -0
- package/dist/palette/cerulean.css +21 -0
- package/dist/palette/cornflower.css +21 -0
- package/dist/palette/fuchsia.css +21 -0
- package/dist/palette/harvest.css +31 -0
- package/dist/palette/ink.css +21 -0
- package/dist/palette/mocha.css +31 -0
- package/dist/palette/navy.css +21 -0
- package/dist/palette/postcard.css +31 -0
- package/dist/palette/raspberry.css +21 -0
- package/dist/palette/sky.css +21 -0
- package/dist/palette/soft-blue.css +21 -0
- package/dist/palette/sunburst.css +31 -0
- package/dist/palette/synthwave.css +26 -0
- package/dist/palette/tangerine.css +21 -0
- package/dist/select-list.d.ts +7 -0
- package/dist/select-list.js +24 -0
- package/dist/split-size.d.ts +18 -0
- package/dist/split-size.js +94 -0
- package/dist/styles.css +1228 -23
- package/dist/theme/ThemeProvider.d.ts +4 -3
- package/dist/theme/ThemeProvider.js +8 -3
- package/dist/toast-travel.d.ts +16 -0
- package/dist/toast-travel.js +42 -0
- package/package.json +7 -3
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* Generated by @scalewing/tokens. Do not edit by hand. */
|
|
2
|
+
:root,
|
|
3
|
+
[data-theme='light'] {
|
|
4
|
+
--sw-color-background: #F6DCAC;
|
|
5
|
+
--sw-color-surface: #FBF0D8;
|
|
6
|
+
--sw-color-text: #1D1D1F;
|
|
7
|
+
--sw-color-muted: #5C5346;
|
|
8
|
+
--sw-color-accent: #A33B20;
|
|
9
|
+
--sw-color-onAccent: #FFFFFF;
|
|
10
|
+
--sw-color-border: #E5C48A;
|
|
11
|
+
--sw-glass-blur: 24px;
|
|
12
|
+
--sw-glass-saturate: 1;
|
|
13
|
+
--sw-glass-fill: rgba(255, 255, 255, 1);
|
|
14
|
+
--sw-glass-border: rgba(210, 210, 215, 1);
|
|
15
|
+
--sw-glass-specular: rgba(255, 255, 255, 0);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
[data-theme='dark'] {
|
|
19
|
+
--sw-color-background: #012D4E;
|
|
20
|
+
--sw-color-surface: #0A3D5C;
|
|
21
|
+
--sw-color-text: #F6DCAC;
|
|
22
|
+
--sw-color-muted: #C4A882;
|
|
23
|
+
--sw-color-accent: #FAA968;
|
|
24
|
+
--sw-color-onAccent: #101214;
|
|
25
|
+
--sw-color-border: #1A5A70;
|
|
26
|
+
--sw-glass-blur: 24px;
|
|
27
|
+
--sw-glass-saturate: 1.8;
|
|
28
|
+
--sw-glass-fill: rgba(68, 53, 43, 0.72);
|
|
29
|
+
--sw-glass-border: rgba(253, 221, 195, 0.22);
|
|
30
|
+
--sw-glass-specular: rgba(254, 238, 225, 0.28);
|
|
31
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/* Generated by @scalewing/tokens. Do not edit by hand. */
|
|
2
|
+
:root,
|
|
3
|
+
[data-theme='light'] {
|
|
4
|
+
--sw-color-accent: #D81B60;
|
|
5
|
+
--sw-color-onAccent: #FFFFFF;
|
|
6
|
+
--sw-glass-blur: 24px;
|
|
7
|
+
--sw-glass-saturate: 1;
|
|
8
|
+
--sw-glass-fill: rgba(255, 255, 255, 1);
|
|
9
|
+
--sw-glass-border: rgba(210, 210, 215, 1);
|
|
10
|
+
--sw-glass-specular: rgba(255, 255, 255, 0);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
[data-theme='dark'] {
|
|
14
|
+
--sw-color-background: #1A0533;
|
|
15
|
+
--sw-color-surface: #241043;
|
|
16
|
+
--sw-color-text: #F5F5F7;
|
|
17
|
+
--sw-color-muted: #C9B8E8;
|
|
18
|
+
--sw-color-accent: #FF2A6D;
|
|
19
|
+
--sw-color-onAccent: #101214;
|
|
20
|
+
--sw-color-border: #4A2C6A;
|
|
21
|
+
--sw-glass-blur: 24px;
|
|
22
|
+
--sw-glass-saturate: 1.8;
|
|
23
|
+
--sw-glass-fill: rgba(69, 31, 44, 0.72);
|
|
24
|
+
--sw-glass-border: rgba(255, 170, 197, 0.22);
|
|
25
|
+
--sw-glass-specular: rgba(255, 212, 226, 0.28);
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* Generated by @scalewing/tokens. Do not edit by hand. */
|
|
2
|
+
:root,
|
|
3
|
+
[data-theme='light'] {
|
|
4
|
+
--sw-color-accent: #C2410C;
|
|
5
|
+
--sw-color-onAccent: #FFFFFF;
|
|
6
|
+
--sw-glass-blur: 24px;
|
|
7
|
+
--sw-glass-saturate: 1;
|
|
8
|
+
--sw-glass-fill: rgba(255, 255, 255, 1);
|
|
9
|
+
--sw-glass-border: rgba(210, 210, 215, 1);
|
|
10
|
+
--sw-glass-specular: rgba(255, 255, 255, 0);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
[data-theme='dark'] {
|
|
14
|
+
--sw-color-accent: #FB923C;
|
|
15
|
+
--sw-color-onAccent: #101214;
|
|
16
|
+
--sw-glass-blur: 24px;
|
|
17
|
+
--sw-glass-saturate: 1.8;
|
|
18
|
+
--sw-glass-fill: rgba(68, 49, 35, 0.72);
|
|
19
|
+
--sw-glass-border: rgba(253, 211, 177, 0.22);
|
|
20
|
+
--sw-glass-specular: rgba(254, 233, 216, 0.28);
|
|
21
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type SelectOption = {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function selectedSelectIndex(options: readonly SelectOption[], value: string): number;
|
|
6
|
+
export declare function nextSelectIndex(current: number, delta: number, length: number): number;
|
|
7
|
+
export declare function selectIndexForKey(key: string, current: number, length: number): number | null;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function selectedSelectIndex(options, value) {
|
|
2
|
+
const index = options.findIndex((option) => option.value === value);
|
|
3
|
+
return index < 0 ? 0 : index;
|
|
4
|
+
}
|
|
5
|
+
export function nextSelectIndex(current, delta, length) {
|
|
6
|
+
if (length <= 0) {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
return Math.min(length - 1, Math.max(0, current + delta));
|
|
10
|
+
}
|
|
11
|
+
export function selectIndexForKey(key, current, length) {
|
|
12
|
+
switch (key) {
|
|
13
|
+
case 'ArrowDown':
|
|
14
|
+
return nextSelectIndex(current, 1, length);
|
|
15
|
+
case 'ArrowUp':
|
|
16
|
+
return nextSelectIndex(current, -1, length);
|
|
17
|
+
case 'Home':
|
|
18
|
+
return 0;
|
|
19
|
+
case 'End':
|
|
20
|
+
return Math.max(0, length - 1);
|
|
21
|
+
default:
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type SplitMetrics = {
|
|
2
|
+
min: number;
|
|
3
|
+
max: number;
|
|
4
|
+
step: number;
|
|
5
|
+
};
|
|
6
|
+
export type SplitSnapshot = {
|
|
7
|
+
collapsed: boolean;
|
|
8
|
+
width: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function cssLengthToPx(value: string, remPx?: number): number;
|
|
11
|
+
export declare function readSplitMetrics(read: (name: string) => string, remPx?: number): SplitMetrics & {
|
|
12
|
+
defaultWidth: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function clampSplitSize(size: number, min: number, max: number): number;
|
|
15
|
+
export declare function splitPercent(width: number, min: number, max: number): number;
|
|
16
|
+
export declare function effectiveSplitMax(tokenMax: number, parentWidth: number, handleWidth: number, min: number): number;
|
|
17
|
+
export declare function applySplitDrag(start: SplitSnapshot, deltaX: number, metrics: SplitMetrics): SplitSnapshot;
|
|
18
|
+
export declare function applySplitKey(key: string, start: SplitSnapshot, metrics: SplitMetrics): SplitSnapshot | null;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { spacingScale, splitScale } from '@scalewing/tokens';
|
|
2
|
+
export function cssLengthToPx(value, remPx = 16) {
|
|
3
|
+
const trimmed = value.trim();
|
|
4
|
+
if (trimmed.endsWith('rem')) {
|
|
5
|
+
const count = Number.parseFloat(trimmed);
|
|
6
|
+
return Number.isFinite(count) ? count * remPx : 0;
|
|
7
|
+
}
|
|
8
|
+
if (trimmed.endsWith('px')) {
|
|
9
|
+
const count = Number.parseFloat(trimmed);
|
|
10
|
+
return Number.isFinite(count) ? count : 0;
|
|
11
|
+
}
|
|
12
|
+
const count = Number.parseFloat(trimmed);
|
|
13
|
+
return Number.isFinite(count) ? count : 0;
|
|
14
|
+
}
|
|
15
|
+
export function readSplitMetrics(read, remPx = 16) {
|
|
16
|
+
return {
|
|
17
|
+
min: cssLengthToPx(read('--sw-split-min') || `${splitScale.min}rem`, remPx),
|
|
18
|
+
max: cssLengthToPx(read('--sw-split-max') || `${splitScale.max}rem`, remPx),
|
|
19
|
+
step: cssLengthToPx(read('--sw-space-4') || `${spacingScale[4]}px`, remPx),
|
|
20
|
+
defaultWidth: cssLengthToPx(read('--sw-split-size') || `${splitScale.size}rem`, remPx),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function clampSplitSize(size, min, max) {
|
|
24
|
+
return Math.min(max, Math.max(min, size));
|
|
25
|
+
}
|
|
26
|
+
export function splitPercent(width, min, max) {
|
|
27
|
+
if (max <= min) {
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
return Math.round(((clampSplitSize(width, min, max) - min) / (max - min)) * 100);
|
|
31
|
+
}
|
|
32
|
+
export function effectiveSplitMax(tokenMax, parentWidth, handleWidth, min) {
|
|
33
|
+
if (parentWidth <= 0) {
|
|
34
|
+
return tokenMax;
|
|
35
|
+
}
|
|
36
|
+
const room = parentWidth - handleWidth - min;
|
|
37
|
+
if (room < min) {
|
|
38
|
+
return min;
|
|
39
|
+
}
|
|
40
|
+
return Math.min(tokenMax, room);
|
|
41
|
+
}
|
|
42
|
+
export function applySplitDrag(start, deltaX, metrics) {
|
|
43
|
+
if (start.collapsed) {
|
|
44
|
+
if (deltaX <= 0) {
|
|
45
|
+
return start;
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
collapsed: false,
|
|
49
|
+
width: clampSplitSize(metrics.min + deltaX, metrics.min, metrics.max),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const proposed = start.width + deltaX;
|
|
53
|
+
if (proposed < metrics.min) {
|
|
54
|
+
return { collapsed: true, width: start.width };
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
collapsed: false,
|
|
58
|
+
width: clampSplitSize(proposed, metrics.min, metrics.max),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function applySplitKey(key, start, metrics) {
|
|
62
|
+
if (key === 'Enter' || key === ' ') {
|
|
63
|
+
return { collapsed: !start.collapsed, width: start.width };
|
|
64
|
+
}
|
|
65
|
+
if (start.collapsed) {
|
|
66
|
+
if (key === 'ArrowRight') {
|
|
67
|
+
return { collapsed: false, width: start.width };
|
|
68
|
+
}
|
|
69
|
+
if (key === 'End') {
|
|
70
|
+
return { collapsed: false, width: metrics.max };
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
if (key === 'Home') {
|
|
75
|
+
return { collapsed: false, width: metrics.min };
|
|
76
|
+
}
|
|
77
|
+
if (key === 'End') {
|
|
78
|
+
return { collapsed: false, width: metrics.max };
|
|
79
|
+
}
|
|
80
|
+
if (key === 'ArrowRight') {
|
|
81
|
+
return {
|
|
82
|
+
collapsed: false,
|
|
83
|
+
width: clampSplitSize(start.width + metrics.step, metrics.min, metrics.max),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (key === 'ArrowLeft') {
|
|
87
|
+
const next = start.width - metrics.step;
|
|
88
|
+
if (next < metrics.min) {
|
|
89
|
+
return { collapsed: true, width: start.width };
|
|
90
|
+
}
|
|
91
|
+
return { collapsed: false, width: next };
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|