@jamesodwyer/gds-figma-vite 2.0.2 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/guidelines/Guidelines.md +116 -0
- package/guidelines/components/Card.md +53 -4
- package/guidelines/components/Modal.md +37 -9
- package/guidelines/components/Stack.md +174 -0
- package/guidelines/guidelines-template.md +385 -0
- package/guidelines/overview-components.md +65 -0
- package/package.json +1 -1
package/guidelines/Guidelines.md
CHANGED
|
@@ -74,10 +74,123 @@ function App() {
|
|
|
74
74
|
|
|
75
75
|
---
|
|
76
76
|
|
|
77
|
+
## CRITICAL: Compound Component Pattern
|
|
78
|
+
|
|
79
|
+
Many GDS components use the **compound component pattern**. Sub-components are accessed via dot notation on the parent component, NOT as separate imports.
|
|
80
|
+
|
|
81
|
+
### Correct Usage (Dot Notation)
|
|
82
|
+
|
|
83
|
+
```tsx
|
|
84
|
+
// ✅ CORRECT - Use dot notation for sub-components
|
|
85
|
+
<Modal>
|
|
86
|
+
<Modal.Header>...</Modal.Header>
|
|
87
|
+
<Modal.Title>...</Modal.Title>
|
|
88
|
+
<Modal.Content>...</Modal.Content>
|
|
89
|
+
<Modal.Description>...</Modal.Description>
|
|
90
|
+
<Modal.Actions>...</Modal.Actions>
|
|
91
|
+
</Modal>
|
|
92
|
+
|
|
93
|
+
<Card>
|
|
94
|
+
<Card.Title>...</Card.Title>
|
|
95
|
+
<Card.Body>...</Card.Body>
|
|
96
|
+
</Card>
|
|
97
|
+
|
|
98
|
+
<InputField id="email">
|
|
99
|
+
<InputField.Label>...</InputField.Label>
|
|
100
|
+
<InputField.Input />
|
|
101
|
+
</InputField>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### WRONG Usage (Do NOT Do This)
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
// ❌ WRONG - These components DO NOT EXIST as separate imports
|
|
108
|
+
<ModalHeader> // WRONG - use Modal.Header
|
|
109
|
+
<ModalTitle> // WRONG - use Modal.Title
|
|
110
|
+
<ModalContent> // WRONG - use Modal.Content
|
|
111
|
+
<ModalDescription> // WRONG - use Modal.Description
|
|
112
|
+
<ModalActions> // WRONG - use Modal.Actions
|
|
113
|
+
<CardTitle> // WRONG - use Card.Title
|
|
114
|
+
<CardBody> // WRONG - use Card.Body
|
|
115
|
+
<CardContent> // WRONG - does not exist at all
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Components with Compound Sub-components
|
|
119
|
+
|
|
120
|
+
| Component | Sub-components |
|
|
121
|
+
|-----------|----------------|
|
|
122
|
+
| Modal | `.Header`, `.Title`, `.Content`, `.Description`, `.Image`, `.CloseButton`, `.Actions` |
|
|
123
|
+
| Card | `.Title`, `.Body` |
|
|
124
|
+
| InputField | `.Label`, `.Row`, `.Input`, `.Textarea`, `.Select`, `.Checkbox`, `.Radio`, `.StartIcon`, `.EndIcon`, `.Validation` |
|
|
125
|
+
| Accordion | `.Item`, `.Toggle`, `.Content` |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## CRITICAL: Non-Existent Components
|
|
130
|
+
|
|
131
|
+
> **⚠️ WARNING FOR AI AGENTS**: The following components DO NOT exist in this design system. Do NOT generate code using them.
|
|
132
|
+
|
|
133
|
+
### Components That DO NOT Exist
|
|
134
|
+
|
|
135
|
+
| Non-Existent | Use Instead |
|
|
136
|
+
|--------------|-------------|
|
|
137
|
+
| `ButtonGroup` | Use `Stack` with `gap` prop, or a styled `div` with flexbox |
|
|
138
|
+
| `CardContent` | Put content directly inside `Card.Body` |
|
|
139
|
+
| `CardHeader` | Use `Card.Title` |
|
|
140
|
+
| `CardActions` | Put buttons inside `Card.Body` |
|
|
141
|
+
| `ModalDescription` | Use `Modal.Description` (compound component) |
|
|
142
|
+
| `ModalHeader` | Use `Modal.Header` (compound component) |
|
|
143
|
+
| `ModalBody` | Use `Modal.Content` (compound component) |
|
|
144
|
+
| `ModalFooter` | Use `Modal.Actions` (compound component) |
|
|
145
|
+
| `FormControl` | Use `InputField` compound component |
|
|
146
|
+
| `FormLabel` | Use `InputField.Label` |
|
|
147
|
+
| `FormHelperText` | Use `InputField.Validation` |
|
|
148
|
+
| `Grid` | Use CSS Grid or styled `div` |
|
|
149
|
+
| `Box` | Use styled `div` with spacing tokens |
|
|
150
|
+
| `Container` | Use styled `div` with spacing tokens |
|
|
151
|
+
| `Typography` | Use `TextStyle` component |
|
|
152
|
+
| `Divider` | Use styled `hr` or `div` |
|
|
153
|
+
| `IconButton` | Use `CircleButton` or `SquareButton` |
|
|
154
|
+
| `Snackbar` | Use `Toast` |
|
|
155
|
+
| `Dialog` | Use `Modal` |
|
|
156
|
+
| `Drawer` | Use `SidePanel` |
|
|
157
|
+
| `AppBar` | Use `Header` |
|
|
158
|
+
|
|
159
|
+
### Layout Without ButtonGroup
|
|
160
|
+
|
|
161
|
+
Use `Stack` for horizontal button layouts:
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
import { Stack, Button } from '@jamesodwyer/gds-figma-vite';
|
|
165
|
+
|
|
166
|
+
// For horizontal button group
|
|
167
|
+
<Stack gap="club" style={{ display: 'flex', flexDirection: 'row' }}>
|
|
168
|
+
<Button colorVariant="secondary">Cancel</Button>
|
|
169
|
+
<Button colorVariant="primary">Confirm</Button>
|
|
170
|
+
</Stack>
|
|
171
|
+
|
|
172
|
+
// Or use a styled div
|
|
173
|
+
import styled from 'styled-components';
|
|
174
|
+
import { spacing } from '@jamesodwyer/gds-figma-vite';
|
|
175
|
+
|
|
176
|
+
const ButtonRow = styled.div`
|
|
177
|
+
display: flex;
|
|
178
|
+
gap: ${spacing.club};
|
|
179
|
+
`;
|
|
180
|
+
|
|
181
|
+
<ButtonRow>
|
|
182
|
+
<Button colorVariant="secondary">Cancel</Button>
|
|
183
|
+
<Button colorVariant="primary">Confirm</Button>
|
|
184
|
+
</ButtonRow>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
77
189
|
## IMPORTANT: Code Generation Rules
|
|
78
190
|
|
|
79
191
|
### DO:
|
|
80
192
|
- Always wrap with `GdsProvider` or `ThemeProvider`
|
|
193
|
+
- Use compound component syntax (`Modal.Header`, `Card.Body`, etc.)
|
|
81
194
|
- Use semantic color tokens from theme (`theme.base.primary`, `theme.status.danger`)
|
|
82
195
|
- Use spacing tokens (`spacing.auditorium`, `spacing.arena`)
|
|
83
196
|
- Use textStyle for typography (`textStyle.rainier`, `textStyle.everest`)
|
|
@@ -86,6 +199,8 @@ function App() {
|
|
|
86
199
|
- Import components from `@jamesodwyer/gds-figma-vite`
|
|
87
200
|
|
|
88
201
|
### DO NOT:
|
|
202
|
+
- **Never import sub-components separately** - use dot notation (`Modal.Header` not `ModalHeader`)
|
|
203
|
+
- **Never use components that don't exist** - check the exports list above
|
|
89
204
|
- Never hardcode hex color values - always use theme tokens
|
|
90
205
|
- Never use pixel values for spacing - use spacing tokens
|
|
91
206
|
- Never use custom font sizes - use textStyle utilities
|
|
@@ -116,6 +231,7 @@ function App() {
|
|
|
116
231
|
### Layout Components
|
|
117
232
|
| Component | Purpose | Docs |
|
|
118
233
|
|-----------|---------|------|
|
|
234
|
+
| `Stack` | Spacing utility for vertical/horizontal layouts | [Stack.md](./components/Stack.md) |
|
|
119
235
|
| `Card` | Content containers with Title and Body | [Card.md](./components/Card.md) |
|
|
120
236
|
| `Modal` | Overlay dialogs requiring user attention | [Modal.md](./components/Modal.md) |
|
|
121
237
|
| `SidePanel` | Slide-in panels for supplementary content | [SidePanel.md](./components/SidePanel.md) |
|
|
@@ -8,6 +8,8 @@ Container component for grouping related content with optional elevation and sty
|
|
|
8
8
|
import { Card } from '@jamesodwyer/gds-figma-vite';
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
> **⚠️ IMPORTANT**: Card uses a compound component pattern. Sub-components are accessed via dot notation (`Card.Title`, `Card.Body`), NOT as separate imports.
|
|
12
|
+
|
|
11
13
|
## Purpose
|
|
12
14
|
|
|
13
15
|
Use Card to:
|
|
@@ -15,13 +17,60 @@ Use Card to:
|
|
|
15
17
|
- Create visual separation between content areas
|
|
16
18
|
- Display information in a contained, elevated surface
|
|
17
19
|
|
|
18
|
-
## Structure
|
|
20
|
+
## Structure (Compound Components)
|
|
21
|
+
|
|
22
|
+
Card uses **dot notation** for sub-components. These are NOT separate imports.
|
|
19
23
|
|
|
20
24
|
| Sub-component | Description |
|
|
21
25
|
|---------------|-------------|
|
|
22
|
-
| Card | Main container |
|
|
23
|
-
| Card.Title | Header/title area |
|
|
24
|
-
| Card.Body | Main content area |
|
|
26
|
+
| `Card` | Main container |
|
|
27
|
+
| `Card.Title` | Header/title area |
|
|
28
|
+
| `Card.Body` | Main content area |
|
|
29
|
+
|
|
30
|
+
### ❌ WRONG - Do Not Use These (They Don't Exist)
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
// These components DO NOT EXIST - do not import or use them:
|
|
34
|
+
<CardTitle> // ❌ WRONG
|
|
35
|
+
<CardBody> // ❌ WRONG
|
|
36
|
+
<CardContent> // ❌ WRONG - does not exist at all
|
|
37
|
+
<CardHeader> // ❌ WRONG
|
|
38
|
+
<CardActions> // ❌ WRONG
|
|
39
|
+
<CardFooter> // ❌ WRONG
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### ✅ CORRECT - Use Dot Notation
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
// Always use dot notation:
|
|
46
|
+
<Card>
|
|
47
|
+
<Card.Title>My Title</Card.Title> // ✅ CORRECT
|
|
48
|
+
<Card.Body>My content</Card.Body> // ✅ CORRECT
|
|
49
|
+
</Card>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Note on CardContent
|
|
53
|
+
|
|
54
|
+
There is **NO `CardContent` component**. Put your content directly inside `Card.Body`:
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
// ❌ WRONG - CardContent doesn't exist
|
|
58
|
+
<Card>
|
|
59
|
+
<Card.Body>
|
|
60
|
+
<CardContent> {/* This will cause an error! */}
|
|
61
|
+
<p>Content</p>
|
|
62
|
+
</CardContent>
|
|
63
|
+
</Card.Body>
|
|
64
|
+
</Card>
|
|
65
|
+
|
|
66
|
+
// ✅ CORRECT - Put content directly in Card.Body
|
|
67
|
+
<Card>
|
|
68
|
+
<Card.Body>
|
|
69
|
+
<TextStyle>Content goes here</TextStyle>
|
|
70
|
+
<Button>Action</Button>
|
|
71
|
+
</Card.Body>
|
|
72
|
+
</Card>
|
|
73
|
+
```
|
|
25
74
|
|
|
26
75
|
## Basic Usage
|
|
27
76
|
|
|
@@ -8,6 +8,8 @@ Overlay dialog for focused user interactions requiring attention or action.
|
|
|
8
8
|
import { Modal } from '@jamesodwyer/gds-figma-vite';
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
> **⚠️ IMPORTANT**: Modal uses a compound component pattern. All sub-components are accessed via dot notation (`Modal.Header`, `Modal.Title`, etc.), NOT as separate imports.
|
|
12
|
+
|
|
11
13
|
## Purpose
|
|
12
14
|
|
|
13
15
|
Use Modal for:
|
|
@@ -16,18 +18,44 @@ Use Modal for:
|
|
|
16
18
|
- Important information that needs acknowledgment
|
|
17
19
|
- Alert dialogs
|
|
18
20
|
|
|
19
|
-
## Structure
|
|
21
|
+
## Structure (Compound Components)
|
|
22
|
+
|
|
23
|
+
Modal uses **dot notation** for sub-components. These are NOT separate imports.
|
|
20
24
|
|
|
21
25
|
| Sub-component | Description |
|
|
22
26
|
|---------------|-------------|
|
|
23
|
-
| Modal | Container with backdrop |
|
|
24
|
-
| Modal.Header | Header section |
|
|
25
|
-
| Modal.Title | Modal title |
|
|
26
|
-
| Modal.Content | Main content area |
|
|
27
|
-
| Modal.Description | Descriptive text |
|
|
28
|
-
| Modal.Image | Optional banner image |
|
|
29
|
-
| Modal.CloseButton | Close button |
|
|
30
|
-
| Modal.Actions | Action buttons container |
|
|
27
|
+
| `Modal` | Container with backdrop |
|
|
28
|
+
| `Modal.Header` | Header section |
|
|
29
|
+
| `Modal.Title` | Modal title |
|
|
30
|
+
| `Modal.Content` | Main content area |
|
|
31
|
+
| `Modal.Description` | Descriptive text |
|
|
32
|
+
| `Modal.Image` | Optional banner image |
|
|
33
|
+
| `Modal.CloseButton` | Close button |
|
|
34
|
+
| `Modal.Actions` | Action buttons container |
|
|
35
|
+
|
|
36
|
+
### ❌ WRONG - Do Not Use These (They Don't Exist)
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
// These components DO NOT EXIST - do not import or use them:
|
|
40
|
+
<ModalHeader> // ❌ WRONG
|
|
41
|
+
<ModalTitle> // ❌ WRONG
|
|
42
|
+
<ModalContent> // ❌ WRONG
|
|
43
|
+
<ModalDescription> // ❌ WRONG
|
|
44
|
+
<ModalActions> // ❌ WRONG
|
|
45
|
+
<ModalFooter> // ❌ WRONG
|
|
46
|
+
<ModalBody> // ❌ WRONG
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### ✅ CORRECT - Use Dot Notation
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
// Always use dot notation:
|
|
53
|
+
<Modal.Header> // ✅ CORRECT
|
|
54
|
+
<Modal.Title> // ✅ CORRECT
|
|
55
|
+
<Modal.Content> // ✅ CORRECT
|
|
56
|
+
<Modal.Description> // ✅ CORRECT
|
|
57
|
+
<Modal.Actions> // ✅ CORRECT
|
|
58
|
+
```
|
|
31
59
|
|
|
32
60
|
## Props
|
|
33
61
|
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# Stack Component
|
|
2
|
+
|
|
3
|
+
Simple layout utility for adding consistent spacing between child elements.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { Stack } from '@jamesodwyer/gds-figma-vite';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Purpose
|
|
12
|
+
|
|
13
|
+
Use Stack to:
|
|
14
|
+
- Add consistent vertical spacing between elements
|
|
15
|
+
- Create horizontal layouts with gaps (using CSS)
|
|
16
|
+
- Replace non-existent `ButtonGroup` component
|
|
17
|
+
- Quickly layout form elements or content sections
|
|
18
|
+
|
|
19
|
+
## Props
|
|
20
|
+
|
|
21
|
+
| Prop | Type | Default | Description |
|
|
22
|
+
|------|------|---------|-------------|
|
|
23
|
+
| gap | SpacingToken | - | Gap between children using spacing scale |
|
|
24
|
+
|
|
25
|
+
### Available Gap Values
|
|
26
|
+
|
|
27
|
+
| Token | Value |
|
|
28
|
+
|-------|-------|
|
|
29
|
+
| `lounge` | 4px |
|
|
30
|
+
| `club` | 8px |
|
|
31
|
+
| `hall` | 12px |
|
|
32
|
+
| `auditorium` | 16px |
|
|
33
|
+
| `theatre` | 20px |
|
|
34
|
+
| `amphitheatre` | 24px |
|
|
35
|
+
| `arena` | 32px |
|
|
36
|
+
| `stadium` | 48px |
|
|
37
|
+
| `dome` | 64px |
|
|
38
|
+
| `field` | 88px |
|
|
39
|
+
|
|
40
|
+
## Basic Usage (Vertical Stack)
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
import { GdsProvider, Stack, Button } from '@jamesodwyer/gds-figma-vite';
|
|
44
|
+
|
|
45
|
+
<GdsProvider>
|
|
46
|
+
<Stack gap="auditorium">
|
|
47
|
+
<Button colorVariant="primary">First Button</Button>
|
|
48
|
+
<Button colorVariant="secondary">Second Button</Button>
|
|
49
|
+
<Button colorVariant="tertiary">Third Button</Button>
|
|
50
|
+
</Stack>
|
|
51
|
+
</GdsProvider>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Horizontal Layout (Button Row)
|
|
55
|
+
|
|
56
|
+
> **Note**: `ButtonGroup` does not exist in GDS. Use Stack with flex styling instead.
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
import { GdsProvider, Stack, Button } from '@jamesodwyer/gds-figma-vite';
|
|
60
|
+
|
|
61
|
+
<GdsProvider>
|
|
62
|
+
<Stack gap="club" style={{ display: 'flex', flexDirection: 'row' }}>
|
|
63
|
+
<Button colorVariant="secondary">Cancel</Button>
|
|
64
|
+
<Button colorVariant="primary">Confirm</Button>
|
|
65
|
+
</Stack>
|
|
66
|
+
</GdsProvider>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## With Styled Components
|
|
70
|
+
|
|
71
|
+
For more control, extend Stack with styled-components:
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
import styled from 'styled-components';
|
|
75
|
+
import { Stack, Button, spacing } from '@jamesodwyer/gds-figma-vite';
|
|
76
|
+
|
|
77
|
+
const ButtonRow = styled(Stack)`
|
|
78
|
+
display: flex;
|
|
79
|
+
flex-direction: row;
|
|
80
|
+
justify-content: flex-end;
|
|
81
|
+
`;
|
|
82
|
+
|
|
83
|
+
<ButtonRow gap="club">
|
|
84
|
+
<Button colorVariant="secondary">Cancel</Button>
|
|
85
|
+
<Button colorVariant="primary">Submit</Button>
|
|
86
|
+
</ButtonRow>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Form Layout Example
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
import { GdsProvider, Stack, InputField, Button } from '@jamesodwyer/gds-figma-vite';
|
|
93
|
+
|
|
94
|
+
<GdsProvider>
|
|
95
|
+
<form>
|
|
96
|
+
<Stack gap="auditorium">
|
|
97
|
+
<InputField id="name">
|
|
98
|
+
<InputField.Label>Name</InputField.Label>
|
|
99
|
+
<InputField.Row marginTop="club">
|
|
100
|
+
<InputField.Input />
|
|
101
|
+
</InputField.Row>
|
|
102
|
+
</InputField>
|
|
103
|
+
|
|
104
|
+
<InputField id="email">
|
|
105
|
+
<InputField.Label>Email</InputField.Label>
|
|
106
|
+
<InputField.Row marginTop="club">
|
|
107
|
+
<InputField.Input type="email" />
|
|
108
|
+
</InputField.Row>
|
|
109
|
+
</InputField>
|
|
110
|
+
|
|
111
|
+
<Button colorVariant="primary" fullWidth>
|
|
112
|
+
Submit
|
|
113
|
+
</Button>
|
|
114
|
+
</Stack>
|
|
115
|
+
</form>
|
|
116
|
+
</GdsProvider>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Alternative: Styled Div
|
|
120
|
+
|
|
121
|
+
If you prefer more explicit control, use a styled div:
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
import styled from 'styled-components';
|
|
125
|
+
import { spacing } from '@jamesodwyer/gds-figma-vite';
|
|
126
|
+
|
|
127
|
+
const VerticalStack = styled.div`
|
|
128
|
+
display: flex;
|
|
129
|
+
flex-direction: column;
|
|
130
|
+
gap: ${spacing.auditorium};
|
|
131
|
+
`;
|
|
132
|
+
|
|
133
|
+
const HorizontalStack = styled.div`
|
|
134
|
+
display: flex;
|
|
135
|
+
flex-direction: row;
|
|
136
|
+
gap: ${spacing.club};
|
|
137
|
+
`;
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Common Patterns
|
|
141
|
+
|
|
142
|
+
### Modal Actions (Replacing ButtonGroup)
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
<Modal.Actions>
|
|
146
|
+
<Stack gap="club" style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-end' }}>
|
|
147
|
+
<Button colorVariant="secondary" onClick={handleCancel}>
|
|
148
|
+
Cancel
|
|
149
|
+
</Button>
|
|
150
|
+
<Button colorVariant="primary" onClick={handleConfirm}>
|
|
151
|
+
Confirm
|
|
152
|
+
</Button>
|
|
153
|
+
</Stack>
|
|
154
|
+
</Modal.Actions>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Card Content Layout
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
<Card>
|
|
161
|
+
<Card.Body>
|
|
162
|
+
<Stack gap="auditorium">
|
|
163
|
+
<TextStyle>First section of content</TextStyle>
|
|
164
|
+
<TextStyle>Second section of content</TextStyle>
|
|
165
|
+
<Button colorVariant="primary">Action</Button>
|
|
166
|
+
</Stack>
|
|
167
|
+
</Card.Body>
|
|
168
|
+
</Card>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Related Components
|
|
172
|
+
|
|
173
|
+
- `Modal.Actions` - Container for modal action buttons
|
|
174
|
+
- `InputField.Row` - Row container with margin support for form inputs
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
# Ticketmaster Global Design System (GDS) - AI Guidelines
|
|
2
|
+
|
|
3
|
+
> **FOR AI AGENTS**: This is a self-contained guide for code generation. All information is in this single file.
|
|
4
|
+
|
|
5
|
+
## Package Information
|
|
6
|
+
|
|
7
|
+
- **Package**: `@jamesodwyer/gds-figma-vite`
|
|
8
|
+
- **Framework**: React 18+ with styled-components
|
|
9
|
+
- **Themes**: TM (Ticketmaster/blue), LN (Live Nation/red)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## REQUIRED: GdsProvider Wrapper
|
|
14
|
+
|
|
15
|
+
Every application MUST wrap components with `GdsProvider`:
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { GdsProvider, Button } from '@jamesodwyer/gds-figma-vite';
|
|
19
|
+
|
|
20
|
+
function App() {
|
|
21
|
+
return (
|
|
22
|
+
<GdsProvider theme="TM">
|
|
23
|
+
<Button colorVariant="primary">Click Me</Button>
|
|
24
|
+
</GdsProvider>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
| Prop | Type | Default | Description |
|
|
30
|
+
|------|------|---------|-------------|
|
|
31
|
+
| theme | 'TM' \| 'LN' | 'TM' | Brand theme |
|
|
32
|
+
| includeGlobalStyles | boolean | true | Include global CSS |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## CRITICAL: Compound Component Pattern
|
|
37
|
+
|
|
38
|
+
Many GDS components use **dot notation** for sub-components. These are NOT separate imports.
|
|
39
|
+
|
|
40
|
+
### Correct Usage
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
// CORRECT - Use dot notation
|
|
44
|
+
<Modal>
|
|
45
|
+
<Modal.Header>
|
|
46
|
+
<Modal.Title>Title</Modal.Title>
|
|
47
|
+
<Modal.CloseButton label="Close" />
|
|
48
|
+
</Modal.Header>
|
|
49
|
+
<Modal.Content>
|
|
50
|
+
<Modal.Description>Content here</Modal.Description>
|
|
51
|
+
</Modal.Content>
|
|
52
|
+
<Modal.Actions>
|
|
53
|
+
<Button colorVariant="secondary">Cancel</Button>
|
|
54
|
+
<Button colorVariant="primary">Confirm</Button>
|
|
55
|
+
</Modal.Actions>
|
|
56
|
+
</Modal>
|
|
57
|
+
|
|
58
|
+
<Card>
|
|
59
|
+
<Card.Title>Card Title</Card.Title>
|
|
60
|
+
<Card.Body>Card content</Card.Body>
|
|
61
|
+
</Card>
|
|
62
|
+
|
|
63
|
+
<InputField id="email">
|
|
64
|
+
<InputField.Label>Email</InputField.Label>
|
|
65
|
+
<InputField.Row marginTop="club">
|
|
66
|
+
<InputField.Input type="email" />
|
|
67
|
+
</InputField.Row>
|
|
68
|
+
</InputField>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Components with Sub-components
|
|
72
|
+
|
|
73
|
+
| Component | Sub-components (use dot notation) |
|
|
74
|
+
|-----------|-----------------------------------|
|
|
75
|
+
| `Modal` | `.Header`, `.Title`, `.Content`, `.Description`, `.Image`, `.CloseButton`, `.Actions` |
|
|
76
|
+
| `Card` | `.Title`, `.Body` |
|
|
77
|
+
| `InputField` | `.Label`, `.Row`, `.Input`, `.Textarea`, `.Select`, `.Checkbox`, `.Radio`, `.StartIcon`, `.EndIcon`, `.Validation` |
|
|
78
|
+
| `Accordion` | `.Item`, `.Toggle`, `.Content` |
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## CRITICAL: Components That DO NOT Exist
|
|
83
|
+
|
|
84
|
+
> **WARNING**: These components are NOT in GDS. Do NOT use them.
|
|
85
|
+
|
|
86
|
+
| DO NOT USE | Use Instead |
|
|
87
|
+
|------------|-------------|
|
|
88
|
+
| `ButtonGroup` | `<div style={{display:'flex',gap:'8px'}}>` or styled div |
|
|
89
|
+
| `CardContent` | Put content directly in `Card.Body` |
|
|
90
|
+
| `CardHeader` | Use `Card.Title` |
|
|
91
|
+
| `CardActions` | Put buttons in `Card.Body` |
|
|
92
|
+
| `ModalDescription` | Use `Modal.Description` (dot notation) |
|
|
93
|
+
| `ModalHeader` | Use `Modal.Header` (dot notation) |
|
|
94
|
+
| `ModalBody` | Use `Modal.Content` (dot notation) |
|
|
95
|
+
| `ModalFooter` | Use `Modal.Actions` (dot notation) |
|
|
96
|
+
| `FormControl` | Use `InputField` |
|
|
97
|
+
| `FormLabel` | Use `InputField.Label` |
|
|
98
|
+
| `Grid` | Use CSS Grid or styled div |
|
|
99
|
+
| `Box` | Use styled div |
|
|
100
|
+
| `Container` | Use styled div |
|
|
101
|
+
| `Typography` | Use `TextStyle` |
|
|
102
|
+
| `Divider` | Use styled hr or div |
|
|
103
|
+
| `Snackbar` | Use `Toast` |
|
|
104
|
+
| `Dialog` | Use `Modal` |
|
|
105
|
+
| `Drawer` | Use `SidePanel` |
|
|
106
|
+
|
|
107
|
+
### Button Row Example (Instead of ButtonGroup)
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
// For horizontal button layouts:
|
|
111
|
+
<div style={{ display: 'flex', gap: '8px' }}>
|
|
112
|
+
<Button colorVariant="secondary">Cancel</Button>
|
|
113
|
+
<Button colorVariant="primary">Confirm</Button>
|
|
114
|
+
</div>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Available Components
|
|
120
|
+
|
|
121
|
+
### Layout
|
|
122
|
+
- `Card` - Container with `.Title`, `.Body`
|
|
123
|
+
- `Modal` - Dialog with `.Header`, `.Title`, `.Content`, `.Description`, `.CloseButton`, `.Actions`
|
|
124
|
+
- `SidePanel` - Slide-in panel
|
|
125
|
+
- `Accordion` - Collapsible sections
|
|
126
|
+
- `Header` - Page header
|
|
127
|
+
- `Footer` - Page footer
|
|
128
|
+
|
|
129
|
+
### Buttons
|
|
130
|
+
- `Button` - Primary button (colorVariant: 'primary' | 'secondary' | 'tertiary')
|
|
131
|
+
- `CircleButton` - Circular icon button
|
|
132
|
+
- `SquareButton` - Square icon button
|
|
133
|
+
- `PillButton` - Pill-shaped button
|
|
134
|
+
|
|
135
|
+
### Form Inputs
|
|
136
|
+
- `InputField` - Compound form input (see sub-components above)
|
|
137
|
+
- `TextInput` - Simple text input
|
|
138
|
+
- `TextArea` - Multi-line input
|
|
139
|
+
- `Checkbox` - Boolean selection
|
|
140
|
+
- `RadioButton` - Single selection
|
|
141
|
+
- `SelectInput` - Dropdown
|
|
142
|
+
- `ToggleSwitch` - On/off switch
|
|
143
|
+
- `PasswordInput` - Password with toggle
|
|
144
|
+
- `PhoneNumber` - Phone with country code
|
|
145
|
+
- `DateOfBirth` - Date input
|
|
146
|
+
- `CountryPicker` - Country dropdown
|
|
147
|
+
- `Stepper` - Increment/decrement
|
|
148
|
+
|
|
149
|
+
### Feedback
|
|
150
|
+
- `Toast` - Temporary notification
|
|
151
|
+
- `AlertBox` - Inline alert (status: 'info' | 'success' | 'warning' | 'danger')
|
|
152
|
+
- `LoadingSpinner` - Loading indicator
|
|
153
|
+
- `Skeleton` - Loading placeholder
|
|
154
|
+
- `ErrorMessage` - Error text
|
|
155
|
+
- `SuccessMessage` - Success text
|
|
156
|
+
- `Badge` - Status label
|
|
157
|
+
- `Tooltip` - Hover tooltip
|
|
158
|
+
|
|
159
|
+
### Typography
|
|
160
|
+
- `TextStyle` - Styled text spans
|
|
161
|
+
- `TitleHeading` - Page titles
|
|
162
|
+
- `DisplayHeading` - Hero text
|
|
163
|
+
- `Link` - Styled links
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Spacing Tokens
|
|
168
|
+
|
|
169
|
+
Use spacing tokens instead of pixel values:
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
import { spacing } from '@jamesodwyer/gds-figma-vite';
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
| Token | Value | Usage |
|
|
176
|
+
|-------|-------|-------|
|
|
177
|
+
| `spacing.lounge` | 4px | Tight spacing, icon gaps |
|
|
178
|
+
| `spacing.club` | 8px | Small gaps |
|
|
179
|
+
| `spacing.hall` | 12px | Small padding |
|
|
180
|
+
| `spacing.auditorium` | 16px | Default padding |
|
|
181
|
+
| `spacing.theatre` | 20px | Medium spacing |
|
|
182
|
+
| `spacing.amphitheatre` | 24px | Large padding |
|
|
183
|
+
| `spacing.arena` | 32px | Section spacing |
|
|
184
|
+
| `spacing.stadium` | 48px | Large sections |
|
|
185
|
+
| `spacing.dome` | 64px | Page sections |
|
|
186
|
+
| `spacing.field` | 88px | Hero spacing |
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
import styled from 'styled-components';
|
|
190
|
+
import { spacing } from '@jamesodwyer/gds-figma-vite';
|
|
191
|
+
|
|
192
|
+
const Container = styled.div`
|
|
193
|
+
padding: ${spacing.auditorium};
|
|
194
|
+
gap: ${spacing.club};
|
|
195
|
+
margin-bottom: ${spacing.arena};
|
|
196
|
+
`;
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Typography (textStyle)
|
|
202
|
+
|
|
203
|
+
Use `textStyle` for consistent typography:
|
|
204
|
+
|
|
205
|
+
```tsx
|
|
206
|
+
import { textStyle } from '@jamesodwyer/gds-figma-vite';
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
| Style | Size | Weight | Usage |
|
|
210
|
+
|-------|------|--------|-------|
|
|
211
|
+
| `textStyle.mauna` | 44-54px | 700 | Hero displays |
|
|
212
|
+
| `textStyle.everest` | 32-44px | 700 | Page titles |
|
|
213
|
+
| `textStyle.kilimanjaro` | 24-32px | 700 | Section headers |
|
|
214
|
+
| `textStyle.matterhorn` | 24-28px | 700 | Large headings |
|
|
215
|
+
| `textStyle.vinson` | 22-24px | 700 | Subheadings |
|
|
216
|
+
| `textStyle.blanc` | 18-20px | 700 | Small headers |
|
|
217
|
+
| `textStyle.fiji` | 18px | 600 | Emphasized body |
|
|
218
|
+
| `textStyle.rainier` | 16px | 400 | Body text (default) |
|
|
219
|
+
| `textStyle.etna` | 14px | 400 | Small text |
|
|
220
|
+
| `textStyle.snowdon` | 12px | 600 | Labels/captions |
|
|
221
|
+
|
|
222
|
+
```tsx
|
|
223
|
+
import styled from 'styled-components';
|
|
224
|
+
import { textStyle } from '@jamesodwyer/gds-figma-vite';
|
|
225
|
+
|
|
226
|
+
const Title = styled.h1`
|
|
227
|
+
${textStyle.everest}
|
|
228
|
+
`;
|
|
229
|
+
|
|
230
|
+
const Body = styled.p`
|
|
231
|
+
${textStyle.rainier}
|
|
232
|
+
`;
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Elevation (Shadows)
|
|
238
|
+
|
|
239
|
+
```tsx
|
|
240
|
+
import { elevation } from '@jamesodwyer/gds-figma-vite';
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
| Level | Usage |
|
|
244
|
+
|-------|-------|
|
|
245
|
+
| `elevation.level0` | Default (no shadow) |
|
|
246
|
+
| `elevation.level1` | Cards, content blocks |
|
|
247
|
+
| `elevation.level2` | Sticky headers |
|
|
248
|
+
| `elevation.level3` | Multiple sticky elements |
|
|
249
|
+
| `elevation.level4` | Modals, dialogs |
|
|
250
|
+
|
|
251
|
+
```tsx
|
|
252
|
+
const Card = styled.div`
|
|
253
|
+
${elevation.level1}
|
|
254
|
+
background: white;
|
|
255
|
+
`;
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Theme Colors
|
|
261
|
+
|
|
262
|
+
Access colors through theme props:
|
|
263
|
+
|
|
264
|
+
```tsx
|
|
265
|
+
const Component = styled.div`
|
|
266
|
+
background: ${props => props.theme.base.bg};
|
|
267
|
+
color: ${props => props.theme.text.primary};
|
|
268
|
+
border-color: ${props => props.theme.base.border};
|
|
269
|
+
|
|
270
|
+
&.error { color: ${props => props.theme.status.danger}; }
|
|
271
|
+
&.success { color: ${props => props.theme.status.success}; }
|
|
272
|
+
`;
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Theme Color Categories
|
|
276
|
+
- `theme.base.primary` - Brand primary color
|
|
277
|
+
- `theme.base.bg` - Background
|
|
278
|
+
- `theme.base.border` - Border color
|
|
279
|
+
- `theme.text.primary` - Primary text
|
|
280
|
+
- `theme.text.secondary` - Secondary text
|
|
281
|
+
- `theme.status.success` - Success green
|
|
282
|
+
- `theme.status.danger` - Error red
|
|
283
|
+
- `theme.status.warning` - Warning yellow
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Icons
|
|
288
|
+
|
|
289
|
+
Import icons directly:
|
|
290
|
+
|
|
291
|
+
```tsx
|
|
292
|
+
import { HeartIcon, CheckmarkIcon, CloseIcon } from '@jamesodwyer/gds-figma-vite';
|
|
293
|
+
|
|
294
|
+
// Usage
|
|
295
|
+
<HeartIcon size="24" />
|
|
296
|
+
<Button startIcon={<CheckmarkIcon />}>Confirm</Button>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Icon props: `size` (string like "24" or "1.5rem"), `fillColor` (optional)
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Button Props
|
|
304
|
+
|
|
305
|
+
```tsx
|
|
306
|
+
<Button
|
|
307
|
+
colorVariant="primary" // 'primary' | 'secondary' | 'tertiary'
|
|
308
|
+
fullWidth={false} // boolean
|
|
309
|
+
disabled={false} // boolean
|
|
310
|
+
startIcon={<Icon />} // ReactNode
|
|
311
|
+
endIcon={<Icon />} // ReactNode
|
|
312
|
+
onClick={() => {}} // function
|
|
313
|
+
>
|
|
314
|
+
Button Text
|
|
315
|
+
</Button>
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Modal Props
|
|
321
|
+
|
|
322
|
+
```tsx
|
|
323
|
+
<Modal
|
|
324
|
+
isOpen={true} // boolean
|
|
325
|
+
onClose={() => setOpen(false)} // function (required)
|
|
326
|
+
ariaLabel="Modal title" // string (required)
|
|
327
|
+
mobileMaxViewportWidth="768px" // string (required)
|
|
328
|
+
role="dialog" // 'dialog' | 'alertdialog'
|
|
329
|
+
size="standard" // 'standard' | 'large'
|
|
330
|
+
variant="default" // 'default' | 'danger'
|
|
331
|
+
>
|
|
332
|
+
<Modal.Header>
|
|
333
|
+
<Modal.Title>Title</Modal.Title>
|
|
334
|
+
<Modal.CloseButton label="Close modal" />
|
|
335
|
+
</Modal.Header>
|
|
336
|
+
<Modal.Content>
|
|
337
|
+
<Modal.Description>Content</Modal.Description>
|
|
338
|
+
</Modal.Content>
|
|
339
|
+
<Modal.Actions>
|
|
340
|
+
<Button colorVariant="secondary">Cancel</Button>
|
|
341
|
+
<Button colorVariant="primary">Confirm</Button>
|
|
342
|
+
</Modal.Actions>
|
|
343
|
+
</Modal>
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## InputField Props
|
|
349
|
+
|
|
350
|
+
```tsx
|
|
351
|
+
<InputField id="fieldId"> {/* id is required */}
|
|
352
|
+
<InputField.Label>Label Text</InputField.Label>
|
|
353
|
+
<InputField.Row marginTop="club">
|
|
354
|
+
<InputField.Input
|
|
355
|
+
type="text" // 'text' | 'email' | 'password' | etc.
|
|
356
|
+
placeholder="..."
|
|
357
|
+
isErrored={false} // boolean - shows error styling
|
|
358
|
+
/>
|
|
359
|
+
</InputField.Row>
|
|
360
|
+
<InputField.Validation
|
|
361
|
+
type="error" // 'error' | 'success'
|
|
362
|
+
screenReaderErrorPrefix="Error:"
|
|
363
|
+
>
|
|
364
|
+
Error message here
|
|
365
|
+
</InputField.Validation>
|
|
366
|
+
</InputField>
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Code Generation Rules
|
|
372
|
+
|
|
373
|
+
### DO:
|
|
374
|
+
- Wrap with `GdsProvider`
|
|
375
|
+
- Use compound component syntax (`Modal.Header`, `Card.Body`)
|
|
376
|
+
- Use spacing tokens (`spacing.auditorium`)
|
|
377
|
+
- Use textStyle for typography
|
|
378
|
+
- Use theme colors (`props.theme.base.primary`)
|
|
379
|
+
|
|
380
|
+
### DO NOT:
|
|
381
|
+
- Import sub-components separately (use dot notation)
|
|
382
|
+
- Use components that don't exist (ButtonGroup, CardContent, etc.)
|
|
383
|
+
- Hardcode hex colors
|
|
384
|
+
- Hardcode pixel values for spacing
|
|
385
|
+
- Skip the GdsProvider wrapper
|
|
@@ -2,6 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
All components are imported from `@jamesodwyer/gds-figma-vite`.
|
|
4
4
|
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## CRITICAL: Compound Component Pattern
|
|
8
|
+
|
|
9
|
+
Several GDS components use the **compound component pattern**. Sub-components are accessed via **dot notation**, NOT as separate imports.
|
|
10
|
+
|
|
11
|
+
### Components with Sub-components
|
|
12
|
+
|
|
13
|
+
| Component | Sub-components (use dot notation) |
|
|
14
|
+
|-----------|-----------------------------------|
|
|
15
|
+
| `Modal` | `.Header`, `.Title`, `.Content`, `.Description`, `.Image`, `.CloseButton`, `.Actions` |
|
|
16
|
+
| `Card` | `.Title`, `.Body` |
|
|
17
|
+
| `InputField` | `.Label`, `.Row`, `.Input`, `.Textarea`, `.Select`, `.Checkbox`, `.Radio`, `.StartIcon`, `.EndIcon`, `.Validation` |
|
|
18
|
+
| `Accordion` | `.Item`, `.Toggle`, `.Content` |
|
|
19
|
+
|
|
20
|
+
### Example Usage
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
// ✅ CORRECT - Use dot notation
|
|
24
|
+
<Modal>
|
|
25
|
+
<Modal.Header>
|
|
26
|
+
<Modal.Title>Title</Modal.Title>
|
|
27
|
+
</Modal.Header>
|
|
28
|
+
<Modal.Content>
|
|
29
|
+
<Modal.Description>Content</Modal.Description>
|
|
30
|
+
</Modal.Content>
|
|
31
|
+
</Modal>
|
|
32
|
+
|
|
33
|
+
// ❌ WRONG - These don't exist as separate components
|
|
34
|
+
<ModalHeader> // Does not exist
|
|
35
|
+
<ModalContent> // Does not exist
|
|
36
|
+
<CardContent> // Does not exist
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
5
41
|
## Layout Components
|
|
6
42
|
|
|
7
43
|
| Component | Description | Usage |
|
|
@@ -83,10 +119,39 @@ All components are imported from `@jamesodwyer/gds-figma-vite`.
|
|
|
83
119
|
|
|
84
120
|
| Component | Description | Usage |
|
|
85
121
|
|-----------|-------------|-------|
|
|
122
|
+
| Stack | Vertical/horizontal layout with spacing | Element spacing, button rows |
|
|
86
123
|
| Countdown | Timer countdown | Time-limited offers |
|
|
87
124
|
| CountdownTimer | Alternative timer | Countdown displays |
|
|
88
125
|
| ShareCard | Social sharing card | Share dialogs |
|
|
89
126
|
| BrandLogo | Brand logo display | Branding |
|
|
127
|
+
| VisuallyHidden | Screen reader only content | Accessibility |
|
|
128
|
+
| IconButton | Icon-only button utility | Icon actions |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Components That DO NOT Exist
|
|
133
|
+
|
|
134
|
+
> **WARNING**: The following components are NOT part of GDS. Do not use them.
|
|
135
|
+
|
|
136
|
+
| Non-Existent Component | Use Instead |
|
|
137
|
+
|------------------------|-------------|
|
|
138
|
+
| `ButtonGroup` | `Stack` with flex styling |
|
|
139
|
+
| `CardContent` | Put content in `Card.Body` |
|
|
140
|
+
| `CardHeader` | Use `Card.Title` |
|
|
141
|
+
| `CardActions` | Put buttons in `Card.Body` |
|
|
142
|
+
| `ModalDescription` | Use `Modal.Description` |
|
|
143
|
+
| `ModalHeader` | Use `Modal.Header` |
|
|
144
|
+
| `ModalBody` | Use `Modal.Content` |
|
|
145
|
+
| `ModalFooter` | Use `Modal.Actions` |
|
|
146
|
+
| `FormControl` | Use `InputField` |
|
|
147
|
+
| `Grid` | Use CSS Grid or styled div |
|
|
148
|
+
| `Box` | Use styled div with spacing tokens |
|
|
149
|
+
| `Container` | Use styled div with spacing tokens |
|
|
150
|
+
| `Typography` | Use `TextStyle` |
|
|
151
|
+
| `Divider` | Use styled hr or div |
|
|
152
|
+
| `Snackbar` | Use `Toast` |
|
|
153
|
+
| `Dialog` | Use `Modal` |
|
|
154
|
+
| `Drawer` | Use `SidePanel` |
|
|
90
155
|
|
|
91
156
|
## Import Examples
|
|
92
157
|
|