@nationaldesignstudio/react 0.0.17 → 0.1.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/dist/component-registry.md +181 -29
- package/dist/components/atoms/accordion/accordion.d.ts +2 -2
- package/dist/components/atoms/background/background.d.ts +158 -0
- package/dist/components/atoms/button/button.d.ts +64 -82
- package/dist/components/atoms/button/icon-button.d.ts +128 -66
- package/dist/components/organisms/card/card.d.ts +130 -4
- package/dist/components/organisms/us-gov-banner/us-gov-banner.d.ts +120 -2
- package/dist/components/sections/hero/hero.d.ts +166 -150
- package/dist/components/sections/quote-block/quote-block.d.ts +152 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +4068 -6052
- package/dist/index.js.map +1 -1
- package/dist/lib/utils.d.ts +1 -2
- package/dist/tokens.css +207 -16
- package/package.json +2 -4
- package/src/components/atoms/accordion/accordion.test.tsx +233 -0
- package/src/components/atoms/accordion/accordion.tsx +8 -8
- package/src/components/atoms/background/background.test.tsx +213 -0
- package/src/components/atoms/background/background.tsx +435 -0
- package/src/components/atoms/background/index.ts +22 -0
- package/src/components/atoms/button/button.stories.tsx +81 -32
- package/src/components/atoms/button/button.tsx +101 -49
- package/src/components/atoms/button/icon-button.stories.tsx +179 -28
- package/src/components/atoms/button/icon-button.test.tsx +254 -0
- package/src/components/atoms/button/icon-button.tsx +178 -59
- package/src/components/atoms/pager-control/pager-control.tsx +32 -3
- package/src/components/dev-tools/dev-toolbar/dev-toolbar.tsx +2 -0
- package/src/components/organisms/card/card.tsx +82 -24
- package/src/components/organisms/card/index.ts +7 -0
- package/src/components/organisms/navbar/navbar.tsx +2 -0
- package/src/components/organisms/us-gov-banner/index.ts +5 -1
- package/src/components/organisms/us-gov-banner/us-gov-banner.tsx +72 -16
- package/src/components/sections/hero/hero.stories.tsx +124 -1
- package/src/components/sections/hero/hero.test.tsx +21 -18
- package/src/components/sections/hero/hero.tsx +188 -301
- package/src/components/sections/hero/index.ts +13 -0
- package/src/components/sections/quote-block/index.ts +5 -0
- package/src/components/sections/quote-block/quote-block.tsx +216 -0
- package/src/index.ts +40 -0
- package/src/lib/utils.ts +1 -6
- package/src/stories/ThemeProvider.stories.tsx +11 -5
|
@@ -27,63 +27,112 @@ Playground.argTypes = {
|
|
|
27
27
|
control: {
|
|
28
28
|
type: "radio",
|
|
29
29
|
},
|
|
30
|
-
options: [
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"ivory",
|
|
38
|
-
"ivoryOutline",
|
|
39
|
-
"ivoryOutlineQuiet",
|
|
40
|
-
"gray",
|
|
41
|
-
],
|
|
30
|
+
options: ["solid", "outline", "ghost", "subtle"],
|
|
31
|
+
},
|
|
32
|
+
colorScheme: {
|
|
33
|
+
control: {
|
|
34
|
+
type: "radio",
|
|
35
|
+
},
|
|
36
|
+
options: ["dark", "light"],
|
|
42
37
|
},
|
|
43
38
|
};
|
|
44
39
|
Playground.args = {
|
|
45
40
|
size: "default",
|
|
46
41
|
disabled: false,
|
|
47
|
-
variant: "
|
|
42
|
+
variant: "solid",
|
|
43
|
+
colorScheme: "dark",
|
|
48
44
|
};
|
|
49
45
|
|
|
50
46
|
// =============================================================================
|
|
51
|
-
//
|
|
47
|
+
// Variants (Dark Color Scheme - for light backgrounds)
|
|
52
48
|
// =============================================================================
|
|
53
49
|
|
|
54
|
-
export const
|
|
50
|
+
export const Solid = () => <Button variant="solid">Solid</Button>;
|
|
55
51
|
|
|
56
|
-
export const
|
|
57
|
-
|
|
58
|
-
)
|
|
52
|
+
export const Outline = () => <Button variant="outline">Outline</Button>;
|
|
53
|
+
|
|
54
|
+
export const Ghost = () => <Button variant="ghost">Ghost</Button>;
|
|
59
55
|
|
|
60
|
-
export const
|
|
56
|
+
export const Subtle = () => <Button variant="subtle">Subtle</Button>;
|
|
61
57
|
|
|
62
58
|
// =============================================================================
|
|
63
|
-
//
|
|
59
|
+
// Variants (Light Color Scheme - for dark backgrounds)
|
|
64
60
|
// =============================================================================
|
|
65
61
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
export const CharcoalOutline = () => (
|
|
69
|
-
<Button variant="charcoalOutline">Charcoal Outline</Button>
|
|
62
|
+
const DarkBackground = ({ children }: { children: React.ReactNode }) => (
|
|
63
|
+
<div className="rounded-radius-12 bg-gray-1200 p-spacing-32">{children}</div>
|
|
70
64
|
);
|
|
71
65
|
|
|
72
|
-
export const
|
|
73
|
-
<
|
|
66
|
+
export const SolidLight = () => (
|
|
67
|
+
<DarkBackground>
|
|
68
|
+
<Button variant="solid" colorScheme="light">
|
|
69
|
+
Solid Light
|
|
70
|
+
</Button>
|
|
71
|
+
</DarkBackground>
|
|
74
72
|
);
|
|
75
73
|
|
|
76
|
-
export const
|
|
74
|
+
export const OutlineLight = () => (
|
|
75
|
+
<DarkBackground>
|
|
76
|
+
<Button variant="outline" colorScheme="light">
|
|
77
|
+
Outline Light
|
|
78
|
+
</Button>
|
|
79
|
+
</DarkBackground>
|
|
80
|
+
);
|
|
77
81
|
|
|
78
|
-
export const
|
|
79
|
-
<
|
|
82
|
+
export const GhostLight = () => (
|
|
83
|
+
<DarkBackground>
|
|
84
|
+
<Button variant="ghost" colorScheme="light">
|
|
85
|
+
Ghost Light
|
|
86
|
+
</Button>
|
|
87
|
+
</DarkBackground>
|
|
80
88
|
);
|
|
81
89
|
|
|
82
|
-
export const
|
|
83
|
-
<
|
|
90
|
+
export const SubtleLight = () => (
|
|
91
|
+
<DarkBackground>
|
|
92
|
+
<Button variant="subtle" colorScheme="light">
|
|
93
|
+
Subtle Light
|
|
94
|
+
</Button>
|
|
95
|
+
</DarkBackground>
|
|
84
96
|
);
|
|
85
97
|
|
|
86
|
-
|
|
98
|
+
// =============================================================================
|
|
99
|
+
// All Variants Comparison
|
|
100
|
+
// =============================================================================
|
|
101
|
+
|
|
102
|
+
export const AllVariants = () => (
|
|
103
|
+
<div className="flex flex-col gap-spacing-32">
|
|
104
|
+
<div>
|
|
105
|
+
<h3 className="mb-spacing-16 text-14 font-medium text-text-secondary">
|
|
106
|
+
Dark Color Scheme (for light backgrounds)
|
|
107
|
+
</h3>
|
|
108
|
+
<div className="flex gap-spacing-16">
|
|
109
|
+
<Button variant="solid">Solid</Button>
|
|
110
|
+
<Button variant="outline">Outline</Button>
|
|
111
|
+
<Button variant="ghost">Ghost</Button>
|
|
112
|
+
<Button variant="subtle">Subtle</Button>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
<DarkBackground>
|
|
116
|
+
<h3 className="mb-spacing-16 text-14 font-medium text-gray-400">
|
|
117
|
+
Light Color Scheme (for dark backgrounds)
|
|
118
|
+
</h3>
|
|
119
|
+
<div className="flex gap-spacing-16">
|
|
120
|
+
<Button variant="solid" colorScheme="light">
|
|
121
|
+
Solid
|
|
122
|
+
</Button>
|
|
123
|
+
<Button variant="outline" colorScheme="light">
|
|
124
|
+
Outline
|
|
125
|
+
</Button>
|
|
126
|
+
<Button variant="ghost" colorScheme="light">
|
|
127
|
+
Ghost
|
|
128
|
+
</Button>
|
|
129
|
+
<Button variant="subtle" colorScheme="light">
|
|
130
|
+
Subtle
|
|
131
|
+
</Button>
|
|
132
|
+
</div>
|
|
133
|
+
</DarkBackground>
|
|
134
|
+
</div>
|
|
135
|
+
);
|
|
87
136
|
|
|
88
137
|
// =============================================================================
|
|
89
138
|
// Sizes
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import {
|
|
2
4
|
Button as BaseButton,
|
|
3
5
|
type ButtonProps as BaseButtonProps,
|
|
@@ -10,16 +12,14 @@ import { type ButtonTheme, buttonThemeToStyleVars } from "../../../lib/theme";
|
|
|
10
12
|
* Button component based on Figma BaseKit / Interface / Buttons
|
|
11
13
|
*
|
|
12
14
|
* Variants:
|
|
13
|
-
* -
|
|
14
|
-
* -
|
|
15
|
-
* -
|
|
16
|
-
* -
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* -
|
|
20
|
-
* -
|
|
21
|
-
* - ivoryOutlineQuiet: Subtle light outlined button (for dark backgrounds)
|
|
22
|
-
* - gray: Gray filled button (for dark backgrounds)
|
|
15
|
+
* - solid: Filled button
|
|
16
|
+
* - outline: Outlined button
|
|
17
|
+
* - ghost: No background/border, just text
|
|
18
|
+
* - subtle: Light background with subtle styling
|
|
19
|
+
*
|
|
20
|
+
* Color Schemes:
|
|
21
|
+
* - dark: Dark colors for use on light backgrounds (default)
|
|
22
|
+
* - light: Light colors for use on dark backgrounds
|
|
23
23
|
*
|
|
24
24
|
* Sizes:
|
|
25
25
|
* - lg: Large buttons
|
|
@@ -30,58 +30,91 @@ import { type ButtonTheme, buttonThemeToStyleVars } from "../../../lib/theme";
|
|
|
30
30
|
*
|
|
31
31
|
* Theme Support:
|
|
32
32
|
* Pass a `theme` prop to override default colors via CSS custom properties.
|
|
33
|
-
* Surface tokens (--radius-surface-button, --surface-button-stroke) control
|
|
34
|
-
* border radius and stroke width across all variants.
|
|
35
33
|
*/
|
|
36
34
|
const buttonVariants = tv({
|
|
37
35
|
base: "inline-flex items-center justify-center gap-spacing-8 whitespace-nowrap transition-colors duration-150 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 rounded-surface-button stroke-surface-button border-solid",
|
|
38
36
|
variants: {
|
|
39
37
|
variant: {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
primaryOutline:
|
|
45
|
-
"bg-transparent text-text-primary border-border-strong hover:bg-alpha-black-5 active:bg-alpha-black-10 focus-visible:ring-button-primary-bg",
|
|
46
|
-
// Secondary - uses semantic color tokens
|
|
47
|
-
secondary:
|
|
48
|
-
"bg-button-secondary-bg text-text-primary border-border-subtle hover:bg-button-secondary-bg-hover focus-visible:ring-button-primary-bg",
|
|
49
|
-
// Charcoal (dark filled) - primary dark (legacy)
|
|
50
|
-
charcoal:
|
|
51
|
-
"bg-gray-1200 text-gray-100 hover:bg-gray-1100 active:bg-gray-1000 border-transparent focus-visible:ring-gray-1000",
|
|
52
|
-
// Charcoal Outline - outlined dark (for light backgrounds)
|
|
53
|
-
charcoalOutline:
|
|
54
|
-
"border-border-strong text-gray-1000 hover:bg-alpha-black-5 active:bg-alpha-black-10 focus-visible:ring-gray-1000",
|
|
55
|
-
// Charcoal Outline Quiet - subtle outlined dark (for light backgrounds)
|
|
56
|
-
charcoalOutlineQuiet:
|
|
57
|
-
"border-border-subtle text-alpha-black-60 hover:border-border-strong hover:text-alpha-black-80 active:bg-alpha-black-5 focus-visible:ring-gray-1000",
|
|
58
|
-
// Ivory (light filled) - primary light (for dark backgrounds)
|
|
59
|
-
ivory:
|
|
60
|
-
"bg-gray-50 text-gray-1000 hover:bg-gray-100 active:bg-gray-200 border-transparent focus-visible:ring-gray-50 focus-visible:ring-offset-gray-1000",
|
|
61
|
-
// Ivory Outline - outlined light (for dark backgrounds)
|
|
62
|
-
ivoryOutline:
|
|
63
|
-
"border-gray-50 text-gray-50 hover:bg-alpha-white-10 active:bg-alpha-white-20 focus-visible:ring-gray-50 focus-visible:ring-offset-gray-1000",
|
|
64
|
-
// Ivory Outline Quiet - subtle light outline (for dark backgrounds)
|
|
65
|
-
ivoryOutlineQuiet:
|
|
66
|
-
"border-alpha-white-20 text-alpha-white-60 hover:border-alpha-white-30 hover:text-alpha-white-80 active:bg-alpha-white-5 focus-visible:ring-gray-50 focus-visible:ring-offset-gray-1000",
|
|
67
|
-
// Gray - gray filled button (for dark backgrounds)
|
|
68
|
-
gray: "bg-gray-800 text-gray-100 hover:bg-gray-700 active:bg-gray-600 border-transparent focus-visible:ring-gray-700 focus-visible:ring-offset-gray-1000",
|
|
38
|
+
solid: "",
|
|
39
|
+
outline: "bg-transparent border",
|
|
40
|
+
ghost: "bg-transparent border-transparent",
|
|
41
|
+
subtle: "border",
|
|
69
42
|
// Themed - uses CSS custom properties for styling
|
|
70
43
|
themed:
|
|
71
44
|
"[background:var(--btn-bg)] [color:var(--btn-text)] [border-color:var(--btn-border-color,transparent)] hover:[background:var(--btn-bg-hover,var(--btn-bg))] active:[background:var(--btn-bg-active,var(--btn-bg-hover,var(--btn-bg)))]",
|
|
72
45
|
},
|
|
46
|
+
colorScheme: {
|
|
47
|
+
dark: "",
|
|
48
|
+
light: "",
|
|
49
|
+
},
|
|
73
50
|
size: {
|
|
74
|
-
|
|
75
|
-
lg: "px-spacing-24 py-spacing-12 typography-brand-large-button-large h-spacing-48",
|
|
76
|
-
// Medium button (default) - uses primitive spacing tokens
|
|
51
|
+
lg: "px-spacing-24 py-spacing-12 typography-large-button-large h-spacing-48",
|
|
77
52
|
default:
|
|
78
|
-
"px-spacing-20 py-spacing-10 typography-
|
|
79
|
-
|
|
80
|
-
sm: "px-spacing-16 py-spacing-8 typography-brand-small-button-small h-spacing-32",
|
|
53
|
+
"px-spacing-20 py-spacing-10 typography-medium-button-medium h-spacing-40",
|
|
54
|
+
sm: "px-spacing-16 py-spacing-8 typography-small-button-small h-spacing-32",
|
|
81
55
|
},
|
|
82
56
|
},
|
|
57
|
+
compoundVariants: [
|
|
58
|
+
// Solid + Dark (for light backgrounds) - uses semantic button tokens
|
|
59
|
+
{
|
|
60
|
+
variant: "solid",
|
|
61
|
+
colorScheme: "dark",
|
|
62
|
+
class:
|
|
63
|
+
"bg-button-primary-bg text-text-inverted hover:bg-button-primary-bg-hover active:bg-button-primary-bg-hover border-transparent focus-visible:ring-button-primary-bg",
|
|
64
|
+
},
|
|
65
|
+
// Solid + Light (for dark backgrounds)
|
|
66
|
+
{
|
|
67
|
+
variant: "solid",
|
|
68
|
+
colorScheme: "light",
|
|
69
|
+
class:
|
|
70
|
+
"bg-button-secondary-bg text-text-primary hover:bg-button-secondary-bg-hover active:bg-gray-200 border-transparent focus-visible:ring-gray-50 focus-visible:ring-offset-gray-1000",
|
|
71
|
+
},
|
|
72
|
+
// Outline + Dark (for light backgrounds)
|
|
73
|
+
{
|
|
74
|
+
variant: "outline",
|
|
75
|
+
colorScheme: "dark",
|
|
76
|
+
class:
|
|
77
|
+
"border-border-strong text-gray-1000 hover:bg-alpha-black-5 active:bg-alpha-black-10 focus-visible:ring-gray-1000",
|
|
78
|
+
},
|
|
79
|
+
// Outline + Light (for dark backgrounds)
|
|
80
|
+
{
|
|
81
|
+
variant: "outline",
|
|
82
|
+
colorScheme: "light",
|
|
83
|
+
class:
|
|
84
|
+
"border-gray-50 text-gray-50 hover:bg-alpha-white-10 active:bg-alpha-white-20 focus-visible:ring-gray-50 focus-visible:ring-offset-gray-1000",
|
|
85
|
+
},
|
|
86
|
+
// Ghost + Dark (for light backgrounds)
|
|
87
|
+
{
|
|
88
|
+
variant: "ghost",
|
|
89
|
+
colorScheme: "dark",
|
|
90
|
+
class:
|
|
91
|
+
"text-gray-700 hover:text-gray-900 hover:bg-alpha-black-5 active:bg-alpha-black-10 focus-visible:ring-gray-1000",
|
|
92
|
+
},
|
|
93
|
+
// Ghost + Light (for dark backgrounds)
|
|
94
|
+
{
|
|
95
|
+
variant: "ghost",
|
|
96
|
+
colorScheme: "light",
|
|
97
|
+
class:
|
|
98
|
+
"text-gray-300 hover:text-gray-100 hover:bg-alpha-white-10 active:bg-alpha-white-20 focus-visible:ring-gray-50 focus-visible:ring-offset-gray-1000",
|
|
99
|
+
},
|
|
100
|
+
// Subtle + Dark (for light backgrounds)
|
|
101
|
+
{
|
|
102
|
+
variant: "subtle",
|
|
103
|
+
colorScheme: "dark",
|
|
104
|
+
class:
|
|
105
|
+
"border-border-subtle text-alpha-black-60 hover:border-border-strong hover:text-alpha-black-80 active:bg-alpha-black-5 focus-visible:ring-gray-1000",
|
|
106
|
+
},
|
|
107
|
+
// Subtle + Light (for dark backgrounds)
|
|
108
|
+
{
|
|
109
|
+
variant: "subtle",
|
|
110
|
+
colorScheme: "light",
|
|
111
|
+
class:
|
|
112
|
+
"border-alpha-white-20 text-alpha-white-60 hover:border-alpha-white-30 hover:text-alpha-white-80 active:bg-alpha-white-5 focus-visible:ring-gray-50 focus-visible:ring-offset-gray-1000",
|
|
113
|
+
},
|
|
114
|
+
],
|
|
83
115
|
defaultVariants: {
|
|
84
|
-
variant: "
|
|
116
|
+
variant: "solid",
|
|
117
|
+
colorScheme: "dark",
|
|
85
118
|
size: "default",
|
|
86
119
|
},
|
|
87
120
|
});
|
|
@@ -106,7 +139,17 @@ function hasThemeValues(theme: ButtonTheme | undefined): boolean {
|
|
|
106
139
|
|
|
107
140
|
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|
108
141
|
(
|
|
109
|
-
{
|
|
142
|
+
{
|
|
143
|
+
className,
|
|
144
|
+
variant,
|
|
145
|
+
colorScheme,
|
|
146
|
+
size,
|
|
147
|
+
render,
|
|
148
|
+
nativeButton,
|
|
149
|
+
theme,
|
|
150
|
+
style,
|
|
151
|
+
...props
|
|
152
|
+
},
|
|
110
153
|
ref,
|
|
111
154
|
) => {
|
|
112
155
|
// When render prop is provided, default nativeButton to false to suppress warnings
|
|
@@ -118,10 +161,16 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|
|
118
161
|
const themeStyles = buttonThemeToStyleVars(theme);
|
|
119
162
|
const combinedStyles = hasTheme ? { ...themeStyles, ...style } : style;
|
|
120
163
|
|
|
164
|
+
// Resolve actual values for data attributes
|
|
165
|
+
const resolvedVariant = effectiveVariant ?? "solid";
|
|
166
|
+
const resolvedColorScheme = colorScheme ?? "dark";
|
|
167
|
+
const resolvedSize = size ?? "default";
|
|
168
|
+
|
|
121
169
|
return (
|
|
122
170
|
<BaseButton
|
|
123
171
|
className={buttonVariants({
|
|
124
172
|
variant: effectiveVariant,
|
|
173
|
+
colorScheme,
|
|
125
174
|
size,
|
|
126
175
|
class: className,
|
|
127
176
|
})}
|
|
@@ -129,6 +178,9 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|
|
129
178
|
render={render}
|
|
130
179
|
nativeButton={isNativeButton}
|
|
131
180
|
style={combinedStyles}
|
|
181
|
+
data-variant={resolvedVariant}
|
|
182
|
+
data-color-scheme={resolvedColorScheme}
|
|
183
|
+
data-size={resolvedSize}
|
|
132
184
|
{...props}
|
|
133
185
|
/>
|
|
134
186
|
);
|
|
@@ -77,90 +77,241 @@ Playground.argTypes = {
|
|
|
77
77
|
control: {
|
|
78
78
|
type: "radio",
|
|
79
79
|
},
|
|
80
|
-
options: [
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
"
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
options: ["solid", "outline", "ghost", "subtle"],
|
|
81
|
+
},
|
|
82
|
+
colorScheme: {
|
|
83
|
+
control: {
|
|
84
|
+
type: "radio",
|
|
85
|
+
},
|
|
86
|
+
options: ["dark", "light"],
|
|
87
|
+
},
|
|
88
|
+
rounded: {
|
|
89
|
+
control: {
|
|
90
|
+
type: "radio",
|
|
91
|
+
},
|
|
92
|
+
options: ["default", "sm", "full"],
|
|
88
93
|
},
|
|
89
94
|
};
|
|
90
95
|
Playground.args = {
|
|
91
96
|
size: "default",
|
|
92
97
|
disabled: false,
|
|
93
|
-
variant: "
|
|
98
|
+
variant: "solid",
|
|
99
|
+
colorScheme: "dark",
|
|
100
|
+
rounded: "default",
|
|
101
|
+
"aria-label": "Search",
|
|
94
102
|
};
|
|
95
103
|
|
|
96
104
|
// =============================================================================
|
|
97
|
-
// Variants
|
|
105
|
+
// Variants (Dark Color Scheme - for light backgrounds)
|
|
98
106
|
// =============================================================================
|
|
99
107
|
|
|
100
|
-
export const
|
|
101
|
-
<IconButton variant="
|
|
108
|
+
export const Solid = () => (
|
|
109
|
+
<IconButton variant="solid" aria-label="Search">
|
|
102
110
|
<SearchIcon />
|
|
103
111
|
</IconButton>
|
|
104
112
|
);
|
|
105
113
|
|
|
106
|
-
export const
|
|
107
|
-
<IconButton variant="
|
|
114
|
+
export const Outline = () => (
|
|
115
|
+
<IconButton variant="outline" aria-label="Search">
|
|
108
116
|
<SearchIcon />
|
|
109
117
|
</IconButton>
|
|
110
118
|
);
|
|
111
119
|
|
|
112
|
-
export const
|
|
113
|
-
<IconButton variant="
|
|
120
|
+
export const Ghost = () => (
|
|
121
|
+
<IconButton variant="ghost" aria-label="Search">
|
|
114
122
|
<SearchIcon />
|
|
115
123
|
</IconButton>
|
|
116
124
|
);
|
|
117
125
|
|
|
118
|
-
export const
|
|
119
|
-
<IconButton variant="
|
|
126
|
+
export const Subtle = () => (
|
|
127
|
+
<IconButton variant="subtle" aria-label="Search">
|
|
120
128
|
<SearchIcon />
|
|
121
129
|
</IconButton>
|
|
122
130
|
);
|
|
123
131
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
132
|
+
// =============================================================================
|
|
133
|
+
// Variants (Light Color Scheme - for dark backgrounds)
|
|
134
|
+
// =============================================================================
|
|
135
|
+
|
|
136
|
+
const DarkBackground = ({ children }: { children: React.ReactNode }) => (
|
|
137
|
+
<div className="rounded-radius-12 bg-gray-1200 p-spacing-32">{children}</div>
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
export const SolidLight = () => (
|
|
141
|
+
<DarkBackground>
|
|
142
|
+
<IconButton variant="solid" colorScheme="light" aria-label="Navigate">
|
|
143
|
+
<ArrowRightIcon />
|
|
144
|
+
</IconButton>
|
|
145
|
+
</DarkBackground>
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
export const OutlineLight = () => (
|
|
149
|
+
<DarkBackground>
|
|
150
|
+
<IconButton variant="outline" colorScheme="light" aria-label="Navigate">
|
|
151
|
+
<ArrowRightIcon />
|
|
152
|
+
</IconButton>
|
|
153
|
+
</DarkBackground>
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
export const GhostLight = () => (
|
|
157
|
+
<DarkBackground>
|
|
158
|
+
<IconButton variant="ghost" colorScheme="light" aria-label="Navigate">
|
|
159
|
+
<ArrowRightIcon />
|
|
160
|
+
</IconButton>
|
|
161
|
+
</DarkBackground>
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
export const SubtleLight = () => (
|
|
165
|
+
<DarkBackground>
|
|
166
|
+
<IconButton variant="subtle" colorScheme="light" aria-label="Navigate">
|
|
167
|
+
<ArrowRightIcon />
|
|
168
|
+
</IconButton>
|
|
169
|
+
</DarkBackground>
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
// =============================================================================
|
|
173
|
+
// All Variants Comparison
|
|
174
|
+
// =============================================================================
|
|
175
|
+
|
|
176
|
+
export const AllVariants = () => (
|
|
177
|
+
<div className="flex flex-col gap-spacing-32">
|
|
178
|
+
<div>
|
|
179
|
+
<h3 className="mb-spacing-16 text-14 font-medium text-text-secondary">
|
|
180
|
+
Dark Color Scheme (for light backgrounds)
|
|
181
|
+
</h3>
|
|
182
|
+
<div className="flex gap-spacing-16">
|
|
183
|
+
<IconButton variant="solid" aria-label="Solid">
|
|
184
|
+
<SearchIcon />
|
|
185
|
+
</IconButton>
|
|
186
|
+
<IconButton variant="outline" aria-label="Outline">
|
|
187
|
+
<SearchIcon />
|
|
188
|
+
</IconButton>
|
|
189
|
+
<IconButton variant="ghost" aria-label="Ghost">
|
|
190
|
+
<SearchIcon />
|
|
191
|
+
</IconButton>
|
|
192
|
+
<IconButton variant="subtle" aria-label="Subtle">
|
|
193
|
+
<SearchIcon />
|
|
194
|
+
</IconButton>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
<DarkBackground>
|
|
198
|
+
<h3 className="mb-spacing-16 text-14 font-medium text-gray-400">
|
|
199
|
+
Light Color Scheme (for dark backgrounds)
|
|
200
|
+
</h3>
|
|
201
|
+
<div className="flex gap-spacing-16">
|
|
202
|
+
<IconButton variant="solid" colorScheme="light" aria-label="Solid">
|
|
203
|
+
<ArrowRightIcon />
|
|
204
|
+
</IconButton>
|
|
205
|
+
<IconButton variant="outline" colorScheme="light" aria-label="Outline">
|
|
206
|
+
<ArrowRightIcon />
|
|
207
|
+
</IconButton>
|
|
208
|
+
<IconButton variant="ghost" colorScheme="light" aria-label="Ghost">
|
|
209
|
+
<ArrowRightIcon />
|
|
210
|
+
</IconButton>
|
|
211
|
+
<IconButton variant="subtle" colorScheme="light" aria-label="Subtle">
|
|
212
|
+
<ArrowRightIcon />
|
|
213
|
+
</IconButton>
|
|
214
|
+
</div>
|
|
215
|
+
</DarkBackground>
|
|
216
|
+
</div>
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
// =============================================================================
|
|
220
|
+
// Rounded Variants
|
|
221
|
+
// =============================================================================
|
|
222
|
+
|
|
223
|
+
export const RoundedDefault = () => (
|
|
224
|
+
<IconButton rounded="default" aria-label="Search">
|
|
225
|
+
<SearchIcon />
|
|
127
226
|
</IconButton>
|
|
128
227
|
);
|
|
129
228
|
|
|
130
|
-
export const
|
|
131
|
-
<IconButton
|
|
132
|
-
<
|
|
229
|
+
export const RoundedSm = () => (
|
|
230
|
+
<IconButton rounded="sm" aria-label="Search">
|
|
231
|
+
<SearchIcon />
|
|
133
232
|
</IconButton>
|
|
134
233
|
);
|
|
135
234
|
|
|
235
|
+
export const RoundedFull = () => (
|
|
236
|
+
<IconButton rounded="full" aria-label="Search">
|
|
237
|
+
<SearchIcon />
|
|
238
|
+
</IconButton>
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
export const AllRounded = () => (
|
|
242
|
+
<div className="flex gap-spacing-16">
|
|
243
|
+
<div className="text-center">
|
|
244
|
+
<IconButton rounded="default" aria-label="Default rounded">
|
|
245
|
+
<SearchIcon />
|
|
246
|
+
</IconButton>
|
|
247
|
+
<p className="mt-spacing-8 text-12 text-text-muted">default</p>
|
|
248
|
+
</div>
|
|
249
|
+
<div className="text-center">
|
|
250
|
+
<IconButton rounded="sm" aria-label="Small rounded">
|
|
251
|
+
<SearchIcon />
|
|
252
|
+
</IconButton>
|
|
253
|
+
<p className="mt-spacing-8 text-12 text-text-muted">sm</p>
|
|
254
|
+
</div>
|
|
255
|
+
<div className="text-center">
|
|
256
|
+
<IconButton rounded="full" aria-label="Full rounded">
|
|
257
|
+
<SearchIcon />
|
|
258
|
+
</IconButton>
|
|
259
|
+
<p className="mt-spacing-8 text-12 text-text-muted">full</p>
|
|
260
|
+
</div>
|
|
261
|
+
</div>
|
|
262
|
+
);
|
|
263
|
+
|
|
136
264
|
// =============================================================================
|
|
137
265
|
// Sizes
|
|
138
266
|
// =============================================================================
|
|
139
267
|
|
|
140
268
|
export const Small = () => (
|
|
141
|
-
<IconButton size="sm">
|
|
269
|
+
<IconButton size="sm" aria-label="Search">
|
|
142
270
|
<ArrowRightIcon />
|
|
143
271
|
</IconButton>
|
|
144
272
|
);
|
|
145
273
|
|
|
146
274
|
export const Medium = () => (
|
|
147
|
-
<IconButton size="default">
|
|
275
|
+
<IconButton size="default" aria-label="Search">
|
|
148
276
|
<SearchIcon />
|
|
149
277
|
</IconButton>
|
|
150
278
|
);
|
|
151
279
|
|
|
152
280
|
export const Large = () => (
|
|
153
|
-
<IconButton size="lg">
|
|
281
|
+
<IconButton size="lg" aria-label="Search">
|
|
154
282
|
<SearchIcon />
|
|
155
283
|
</IconButton>
|
|
156
284
|
);
|
|
157
285
|
|
|
286
|
+
export const AllSizes = () => (
|
|
287
|
+
<div className="flex items-center gap-spacing-16">
|
|
288
|
+
<div className="text-center">
|
|
289
|
+
<IconButton size="sm" aria-label="Small">
|
|
290
|
+
<ArrowRightIcon />
|
|
291
|
+
</IconButton>
|
|
292
|
+
<p className="mt-spacing-8 text-12 text-text-muted">sm (32px)</p>
|
|
293
|
+
</div>
|
|
294
|
+
<div className="text-center">
|
|
295
|
+
<IconButton size="default" aria-label="Default">
|
|
296
|
+
<SearchIcon />
|
|
297
|
+
</IconButton>
|
|
298
|
+
<p className="mt-spacing-8 text-12 text-text-muted">default (40px)</p>
|
|
299
|
+
</div>
|
|
300
|
+
<div className="text-center">
|
|
301
|
+
<IconButton size="lg" aria-label="Large">
|
|
302
|
+
<SearchIcon />
|
|
303
|
+
</IconButton>
|
|
304
|
+
<p className="mt-spacing-8 text-12 text-text-muted">lg (48px)</p>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
);
|
|
308
|
+
|
|
158
309
|
// =============================================================================
|
|
159
310
|
// States
|
|
160
311
|
// =============================================================================
|
|
161
312
|
|
|
162
313
|
export const Disabled = () => (
|
|
163
|
-
<IconButton disabled>
|
|
314
|
+
<IconButton disabled aria-label="Search">
|
|
164
315
|
<SearchIcon />
|
|
165
316
|
</IconButton>
|
|
166
317
|
);
|