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.
Files changed (59) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +175 -0
  3. package/dist/components/Avatar.d.ts +20 -0
  4. package/dist/components/Avatar.d.ts.map +1 -0
  5. package/dist/components/Avatar.js +174 -0
  6. package/dist/components/Button.d.ts +21 -0
  7. package/dist/components/Button.d.ts.map +1 -0
  8. package/dist/components/Button.js +227 -0
  9. package/dist/components/Card.d.ts +40 -0
  10. package/dist/components/Card.d.ts.map +1 -0
  11. package/dist/components/Card.js +517 -0
  12. package/dist/components/Checkbox.d.ts +12 -0
  13. package/dist/components/Checkbox.d.ts.map +1 -0
  14. package/dist/components/Checkbox.js +64 -0
  15. package/dist/components/CheckboxPreview.d.ts +13 -0
  16. package/dist/components/CheckboxPreview.d.ts.map +1 -0
  17. package/dist/components/CheckboxPreview.js +155 -0
  18. package/dist/components/Chip.d.ts +15 -0
  19. package/dist/components/Chip.d.ts.map +1 -0
  20. package/dist/components/Chip.js +99 -0
  21. package/dist/components/Input.d.ts +24 -0
  22. package/dist/components/Input.d.ts.map +1 -0
  23. package/dist/components/Input.js +138 -0
  24. package/dist/components/Menu.d.ts +20 -0
  25. package/dist/components/Menu.d.ts.map +1 -0
  26. package/dist/components/Menu.js +252 -0
  27. package/dist/components/RadioButton.d.ts +13 -0
  28. package/dist/components/RadioButton.d.ts.map +1 -0
  29. package/dist/components/RadioButton.js +140 -0
  30. package/dist/components/Switch.d.ts +11 -0
  31. package/dist/components/Switch.d.ts.map +1 -0
  32. package/dist/components/Switch.js +64 -0
  33. package/dist/components/SwitchPreview.d.ts +14 -0
  34. package/dist/components/SwitchPreview.d.ts.map +1 -0
  35. package/dist/components/SwitchPreview.js +281 -0
  36. package/dist/icons/index.d.ts +97 -0
  37. package/dist/icons/index.d.ts.map +1 -0
  38. package/dist/icons/index.js +383 -0
  39. package/dist/index.d.ts +13 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +12 -0
  42. package/dist/providers/ThemeProvider.d.ts +23 -0
  43. package/dist/providers/ThemeProvider.d.ts.map +1 -0
  44. package/dist/providers/ThemeProvider.js +79 -0
  45. package/dist/tokens/types.d.ts +14 -0
  46. package/dist/tokens/types.d.ts.map +1 -0
  47. package/dist/tokens/types.js +5 -0
  48. package/dist/utils/patternPaths.d.ts +28 -0
  49. package/dist/utils/patternPaths.d.ts.map +1 -0
  50. package/dist/utils/patternPaths.js +92 -0
  51. package/package.json +51 -0
  52. package/tokens/generated/brand-dark.css +86 -0
  53. package/tokens/generated/brand-light.css +86 -0
  54. package/tokens/generated/effects.css +10 -0
  55. package/tokens/generated/index.css +804 -0
  56. package/tokens/generated/primitives.css +116 -0
  57. package/tokens/generated/responsive.css +235 -0
  58. package/tokens/generated/semantic.css +138 -0
  59. 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"}