@ds-mo/ui 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/LICENSE +21 -0
- package/README.md +81 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +969 -0
- package/dist/index.js +2623 -0
- package/dist/index.js.map +1 -0
- package/dist/r/accordion.json +79 -0
- package/dist/r/badge.json +69 -0
- package/dist/r/banner.json +90 -0
- package/dist/r/breadcrumb.json +70 -0
- package/dist/r/button-group.json +65 -0
- package/dist/r/button.json +137 -0
- package/dist/r/card.json +82 -0
- package/dist/r/checkbox.json +91 -0
- package/dist/r/divider.json +57 -0
- package/dist/r/empty-state.json +69 -0
- package/dist/r/error-boundary.json +66 -0
- package/dist/r/fade.json +65 -0
- package/dist/r/field.json +71 -0
- package/dist/r/header.json +67 -0
- package/dist/r/input.json +77 -0
- package/dist/r/loader.json +54 -0
- package/dist/r/menu.json +130 -0
- package/dist/r/modal.json +93 -0
- package/dist/r/pagination.json +80 -0
- package/dist/r/radio.json +85 -0
- package/dist/r/registry.json +1600 -0
- package/dist/r/scrollbar.json +68 -0
- package/dist/r/select.json +93 -0
- package/dist/r/sidebar.json +105 -0
- package/dist/r/skeleton.json +72 -0
- package/dist/r/slider.json +87 -0
- package/dist/r/surface.json +97 -0
- package/dist/r/tab-group.json +72 -0
- package/dist/r/tab.json +71 -0
- package/dist/r/table.json +110 -0
- package/dist/r/tag.json +110 -0
- package/dist/r/text.json +94 -0
- package/dist/r/toast.json +77 -0
- package/dist/r/toggle-button-group.json +65 -0
- package/dist/r/toggle-button.json +94 -0
- package/dist/r/toggle.json +65 -0
- package/dist/r/tooltip.json +86 -0
- package/package.json +80 -0
- package/src/components/Accordion/Accordion.module.css +66 -0
- package/src/components/Accordion/Accordion.stories.tsx +95 -0
- package/src/components/Accordion/Accordion.tsx +122 -0
- package/src/components/Accordion/index.ts +2 -0
- package/src/components/Badge/Badge.module.css +6 -0
- package/src/components/Badge/Badge.stories.tsx +99 -0
- package/src/components/Badge/Badge.tsx +23 -0
- package/src/components/Badge/index.ts +2 -0
- package/src/components/Banner/Banner.module.css +67 -0
- package/src/components/Banner/Banner.stories.tsx +81 -0
- package/src/components/Banner/Banner.tsx +109 -0
- package/src/components/Banner/index.ts +2 -0
- package/src/components/Breadcrumb/Breadcrumb.module.css +46 -0
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +72 -0
- package/src/components/Breadcrumb/Breadcrumb.tsx +68 -0
- package/src/components/Breadcrumb/index.ts +2 -0
- package/src/components/Button/Button.module.css +343 -0
- package/src/components/Button/Button.stories.tsx +575 -0
- package/src/components/Button/Button.tsx +201 -0
- package/src/components/Button/index.ts +10 -0
- package/src/components/ButtonGroup/ButtonGroup.module.css +157 -0
- package/src/components/ButtonGroup/ButtonGroup.stories.tsx +384 -0
- package/src/components/ButtonGroup/ButtonGroup.tsx +122 -0
- package/src/components/ButtonGroup/index.ts +2 -0
- package/src/components/Card/Card.module.css +36 -0
- package/src/components/Card/Card.stories.tsx +78 -0
- package/src/components/Card/Card.tsx +53 -0
- package/src/components/Card/index.ts +2 -0
- package/src/components/Checkbox/Checkbox.module.css +47 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +129 -0
- package/src/components/Checkbox/Checkbox.tsx +68 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/Divider/Divider.module.css +19 -0
- package/src/components/Divider/Divider.stories.tsx +55 -0
- package/src/components/Divider/Divider.tsx +28 -0
- package/src/components/Divider/index.ts +2 -0
- package/src/components/EmptyState/EmptyState.module.css +8 -0
- package/src/components/EmptyState/EmptyState.stories.tsx +53 -0
- package/src/components/EmptyState/EmptyState.tsx +31 -0
- package/src/components/EmptyState/index.ts +2 -0
- package/src/components/ErrorBoundary/ErrorBoundary.module.css +18 -0
- package/src/components/ErrorBoundary/ErrorBoundary.stories.tsx +38 -0
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +50 -0
- package/src/components/ErrorBoundary/index.ts +2 -0
- package/src/components/Fade/Fade.module.css +31 -0
- package/src/components/Fade/Fade.stories.tsx +35 -0
- package/src/components/Fade/Fade.tsx +33 -0
- package/src/components/Fade/index.ts +2 -0
- package/src/components/Field/Field.module.css +5 -0
- package/src/components/Field/Field.stories.tsx +111 -0
- package/src/components/Field/Field.tsx +22 -0
- package/src/components/Field/index.ts +2 -0
- package/src/components/Header/Header.module.css +33 -0
- package/src/components/Header/Header.stories.tsx +52 -0
- package/src/components/Header/Header.tsx +42 -0
- package/src/components/Header/index.ts +2 -0
- package/src/components/Input/Input.module.css +71 -0
- package/src/components/Input/Input.stories.tsx +135 -0
- package/src/components/Input/Input.tsx +76 -0
- package/src/components/Input/index.ts +2 -0
- package/src/components/LabelWrap/LabelWrap.module.css +34 -0
- package/src/components/LabelWrap/LabelWrap.tsx +32 -0
- package/src/components/LabelWrap/index.ts +1 -0
- package/src/components/Loader/Loader.module.css +9 -0
- package/src/components/Loader/Loader.stories.tsx +44 -0
- package/src/components/Loader/Loader.tsx +43 -0
- package/src/components/Loader/index.ts +2 -0
- package/src/components/Menu/DestructiveMenuItem.module.css +57 -0
- package/src/components/Menu/DestructiveMenuItem.tsx +64 -0
- package/src/components/Menu/Menu.module.css +49 -0
- package/src/components/Menu/Menu.stories.tsx +129 -0
- package/src/components/Menu/Menu.tsx +269 -0
- package/src/components/Menu/MenuItem.module.css +84 -0
- package/src/components/Menu/MenuItem.tsx +101 -0
- package/src/components/Menu/index.ts +6 -0
- package/src/components/Modal/Modal.module.css +67 -0
- package/src/components/Modal/Modal.stories.tsx +71 -0
- package/src/components/Modal/Modal.tsx +122 -0
- package/src/components/Modal/index.ts +2 -0
- package/src/components/Pagination/Pagination.module.css +64 -0
- package/src/components/Pagination/Pagination.stories.tsx +51 -0
- package/src/components/Pagination/Pagination.tsx +103 -0
- package/src/components/Pagination/index.ts +2 -0
- package/src/components/Radio/Radio.module.css +61 -0
- package/src/components/Radio/Radio.stories.tsx +101 -0
- package/src/components/Radio/Radio.tsx +108 -0
- package/src/components/Radio/index.ts +2 -0
- package/src/components/Scrollbar/Scrollbar.module.css +81 -0
- package/src/components/Scrollbar/Scrollbar.stories.tsx +46 -0
- package/src/components/Scrollbar/Scrollbar.tsx +187 -0
- package/src/components/Scrollbar/index.ts +2 -0
- package/src/components/Select/Select.module.css +31 -0
- package/src/components/Select/Select.stories.tsx +59 -0
- package/src/components/Select/Select.tsx +92 -0
- package/src/components/Select/index.ts +2 -0
- package/src/components/Sidebar/Sidebar.module.css +161 -0
- package/src/components/Sidebar/Sidebar.stories.tsx +125 -0
- package/src/components/Sidebar/Sidebar.tsx +129 -0
- package/src/components/Sidebar/SidebarItem.tsx +57 -0
- package/src/components/Sidebar/SidebarSection.tsx +42 -0
- package/src/components/Sidebar/index.ts +6 -0
- package/src/components/Skeleton/Skeleton.module.css +53 -0
- package/src/components/Skeleton/Skeleton.stories.tsx +89 -0
- package/src/components/Skeleton/Skeleton.tsx +66 -0
- package/src/components/Skeleton/index.ts +2 -0
- package/src/components/Slider/Slider.module.css +62 -0
- package/src/components/Slider/Slider.stories.tsx +120 -0
- package/src/components/Slider/Slider.tsx +74 -0
- package/src/components/Slider/index.ts +2 -0
- package/src/components/Surface/Surface.module.css +222 -0
- package/src/components/Surface/Surface.stories.tsx +213 -0
- package/src/components/Surface/Surface.tsx +219 -0
- package/src/components/Surface/index.ts +12 -0
- package/src/components/Tab/Tab.module.css +66 -0
- package/src/components/Tab/Tab.stories.tsx +103 -0
- package/src/components/Tab/Tab.tsx +41 -0
- package/src/components/Tab/index.ts +2 -0
- package/src/components/TabGroup/TabGroup.module.css +26 -0
- package/src/components/TabGroup/TabGroup.stories.tsx +60 -0
- package/src/components/TabGroup/TabGroup.tsx +83 -0
- package/src/components/TabGroup/index.ts +2 -0
- package/src/components/Table/Table.module.css +130 -0
- package/src/components/Table/Table.stories.tsx +111 -0
- package/src/components/Table/Table.tsx +226 -0
- package/src/components/Table/index.ts +11 -0
- package/src/components/Tag/Tag.module.css +270 -0
- package/src/components/Tag/Tag.stories.tsx +399 -0
- package/src/components/Tag/Tag.tsx +162 -0
- package/src/components/Tag/index.ts +2 -0
- package/src/components/Text/Text.module.css +166 -0
- package/src/components/Text/Text.stories.tsx +212 -0
- package/src/components/Text/Text.tsx +181 -0
- package/src/components/Text/index.ts +13 -0
- package/src/components/Toast/Toast.module.css +91 -0
- package/src/components/Toast/Toast.stories.tsx +66 -0
- package/src/components/Toast/Toast.tsx +182 -0
- package/src/components/Toast/index.ts +8 -0
- package/src/components/Toggle/Toggle.module.css +87 -0
- package/src/components/Toggle/Toggle.stories.tsx +85 -0
- package/src/components/Toggle/Toggle.tsx +52 -0
- package/src/components/Toggle/index.ts +2 -0
- package/src/components/ToggleButton/ToggleButton.module.css +172 -0
- package/src/components/ToggleButton/ToggleButton.stories.tsx +299 -0
- package/src/components/ToggleButton/ToggleButton.tsx +118 -0
- package/src/components/ToggleButton/index.ts +2 -0
- package/src/components/ToggleButtonGroup/ToggleButtonGroup.module.css +163 -0
- package/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx +341 -0
- package/src/components/ToggleButtonGroup/ToggleButtonGroup.tsx +111 -0
- package/src/components/ToggleButtonGroup/index.ts +2 -0
- package/src/components/Tooltip/Tooltip.module.css +45 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +46 -0
- package/src/components/Tooltip/Tooltip.tsx +224 -0
- package/src/components/Tooltip/index.ts +2 -0
- package/src/css-modules.d.ts +4 -0
- package/src/docs/ColorUsage.mdx +195 -0
- package/src/docs/ElevationUsage.mdx +95 -0
- package/src/docs/Introduction.mdx +97 -0
- package/src/docs/OpticalSizing.mdx +178 -0
- package/src/docs/TypographyUsage.mdx +121 -0
- package/src/index.ts +154 -0
- package/src/stories/Colors.stories.tsx +528 -0
- package/src/stories/Dimensions.stories.tsx +200 -0
- package/src/stories/Effects.stories.tsx +231 -0
- package/src/stories/Icons.stories.tsx +159 -0
- package/src/stories/Typography.stories.tsx +157 -0
- package/src/types/icons.ts +15 -0
- package/src/types/index.ts +1 -0
- package/src/utils/cn.ts +6 -0
- package/src/utils/css-tokens.ts +22 -0
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Button } from './Button';
|
|
4
|
+
import { Surface } from '@/components/Surface';
|
|
5
|
+
import type { SurfaceIntent, SurfaceContrast } from '@/components/Surface';
|
|
6
|
+
import type { ButtonVariant, ButtonElevation, ButtonIntent, ButtonContrast, ButtonSize, ButtonBackground } from './Button';
|
|
7
|
+
import type { IconComponent } from '@/types/icons';
|
|
8
|
+
|
|
9
|
+
/** Placeholder icon component for stories (no real icon dependency). */
|
|
10
|
+
const PlaceholderIcon: IconComponent = ({ size = 20 }) => (
|
|
11
|
+
<svg width={size} height={size} viewBox="0 0 20 20" fill="currentColor">
|
|
12
|
+
<circle cx="10" cy="10" r="6" />
|
|
13
|
+
</svg>
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
const meta: Meta<typeof Button> = {
|
|
17
|
+
title: 'Primitives (Reviewed)/Button',
|
|
18
|
+
component: Button,
|
|
19
|
+
args: {
|
|
20
|
+
label: 'Button',
|
|
21
|
+
variant: 'primary',
|
|
22
|
+
intent: 'brand',
|
|
23
|
+
size: 'md',
|
|
24
|
+
contrast: 'bold',
|
|
25
|
+
elevation: 'none',
|
|
26
|
+
rounded: false,
|
|
27
|
+
inactive: false,
|
|
28
|
+
loading: false,
|
|
29
|
+
dropdown: false,
|
|
30
|
+
fullWidth: false,
|
|
31
|
+
},
|
|
32
|
+
argTypes: {
|
|
33
|
+
variant: { control: 'select', options: ['primary', 'secondary'] },
|
|
34
|
+
elevation: { control: 'select', options: ['elevated', 'flat', 'none', 'floating'] },
|
|
35
|
+
intent: { control: 'select', options: ['none', 'neutral', 'brand', 'ai', 'negative', 'warning', 'caution', 'positive'] },
|
|
36
|
+
size: { control: 'select', options: ['xs', 'sm', 'md', 'lg'] },
|
|
37
|
+
contrast: { control: 'select', options: ['strong', 'bold', 'medium', 'faint'] },
|
|
38
|
+
label: { control: 'text' },
|
|
39
|
+
rounded: { control: 'boolean' },
|
|
40
|
+
inactive: { control: 'boolean' },
|
|
41
|
+
loading: { control: 'boolean' },
|
|
42
|
+
dropdown: { control: 'boolean' },
|
|
43
|
+
background: { control: 'select', options: ['faint', 'medium', 'bold', 'strong', 'always-dark'] },
|
|
44
|
+
fullWidth: { control: 'boolean' },
|
|
45
|
+
badgeCount:{ control: 'number' },
|
|
46
|
+
width: { control: 'text' },
|
|
47
|
+
icon: {
|
|
48
|
+
control: 'boolean',
|
|
49
|
+
mapping: { true: PlaceholderIcon, false: undefined },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export default meta;
|
|
55
|
+
type Story = StoryObj<typeof Button>;
|
|
56
|
+
|
|
57
|
+
export const Playground: Story = {};
|
|
58
|
+
|
|
59
|
+
// ─── Matrix ───────────────────────────────────────────────────────────────────
|
|
60
|
+
|
|
61
|
+
const INTENTS: ButtonIntent[] = ['none', 'neutral', 'brand', 'ai', 'negative', 'warning', 'caution', 'positive'];
|
|
62
|
+
const CONTRASTS: ButtonContrast[] = ['strong', 'bold', 'medium', 'faint'];
|
|
63
|
+
const SIZES: ButtonSize[] = ['lg', 'md', 'sm', 'xs'];
|
|
64
|
+
const VARIANTS: ButtonVariant[] = ['primary', 'secondary'];
|
|
65
|
+
const ELEVATIONS: ButtonElevation[] = ['elevated', 'flat', 'none', 'floating'];
|
|
66
|
+
|
|
67
|
+
const col: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start' };
|
|
68
|
+
const row: React.CSSProperties = { display: 'flex', gap: 8, alignItems: 'center' };
|
|
69
|
+
const lbl = (text: string): React.CSSProperties => ({ fontSize: 10, fontFamily: 'monospace', color: '#888', minWidth: 80, flexShrink: 0 });
|
|
70
|
+
const section = (text: string) => (
|
|
71
|
+
<div style={{ fontSize: 11, fontWeight: 600, letterSpacing: '0.05em', textTransform: 'uppercase', color: '#555', marginTop: 8 }}>
|
|
72
|
+
{text}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
const divider = <hr style={{ border: 'none', borderTop: '1px solid #e0e0e0', margin: '16px 0' }} />;
|
|
76
|
+
|
|
77
|
+
export const Matrix: Story = {
|
|
78
|
+
parameters: { layout: 'padded' },
|
|
79
|
+
render: () => (
|
|
80
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 0, fontFamily: 'sans-serif' }}>
|
|
81
|
+
|
|
82
|
+
{/* ── Variants × Intent ── */}
|
|
83
|
+
{section('Variants × Intent — md, bold contrast')}
|
|
84
|
+
<div style={{ ...col, marginTop: 12 }}>
|
|
85
|
+
<div style={row}>
|
|
86
|
+
<span style={lbl('')}></span>
|
|
87
|
+
{VARIANTS.map(v => (
|
|
88
|
+
<span key={v} style={{ ...lbl(''), minWidth: 100, textAlign: 'center' }}>{v}</span>
|
|
89
|
+
))}
|
|
90
|
+
<span style={{ ...lbl(''), minWidth: 100, textAlign: 'center' }}>secondary / none</span>
|
|
91
|
+
</div>
|
|
92
|
+
{INTENTS.map(intent => (
|
|
93
|
+
<div key={intent} style={row}>
|
|
94
|
+
<span style={lbl(intent)}>{intent}</span>
|
|
95
|
+
{VARIANTS.map(v => (
|
|
96
|
+
<div key={v} style={{ minWidth: 100, display: 'flex', justifyContent: 'center' }}>
|
|
97
|
+
<Button variant={v} intent={intent} label="Label" size="md" />
|
|
98
|
+
</div>
|
|
99
|
+
))}
|
|
100
|
+
<div style={{ minWidth: 100, display: 'flex', justifyContent: 'center' }}>
|
|
101
|
+
<Button variant="secondary" intent={intent} elevation="none" label="Label" size="md" />
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
))}
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
{divider}
|
|
108
|
+
|
|
109
|
+
{/* ── Elevation levels ── */}
|
|
110
|
+
{section('Elevation levels — secondary variant')}
|
|
111
|
+
<div style={{ ...col, marginTop: 12 }}>
|
|
112
|
+
{ELEVATIONS.map(elev => (
|
|
113
|
+
<div key={elev} style={row}>
|
|
114
|
+
<span style={lbl(elev)}>{elev}</span>
|
|
115
|
+
<Button variant="secondary" elevation={elev} label="Label" />
|
|
116
|
+
<Button variant="secondary" elevation={elev} icon={PlaceholderIcon} label="Label" />
|
|
117
|
+
<Button variant="secondary" elevation={elev} icon={PlaceholderIcon} aria-label="action" />
|
|
118
|
+
</div>
|
|
119
|
+
))}
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
{divider}
|
|
123
|
+
|
|
124
|
+
{/* ── Elevation levels — primary ── */}
|
|
125
|
+
{section('Elevation levels — primary variant')}
|
|
126
|
+
<div style={{ ...col, marginTop: 12 }}>
|
|
127
|
+
{ELEVATIONS.map(elev => (
|
|
128
|
+
<div key={elev} style={row}>
|
|
129
|
+
<span style={lbl(elev)}>{elev}</span>
|
|
130
|
+
<Button variant="primary" intent="brand" elevation={elev} label="Brand" />
|
|
131
|
+
<Button variant="primary" intent="none" elevation={elev} label="None" />
|
|
132
|
+
</div>
|
|
133
|
+
))}
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
{divider}
|
|
137
|
+
|
|
138
|
+
{/* ── Contrast × Intent (primary only) ── */}
|
|
139
|
+
{section('Primary × Contrast × Intent')}
|
|
140
|
+
<div style={{ ...col, marginTop: 12 }}>
|
|
141
|
+
<div style={row}>
|
|
142
|
+
<span style={lbl('')}></span>
|
|
143
|
+
{CONTRASTS.map(c => (
|
|
144
|
+
<span key={c} style={{ ...lbl(''), minWidth: 90, textAlign: 'center' }}>{c}</span>
|
|
145
|
+
))}
|
|
146
|
+
</div>
|
|
147
|
+
{INTENTS.filter(i => i !== 'none').map(intent => (
|
|
148
|
+
<div key={intent} style={row}>
|
|
149
|
+
<span style={lbl(intent)}>{intent}</span>
|
|
150
|
+
{CONTRASTS.map(contrast => (
|
|
151
|
+
<div key={contrast} style={{ minWidth: 90, display: 'flex', justifyContent: 'center' }}>
|
|
152
|
+
<Button variant="primary" intent={intent} contrast={contrast} label="Label" size="md" elevation="flat" />
|
|
153
|
+
</div>
|
|
154
|
+
))}
|
|
155
|
+
</div>
|
|
156
|
+
))}
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
{divider}
|
|
160
|
+
|
|
161
|
+
{/* ── Sizes × Variants ── */}
|
|
162
|
+
{section('Sizes × Variants')}
|
|
163
|
+
<div style={{ ...col, marginTop: 12 }}>
|
|
164
|
+
<div style={row}>
|
|
165
|
+
<span style={lbl('')}></span>
|
|
166
|
+
{[...VARIANTS, 'ghost'].map(v => (
|
|
167
|
+
<span key={v} style={{ ...lbl(''), minWidth: 100, textAlign: 'center' }}>{v === 'ghost' ? 'secondary/none' : v}</span>
|
|
168
|
+
))}
|
|
169
|
+
</div>
|
|
170
|
+
{SIZES.flatMap(size => ([
|
|
171
|
+
{ key: `${size}-label`, size, iconProp: false, labelProp: true },
|
|
172
|
+
{ key: `${size}-icon`, size, iconProp: true, labelProp: false },
|
|
173
|
+
{ key: `${size}-iconlabel`, size, iconProp: true, labelProp: true },
|
|
174
|
+
])).map(({ key, size, iconProp, labelProp }) => (
|
|
175
|
+
<div key={key} style={row}>
|
|
176
|
+
<span style={lbl(key)}>{key}</span>
|
|
177
|
+
{VARIANTS.map(v => (
|
|
178
|
+
<div key={v} style={{ minWidth: 100, display: 'flex', justifyContent: 'center' }}>
|
|
179
|
+
<Button variant={v} size={size} label={labelProp ? 'Label' : undefined} icon={iconProp ? PlaceholderIcon : undefined} aria-label="action" />
|
|
180
|
+
</div>
|
|
181
|
+
))}
|
|
182
|
+
<div style={{ minWidth: 100, display: 'flex', justifyContent: 'center' }}>
|
|
183
|
+
<Button variant="secondary" elevation="none" size={size} label={labelProp ? 'Label' : undefined} icon={iconProp ? PlaceholderIcon : undefined} aria-label="action" />
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
))}
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
{divider}
|
|
190
|
+
|
|
191
|
+
{/* ── Icon states ── */}
|
|
192
|
+
{section('Icon states — md')}
|
|
193
|
+
<div style={{ ...col, marginTop: 12 }}>
|
|
194
|
+
{([
|
|
195
|
+
{ combo: 'icon only', iconProp: true, labelProp: false, roundedProp: false, dropdownProp: false },
|
|
196
|
+
{ combo: 'icon only rounded', iconProp: true, labelProp: false, roundedProp: true, dropdownProp: false },
|
|
197
|
+
{ combo: 'icon + label', iconProp: true, labelProp: true, roundedProp: false, dropdownProp: false },
|
|
198
|
+
{ combo: 'label only', iconProp: false, labelProp: true, roundedProp: false, dropdownProp: false },
|
|
199
|
+
{ combo: 'dropdown', iconProp: false, labelProp: true, roundedProp: false, dropdownProp: true },
|
|
200
|
+
{ combo: 'icon + dropdown', iconProp: true, labelProp: true, roundedProp: false, dropdownProp: true },
|
|
201
|
+
] as const).map(({ combo, iconProp, labelProp, roundedProp, dropdownProp }) => (
|
|
202
|
+
<div key={combo} style={row}>
|
|
203
|
+
<span style={lbl(combo)}>{combo}</span>
|
|
204
|
+
{VARIANTS.map(v => (
|
|
205
|
+
<div key={v} style={{ minWidth: 100, display: 'flex', justifyContent: 'center' }}>
|
|
206
|
+
<Button variant={v} label={labelProp ? 'Label' : undefined} icon={iconProp ? PlaceholderIcon : undefined} rounded={roundedProp} dropdown={dropdownProp} aria-label="action" />
|
|
207
|
+
</div>
|
|
208
|
+
))}
|
|
209
|
+
<div style={{ minWidth: 100, display: 'flex', justifyContent: 'center' }}>
|
|
210
|
+
<Button variant="secondary" elevation="none" label={labelProp ? 'Label' : undefined} icon={iconProp ? PlaceholderIcon : undefined} rounded={roundedProp} dropdown={dropdownProp} aria-label="action" />
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
))}
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
{divider}
|
|
217
|
+
|
|
218
|
+
{/* ── States ── */}
|
|
219
|
+
{section('States')}
|
|
220
|
+
<div style={{ ...col, marginTop: 12 }}>
|
|
221
|
+
{([
|
|
222
|
+
{ label: 'default', props: {} },
|
|
223
|
+
{ label: 'Inactive', props: { inactive: true } },
|
|
224
|
+
{ label: 'rounded', props: { rounded: true } },
|
|
225
|
+
] as const).map(({ label: stateLabel, props }) => (
|
|
226
|
+
<div key={stateLabel} style={row}>
|
|
227
|
+
<span style={lbl(stateLabel)}>{stateLabel}</span>
|
|
228
|
+
{VARIANTS.map(v => (
|
|
229
|
+
<div key={v} style={{ minWidth: 100, display: 'flex', justifyContent: 'center' }}>
|
|
230
|
+
<Button variant={v} label="Label" {...(props as object)} />
|
|
231
|
+
</div>
|
|
232
|
+
))}
|
|
233
|
+
<div style={{ minWidth: 100, display: 'flex', justifyContent: 'center' }}>
|
|
234
|
+
<Button variant="secondary" elevation="none" label="Label" {...(props as object)} />
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
))}
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
</div>
|
|
241
|
+
),
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// ─── Individual stories ───────────────────────────────────────────────────────
|
|
245
|
+
|
|
246
|
+
export const Variants: Story = {
|
|
247
|
+
render: () => (
|
|
248
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
249
|
+
<Button variant="primary" label="Primary" />
|
|
250
|
+
<Button variant="secondary" label="Secondary (flat)" />
|
|
251
|
+
<Button variant="secondary" elevation="elevated" label="Secondary elevated" />
|
|
252
|
+
<Button variant="secondary" elevation="none" label="Ghost" />
|
|
253
|
+
</div>
|
|
254
|
+
),
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
export const Sizes: Story = {
|
|
258
|
+
render: () => (
|
|
259
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
260
|
+
<Button size="lg" label="Large" />
|
|
261
|
+
<Button size="md" label="Medium" />
|
|
262
|
+
<Button size="sm" label="Small" />
|
|
263
|
+
<Button size="xs" label="Extra Small" />
|
|
264
|
+
</div>
|
|
265
|
+
),
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
export const Intents: Story = {
|
|
269
|
+
render: () => (
|
|
270
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center', flexWrap: 'wrap' }}>
|
|
271
|
+
<Button intent="none" label="None" />
|
|
272
|
+
<Button intent="neutral" label="Neutral" />
|
|
273
|
+
<Button intent="brand" label="Brand" />
|
|
274
|
+
<Button intent="ai" label="AI" />
|
|
275
|
+
<Button intent="negative" label="Negative" />
|
|
276
|
+
<Button intent="warning" label="Warning" />
|
|
277
|
+
<Button intent="caution" label="Caution" />
|
|
278
|
+
<Button intent="positive" label="Positive" />
|
|
279
|
+
</div>
|
|
280
|
+
),
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
export const Elevation: Story = {
|
|
284
|
+
render: () => (
|
|
285
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
|
|
286
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
287
|
+
<span style={{ fontSize: 10, fontFamily: 'monospace', color: '#888', minWidth: 80 }}>primary</span>
|
|
288
|
+
<Button variant="primary" label="elevated" elevation="elevated" />
|
|
289
|
+
<Button variant="primary" label="flat" elevation="flat" />
|
|
290
|
+
<Button variant="primary" label="none" elevation="none" />
|
|
291
|
+
<Button variant="primary" label="floating" elevation="floating" />
|
|
292
|
+
</div>
|
|
293
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
294
|
+
<span style={{ fontSize: 10, fontFamily: 'monospace', color: '#888', minWidth: 80 }}>secondary</span>
|
|
295
|
+
<Button variant="secondary" label="elevated" elevation="elevated" />
|
|
296
|
+
<Button variant="secondary" label="flat" elevation="flat" />
|
|
297
|
+
<Button variant="secondary" label="none" elevation="none" />
|
|
298
|
+
<Button variant="secondary" label="floating" elevation="floating" />
|
|
299
|
+
</div>
|
|
300
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
301
|
+
<span style={{ fontSize: 10, fontFamily: 'monospace', color: '#888', minWidth: 80 }}>p / intentNone</span>
|
|
302
|
+
<Button variant="primary" intent="none" label="elevated" elevation="elevated" />
|
|
303
|
+
<Button variant="primary" intent="none" label="flat" elevation="flat" />
|
|
304
|
+
<Button variant="primary" intent="none" label="none" elevation="none" />
|
|
305
|
+
<Button variant="primary" intent="none" label="floating" elevation="floating" />
|
|
306
|
+
</div>
|
|
307
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
308
|
+
<span style={{ fontSize: 10, fontFamily: 'monospace', color: '#888', minWidth: 80 }}>FAB</span>
|
|
309
|
+
<Button variant="primary" icon={PlaceholderIcon} rounded elevation="floating" aria-label="FAB" />
|
|
310
|
+
<Button variant="secondary" icon={PlaceholderIcon} rounded elevation="floating" aria-label="FAB secondary" />
|
|
311
|
+
</div>
|
|
312
|
+
</div>
|
|
313
|
+
),
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
export const IconOnly: Story = {
|
|
317
|
+
render: () => (
|
|
318
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
319
|
+
<Button variant="primary" icon={PlaceholderIcon} aria-label="Action" />
|
|
320
|
+
<Button variant="secondary" icon={PlaceholderIcon} aria-label="Action" />
|
|
321
|
+
<Button variant="secondary" elevation="none" icon={PlaceholderIcon} aria-label="Action" />
|
|
322
|
+
</div>
|
|
323
|
+
),
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
export const IconAndLabel: Story = {
|
|
327
|
+
render: () => (
|
|
328
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
329
|
+
<Button variant="primary" icon={PlaceholderIcon} label="Primary" />
|
|
330
|
+
<Button variant="secondary" icon={PlaceholderIcon} label="Secondary" />
|
|
331
|
+
<Button variant="secondary" elevation="none" icon={PlaceholderIcon} label="Ghost" />
|
|
332
|
+
</div>
|
|
333
|
+
),
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
export const WithBadge: Story = {
|
|
337
|
+
render: () => (
|
|
338
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
339
|
+
<Button variant="secondary" label="Messages" badgeCount={3} />
|
|
340
|
+
<Button variant="secondary" label="Notifications" badgeCount={9} />
|
|
341
|
+
<Button variant="secondary" label="Alerts" badgeCount={12} />
|
|
342
|
+
</div>
|
|
343
|
+
),
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
export const Inactive: Story = {
|
|
347
|
+
render: () => (
|
|
348
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
349
|
+
<Button variant="primary" label="Primary" inactive />
|
|
350
|
+
<Button variant="secondary" label="Secondary" inactive />
|
|
351
|
+
<Button variant="secondary" elevation="none" label="Ghost" inactive />
|
|
352
|
+
</div>
|
|
353
|
+
),
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
export const Rounded: Story = {
|
|
357
|
+
render: () => (
|
|
358
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
359
|
+
<Button variant="primary" label="Rounded" rounded />
|
|
360
|
+
<Button variant="secondary" label="Rounded" rounded />
|
|
361
|
+
<Button variant="secondary" elevation="none" label="Rounded" rounded />
|
|
362
|
+
</div>
|
|
363
|
+
),
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
export const Contrasts: Story = {
|
|
367
|
+
render: () => (
|
|
368
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
369
|
+
<Button variant="primary" label="Strong" contrast="strong" elevation="flat" />
|
|
370
|
+
<Button variant="primary" label="Bold" contrast="bold" elevation="flat" />
|
|
371
|
+
<Button variant="primary" label="Medium" contrast="medium" elevation="flat" />
|
|
372
|
+
<Button variant="primary" label="Faint" contrast="faint" elevation="flat" />
|
|
373
|
+
</div>
|
|
374
|
+
),
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
export const Loading: Story = {
|
|
378
|
+
render: () => (
|
|
379
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
380
|
+
<Button variant="primary" label="Saving" loading />
|
|
381
|
+
<Button variant="secondary" label="Saving" loading />
|
|
382
|
+
<Button variant="secondary" elevation="none" label="Saving" loading />
|
|
383
|
+
<Button variant="primary" icon={PlaceholderIcon} label="Saving" loading />
|
|
384
|
+
<Button variant="primary" icon={PlaceholderIcon} loading aria-label="Loading" />
|
|
385
|
+
</div>
|
|
386
|
+
),
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
export const FullWidth: Story = {
|
|
390
|
+
render: () => (
|
|
391
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 12, width: 300 }}>
|
|
392
|
+
<Button variant="primary" label="Full Width Button" fullWidth />
|
|
393
|
+
<Button variant="secondary" icon={PlaceholderIcon} label="Full Width with Icon" fullWidth />
|
|
394
|
+
<Button variant="primary" label="This label is very long and should truncate gracefully" fullWidth />
|
|
395
|
+
</div>
|
|
396
|
+
),
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
export const AsLink: Story = {
|
|
400
|
+
render: () => (
|
|
401
|
+
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
|
402
|
+
<Button as="a" href="#" variant="primary" label="Link button" />
|
|
403
|
+
<Button as="a" href="#" variant="secondary" label="Link button" />
|
|
404
|
+
<Button as="a" href="#" variant="secondary" elevation="none" label="Link button" />
|
|
405
|
+
</div>
|
|
406
|
+
),
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
// ─── Background Context ──────────────────────────────────────────────────────
|
|
410
|
+
|
|
411
|
+
type SurfaceConfig = { bg: ButtonBackground; intent: SurfaceIntent; contrast: SurfaceContrast };
|
|
412
|
+
|
|
413
|
+
const COLORED_SURFACES: SurfaceConfig[] = [
|
|
414
|
+
{ bg: 'faint', intent: 'brand', contrast: 'faint' },
|
|
415
|
+
{ bg: 'medium', intent: 'brand', contrast: 'medium' },
|
|
416
|
+
{ bg: 'bold', intent: 'brand', contrast: 'bold' },
|
|
417
|
+
{ bg: 'strong', intent: 'brand', contrast: 'strong' },
|
|
418
|
+
{ bg: 'faint', intent: 'neutral', contrast: 'faint' },
|
|
419
|
+
{ bg: 'bold', intent: 'neutral', contrast: 'bold' },
|
|
420
|
+
{ bg: 'strong', intent: 'neutral', contrast: 'strong' },
|
|
421
|
+
{ bg: 'faint', intent: 'negative', contrast: 'faint' },
|
|
422
|
+
{ bg: 'bold', intent: 'negative', contrast: 'bold' },
|
|
423
|
+
{ bg: 'bold', intent: 'ai', contrast: 'bold' },
|
|
424
|
+
{ bg: 'bold', intent: 'positive', contrast: 'bold' },
|
|
425
|
+
{ bg: 'bold', intent: 'warning', contrast: 'bold' },
|
|
426
|
+
];
|
|
427
|
+
|
|
428
|
+
const bgRow = (label: string, children: React.ReactNode) => (
|
|
429
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>
|
|
430
|
+
<span style={{ fontSize: 10, fontFamily: 'monospace', opacity: 0.6, minWidth: 96, flexShrink: 0 }}>{label}</span>
|
|
431
|
+
{children}
|
|
432
|
+
</div>
|
|
433
|
+
);
|
|
434
|
+
|
|
435
|
+
export const BackgroundContext: Story = {
|
|
436
|
+
parameters: { layout: 'padded' },
|
|
437
|
+
render: () => (
|
|
438
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 24, fontFamily: 'sans-serif' }}>
|
|
439
|
+
<div style={{ fontSize: 11, fontWeight: 600, letterSpacing: '0.05em', textTransform: 'uppercase', color: '#555' }}>
|
|
440
|
+
All button variants on colored surfaces — hover to test interaction layers
|
|
441
|
+
</div>
|
|
442
|
+
|
|
443
|
+
{COLORED_SURFACES.map(({ bg, intent, contrast }) => (
|
|
444
|
+
<Surface key={`${bg}-${intent}`} intent={intent} contrast={contrast} radius="md" style={{ padding: 20 }}>
|
|
445
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
446
|
+
<span style={{ fontSize: 10, fontFamily: 'monospace', opacity: 0.7, marginBottom: 2 }}>
|
|
447
|
+
background="{bg}" — {contrast} {intent}
|
|
448
|
+
</span>
|
|
449
|
+
|
|
450
|
+
{bgRow('primary', <>
|
|
451
|
+
<Button variant="primary" intent="brand" label="Brand" background={bg} />
|
|
452
|
+
<Button variant="primary" intent="neutral" label="Neutral" background={bg} />
|
|
453
|
+
<Button variant="primary" intent="ai" label="AI" background={bg} />
|
|
454
|
+
<Button variant="primary" intent="negative" label="Negative" background={bg} />
|
|
455
|
+
<Button variant="primary" intent="positive" label="Positive" background={bg} />
|
|
456
|
+
<Button variant="primary" intent="warning" label="Warning" background={bg} />
|
|
457
|
+
<Button variant="primary" intent="none" label="Inverted" background={bg} />
|
|
458
|
+
</>)}
|
|
459
|
+
|
|
460
|
+
{bgRow('primary +icon', <>
|
|
461
|
+
<Button variant="primary" intent="brand" icon={PlaceholderIcon} label="Brand" background={bg} />
|
|
462
|
+
<Button variant="primary" intent="neutral" icon={PlaceholderIcon} label="Neutral" background={bg} />
|
|
463
|
+
<Button variant="primary" intent="negative" icon={PlaceholderIcon} label="Negative" background={bg} />
|
|
464
|
+
<Button variant="primary" intent="none" icon={PlaceholderIcon} label="Inverted" background={bg} />
|
|
465
|
+
<Button variant="primary" intent="brand" icon={PlaceholderIcon} aria-label="brand" background={bg} />
|
|
466
|
+
<Button variant="primary" intent="none" icon={PlaceholderIcon} aria-label="inverted" background={bg} />
|
|
467
|
+
</>)}
|
|
468
|
+
|
|
469
|
+
{bgRow('sec. flat', <>
|
|
470
|
+
<Button variant="secondary" elevation="flat" label="Default" background={bg} />
|
|
471
|
+
<Button variant="secondary" elevation="flat" intent="brand" label="Brand" background={bg} />
|
|
472
|
+
<Button variant="secondary" elevation="flat" intent="neutral" label="Neutral" background={bg} />
|
|
473
|
+
<Button variant="secondary" elevation="flat" intent="negative" label="Negative" background={bg} />
|
|
474
|
+
<Button variant="secondary" elevation="flat" intent="ai" label="AI" background={bg} />
|
|
475
|
+
<Button variant="secondary" elevation="flat" icon={PlaceholderIcon} label="Icon" background={bg} />
|
|
476
|
+
<Button variant="secondary" elevation="flat" icon={PlaceholderIcon} aria-label="icon" background={bg} />
|
|
477
|
+
</>)}
|
|
478
|
+
|
|
479
|
+
{bgRow('sec. ghost', <>
|
|
480
|
+
<Button variant="secondary" elevation="none" label="Default" background={bg} />
|
|
481
|
+
<Button variant="secondary" elevation="none" intent="brand" label="Brand" background={bg} />
|
|
482
|
+
<Button variant="secondary" elevation="none" intent="neutral" label="Neutral" background={bg} />
|
|
483
|
+
<Button variant="secondary" elevation="none" intent="negative" label="Negative" background={bg} />
|
|
484
|
+
<Button variant="secondary" elevation="none" intent="ai" label="AI" background={bg} />
|
|
485
|
+
<Button variant="secondary" elevation="none" icon={PlaceholderIcon} label="Icon" background={bg} />
|
|
486
|
+
<Button variant="secondary" elevation="none" icon={PlaceholderIcon} aria-label="icon" background={bg} />
|
|
487
|
+
</>)}
|
|
488
|
+
|
|
489
|
+
{bgRow('inverted', <>
|
|
490
|
+
<Button variant="primary" intent="none" elevation="none" label="None" background={bg} />
|
|
491
|
+
<Button variant="primary" intent="none" elevation="flat" label="Flat" background={bg} />
|
|
492
|
+
<Button variant="primary" intent="none" elevation="elevated" label="Elevated" background={bg} />
|
|
493
|
+
<Button variant="primary" intent="none" icon={PlaceholderIcon} label="Icon" background={bg} />
|
|
494
|
+
<Button variant="primary" intent="none" rounded label="Rounded" background={bg} />
|
|
495
|
+
<Button variant="primary" intent="none" inactive label="Inactive" background={bg} />
|
|
496
|
+
</>)}
|
|
497
|
+
|
|
498
|
+
{bgRow('states', <>
|
|
499
|
+
<Button variant="primary" intent="brand" inactive label="Inactive" background={bg} />
|
|
500
|
+
<Button variant="secondary" elevation="flat" inactive label="Inactive" background={bg} />
|
|
501
|
+
<Button variant="primary" intent="brand" rounded label="Rounded" background={bg} />
|
|
502
|
+
<Button variant="secondary" elevation="flat" rounded label="Rounded" background={bg} />
|
|
503
|
+
<Button variant="primary" intent="brand" loading label="Loading" background={bg} />
|
|
504
|
+
<Button variant="secondary" elevation="flat" dropdown label="Dropdown" background={bg} />
|
|
505
|
+
</>)}
|
|
506
|
+
</div>
|
|
507
|
+
</Surface>
|
|
508
|
+
))}
|
|
509
|
+
|
|
510
|
+
{/* Always-dark surface */}
|
|
511
|
+
<div style={{ background: 'var(--color-always-dark-background)', borderRadius: 8, padding: 20 }}>
|
|
512
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
513
|
+
<span style={{ fontSize: 10, fontFamily: 'monospace', color: 'rgba(255,255,255,0.5)', marginBottom: 2 }}>
|
|
514
|
+
background="always-dark" — custom dark surface
|
|
515
|
+
</span>
|
|
516
|
+
|
|
517
|
+
{bgRow('primary', <>
|
|
518
|
+
<Button variant="primary" intent="brand" label="Brand" background="always-dark" />
|
|
519
|
+
<Button variant="primary" intent="neutral" label="Neutral" background="always-dark" />
|
|
520
|
+
<Button variant="primary" intent="ai" label="AI" background="always-dark" />
|
|
521
|
+
<Button variant="primary" intent="negative" label="Negative" background="always-dark" />
|
|
522
|
+
<Button variant="primary" intent="positive" label="Positive" background="always-dark" />
|
|
523
|
+
<Button variant="primary" intent="warning" label="Warning" background="always-dark" />
|
|
524
|
+
<Button variant="primary" intent="none" label="Inverted" background="always-dark" />
|
|
525
|
+
</>)}
|
|
526
|
+
|
|
527
|
+
{bgRow('primary +icon', <>
|
|
528
|
+
<Button variant="primary" intent="brand" icon={PlaceholderIcon} label="Brand" background="always-dark" />
|
|
529
|
+
<Button variant="primary" intent="negative" icon={PlaceholderIcon} label="Negative" background="always-dark" />
|
|
530
|
+
<Button variant="primary" intent="none" icon={PlaceholderIcon} label="Inverted" background="always-dark" />
|
|
531
|
+
<Button variant="primary" intent="brand" icon={PlaceholderIcon} aria-label="brand" background="always-dark" />
|
|
532
|
+
<Button variant="primary" intent="none" icon={PlaceholderIcon} aria-label="inverted" background="always-dark" />
|
|
533
|
+
</>)}
|
|
534
|
+
|
|
535
|
+
{bgRow('sec. flat', <>
|
|
536
|
+
<Button variant="secondary" elevation="flat" label="Default" background="always-dark" />
|
|
537
|
+
<Button variant="secondary" elevation="flat" intent="brand" label="Brand" background="always-dark" />
|
|
538
|
+
<Button variant="secondary" elevation="flat" intent="neutral" label="Neutral" background="always-dark" />
|
|
539
|
+
<Button variant="secondary" elevation="flat" intent="negative" label="Negative" background="always-dark" />
|
|
540
|
+
<Button variant="secondary" elevation="flat" intent="ai" label="AI" background="always-dark" />
|
|
541
|
+
<Button variant="secondary" elevation="flat" icon={PlaceholderIcon} label="Icon" background="always-dark" />
|
|
542
|
+
<Button variant="secondary" elevation="flat" icon={PlaceholderIcon} aria-label="icon" background="always-dark" />
|
|
543
|
+
</>)}
|
|
544
|
+
|
|
545
|
+
{bgRow('sec. ghost', <>
|
|
546
|
+
<Button variant="secondary" elevation="none" label="Default" background="always-dark" />
|
|
547
|
+
<Button variant="secondary" elevation="none" intent="brand" label="Brand" background="always-dark" />
|
|
548
|
+
<Button variant="secondary" elevation="none" intent="neutral" label="Neutral" background="always-dark" />
|
|
549
|
+
<Button variant="secondary" elevation="none" intent="negative" label="Negative" background="always-dark" />
|
|
550
|
+
<Button variant="secondary" elevation="none" intent="ai" label="AI" background="always-dark" />
|
|
551
|
+
<Button variant="secondary" elevation="none" icon={PlaceholderIcon} label="Icon" background="always-dark" />
|
|
552
|
+
<Button variant="secondary" elevation="none" icon={PlaceholderIcon} aria-label="icon" background="always-dark" />
|
|
553
|
+
</>)}
|
|
554
|
+
|
|
555
|
+
{bgRow('inverted', <>
|
|
556
|
+
<Button variant="primary" intent="none" elevation="none" label="None" background="always-dark" />
|
|
557
|
+
<Button variant="primary" intent="none" elevation="flat" label="Flat" background="always-dark" />
|
|
558
|
+
<Button variant="primary" intent="none" elevation="elevated" label="Elevated" background="always-dark" />
|
|
559
|
+
<Button variant="primary" intent="none" icon={PlaceholderIcon} label="Icon" background="always-dark" />
|
|
560
|
+
<Button variant="primary" intent="none" rounded label="Rounded" background="always-dark" />
|
|
561
|
+
<Button variant="primary" intent="none" inactive label="Inactive" background="always-dark" />
|
|
562
|
+
</>)}
|
|
563
|
+
|
|
564
|
+
{bgRow('states', <>
|
|
565
|
+
<Button variant="primary" intent="brand" inactive label="Inactive" background="always-dark" />
|
|
566
|
+
<Button variant="secondary" elevation="flat" inactive label="Inactive" background="always-dark" />
|
|
567
|
+
<Button variant="primary" intent="brand" rounded label="Rounded" background="always-dark" />
|
|
568
|
+
<Button variant="primary" intent="brand" loading label="Loading" background="always-dark" />
|
|
569
|
+
<Button variant="secondary" elevation="flat" dropdown label="Dropdown" background="always-dark" />
|
|
570
|
+
</>)}
|
|
571
|
+
</div>
|
|
572
|
+
</div>
|
|
573
|
+
</div>
|
|
574
|
+
),
|
|
575
|
+
};
|