beacon-ui 3.1.4
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 +50 -0
- package/README.md +175 -0
- package/dist/components/Avatar.d.ts +20 -0
- package/dist/components/Avatar.d.ts.map +1 -0
- package/dist/components/Avatar.js +174 -0
- package/dist/components/Button.d.ts +21 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +227 -0
- package/dist/components/Card.d.ts +40 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +517 -0
- package/dist/components/Checkbox.d.ts +12 -0
- package/dist/components/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox.js +64 -0
- package/dist/components/CheckboxPreview.d.ts +13 -0
- package/dist/components/CheckboxPreview.d.ts.map +1 -0
- package/dist/components/CheckboxPreview.js +155 -0
- package/dist/components/Chip.d.ts +15 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +99 -0
- package/dist/components/Input.d.ts +24 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +138 -0
- package/dist/components/Menu.d.ts +20 -0
- package/dist/components/Menu.d.ts.map +1 -0
- package/dist/components/Menu.js +252 -0
- package/dist/components/RadioButton.d.ts +13 -0
- package/dist/components/RadioButton.d.ts.map +1 -0
- package/dist/components/RadioButton.js +140 -0
- package/dist/components/Switch.d.ts +11 -0
- package/dist/components/Switch.d.ts.map +1 -0
- package/dist/components/Switch.js +64 -0
- package/dist/components/SwitchPreview.d.ts +14 -0
- package/dist/components/SwitchPreview.d.ts.map +1 -0
- package/dist/components/SwitchPreview.js +281 -0
- package/dist/icons/index.d.ts +97 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +383 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/providers/ThemeProvider.d.ts +23 -0
- package/dist/providers/ThemeProvider.d.ts.map +1 -0
- package/dist/providers/ThemeProvider.js +79 -0
- package/dist/tokens/types.d.ts +14 -0
- package/dist/tokens/types.d.ts.map +1 -0
- package/dist/tokens/types.js +5 -0
- package/dist/utils/patternPaths.d.ts +28 -0
- package/dist/utils/patternPaths.d.ts.map +1 -0
- package/dist/utils/patternPaths.js +92 -0
- package/package.json +51 -0
- package/tokens/generated/brand-dark.css +86 -0
- package/tokens/generated/brand-light.css +86 -0
- package/tokens/generated/effects.css +10 -0
- package/tokens/generated/index.css +804 -0
- package/tokens/generated/primitives.css +116 -0
- package/tokens/generated/responsive.css +235 -0
- package/tokens/generated/semantic.css +138 -0
- package/tokens/generated/typography.css +124 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Theme, HueVariant } from "../tokens/types";
|
|
2
|
+
type CheckboxStatus = "default" | "hovered" | "focused" | "pressed" | "disabled";
|
|
3
|
+
interface CheckboxPreviewProps {
|
|
4
|
+
checked?: boolean;
|
|
5
|
+
status?: CheckboxStatus;
|
|
6
|
+
label?: string;
|
|
7
|
+
showLabel?: boolean;
|
|
8
|
+
theme?: Theme;
|
|
9
|
+
hue?: HueVariant;
|
|
10
|
+
}
|
|
11
|
+
export declare function CheckboxPreview({ checked, status, label, showLabel, theme, hue, }: CheckboxPreviewProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=CheckboxPreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckboxPreview.d.ts","sourceRoot":"","sources":["../../src/components/CheckboxPreview.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjF,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB;AAKD,wBAAgB,eAAe,CAAC,EAC9B,OAAe,EACf,MAAkB,EAClB,KAAkB,EAClB,SAAgB,EAChB,KAAK,EACL,GAAG,GACJ,EAAE,oBAAoB,2CA8KtB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { CheckIcon } from "../icons";
|
|
5
|
+
const CHECKBOX_SIZE = 20;
|
|
6
|
+
const ICON_SIZE = 16; // 20px box - 4px padding (2px each side) = 16px
|
|
7
|
+
export function CheckboxPreview({ checked = false, status = "default", label = "Checkbox", showLabel = true, theme, hue, }) {
|
|
8
|
+
const disabled = status === "disabled";
|
|
9
|
+
const checkboxStyles = useMemo(() => {
|
|
10
|
+
const baseStyles = {
|
|
11
|
+
width: `${CHECKBOX_SIZE}px`,
|
|
12
|
+
height: `${CHECKBOX_SIZE}px`,
|
|
13
|
+
borderRadius: "var(--corner-radius-100)",
|
|
14
|
+
display: "flex",
|
|
15
|
+
alignItems: "center",
|
|
16
|
+
justifyContent: "center",
|
|
17
|
+
flexShrink: 0,
|
|
18
|
+
transition: "background-color 0.15s ease, border-color 0.15s ease",
|
|
19
|
+
boxSizing: "border-box",
|
|
20
|
+
overflow: "hidden",
|
|
21
|
+
position: "relative",
|
|
22
|
+
};
|
|
23
|
+
if (checked) {
|
|
24
|
+
// Checked state
|
|
25
|
+
if (disabled) {
|
|
26
|
+
return {
|
|
27
|
+
...baseStyles,
|
|
28
|
+
backgroundColor: "var(--bg-disabled)",
|
|
29
|
+
border: "none",
|
|
30
|
+
padding: "var(--spacing-50)",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (status === "hovered") {
|
|
34
|
+
return {
|
|
35
|
+
...baseStyles,
|
|
36
|
+
backgroundColor: "var(--bg-primary-on-hover)",
|
|
37
|
+
border: "none",
|
|
38
|
+
padding: "var(--spacing-50)",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (status === "focused" || status === "pressed") {
|
|
42
|
+
return {
|
|
43
|
+
...baseStyles,
|
|
44
|
+
backgroundColor: "var(--bg-primary-pressed)",
|
|
45
|
+
border: "none",
|
|
46
|
+
padding: "var(--spacing-50)",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Default checked
|
|
50
|
+
return {
|
|
51
|
+
...baseStyles,
|
|
52
|
+
backgroundColor: "var(--bg-primary)",
|
|
53
|
+
border: "none",
|
|
54
|
+
padding: "var(--spacing-50)",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Unchecked state
|
|
59
|
+
if (disabled) {
|
|
60
|
+
return {
|
|
61
|
+
...baseStyles,
|
|
62
|
+
backgroundColor: "var(--bg-page-primary)",
|
|
63
|
+
border: "var(--border-width-50) solid var(--border-neutral-tertiary)",
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (status === "hovered" || status === "focused" || status === "pressed") {
|
|
67
|
+
return {
|
|
68
|
+
...baseStyles,
|
|
69
|
+
backgroundColor: "var(--bg-page-primary)",
|
|
70
|
+
border: "var(--border-width-50) solid var(--border-neutral-primary)",
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Default unchecked
|
|
74
|
+
return {
|
|
75
|
+
...baseStyles,
|
|
76
|
+
backgroundColor: "var(--bg-page-primary)",
|
|
77
|
+
border: "var(--border-width-50) solid var(--border-neutral-secondary)",
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}, [checked, status, disabled]);
|
|
81
|
+
const iconColor = useMemo(() => {
|
|
82
|
+
if (disabled) {
|
|
83
|
+
return "var(--fg-on-disabled)";
|
|
84
|
+
}
|
|
85
|
+
return "var(--static-white)";
|
|
86
|
+
}, [disabled]);
|
|
87
|
+
const labelStyles = useMemo(() => {
|
|
88
|
+
const baseStyles = {
|
|
89
|
+
fontFamily: "var(--font-secondary)",
|
|
90
|
+
fontSize: "var(--body-small-text-size)",
|
|
91
|
+
lineHeight: "var(--body-small-line-height)",
|
|
92
|
+
fontWeight: "var(--font-weight-secondary-medium)",
|
|
93
|
+
margin: 0,
|
|
94
|
+
};
|
|
95
|
+
if (disabled) {
|
|
96
|
+
return {
|
|
97
|
+
...baseStyles,
|
|
98
|
+
color: "var(--fg-on-disabled)",
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (checked) {
|
|
102
|
+
return {
|
|
103
|
+
...baseStyles,
|
|
104
|
+
color: "var(--fg-neutral-secondary)",
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
...baseStyles,
|
|
109
|
+
color: "var(--fg-neutral-tertiary)",
|
|
110
|
+
};
|
|
111
|
+
}, [disabled, checked]);
|
|
112
|
+
const focusRingStyles = useMemo(() => {
|
|
113
|
+
if (status !== "focused")
|
|
114
|
+
return null;
|
|
115
|
+
// Focus ring should be positioned outside the checkbox
|
|
116
|
+
// The checkbox is 20px × 20px
|
|
117
|
+
// The focus ring should be 4px outside the checkbox edge, centered on the container
|
|
118
|
+
// Using explicit width/height and centering: 20px + 8px (4px on each side) = 28px
|
|
119
|
+
// Border radius matches the checkbox's rounded rectangle shape
|
|
120
|
+
return {
|
|
121
|
+
position: "absolute",
|
|
122
|
+
top: "50%",
|
|
123
|
+
left: "50%",
|
|
124
|
+
transform: "translate(-50%, -50%)",
|
|
125
|
+
width: "28px",
|
|
126
|
+
height: "28px",
|
|
127
|
+
marginTop: "0",
|
|
128
|
+
marginLeft: "0",
|
|
129
|
+
borderRadius: "var(--corner-radius-200)",
|
|
130
|
+
borderWidth: "var(--border-width-25)",
|
|
131
|
+
borderStyle: "solid",
|
|
132
|
+
borderColor: checked
|
|
133
|
+
? "var(--border-primary)"
|
|
134
|
+
: "var(--border-neutral-primary)",
|
|
135
|
+
pointerEvents: "none",
|
|
136
|
+
};
|
|
137
|
+
}, [status, checked]);
|
|
138
|
+
return (_jsxs("div", { style: {
|
|
139
|
+
display: "flex",
|
|
140
|
+
alignItems: "center",
|
|
141
|
+
gap: "var(--spacing-200)",
|
|
142
|
+
position: "relative",
|
|
143
|
+
}, children: [_jsxs("div", { style: { position: "relative", display: "flex", alignItems: "center", justifyContent: "center" }, children: [focusRingStyles && _jsx("div", { style: focusRingStyles }), _jsx("div", { style: checkboxStyles, children: checked && (_jsx("div", { style: {
|
|
144
|
+
color: iconColor,
|
|
145
|
+
display: "flex",
|
|
146
|
+
alignItems: "center",
|
|
147
|
+
justifyContent: "center",
|
|
148
|
+
width: `${ICON_SIZE}px`,
|
|
149
|
+
height: `${ICON_SIZE}px`,
|
|
150
|
+
maxWidth: `${ICON_SIZE}px`,
|
|
151
|
+
maxHeight: `${ICON_SIZE}px`,
|
|
152
|
+
flexShrink: 0,
|
|
153
|
+
overflow: "hidden",
|
|
154
|
+
}, children: _jsx(CheckIcon, { size: ICON_SIZE }) })) })] }), showLabel && label && _jsx("p", { style: labelStyles, children: label })] }));
|
|
155
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Theme, HueVariant } from "../tokens/types";
|
|
2
|
+
type ChipSize = "sm" | "md" | "lg";
|
|
3
|
+
type ChipColor = "primary" | "neutral" | "success" | "critical" | "warning";
|
|
4
|
+
interface ChipProps {
|
|
5
|
+
label?: string;
|
|
6
|
+
color?: ChipColor;
|
|
7
|
+
size?: ChipSize;
|
|
8
|
+
showBorders?: boolean;
|
|
9
|
+
showIcon?: boolean;
|
|
10
|
+
theme?: Theme;
|
|
11
|
+
hue?: HueVariant;
|
|
12
|
+
}
|
|
13
|
+
export declare function Chip({ label, color, size, showBorders, showIcon, theme, hue, }: ChipProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=Chip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chip.d.ts","sourceRoot":"","sources":["../../src/components/Chip.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACnC,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5E,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB;AAsED,wBAAgB,IAAI,CAAC,EACnB,KAAoB,EACpB,KAAiB,EACjB,IAAW,EACX,WAAmB,EACnB,QAAgB,EAChB,KAAK,EACL,GAAG,GACJ,EAAE,SAAS,2CA0DX"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { ListDetailsIcon } from "../icons";
|
|
5
|
+
const SIZE_CONFIG = {
|
|
6
|
+
sm: {
|
|
7
|
+
iconSize: 16,
|
|
8
|
+
fontSize: "var(--body-extra-small-text-size)",
|
|
9
|
+
lineHeight: "var(--body-extra-small-line-height)",
|
|
10
|
+
paddingX: "var(--spacing-300)",
|
|
11
|
+
paddingY: "var(--spacing-100)",
|
|
12
|
+
},
|
|
13
|
+
md: {
|
|
14
|
+
iconSize: 20,
|
|
15
|
+
fontSize: "var(--body-small-text-size)",
|
|
16
|
+
lineHeight: "var(--body-small-line-height)",
|
|
17
|
+
paddingX: "var(--spacing-400)",
|
|
18
|
+
paddingY: "var(--spacing-200)",
|
|
19
|
+
},
|
|
20
|
+
lg: {
|
|
21
|
+
iconSize: 24,
|
|
22
|
+
fontSize: "var(--body-regular-text-size)",
|
|
23
|
+
lineHeight: "var(--body-regular-line-height)",
|
|
24
|
+
paddingX: "var(--spacing-450)",
|
|
25
|
+
paddingY: "var(--spacing-200)",
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const COLOR_CONFIG = {
|
|
29
|
+
primary: {
|
|
30
|
+
bg: "var(--bg-primary-tonal)",
|
|
31
|
+
fg: "var(--fg-primary-on-tonal)",
|
|
32
|
+
border: "var(--border-primary)",
|
|
33
|
+
},
|
|
34
|
+
neutral: {
|
|
35
|
+
bg: "var(--bg-page-tertiary)",
|
|
36
|
+
fg: "var(--fg-neutral-tertiary)",
|
|
37
|
+
border: "var(--border-neutral-primary)",
|
|
38
|
+
},
|
|
39
|
+
success: {
|
|
40
|
+
bg: "var(--bg-success-tonal)",
|
|
41
|
+
fg: "var(--fg-success-on-tonal)",
|
|
42
|
+
border: "var(--border-success)",
|
|
43
|
+
},
|
|
44
|
+
critical: {
|
|
45
|
+
bg: "var(--bg-critical-tonal)",
|
|
46
|
+
fg: "var(--fg-critical-on-tonal)",
|
|
47
|
+
border: "var(--border-critical)",
|
|
48
|
+
},
|
|
49
|
+
warning: {
|
|
50
|
+
bg: "var(--bg-warning-tonal)",
|
|
51
|
+
fg: "var(--fg-warning-on-tonal)",
|
|
52
|
+
border: "var(--border-warning)",
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
export function Chip({ label = "Identifier", color = "primary", size = "md", showBorders = false, showIcon = false, theme, hue, }) {
|
|
56
|
+
const sizeConfig = SIZE_CONFIG[size];
|
|
57
|
+
const colorConfig = COLOR_CONFIG[color];
|
|
58
|
+
const chipStyles = useMemo(() => {
|
|
59
|
+
const baseStyles = {
|
|
60
|
+
display: "flex",
|
|
61
|
+
gap: "var(--spacing-200)",
|
|
62
|
+
alignItems: "center",
|
|
63
|
+
backgroundColor: colorConfig.bg,
|
|
64
|
+
color: colorConfig.fg,
|
|
65
|
+
borderRadius: "var(--corner-radius-full)",
|
|
66
|
+
paddingLeft: sizeConfig.paddingX,
|
|
67
|
+
paddingRight: sizeConfig.paddingX,
|
|
68
|
+
paddingTop: sizeConfig.paddingY,
|
|
69
|
+
paddingBottom: sizeConfig.paddingY,
|
|
70
|
+
fontFamily: "var(--font-secondary)",
|
|
71
|
+
fontSize: sizeConfig.fontSize,
|
|
72
|
+
lineHeight: sizeConfig.lineHeight,
|
|
73
|
+
fontWeight: "var(--font-weight-secondary-medium)",
|
|
74
|
+
};
|
|
75
|
+
if (showBorders) {
|
|
76
|
+
return {
|
|
77
|
+
...baseStyles,
|
|
78
|
+
border: "var(--border-width-25) solid",
|
|
79
|
+
borderColor: colorConfig.border,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return baseStyles;
|
|
83
|
+
}, [colorConfig, sizeConfig, showBorders]);
|
|
84
|
+
const iconWrapperStyles = useMemo(() => {
|
|
85
|
+
return {
|
|
86
|
+
display: "flex",
|
|
87
|
+
alignItems: "center",
|
|
88
|
+
justifyContent: "center",
|
|
89
|
+
width: `${sizeConfig.iconSize}px`,
|
|
90
|
+
height: `${sizeConfig.iconSize}px`,
|
|
91
|
+
maxWidth: `${sizeConfig.iconSize}px`,
|
|
92
|
+
maxHeight: `${sizeConfig.iconSize}px`,
|
|
93
|
+
flexShrink: 0,
|
|
94
|
+
overflow: "hidden",
|
|
95
|
+
color: colorConfig.fg,
|
|
96
|
+
};
|
|
97
|
+
}, [sizeConfig.iconSize, colorConfig.fg]);
|
|
98
|
+
return (_jsxs("div", { style: chipStyles, children: [showIcon && (_jsx("div", { style: iconWrapperStyles, children: _jsx(ListDetailsIcon, { size: sizeConfig.iconSize }) })), _jsx("span", { children: label })] }));
|
|
99
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Theme, HueVariant } from "../tokens/types";
|
|
2
|
+
type InputSize = "sm" | "md" | "lg";
|
|
3
|
+
type InputStatus = "default" | "active";
|
|
4
|
+
interface InputProps {
|
|
5
|
+
label?: string;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
value?: string;
|
|
8
|
+
size?: InputSize;
|
|
9
|
+
status?: InputStatus;
|
|
10
|
+
showLabel?: boolean;
|
|
11
|
+
showStartIcon?: boolean;
|
|
12
|
+
showEndIcon?: boolean;
|
|
13
|
+
showPlaceholderIcon?: boolean;
|
|
14
|
+
showError?: boolean;
|
|
15
|
+
showNumberPrefix?: boolean;
|
|
16
|
+
rounded?: boolean;
|
|
17
|
+
iconOnly?: boolean;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
theme?: Theme;
|
|
20
|
+
hue?: HueVariant;
|
|
21
|
+
}
|
|
22
|
+
export declare function Input({ label, placeholder, value, size, status, showLabel, showStartIcon, showEndIcon, showPlaceholderIcon, showError, showNumberPrefix, rounded, iconOnly, disabled, theme, hue, }: InputProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../src/components/Input.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACpC,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExC,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB;AAuDD,wBAAgB,KAAK,CAAC,EACpB,KAAe,EACf,WAA2B,EAC3B,KAAU,EACV,IAAW,EACX,MAAkB,EAClB,SAAgB,EAChB,aAAqB,EACrB,WAAmB,EACnB,mBAA2B,EAC3B,SAAiB,EACjB,gBAAwB,EACxB,OAAe,EACf,QAAgB,EAChB,QAAgB,EAChB,KAAK,EACL,GAAG,GACJ,EAAE,UAAU,2CAgKZ"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { UserPersonIcon, SearchIcon, ChevronDownIcon, AlertTriangleErrorIcon } from "../icons";
|
|
5
|
+
const SIZE_CONFIG = {
|
|
6
|
+
sm: {
|
|
7
|
+
height: "28px",
|
|
8
|
+
iconSize: 16,
|
|
9
|
+
fontSize: "var(--body-small-text-size)",
|
|
10
|
+
lineHeight: "var(--body-small-line-height)",
|
|
11
|
+
labelFontSize: "var(--body-extra-small-text-size)",
|
|
12
|
+
labelLineHeight: "var(--body-extra-small-line-height)",
|
|
13
|
+
paddingX: "var(--spacing-200)",
|
|
14
|
+
paddingY: "var(--spacing-100)",
|
|
15
|
+
borderRadius: "var(--corner-radius-100)",
|
|
16
|
+
gap: "var(--spacing-100)",
|
|
17
|
+
},
|
|
18
|
+
md: {
|
|
19
|
+
height: "36px",
|
|
20
|
+
iconSize: 16,
|
|
21
|
+
fontSize: "var(--body-small-text-size)",
|
|
22
|
+
lineHeight: "var(--body-small-line-height)",
|
|
23
|
+
labelFontSize: "var(--body-small-text-size)",
|
|
24
|
+
labelLineHeight: "var(--body-small-line-height)",
|
|
25
|
+
paddingX: "var(--spacing-200)",
|
|
26
|
+
paddingY: "var(--spacing-100)",
|
|
27
|
+
borderRadius: "var(--corner-radius-100)",
|
|
28
|
+
gap: "var(--spacing-100)",
|
|
29
|
+
},
|
|
30
|
+
lg: {
|
|
31
|
+
height: "48px",
|
|
32
|
+
iconSize: 20,
|
|
33
|
+
fontSize: "var(--body-regular-text-size)",
|
|
34
|
+
lineHeight: "var(--body-regular-line-height)",
|
|
35
|
+
labelFontSize: "var(--body-regular-text-size)",
|
|
36
|
+
labelLineHeight: "var(--body-regular-line-height)",
|
|
37
|
+
paddingX: "var(--spacing-400)",
|
|
38
|
+
paddingY: "var(--spacing-300)",
|
|
39
|
+
borderRadius: "var(--corner-radius-200)",
|
|
40
|
+
gap: "var(--spacing-200)",
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export function Input({ label = "Label", placeholder = "Placeholder", value = "", size = "md", status = "default", showLabel = true, showStartIcon = false, showEndIcon = false, showPlaceholderIcon = false, showError = false, showNumberPrefix = false, rounded = false, iconOnly = false, disabled = false, theme, hue, }) {
|
|
44
|
+
const sizeConfig = SIZE_CONFIG[size];
|
|
45
|
+
const hasValue = value.length > 0;
|
|
46
|
+
const borderColor = useMemo(() => {
|
|
47
|
+
if (disabled) {
|
|
48
|
+
return "var(--border-strong-100)";
|
|
49
|
+
}
|
|
50
|
+
if (status === "active") {
|
|
51
|
+
return "var(--border-neutral-primary)";
|
|
52
|
+
}
|
|
53
|
+
return "var(--border-strong-200)";
|
|
54
|
+
}, [status, disabled]);
|
|
55
|
+
const inputContainerStyles = useMemo(() => {
|
|
56
|
+
const baseStyles = {
|
|
57
|
+
display: "flex",
|
|
58
|
+
alignItems: "center",
|
|
59
|
+
border: `var(--border-width-25) solid ${borderColor}`,
|
|
60
|
+
backgroundColor: "var(--bg-page-primary)",
|
|
61
|
+
borderRadius: rounded ? "var(--corner-radius-full)" : sizeConfig.borderRadius,
|
|
62
|
+
gap: sizeConfig.gap,
|
|
63
|
+
paddingLeft: sizeConfig.paddingX,
|
|
64
|
+
paddingRight: sizeConfig.paddingX,
|
|
65
|
+
paddingTop: sizeConfig.paddingY,
|
|
66
|
+
paddingBottom: sizeConfig.paddingY,
|
|
67
|
+
width: iconOnly ? sizeConfig.height : "100%",
|
|
68
|
+
height: iconOnly ? sizeConfig.height : sizeConfig.height,
|
|
69
|
+
justifyContent: iconOnly ? "center" : "flex-start",
|
|
70
|
+
cursor: disabled ? "not-allowed" : "text",
|
|
71
|
+
opacity: disabled ? 0.6 : 1,
|
|
72
|
+
};
|
|
73
|
+
return baseStyles;
|
|
74
|
+
}, [sizeConfig, borderColor, rounded, iconOnly, disabled]);
|
|
75
|
+
const textStyles = useMemo(() => {
|
|
76
|
+
return {
|
|
77
|
+
fontSize: sizeConfig.fontSize,
|
|
78
|
+
lineHeight: sizeConfig.lineHeight,
|
|
79
|
+
fontFamily: "var(--font-secondary)",
|
|
80
|
+
color: hasValue
|
|
81
|
+
? "var(--fg-neutral-secondary)"
|
|
82
|
+
: disabled
|
|
83
|
+
? "var(--fg-disabled)"
|
|
84
|
+
: "var(--fg-disabled)",
|
|
85
|
+
fontWeight: hasValue ? 500 : 400,
|
|
86
|
+
flex: iconOnly ? "none" : "1 0 0",
|
|
87
|
+
minWidth: iconOnly ? "auto" : 0,
|
|
88
|
+
minHeight: iconOnly ? "auto" : 0,
|
|
89
|
+
};
|
|
90
|
+
}, [sizeConfig, hasValue, disabled, iconOnly]);
|
|
91
|
+
const labelStyles = useMemo(() => {
|
|
92
|
+
return {
|
|
93
|
+
fontSize: sizeConfig.labelFontSize,
|
|
94
|
+
lineHeight: sizeConfig.labelLineHeight,
|
|
95
|
+
fontFamily: "var(--font-secondary)",
|
|
96
|
+
color: "var(--fg-neutral)",
|
|
97
|
+
marginBottom: "var(--spacing-100)",
|
|
98
|
+
};
|
|
99
|
+
}, [sizeConfig]);
|
|
100
|
+
const prefixStyles = useMemo(() => {
|
|
101
|
+
return {
|
|
102
|
+
fontSize: sizeConfig.fontSize,
|
|
103
|
+
lineHeight: sizeConfig.lineHeight,
|
|
104
|
+
fontFamily: "var(--font-secondary)",
|
|
105
|
+
color: "var(--fg-neutral-tertiary)",
|
|
106
|
+
paddingRight: "var(--spacing-100)",
|
|
107
|
+
borderRight: `var(--border-width-25) solid ${status === "active" ? "var(--border-strong-100)" : "var(--border-strong-200)"}`,
|
|
108
|
+
display: "flex",
|
|
109
|
+
alignItems: "center",
|
|
110
|
+
};
|
|
111
|
+
}, [sizeConfig, status]);
|
|
112
|
+
const errorContainerStyles = useMemo(() => {
|
|
113
|
+
return {
|
|
114
|
+
display: "flex",
|
|
115
|
+
alignItems: "center",
|
|
116
|
+
gap: "var(--spacing-100)",
|
|
117
|
+
marginTop: "var(--spacing-100)",
|
|
118
|
+
};
|
|
119
|
+
}, []);
|
|
120
|
+
const errorIconStyles = useMemo(() => {
|
|
121
|
+
return {
|
|
122
|
+
color: "var(--fg-critical)",
|
|
123
|
+
flexShrink: 0,
|
|
124
|
+
};
|
|
125
|
+
}, []);
|
|
126
|
+
const errorMessageStyles = useMemo(() => {
|
|
127
|
+
return {
|
|
128
|
+
fontSize: "var(--body-extra-small-text-size)",
|
|
129
|
+
lineHeight: "var(--body-extra-small-line-height)",
|
|
130
|
+
fontFamily: "var(--font-secondary)",
|
|
131
|
+
color: "var(--fg-critical)",
|
|
132
|
+
};
|
|
133
|
+
}, []);
|
|
134
|
+
if (iconOnly) {
|
|
135
|
+
return (_jsx("div", { style: { display: "flex", flexDirection: "column", gap: "var(--spacing-100)", width: "100%" }, children: _jsxs("div", { style: inputContainerStyles, children: [showPlaceholderIcon && (_jsx("div", { style: { color: "var(--fg-neutral)", display: "flex", alignItems: "center", justifyContent: "center" }, children: _jsx(SearchIcon, { size: sizeConfig.iconSize }) })), showStartIcon && !showPlaceholderIcon && (_jsx("div", { style: { color: "var(--fg-neutral)", display: "flex", alignItems: "center", justifyContent: "center" }, children: _jsx(UserPersonIcon, { size: sizeConfig.iconSize }) }))] }) }));
|
|
136
|
+
}
|
|
137
|
+
return (_jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "var(--spacing-100)", width: "100%" }, children: [showLabel && (_jsx("p", { style: labelStyles, children: label })), _jsxs("div", { style: inputContainerStyles, children: [showStartIcon && (_jsx("div", { style: { color: "var(--fg-neutral)", flexShrink: 0, display: "flex", alignItems: "center", justifyContent: "center" }, children: _jsx(UserPersonIcon, { size: sizeConfig.iconSize }) })), showPlaceholderIcon && !hasValue && (_jsx("div", { style: { color: iconOnly ? "var(--fg-neutral)" : "var(--fg-disabled)", flexShrink: 0, display: "flex", alignItems: "center", justifyContent: "center" }, children: _jsx(SearchIcon, { size: sizeConfig.iconSize }) })), showNumberPrefix && (_jsx("div", { style: prefixStyles, children: "+33" })), hasValue ? (_jsx("p", { style: textStyles, children: value })) : (_jsx("p", { style: textStyles, children: placeholder })), showEndIcon && (_jsx("div", { style: { color: "var(--fg-neutral-tertiary)", flexShrink: 0, display: "flex", alignItems: "center", justifyContent: "center" }, children: _jsx(ChevronDownIcon, { size: sizeConfig.iconSize }) }))] }), showError && (_jsxs("div", { style: errorContainerStyles, children: [_jsx("div", { style: { ...errorIconStyles, display: "flex", alignItems: "center", justifyContent: "center" }, children: _jsx(AlertTriangleErrorIcon, { size: 16 }) }), _jsx("p", { style: errorMessageStyles, children: "Error message!" })] }))] }));
|
|
138
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Theme, HueVariant } from "../tokens/types";
|
|
2
|
+
type MenuVariant = "desktop" | "tablet-open" | "tablet-closed" | "mobile-open" | "mobile-closed" | "close-menu";
|
|
3
|
+
interface MenuItem {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
interface MenuProps {
|
|
8
|
+
variant?: MenuVariant;
|
|
9
|
+
showMenu?: boolean;
|
|
10
|
+
showButton?: boolean;
|
|
11
|
+
menuItems?: MenuItem[];
|
|
12
|
+
headerTitle?: string;
|
|
13
|
+
headerSubtitle?: string;
|
|
14
|
+
showChevrons?: boolean;
|
|
15
|
+
theme?: Theme;
|
|
16
|
+
hue?: HueVariant;
|
|
17
|
+
}
|
|
18
|
+
export declare function Menu({ variant, showMenu, showButton, menuItems, headerTitle, headerSubtitle, showChevrons, theme, hue, }: MenuProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=Menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/components/Menu.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIzD,KAAK,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,aAAa,GAAG,eAAe,GAAG,YAAY,CAAC;AAEhH,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,SAAS;IACjB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB;AAUD,wBAAgB,IAAI,CAAC,EACnB,OAAmB,EACnB,QAAe,EACf,UAAiB,EACjB,SAA8B,EAC9B,WAAqB,EACrB,cAA2B,EAC3B,YAAmB,EACnB,KAAK,EACL,GAAG,GACJ,EAAE,SAAS,2CA0YX"}
|