nurosys-agents 2.0.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/.agent/INSTRUCTIONS.md +82 -0
- package/.agent/README.md +483 -0
- package/.agent/backend/skills/architect/SKILL.md +436 -0
- package/.agent/backend/skills/auth-and-permissions/SKILL.md +168 -0
- package/.agent/backend/skills/brainstorm/SKILL.md +127 -0
- package/.agent/backend/skills/code-reviewer/SKILL.md +324 -0
- package/.agent/backend/skills/create-blueprint/SKILL.md +650 -0
- package/.agent/backend/skills/debug-issue/SKILL.md +53 -0
- package/.agent/backend/skills/explore-codebase/SKILL.md +45 -0
- package/.agent/backend/skills/quick-execute/SKILL.md +99 -0
- package/.agent/backend/skills/refactor-safely/SKILL.md +46 -0
- package/.agent/backend/skills/security-assessment/SKILL.md +174 -0
- package/.agent/backend/workflows/module-runner.claude.md +226 -0
- package/.agent/backend/workflows/module-runner.codex.md +155 -0
- package/.agent/backend/workflows/module-runner.cursor.md +212 -0
- package/.agent/frontend/skills/architect/SKILL.md +644 -0
- package/.agent/frontend/skills/auth-and-permissions/SKILL.md +43 -0
- package/.agent/frontend/skills/create-blueprint/SKILL.md +635 -0
- package/.agent/frontend/skills/debug-issue/SKILL.md +28 -0
- package/.agent/frontend/skills/explore-codebase/SKILL.md +29 -0
- package/.agent/frontend/skills/feature-workflow/SKILL.md +61 -0
- package/.agent/frontend/skills/react-quality-review/SKILL.md +126 -0
- package/.agent/frontend/skills/react-quality-review/examples.md +24 -0
- package/.agent/frontend/skills/react-quality-review/rules/_sections.md +26 -0
- package/.agent/frontend/skills/react-quality-review/rules/_template.md +28 -0
- package/.agent/frontend/skills/react-quality-review/rules/advanced-event-handler-refs.md +55 -0
- package/.agent/frontend/skills/react-quality-review/rules/advanced-init-once.md +42 -0
- package/.agent/frontend/skills/react-quality-review/rules/react-rules-calling.md +66 -0
- package/.agent/frontend/skills/react-quality-review/rules/react-rules-hooks.md +91 -0
- package/.agent/frontend/skills/react-quality-review/rules/react-rules-purity.md +121 -0
- package/.agent/frontend/skills/react-quality-review/rules/rendering-activity.md +26 -0
- package/.agent/frontend/skills/react-quality-review/rules/rendering-conditional-render.md +40 -0
- package/.agent/frontend/skills/react-quality-review/rules/rendering-content-visibility.md +38 -0
- package/.agent/frontend/skills/react-quality-review/rules/rendering-hoist-jsx.md +46 -0
- package/.agent/frontend/skills/react-quality-review/rules/rendering-usetransition-loading.md +75 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-defer-reads.md +39 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-dependencies.md +45 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-derived-state-no-effect.md +40 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-derived-state.md +29 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-functional-setstate.md +74 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-lazy-state-init.md +58 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-memo-with-default-value.md +38 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-memo.md +44 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-move-effect-to-event.md +45 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-no-inline-components.md +82 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-simple-expression-in-memo.md +35 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-transitions.md +40 -0
- package/.agent/frontend/skills/react-quality-review/rules/rerender-use-ref-transient-values.md +73 -0
- package/.agent/frontend/skills/refactor-safely/SKILL.md +29 -0
- package/.agent/frontend/skills/vuexy-component-guide/SKILL.md +369 -0
- package/.agent/frontend/skills/vuexy-component-guide/examples.md +662 -0
- package/.agent/frontend/skills/vuexy-component-guide/reference.md +1036 -0
- package/.agent/frontend/workflows/build-feature-react.workflow.md +82 -0
- package/.agent/frontend/workflows/feature-module-runner.md +101 -0
- package/.agent/monolith/skills/architect/SKILL.md +648 -0
- package/.agent/monolith/skills/auth-and-permissions/SKILL.md +43 -0
- package/.agent/monolith/skills/code-reviewer/SKILL.md +281 -0
- package/.agent/monolith/skills/create-blueprint/SKILL.md +635 -0
- package/.agent/monolith/skills/debug-issue/SKILL.md +28 -0
- package/.agent/monolith/skills/explore-codebase/SKILL.md +29 -0
- package/.agent/monolith/skills/feature-workflow/SKILL.md +61 -0
- package/.agent/monolith/skills/react-quality-review/SKILL.md +126 -0
- package/.agent/monolith/skills/react-quality-review/examples.md +24 -0
- package/.agent/monolith/skills/react-quality-review/rules/_sections.md +26 -0
- package/.agent/monolith/skills/react-quality-review/rules/_template.md +28 -0
- package/.agent/monolith/skills/react-quality-review/rules/advanced-event-handler-refs.md +55 -0
- package/.agent/monolith/skills/react-quality-review/rules/advanced-init-once.md +42 -0
- package/.agent/monolith/skills/react-quality-review/rules/react-rules-calling.md +66 -0
- package/.agent/monolith/skills/react-quality-review/rules/react-rules-hooks.md +91 -0
- package/.agent/monolith/skills/react-quality-review/rules/react-rules-purity.md +121 -0
- package/.agent/monolith/skills/react-quality-review/rules/rendering-activity.md +26 -0
- package/.agent/monolith/skills/react-quality-review/rules/rendering-conditional-render.md +40 -0
- package/.agent/monolith/skills/react-quality-review/rules/rendering-content-visibility.md +38 -0
- package/.agent/monolith/skills/react-quality-review/rules/rendering-hoist-jsx.md +46 -0
- package/.agent/monolith/skills/react-quality-review/rules/rendering-usetransition-loading.md +75 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-defer-reads.md +39 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-dependencies.md +45 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-derived-state-no-effect.md +40 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-derived-state.md +29 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-functional-setstate.md +74 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-lazy-state-init.md +58 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-memo-with-default-value.md +38 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-memo.md +44 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-move-effect-to-event.md +45 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-no-inline-components.md +82 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-simple-expression-in-memo.md +35 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-transitions.md +40 -0
- package/.agent/monolith/skills/react-quality-review/rules/rerender-use-ref-transient-values.md +73 -0
- package/.agent/monolith/skills/refactor-safely/SKILL.md +29 -0
- package/.agent/monolith/skills/vuexy-component-guide/SKILL.md +369 -0
- package/.agent/monolith/skills/vuexy-component-guide/examples.md +662 -0
- package/.agent/monolith/skills/vuexy-component-guide/reference.md +1036 -0
- package/.agent/monolith/workflows/add-new-api-feature-module.md +63 -0
- package/.agent/monolith/workflows/backend-quality-review.md +27 -0
- package/.agent/monolith/workflows/build-feature-backend.workflow.md +91 -0
- package/.agent/monolith/workflows/build-feature-react.workflow.md +82 -0
- package/.agent/monolith/workflows/feature-module-runner.md +97 -0
- package/.agent/templates/FEATURE_PLAN.md +42 -0
- package/.agent/templates/MODULE.md +45 -0
- package/.agent/templates/REVIEW_REPORT.md +44 -0
- package/.agent/templates/SECURITY_REPORT.md +70 -0
- package/.agent/templates/TEST_PLAN.md +49 -0
- package/README.md +131 -0
- package/package.json +42 -0
- package/scripts/setup-rules.js +224 -0
- package/scripts/setup.js +518 -0
|
@@ -0,0 +1,1036 @@
|
|
|
1
|
+
# VueXY MUI Component Reference
|
|
2
|
+
|
|
3
|
+
Complete configuration options for every component used in this project.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Input Components
|
|
8
|
+
|
|
9
|
+
### CustomTextField (`@core/components/mui/TextField`)
|
|
10
|
+
|
|
11
|
+
Wraps MUI TextField with Vuexy styling. Use this instead of `@mui/material/TextField`.
|
|
12
|
+
|
|
13
|
+
**Props**: All `TextFieldProps` from MUI, plus:
|
|
14
|
+
- `size` — `'small'` (default) | `'medium'`
|
|
15
|
+
- `label` — string — Label text above input
|
|
16
|
+
- `placeholder` — string — Placeholder text
|
|
17
|
+
- `fullWidth` — boolean — Expand to container width
|
|
18
|
+
- `error` — boolean — Show error state (red border)
|
|
19
|
+
- `helperText` — string | ReactNode — Text below input
|
|
20
|
+
- `type` — `'text'` | `'email'` | `'password'` | `'number'` | `'tel'` | `'url'` | etc.
|
|
21
|
+
- `disabled` — boolean — Disable input
|
|
22
|
+
- `readOnly` — boolean — Read-only input
|
|
23
|
+
- `multiline` — boolean — Multi-line textarea
|
|
24
|
+
- `rows` — number — Number of visible lines (for multiline)
|
|
25
|
+
- `select` — boolean — Render as select dropdown
|
|
26
|
+
- `slotProps` — object — `{ input?: {}, inputLabel?: {}, select?: {} }`
|
|
27
|
+
- `InputProps` — object — Passed to inner Input component
|
|
28
|
+
- `inputProps` — object — Passed to native input element
|
|
29
|
+
- `value` — string | number — Controlled value
|
|
30
|
+
- `onChange` — function — Change handler
|
|
31
|
+
- `onFocus` / `onBlur` — function — Focus handlers
|
|
32
|
+
- `sx` — SxProps — Additional MUI sx styling
|
|
33
|
+
|
|
34
|
+
**Styles applied**:
|
|
35
|
+
- Label is always shrunk (not floating)
|
|
36
|
+
- Default variant: `'filled'`
|
|
37
|
+
- Border: 1px solid inputBorder, 2px on focus with shadow
|
|
38
|
+
- Default size: `'small'` with compact padding
|
|
39
|
+
- Focus: primary color border + `var(--mui-customShadows-primary-sm)`
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
// Basic text
|
|
43
|
+
<CustomTextField fullWidth label='Full Name' placeholder='John Doe' />
|
|
44
|
+
|
|
45
|
+
// With error
|
|
46
|
+
<CustomTextField fullWidth label='Email' error helperText='Invalid email' />
|
|
47
|
+
|
|
48
|
+
// Select dropdown
|
|
49
|
+
<CustomTextField select fullWidth label='Country' value='US' onChange={handleChange}>
|
|
50
|
+
<MenuItem value='US'>United States</MenuItem>
|
|
51
|
+
<MenuItem value='UK'>United Kingdom</MenuItem>
|
|
52
|
+
</CustomTextField>
|
|
53
|
+
|
|
54
|
+
// Multi-select
|
|
55
|
+
<CustomTextField
|
|
56
|
+
select
|
|
57
|
+
fullWidth
|
|
58
|
+
slotProps={{ select: { multiple: true } }}
|
|
59
|
+
label='Languages'
|
|
60
|
+
value={['en', 'fr']}
|
|
61
|
+
>
|
|
62
|
+
<MenuItem value='en'>English</MenuItem>
|
|
63
|
+
<MenuItem value='fr'>French</MenuItem>
|
|
64
|
+
</CustomTextField>
|
|
65
|
+
|
|
66
|
+
// Textarea
|
|
67
|
+
<CustomTextField fullWidth label='Bio' multiline rows={4} />
|
|
68
|
+
|
|
69
|
+
// Password with toggle
|
|
70
|
+
<CustomTextField
|
|
71
|
+
fullWidth
|
|
72
|
+
label='Password'
|
|
73
|
+
type={isPasswordShown ? 'text' : 'password'}
|
|
74
|
+
slotProps={{
|
|
75
|
+
input: {
|
|
76
|
+
endAdornment: (
|
|
77
|
+
<InputAdornment position='end'>
|
|
78
|
+
<IconButton edge='end' onClick={handleTogglePassword}>
|
|
79
|
+
<i className='tabler-eye' />
|
|
80
|
+
</IconButton>
|
|
81
|
+
</InputAdornment>
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
}}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### Autocomplete (`@mui/material/Autocomplete`)
|
|
91
|
+
|
|
92
|
+
**Import**: `import Autocomplete from '@mui/material/Autocomplete'`
|
|
93
|
+
|
|
94
|
+
**Key Props**:
|
|
95
|
+
- `options` — Array<T> — List of options
|
|
96
|
+
- `renderInput` — `(params) => ReactNode` — Render function for input. Use `CustomTextField` here.
|
|
97
|
+
- `value` — T | null — Controlled value (single)
|
|
98
|
+
- `multiple` — boolean — Allow multiple selection
|
|
99
|
+
- `freeSolo` — boolean — Allow custom text not in options
|
|
100
|
+
- `disabled` — boolean
|
|
101
|
+
- `loading` — boolean
|
|
102
|
+
- `onChange` — `(event, value) => void`
|
|
103
|
+
- `getLabel` — `(option) => string` — Label for each option
|
|
104
|
+
- `isOptionEqualToValue` — `(option, value) => boolean` — Comparison function
|
|
105
|
+
- `filterOptions` — function — Custom filtering logic
|
|
106
|
+
- `groupBy` — `(option) => string` — Group options by property
|
|
107
|
+
- `disablePortal` — boolean — Don't render in portal
|
|
108
|
+
- `renderOption` — `(props, option) => ReactNode` — Custom option rendering
|
|
109
|
+
- `renderTags` — `(value, getTagProps) => ReactNode` — Custom tag rendering
|
|
110
|
+
- `size` — `'small'` | `'medium'`
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
<Autocomplete
|
|
114
|
+
options={countries}
|
|
115
|
+
value={selectedCountry}
|
|
116
|
+
onChange={(_, value) => setSelectedCountry(value)}
|
|
117
|
+
renderInput={params => <CustomTextField {...params} label='Country' />}
|
|
118
|
+
/>
|
|
119
|
+
|
|
120
|
+
// With avatars
|
|
121
|
+
<Autocomplete
|
|
122
|
+
options={users}
|
|
123
|
+
getOptionLabel={option => option.name}
|
|
124
|
+
renderInput={params => <CustomTextField {...params} label='User' />}
|
|
125
|
+
renderOption={(props, option) => (
|
|
126
|
+
<li {...props}>
|
|
127
|
+
<Avatar src={option.avatar} size={32} />
|
|
128
|
+
<span style={{ marginLeft: 10 }}>{option.name}</span>
|
|
129
|
+
</li>
|
|
130
|
+
)}
|
|
131
|
+
/>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### Select (`@mui/material/Select`)
|
|
137
|
+
|
|
138
|
+
Used when `CustomTextField` has `select` prop. Rarely used standalone.
|
|
139
|
+
|
|
140
|
+
**Key Props**: `value`, `onChange`, `multiple`, `displayEmpty`, `IconComponent`, `renderValue`
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### InputAdornment (`@mui/material/InputAdornment`)
|
|
145
|
+
|
|
146
|
+
**Import**: `import InputAdornment from '@mui/material/InputAdornment'`
|
|
147
|
+
|
|
148
|
+
**Key Props**:
|
|
149
|
+
- `position` — `'start'` | `'end'` — Adornment position
|
|
150
|
+
- `disablePointerEvents` — boolean
|
|
151
|
+
- `children` — ReactNode — Usually `IconButton`
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
<CustomTextField
|
|
155
|
+
fullWidth
|
|
156
|
+
label='Price'
|
|
157
|
+
slotProps={{
|
|
158
|
+
input: {
|
|
159
|
+
startAdornment: <InputAdornment position='start'>$</InputAdornment>
|
|
160
|
+
}
|
|
161
|
+
}}
|
|
162
|
+
/>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### InputBase (`@mui/material/InputBase`)
|
|
168
|
+
|
|
169
|
+
Raw input without label/border styling. Use `CustomTextField` instead unless building custom input wrappers.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
### InputLabel (`@mui/material/InputLabel`)
|
|
174
|
+
|
|
175
|
+
Used with native `Select` or custom inputs. Use `CustomTextField` for most cases.
|
|
176
|
+
|
|
177
|
+
**Key Props**: `shrink` (boolean), `required`, `error`, `focused`, `color`
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
### FormControl (`@mui/material/FormControl`)
|
|
182
|
+
|
|
183
|
+
Wraps form elements to provide context for `FormHelperText`, `InputLabel`, and error state.
|
|
184
|
+
|
|
185
|
+
**Key Props**: `fullWidth`, `error`, `disabled`, `required`, `size`, `variant`, `sx`
|
|
186
|
+
|
|
187
|
+
```tsx
|
|
188
|
+
<FormControl fullWidth error={Boolean(errors.gender)}>
|
|
189
|
+
<FormLabel>Gender</FormLabel>
|
|
190
|
+
<RadioGroup row value={gender} onChange={handleChange}>
|
|
191
|
+
<FormControlLabel value='male' control={<Radio />} label='Male' />
|
|
192
|
+
<FormControlLabel value='female' control={<Radio />} label='Female' />
|
|
193
|
+
</RadioGroup>
|
|
194
|
+
<FormHelperText>{errors.gender?.message}</FormHelperText>
|
|
195
|
+
</FormControl>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
### FormHelperText (`@mui/material/FormHelperText`)
|
|
201
|
+
|
|
202
|
+
**Key Props**: `error` (boolean), `disabled`, `sx`, `children`
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
### FormLabel (`@mui/material/FormLabel`)
|
|
207
|
+
|
|
208
|
+
**Key Props**: `error`, `focused`, `disabled`, `required`, `sx`, `children`
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
### FormGroup (`@mui/material/FormGroup`)
|
|
213
|
+
|
|
214
|
+
Container for checkboxes. Use with `FormControlLabel`.
|
|
215
|
+
|
|
216
|
+
**Key Props**: `row` (boolean), `sx`
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
### FormControlLabel (`@mui/material/FormControlLabel`)
|
|
221
|
+
|
|
222
|
+
**Key Props**: `control` (Checkbox/Radio/Switch element), `label` (string|ReactNode), `disabled`, `labelPlacement` (`'top'` | `'bottom'` | `'start'` | `'end'`), `checked`
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
### Checkbox (`@mui/material/Checkbox`)
|
|
227
|
+
|
|
228
|
+
**Key Props**: `checked`, `defaultChecked`, `disabled`, `onChange`, `color`, `size`, `icon`, `checkedIcon`, `indeterminate`, `inputProps`
|
|
229
|
+
|
|
230
|
+
```tsx
|
|
231
|
+
<Checkbox checked={checked} onChange={e => setChecked(e.target.checked)} />
|
|
232
|
+
<Checkbox color='secondary' checked />
|
|
233
|
+
<Checkbox defaultChecked disabled />
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
### Radio (`@mui/material/Radio`) + RadioGroup (`@mui/material/RadioGroup`)
|
|
239
|
+
|
|
240
|
+
**Radio Props**: `checked`, `disabled`, `onChange`, `color`, `size`, `value`, `name`, `icon`, `checkedIcon`
|
|
241
|
+
|
|
242
|
+
**RadioGroup Props**: `row` (boolean), `value`, `onChange`, `name`, `defaultValue`
|
|
243
|
+
|
|
244
|
+
```tsx
|
|
245
|
+
<FormControl>
|
|
246
|
+
<FormLabel>Plan</FormLabel>
|
|
247
|
+
<RadioGroup value={plan} onChange={handleChange} name='plan'>
|
|
248
|
+
<FormControlLabel value='free' control={<Radio />} label='Free' />
|
|
249
|
+
<FormControlLabel value='pro' control={<Radio />} label='Pro' />
|
|
250
|
+
<FormControlLabel value='enterprise' control={<Radio />} label='Enterprise' />
|
|
251
|
+
</RadioGroup>
|
|
252
|
+
</FormControl>
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
### Switch (`@mui/material/Switch`)
|
|
258
|
+
|
|
259
|
+
**Key Props**: `checked`, `onChange`, `disabled`, `color`, `size` (`'small'` | `'medium'`), `defaultChecked`, `inputProps`
|
|
260
|
+
|
|
261
|
+
```tsx
|
|
262
|
+
<Switch checked={enabled} onChange={handleChange} />
|
|
263
|
+
<Switch color='secondary' />
|
|
264
|
+
<Switch size='small' />
|
|
265
|
+
|
|
266
|
+
// With label
|
|
267
|
+
<FormControlLabel control={<Switch checked={dark} onChange={handleChange} />} label='Dark Mode' />
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
### Rating (`@mui/material/Rating`)
|
|
273
|
+
|
|
274
|
+
**Key Props**: `value`, `onChange`, `max` (default 5), `icon`, `emptyIcon`, `precision` (0.5, 1), `size` (`'small'` | `'medium'` | `'large'`), `readOnly`, `disabled`, `highlightSelectedOnly`
|
|
275
|
+
|
|
276
|
+
```tsx
|
|
277
|
+
<Rating value={4} onChange={(_, newValue) => setValue(newValue)} />
|
|
278
|
+
<Rating value={3.5} precision={0.5} readOnly />
|
|
279
|
+
<Rating value={4} size='large' max={10} />
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Data Display Components
|
|
285
|
+
|
|
286
|
+
### Typography (`@mui/material/Typography`)
|
|
287
|
+
|
|
288
|
+
**Key Props**:
|
|
289
|
+
- `variant` — `'h1'` | `'h2'` | `'h3'` | `'h4'` | `'h5'` | `'h6'` | `'subtitle1'` | `'subtitle2'` | `'body1'` | `'body2'` | `'button'` | `'caption'` | `'overline'` | `'inherit'`
|
|
290
|
+
- `color` — `'textPrimary'` | `'textSecondary'` | `'primary'` | `'secondary'` | `'error'` | etc.
|
|
291
|
+
- `align` — `'left'` | `'center'` | `'right'` | `'justify'`
|
|
292
|
+
- `noWrap` — boolean — Truncate with ellipsis
|
|
293
|
+
- `gutterBottom` — boolean — Add bottom margin
|
|
294
|
+
- `component` — string | ComponentType — Override HTML element (e.g., `'p'`, `'h3'`, `Link`)
|
|
295
|
+
- `children` — ReactNode
|
|
296
|
+
- `className` / `sx` — Styling
|
|
297
|
+
|
|
298
|
+
```tsx
|
|
299
|
+
<Typography variant='h4'>Page Title</Typography>
|
|
300
|
+
<Typography variant='body2' color='text.secondary'>Description</Typography>
|
|
301
|
+
<Typography color='text.primary' className='font-medium'>Bold text</Typography>
|
|
302
|
+
<Typography variant='body2' noWrap>Long text that truncates...</Typography>
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### Card (`@mui/material/Card`)
|
|
308
|
+
|
|
309
|
+
**Key Props**: `variant` (`'elevation'` | `'outlined'`), `raised`, `children`, `sx`
|
|
310
|
+
|
|
311
|
+
```tsx
|
|
312
|
+
<Card>
|
|
313
|
+
<CardHeader title='Card Title' subheader='Card Subtitle' />
|
|
314
|
+
<CardContent>
|
|
315
|
+
{/* Card content */}
|
|
316
|
+
</CardContent>
|
|
317
|
+
<CardActions>
|
|
318
|
+
<Button variant='contained'>Action</Button>
|
|
319
|
+
</CardActions>
|
|
320
|
+
</Card>
|
|
321
|
+
|
|
322
|
+
// With image
|
|
323
|
+
<Card>
|
|
324
|
+
<CardMedia component='img' height='200' image='/images/card.png' />
|
|
325
|
+
<CardContent>...</CardContent>
|
|
326
|
+
</Card>
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
### CardHeader (`@mui/material/CardHeader`)
|
|
332
|
+
|
|
333
|
+
**Key Props**: `title`, `subheader`, `avatar`, `action`
|
|
334
|
+
|
|
335
|
+
```tsx
|
|
336
|
+
<CardHeader title='Orders' subheader='Total 150 orders' action={
|
|
337
|
+
<IconButton><i className='tabler-dots-vertical' /></IconButton>
|
|
338
|
+
} />
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
### CardContent (`@mui/material/CardContent`)
|
|
344
|
+
|
|
345
|
+
**Key Props**: `children`, `sx`
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
### CardActions (`@mui/material/CardActions`)
|
|
350
|
+
|
|
351
|
+
**Key Props**: `children`, `disableSpacing`, `sx`
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
### CardMedia (`@mui/material/CardMedia`)
|
|
356
|
+
|
|
357
|
+
**Key Props**: `component` (`'img'` | `'div'` | etc.), `image` (URL), `height`, `title`, `sx`
|
|
358
|
+
|
|
359
|
+
```tsx
|
|
360
|
+
<CardMedia component='img' height='140' image='https://example.com/image.jpg' />
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
### CustomAvatar (`@core/components/mui/Avatar`)
|
|
366
|
+
|
|
367
|
+
**Key Props** (all Avatar props plus):
|
|
368
|
+
- `color` — `'primary'` | `'secondary'` | `'success'` | `'warning'` | `'error'` | `'info'`
|
|
369
|
+
- `skin` — `'filled'` (default, solid bg) | `'light'` (light bg, respects theme) | `'light-static'`
|
|
370
|
+
- `size` — number — Pixel dimensions (e.g., `32`, `40`, `119`)
|
|
371
|
+
- `src` — string — Image URL
|
|
372
|
+
- `children` — letter(s) for avatar
|
|
373
|
+
- `variant` — `'circular'` (default) | `'rounded'` | `'square'`
|
|
374
|
+
- `sx` — additional styles
|
|
375
|
+
|
|
376
|
+
```tsx
|
|
377
|
+
<CustomAvatar color='primary'>A</CustomAvatar>
|
|
378
|
+
<CustomAvatar color='success' skin='light' size={32}><i className='tabler-check' /></CustomAvatar>
|
|
379
|
+
<CustomAvatar src='/images/avatar.png' size={40} />
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### CustomBadge (`@core/components/mui/Badge`)
|
|
385
|
+
|
|
386
|
+
**Key Props** (all Badge props plus):
|
|
387
|
+
- `tonal` — `'true'` | `'false'` — Light background instead of solid
|
|
388
|
+
|
|
389
|
+
```tsx
|
|
390
|
+
<CustomBadge tonal='true' color='error' badgeContent={4}>
|
|
391
|
+
<CustomAvatar src='/images/avatar.png' />
|
|
392
|
+
</CustomBadge>
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
### CustomChip (`@core/components/mui/Chip`)
|
|
398
|
+
|
|
399
|
+
**Key Props** (all Chip props plus):
|
|
400
|
+
- `round` — `'true'` | `'false'` — Pill shape (500px border radius)
|
|
401
|
+
|
|
402
|
+
**Chip Props**:
|
|
403
|
+
- `label` — string | ReactNode
|
|
404
|
+
- `color` — `'default'` | `'primary'` | `'secondary'` | `'error'` | `'info'` | `'success'` | `'warning'`
|
|
405
|
+
- `size` — `'small'` | `'medium'`
|
|
406
|
+
- `variant` — `'filled'` | `'outlined'`
|
|
407
|
+
- `onDelete` — function — Shows delete icon (calls handler)
|
|
408
|
+
- `onClick` — function
|
|
409
|
+
- `icon` — ReactNode
|
|
410
|
+
- `avatar` — Avatar element
|
|
411
|
+
- `clickable` — boolean
|
|
412
|
+
- `disabled` — boolean
|
|
413
|
+
|
|
414
|
+
```tsx
|
|
415
|
+
<CustomChip label='Active' color='success' round='true' />
|
|
416
|
+
<CustomChip label='Pending' color='warning' />
|
|
417
|
+
<CustomChip label='Error' color='error' variant='outlined' />
|
|
418
|
+
<CustomChip avatar={<Avatar>A</Avatar>} label='Author' />
|
|
419
|
+
<CustomChip label='Deletable' onDelete={() => {}} color='info' />
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
### List, ListItem, ListItemButton, ListItemText, ListItemIcon, ListItemAvatar
|
|
425
|
+
|
|
426
|
+
```tsx
|
|
427
|
+
<List>
|
|
428
|
+
<ListItem disablePadding>
|
|
429
|
+
<ListItemButton>
|
|
430
|
+
<ListItemIcon><i className='tabler-mail' /></ListItemIcon>
|
|
431
|
+
<ListItemText primary='Inbox' secondary='12 unread' />
|
|
432
|
+
</ListItemButton>
|
|
433
|
+
</ListItem>
|
|
434
|
+
</List>
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
**List Props**: `disablePadding`, `dense`, `subheader`, `component`
|
|
438
|
+
**ListItem Props**: `disablePadding`, `dense`, `divider`, `secondaryAction`
|
|
439
|
+
**ListItemButton Props**: `selected`, `disabled`, `dense`, `component`, `onMouseEnter/Leave`
|
|
440
|
+
**ListItemText Props**: `primary`, `secondary`, `primaryTypographyProps`, `secondaryTypographyProps`
|
|
441
|
+
**ListItemIcon Props**: `className` (for sizing)
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
### Divider (`@mui/material/Divider`)
|
|
446
|
+
|
|
447
|
+
**Key Props**: `flexItem`, `light`, `orientation` (`'horizontal'` | `'vertical'`), `children`, `sx`
|
|
448
|
+
|
|
449
|
+
```tsx
|
|
450
|
+
<Divider />
|
|
451
|
+
<Divider flexItem /> {/* In flex container */}
|
|
452
|
+
<Divider className='mbe-4' />
|
|
453
|
+
<Divider textAlign='left'>OR</Divider>
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
### Table Components
|
|
459
|
+
|
|
460
|
+
**Import each from `@mui/material/`**: `Table`, `TableHead`, `TableBody`, `TableRow`, `TableCell`, `TableContainer`, `TablePagination`
|
|
461
|
+
|
|
462
|
+
```tsx
|
|
463
|
+
import Table from '@mui/material/Table'
|
|
464
|
+
import TableBody from '@mui/material/TableBody'
|
|
465
|
+
import TableCell from '@mui/material/TableCell'
|
|
466
|
+
import TableHead from '@mui/material/TableHead'
|
|
467
|
+
import TableRow from '@mui/material/TableRow'
|
|
468
|
+
import TablePagination from '@mui/material/TablePagination'
|
|
469
|
+
import Checkbox from '@mui/material/Checkbox'
|
|
470
|
+
|
|
471
|
+
<Table>
|
|
472
|
+
<TableHead>
|
|
473
|
+
<TableRow>
|
|
474
|
+
<TableCell padding='checkbox'>
|
|
475
|
+
<Checkbox
|
|
476
|
+
checked={selectAll}
|
|
477
|
+
onChange={e => setSelectAll(e.target.checked)}
|
|
478
|
+
/>
|
|
479
|
+
</TableCell>
|
|
480
|
+
<TableCell>Name</TableCell>
|
|
481
|
+
<TableCell>Email</TableCell>
|
|
482
|
+
<TableCell>Actions</TableCell>
|
|
483
|
+
</TableRow>
|
|
484
|
+
</TableHead>
|
|
485
|
+
<TableBody>
|
|
486
|
+
{rows.map(row => (
|
|
487
|
+
<TableRow key={row.id}>
|
|
488
|
+
<TableCell padding='checkbox'>
|
|
489
|
+
<Checkbox checked={selected.has(row.id)} />
|
|
490
|
+
</TableCell>
|
|
491
|
+
<TableCell>{row.name}</TableCell>
|
|
492
|
+
<TableCell>{row.email}</TableCell>
|
|
493
|
+
<TableCell>
|
|
494
|
+
<IconButton onClick={() => handleEdit(row.id)}><i className='tabler-pencil' /></IconButton>
|
|
495
|
+
<IconButton onClick={() => handleDelete(row.id)}><i className='tabler-trash' /></IconButton>
|
|
496
|
+
</TableCell>
|
|
497
|
+
</TableRow>
|
|
498
|
+
))}
|
|
499
|
+
</TableBody>
|
|
500
|
+
</Table>
|
|
501
|
+
|
|
502
|
+
{/* Pagination */}
|
|
503
|
+
<TablePagination
|
|
504
|
+
component='div'
|
|
505
|
+
count={totalRows}
|
|
506
|
+
page={page}
|
|
507
|
+
onPageChange={(_, newPage) => setPage(newPage)}
|
|
508
|
+
rowsPerPage={rowsPerPage}
|
|
509
|
+
onRowsPerPageChange={e => { setRowsPerPage(+e.target.value); setPage(0); }}
|
|
510
|
+
/>
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
**TableCell Props**: `align` (`'left'` | `'center'` | `'right'` | `'justify'`), `padding` (`'normal'` | `'checkbox'` | `'none'`), `size` (`'small'` | `'medium'`), `sortDirection`, `component`, `colSpan`, `rowSpan`, `variant` (`'head'` | `'body'` | `'footer'`)
|
|
514
|
+
**TablePagination Props**: `count`, `page`, `rowsPerPage`, `onPageChange`, `onRowsPerPageChange`, `rowsPerPageOptions`, `component`, `labelRowsPerPage`, `labelDisplayedRows`
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
## Feedback Components
|
|
519
|
+
|
|
520
|
+
### Alert (`@mui/material/Alert`)
|
|
521
|
+
|
|
522
|
+
**Key Props**:
|
|
523
|
+
- `severity` — `'error'` | `'warning'` | `'info'` | `'success'`
|
|
524
|
+
- `variant` — `'standard'` | `'outlined'` | `'filled'`
|
|
525
|
+
- `icon` — ReactNode — Custom icon
|
|
526
|
+
- `action` — ReactNode — Action element (button, close icon)
|
|
527
|
+
- `onClose` — function
|
|
528
|
+
- `title` — string (for AlertTitle sibling)
|
|
529
|
+
|
|
530
|
+
```tsx
|
|
531
|
+
<Alert severity='error'>
|
|
532
|
+
<AlertTitle>Error</AlertTitle>
|
|
533
|
+
<div>Something went wrong.</div>
|
|
534
|
+
</Alert>
|
|
535
|
+
|
|
536
|
+
<Alert severity='success' variant='outlined'>
|
|
537
|
+
Changes saved successfully!
|
|
538
|
+
</Alert>
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
---
|
|
542
|
+
|
|
543
|
+
### AlertTitle (`@mui/material/AlertTitle`)
|
|
544
|
+
|
|
545
|
+
**Key Props**: `children`, `className`, `sx`
|
|
546
|
+
**Usage**: Must be used inside an `<Alert>` component.
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
### CircularProgress (`@mui/material/CircularProgress`)
|
|
551
|
+
|
|
552
|
+
**Key Props**: `size` (number | `'small'` | `'medium'`), `thickness` (number), `color`, `variant` (`'indeterminate'` | `'determinate'`), `value` (0-100 for determinate)
|
|
553
|
+
|
|
554
|
+
```tsx
|
|
555
|
+
<CircularProgress />
|
|
556
|
+
<CircularProgress size={24} />
|
|
557
|
+
<CircularProgress color='secondary' />
|
|
558
|
+
<CircularProgress variant='determinate' value={75} />
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
---
|
|
562
|
+
|
|
563
|
+
### LinearProgress (`@mui/material/LinearProgress`)
|
|
564
|
+
|
|
565
|
+
**Key Props**: `variant` (`'indeterminate'` | `'determinate'` | `'buffer'` | `'query'`), `value` (0-100), `valueBuffer` (0-100), `color`, `sx`
|
|
566
|
+
|
|
567
|
+
```tsx
|
|
568
|
+
<LinearProgress variant='determinate' value={60} />
|
|
569
|
+
<LinearProgress color='secondary' />
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
### Backdrop (`@mui/material/Backdrop`)
|
|
575
|
+
|
|
576
|
+
**Key Props**: `open`, `children`, `onClick`, `sx`, `transitionDuration`
|
|
577
|
+
|
|
578
|
+
```tsx
|
|
579
|
+
<Backdrop open={loading} onClick={() => setLoading(false)}>
|
|
580
|
+
<CircularProgress color='inherit' />
|
|
581
|
+
</Backdrop>
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
---
|
|
585
|
+
|
|
586
|
+
### Snackbar (`@mui/material/Snackbar`)
|
|
587
|
+
|
|
588
|
+
**Key Props**: `open`, `message`, `autoHideDuration`, `onClose`, `anchorOrigin` (`{ vertical: 'top' | 'bottom', horizontal: 'left' | 'center' | 'right' }`), `action`, `TransitionComponent`
|
|
589
|
+
|
|
590
|
+
**Note**: This project uses `react-toastify` for toast notifications instead of MUI Snackbar. Use `toast.success()`, `toast.error()`, `toast.warning()`, `toast.info()` from `'react-toastify'`.
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
## Navigation Components
|
|
595
|
+
|
|
596
|
+
### Button (`@mui/material/Button`)
|
|
597
|
+
|
|
598
|
+
**Key Props**:
|
|
599
|
+
- `variant` — `'text'` | `'outlined'` | `'contained'` | `'tonal'` (Vuexy custom!)
|
|
600
|
+
- `color` — `'primary'` | `'secondary'` | `'error'` | `'info'` | `'success'` | `'warning'` | `'inherit'`
|
|
601
|
+
- `size` — `'small'` | `'medium'` | `'large'`
|
|
602
|
+
- `disabled` — boolean
|
|
603
|
+
- `fullWidth` — boolean
|
|
604
|
+
- `startIcon` / `endIcon` — ReactNode
|
|
605
|
+
- `type` — `'button'` | `'submit'` | `'reset'`
|
|
606
|
+
- `onClick` — function
|
|
607
|
+
- `href` — string — Makes it a link
|
|
608
|
+
- `component` — Link (for Next.js Link integration)
|
|
609
|
+
- `className` / `sx`
|
|
610
|
+
|
|
611
|
+
```tsx
|
|
612
|
+
<Button variant='contained' type='submit'>Submit</Button>
|
|
613
|
+
<Button variant='tonal' color='secondary'>Cancel</Button>
|
|
614
|
+
<Button variant='outlined' startIcon={<i className='tabler-plus' />}>Add New</Button>
|
|
615
|
+
<Button variant='text' onClick={handleClick}>Learn More</Button>
|
|
616
|
+
<Button variant='contained' color='error'>Delete</Button>
|
|
617
|
+
<Button variant='tonal' size='small'>Small</Button>
|
|
618
|
+
|
|
619
|
+
// As link
|
|
620
|
+
<Button component={Link} href='/settings' variant='tonal' color='secondary'>
|
|
621
|
+
Go to Settings
|
|
622
|
+
</Button>
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
---
|
|
626
|
+
|
|
627
|
+
### ButtonGroup (`@mui/material/ButtonGroup`)
|
|
628
|
+
|
|
629
|
+
**Key Props**: `variant`, `color`, `size`, `orientation` (`'horizontal'` | `'vertical'`), `fullWidth`, `disabled`, `sx`
|
|
630
|
+
|
|
631
|
+
```tsx
|
|
632
|
+
<ButtonGroup>
|
|
633
|
+
<Button>One</Button>
|
|
634
|
+
<Button>Two</Button>
|
|
635
|
+
<Button>Three</Button>
|
|
636
|
+
</ButtonGroup>
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
---
|
|
640
|
+
|
|
641
|
+
### Breadcrumbs (`@mui/material/Breadcrumbs`)
|
|
642
|
+
|
|
643
|
+
**Key Props**: `separator`, `maxItems`, `component`, `itemsAfterCollapse`, `itemsBeforeCollapse`, `sx`
|
|
644
|
+
|
|
645
|
+
```tsx
|
|
646
|
+
<Breadcrumbs>
|
|
647
|
+
<Link href='/'>Home</Link>
|
|
648
|
+
<Link href='/apps'>Apps</Link>
|
|
649
|
+
<Typography color='text.primary'>Ecommerce</Typography>
|
|
650
|
+
</Breadcrumbs>
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
---
|
|
654
|
+
|
|
655
|
+
### Tooltip (`@mui/material/Tooltip`)
|
|
656
|
+
|
|
657
|
+
**Key Props**: `title`, `placement` (`'top'` | `'bottom'` | `'left'` | `'right'` + variants), `arrow`, `open`, `defaultOpen`, `enterDelay`, `leaveDelay`, `children`
|
|
658
|
+
|
|
659
|
+
```tsx
|
|
660
|
+
<Tooltip title='Delete' placement='top' arrow>
|
|
661
|
+
<IconButton><i className='tabler-trash' /></IconButton>
|
|
662
|
+
</Tooltip>
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
---
|
|
666
|
+
|
|
667
|
+
### Menu + MenuList + MenuItem
|
|
668
|
+
|
|
669
|
+
```tsx
|
|
670
|
+
import Menu from '@mui/material/Menu'
|
|
671
|
+
import MenuItem from '@mui/material/MenuItem'
|
|
672
|
+
|
|
673
|
+
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)
|
|
674
|
+
const open = Boolean(anchorEl)
|
|
675
|
+
|
|
676
|
+
<IconButton onClick={e => setAnchorEl(e.currentTarget)}>
|
|
677
|
+
<i className='tabler-dots-vertical' />
|
|
678
|
+
</IconButton>
|
|
679
|
+
|
|
680
|
+
<Menu anchorEl={anchorEl} open={open} onClose={() => setAnchorEl(null)}>
|
|
681
|
+
<MenuItem onClick={handleView}>
|
|
682
|
+
<i className='tabler-eye me-2' />
|
|
683
|
+
View
|
|
684
|
+
</MenuItem>
|
|
685
|
+
<MenuItem onClick={handleEdit}>
|
|
686
|
+
<i className='tabler-pencil me-2' />
|
|
687
|
+
Edit
|
|
688
|
+
</MenuItem>
|
|
689
|
+
<MenuItem onClick={handleDelete}>
|
|
690
|
+
<i className='tabler-trash me-2' />
|
|
691
|
+
Delete
|
|
692
|
+
</MenuItem>
|
|
693
|
+
</Menu>
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
**Menu Props**: `anchorEl`, `open`, `onClose`, `anchorOrigin` (`{ vertical: 'bottom' | 'top', horizontal: 'left' | 'right' | 'center' }`), `transformOrigin`, `PaperProps`, `MenuListProps`, `slotProps`, `keepMounted`
|
|
697
|
+
**MenuItem Props**: `dense`, `disabled`, `selected`, `component`, `onClick`, `children` (usually icon + text)
|
|
698
|
+
|
|
699
|
+
---
|
|
700
|
+
|
|
701
|
+
### Pagination (`@mui/material/Pagination`)
|
|
702
|
+
|
|
703
|
+
**Key Props**: `count` (total pages), `page` (current), `onChange`, `variant` (`'text'` | `'outlined'`), `color`, `size` (`'small'` | `'medium'` | `'large'`), `shape` (`'round'` | `'rounded'`), `showFirstButton`, `showLastButton`, `siblingsRange`, `boundaryRange`
|
|
704
|
+
|
|
705
|
+
```tsx
|
|
706
|
+
<Pagination count={10} page={1} onChange={handlePageChange} color='primary' />
|
|
707
|
+
<Pagination count={10} variant='outlined' shape='rounded' />
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
---
|
|
711
|
+
|
|
712
|
+
### Stepper + Step + StepLabel + StepContent + StepIcon
|
|
713
|
+
|
|
714
|
+
```tsx
|
|
715
|
+
import Stepper from '@mui/material/Stepper'
|
|
716
|
+
import Step from '@mui/material/Step'
|
|
717
|
+
import StepLabel from '@mui/material/StepLabel'
|
|
718
|
+
import StepContent from '@mui/material/StepContent'
|
|
719
|
+
import Button from '@mui/material/Button'
|
|
720
|
+
|
|
721
|
+
<Stepper activeStep={activeStep} orientation='vertical'>
|
|
722
|
+
{steps.map((step, index) => (
|
|
723
|
+
<Step key={index}>
|
|
724
|
+
<StepLabel>{step.label}</StepLabel>
|
|
725
|
+
<StepContent>
|
|
726
|
+
<p>{step.description}</p>
|
|
727
|
+
<Button variant='contained' onClick={() => setActiveStep(index + 1)}>
|
|
728
|
+
{index === steps.length - 1 ? 'Finish' : 'Next'}
|
|
729
|
+
</Button>
|
|
730
|
+
</StepContent>
|
|
731
|
+
</Step>
|
|
732
|
+
))}
|
|
733
|
+
</Stepper>
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
**Stepper Props**: `activeStep`, `orientation` (`'horizontal'` | `'vertical'`), `alternativeLabel`, `disabled`, `connector`, `nonLinear`, `children`
|
|
737
|
+
**Step Props**: `completed`, `expanded`, `disabled`, `index`, `active`
|
|
738
|
+
**StepLabel Props**: `error`, `children`, `StepIconComponent`, `optional`, `icon`
|
|
739
|
+
**StepContent Props**: `children`, `TransitionProps`, `transitionDuration`
|
|
740
|
+
|
|
741
|
+
---
|
|
742
|
+
|
|
743
|
+
### Tabs, Tab, TabContext, TabPanel, CustomTabList
|
|
744
|
+
|
|
745
|
+
```tsx
|
|
746
|
+
import TabContext from '@mui/lab/TabContext'
|
|
747
|
+
import TabPanel from '@mui/lab/TabPanel'
|
|
748
|
+
import Tab from '@mui/material/Tab'
|
|
749
|
+
import CustomTabList from '@core/components/mui/TabList'
|
|
750
|
+
|
|
751
|
+
<TabContext value={tabValue}>
|
|
752
|
+
<CustomTabList onChange={handleTabChange} pill='true' color='primary'>
|
|
753
|
+
<Tab value='1' label='Tab One' />
|
|
754
|
+
<Tab value='2' label='Tab Two' />
|
|
755
|
+
<Tab value='3' label='Tab Three' />
|
|
756
|
+
</CustomTabList>
|
|
757
|
+
<TabPanel value='1'>Content One</TabPanel>
|
|
758
|
+
<TabPanel value='2'>Content Two</TabPanel>
|
|
759
|
+
<TabPanel value='3'>Content Three</TabPanel>
|
|
760
|
+
</TabContext>
|
|
761
|
+
```
|
|
762
|
+
|
|
763
|
+
**CustomTabList Props**: `value`, `onChange`, `color`, `pill` (`'true'` | `'false'`), `orientation` (`'horizontal'` | `'vertical'`), `variant` (`'standard'` | `'scrollable'` | `'fullWidth'`), `scrollButtons`, `allowScrollButtonsMobile`
|
|
764
|
+
**Tab Props**: `label`, `value`, `icon`, `iconPosition` (`'top'` | `'bottom'` | `'start'` | `'end'`), `disabled`, `wrapped` (for scrollable), `TabIndicatorProps`
|
|
765
|
+
|
|
766
|
+
---
|
|
767
|
+
|
|
768
|
+
## Overlays
|
|
769
|
+
|
|
770
|
+
### Dialog + DialogTitle + DialogContent + DialogActions
|
|
771
|
+
|
|
772
|
+
```tsx
|
|
773
|
+
import Dialog from '@mui/material/Dialog'
|
|
774
|
+
import DialogTitle from '@mui/material/DialogTitle'
|
|
775
|
+
import DialogContent from '@mui/material/DialogContent'
|
|
776
|
+
import DialogActions from '@mui/material/DialogActions'
|
|
777
|
+
|
|
778
|
+
<Dialog open={open} onClose={handleClose} fullWidth maxWidth='sm'>
|
|
779
|
+
<DialogTitle>Dialog Title</DialogTitle>
|
|
780
|
+
<DialogCloseButton onClick={handleClose} /> {/* From @/components/dialogs/DialogCloseButton */}
|
|
781
|
+
<DialogContent>
|
|
782
|
+
<Grid container spacing={6}>
|
|
783
|
+
{/* Dialog content / form */}
|
|
784
|
+
</Grid>
|
|
785
|
+
</DialogContent>
|
|
786
|
+
<DialogActions className='dialog-actions-dense'>
|
|
787
|
+
<Button variant='tonal' color='secondary' onClick={handleClose}>Cancel</Button>
|
|
788
|
+
<Button variant='contained' onClick={handleSubmit}>Submit</Button>
|
|
789
|
+
</DialogActions>
|
|
790
|
+
</Dialog>
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
**Dialog Props**: `open`, `onClose`, `fullWidth`, `maxWidth` (`'xs'` | `'sm'` | `'md'` | `'lg'` | `'xl'` | `false`), `fullScreen`, `children`, `sx`, `PaperProps`, `TransitionComponent`, `scroll` (`'paper'` | `'body'`)
|
|
794
|
+
**DialogTitle Props**: `id`, `children`, `sx`
|
|
795
|
+
**DialogContent Props**: `dividers`, `sx`
|
|
796
|
+
**DialogActions Props**: `disableSpacing`, `sx`, `className='dialog-actions-dense'` (standard in this project)
|
|
797
|
+
|
|
798
|
+
### DialogCloseButton (`@/components/dialogs/DialogCloseButton`)
|
|
799
|
+
|
|
800
|
+
**Props**: `onClick`, `className`, `children` (default: `X` icon)
|
|
801
|
+
|
|
802
|
+
```tsx
|
|
803
|
+
import DialogCloseButton from '@/components/dialogs/DialogCloseButton'
|
|
804
|
+
<DialogCloseButton onClick={handleClose} />
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
---
|
|
808
|
+
|
|
809
|
+
### Drawer (`@mui/material/Drawer`)
|
|
810
|
+
|
|
811
|
+
```tsx
|
|
812
|
+
import Drawer from '@mui/material/Drawer'
|
|
813
|
+
|
|
814
|
+
<Drawer
|
|
815
|
+
open={open}
|
|
816
|
+
anchor='right'
|
|
817
|
+
variant='temporary'
|
|
818
|
+
onClose={() => setOpen(false)}
|
|
819
|
+
ModalProps={{ keepMounted: true }}
|
|
820
|
+
sx={{ '& .MuiDrawer-paper': { width: { xs: 300, sm: 400 } } }}
|
|
821
|
+
>
|
|
822
|
+
<div className='flex justify-between items-center pbs-5 mbe-4'>
|
|
823
|
+
<Typography variant='h5'>Drawer Title</Typography>
|
|
824
|
+
<IconButton onClick={() => setOpen(false)}>
|
|
825
|
+
<i className='tabler-x' />
|
|
826
|
+
</IconButton>
|
|
827
|
+
</div>
|
|
828
|
+
<Divider />
|
|
829
|
+
<div className='p-5'>
|
|
830
|
+
{/* Drawer content */}
|
|
831
|
+
</div>
|
|
832
|
+
</Drawer>
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
**Drawer Props**: `open`, `onClose`, `anchor` (`'left'` | `'right'` | `'top'` | `'bottom'`), `variant` (`'temporary'` | `'permanent'` | `'persistent'`), `children`, `sx`, `ModalProps`, `SlideProps`, `transitionDuration`
|
|
836
|
+
|
|
837
|
+
---
|
|
838
|
+
|
|
839
|
+
### Popper (`@mui/material/Popper`)
|
|
840
|
+
|
|
841
|
+
**Key Props**: `open`, `anchorEl`, `placement` (`'top'` | `'bottom'` | `'right'` | `'left'` + variants), `modifiers`, `transition`, `disablePortal`, `sx`
|
|
842
|
+
|
|
843
|
+
---
|
|
844
|
+
|
|
845
|
+
### ClickAwayListener (`@mui/material/ClickAwayListener`)
|
|
846
|
+
|
|
847
|
+
```tsx
|
|
848
|
+
import ClickAwayListener from '@mui/material/ClickAwayListener'
|
|
849
|
+
|
|
850
|
+
<ClickAwayListener onClickAway={() => setOpen(false)}>
|
|
851
|
+
<div>
|
|
852
|
+
<button onClick={() => setOpen(true)}>Toggle</button>
|
|
853
|
+
{open && <div>Click outside to close</div>}
|
|
854
|
+
</div>
|
|
855
|
+
</ClickAwayListener>
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
**Key Props**: `onClickAway`, `children`, `mouseEvent` (`'onClick'` | `'onMouseDown'` | `'none'`), `touchEvent` (`'onTouchEnd'` | `'none'`)
|
|
859
|
+
|
|
860
|
+
---
|
|
861
|
+
|
|
862
|
+
### Fade, Grow, Zoom, Collapse (Transitions)
|
|
863
|
+
|
|
864
|
+
All used for animation: `<Fade in={open}>`, `<Grow in={open}>`, `<Zoom in={open}>`, `<Collapse in={open}>`
|
|
865
|
+
|
|
866
|
+
**Common Props**: `in`, `children`, `timeout`, `onEnter`, `onEntering`, `onEntered`, `onExit`, `onExiting`, `onExited`
|
|
867
|
+
|
|
868
|
+
**Collapse** also has: `orientation` (`'horizontal'` | `'vertical'`), `collapsedSize`
|
|
869
|
+
|
|
870
|
+
---
|
|
871
|
+
|
|
872
|
+
### Paper (`@mui/material/Paper`)
|
|
873
|
+
|
|
874
|
+
**Key Props**: `variant` (`'elevation'` | `'outlined'`), `elevation` (0-24), `square`, `children`, `sx`
|
|
875
|
+
|
|
876
|
+
```tsx
|
|
877
|
+
<Paper elevation={2} sx={{ p: 3 }}>
|
|
878
|
+
Elevated content
|
|
879
|
+
</Paper>
|
|
880
|
+
```
|
|
881
|
+
|
|
882
|
+
---
|
|
883
|
+
|
|
884
|
+
## Lab Components (@mui/lab)
|
|
885
|
+
|
|
886
|
+
### Timeline Components
|
|
887
|
+
|
|
888
|
+
```tsx
|
|
889
|
+
import Timeline from '@mui/lab/Timeline'
|
|
890
|
+
import TimelineItem from '@mui/lab/TimelineItem'
|
|
891
|
+
import TimelineSeparator from '@mui/lab/TimelineSeparator'
|
|
892
|
+
import TimelineConnector from '@mui/lab/TimelineConnector'
|
|
893
|
+
import TimelineContent from '@mui/lab/TimelineContent'
|
|
894
|
+
import TimelineDot from '@mui/lab/TimelineDot'
|
|
895
|
+
|
|
896
|
+
<Timeline>
|
|
897
|
+
<TimelineItem>
|
|
898
|
+
<TimelineSeparator>
|
|
899
|
+
<TimelineDot color='primary' />
|
|
900
|
+
<TimelineConnector />
|
|
901
|
+
</TimelineSeparator>
|
|
902
|
+
<TimelineContent>
|
|
903
|
+
<Typography variant='body2'>Event description</Typography>
|
|
904
|
+
<Typography variant='caption' color='text.secondary'>2 hours ago</Typography>
|
|
905
|
+
</TimelineContent>
|
|
906
|
+
</TimelineItem>
|
|
907
|
+
</Timeline>
|
|
908
|
+
```
|
|
909
|
+
|
|
910
|
+
**Timeline Props**: `position` (`'alternate'` | `'right'` | `'left'`)
|
|
911
|
+
**TimelineDot Props**: `color`, `variant` (`'filled'` | `'outlined'`)
|
|
912
|
+
|
|
913
|
+
---
|
|
914
|
+
|
|
915
|
+
## Card Statistics Components
|
|
916
|
+
|
|
917
|
+
Pre-built statistic cards in `src/components/card-statistics/`:
|
|
918
|
+
|
|
919
|
+
| Component | Props | Use Case |
|
|
920
|
+
|-----------|-------|----------|
|
|
921
|
+
| `CardStatsSquare` | `title`, `stats`, `avatarIcon`, `avatarColor`, `avatarSkin` | Square stat with icon avatar |
|
|
922
|
+
| `Horizontal` | `title`, `stats`, `avatarIcon`, `avatarColor`, `subtitle` | Horizontal stat card |
|
|
923
|
+
| `HorizontalWithAvatar` | `title`, `stats`, `avatarImg`, `avatarColor` | Horizontal with image avatar |
|
|
924
|
+
| `HorizontalWithSubtitle` | `title`, `stats`, `subtitle`, `avatarIcon`, `avatarColor`, `trend` | With trend indicator |
|
|
925
|
+
| `Vertical` | `title`, `stats`, `avatarIcon`, `avatarColor`, `chipText`, `chipType`, `trendNumber` | Vertical with trend chip |
|
|
926
|
+
| `HorizontalWithBorder` | `title`, `stats`, `avatarIcon`, `avatarColor` | Horizontal with border accent |
|
|
927
|
+
| `CardStatPie` | `title`, `stats`, `chartData`, `color` | With pie chart |
|
|
928
|
+
| `CardStatsWithAreaChart` | `title`, `stats`, `chartData`, `color` | With area chart |
|
|
929
|
+
| `CustomerStats` | `title`, `stats`, `chipText`, `chipType`, `trendDirection`, `avatarIcon`, `avatarColor` | Customer-focused stat |
|
|
930
|
+
|
|
931
|
+
```tsx
|
|
932
|
+
import CardStatsVertical from '@components/card-statistics/Vertical'
|
|
933
|
+
|
|
934
|
+
<CardStatsVertical
|
|
935
|
+
title='Revenue'
|
|
936
|
+
stats='$42.5K'
|
|
937
|
+
chipText='+12.5%'
|
|
938
|
+
chipType='success'
|
|
939
|
+
avatarIcon='tabler-currency-dollar'
|
|
940
|
+
avatarColor='primary'
|
|
941
|
+
/>
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
---
|
|
945
|
+
|
|
946
|
+
## Option Menu Component (`@core/components/option-menu`)
|
|
947
|
+
|
|
948
|
+
Dropdown menu for card headers/actions.
|
|
949
|
+
|
|
950
|
+
```tsx
|
|
951
|
+
import OptionMenu from '@core/components/option-menu'
|
|
952
|
+
|
|
953
|
+
<OptionMenu
|
|
954
|
+
iconClassName='tabler-dots-vertical'
|
|
955
|
+
options={[
|
|
956
|
+
{ text: 'Refresh', icon: 'tabler-refresh', onClick: handleRefresh },
|
|
957
|
+
{ text: 'Edit', icon: 'tabler-pencil', href: '/edit' },
|
|
958
|
+
{ divider: true },
|
|
959
|
+
{ text: 'Delete', icon: 'tabler-trash', onClick: handleDelete }
|
|
960
|
+
]}
|
|
961
|
+
/>
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
**Options Array Item Format**:
|
|
965
|
+
- `{ text: string, icon?: string, onClick?: fn, href?: string }` — menu item
|
|
966
|
+
- `{ divider: true }` — divider separator
|
|
967
|
+
|
|
968
|
+
---
|
|
969
|
+
|
|
970
|
+
## Icon System
|
|
971
|
+
|
|
972
|
+
This project uses **Tabler Icons** via Iconify. Icons are referenced by class name:
|
|
973
|
+
|
|
974
|
+
```tsx
|
|
975
|
+
<i className='tabler-icon-name' />
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
Common icons: `tabler-plus`, `tabler-pencil`, `tabler-trash`, `tabler-eye`, `tabler-eye-off`, `tabler-dots-vertical`, `tabler-check`, `tabler-x`, `tabler-arrow-left`, `tabler-arrow-right`, `tabler-arrow-up`, `tabler-user`, `tabler-mail`, `tabler-calendar`, `tabler-search`, `tabler-settings`, `tabler-bell`, `tabler-menu`, `tabler-layout-grid`, `tabler-layout-list`
|
|
979
|
+
|
|
980
|
+
For MUI `IconButton` children or `startIcon`/`endIcon` on Buttons, use `<i className='...' />` or `<Icon />` from `@iconify/react`.
|
|
981
|
+
|
|
982
|
+
---
|
|
983
|
+
|
|
984
|
+
## Theme Utilities
|
|
985
|
+
|
|
986
|
+
### styled() — For Custom Components
|
|
987
|
+
|
|
988
|
+
```tsx
|
|
989
|
+
'use client'
|
|
990
|
+
import { styled } from '@mui/material/styles'
|
|
991
|
+
import Card from '@mui/material/Card'
|
|
992
|
+
|
|
993
|
+
const StyledCard = styled(Card)(({ theme }) => ({
|
|
994
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
995
|
+
'&:hover': {
|
|
996
|
+
boxShadow: theme.shadows[6]
|
|
997
|
+
}
|
|
998
|
+
}))
|
|
999
|
+
```
|
|
1000
|
+
|
|
1001
|
+
### useTheme Hook
|
|
1002
|
+
|
|
1003
|
+
```tsx
|
|
1004
|
+
import { useTheme } from '@mui/material/styles'
|
|
1005
|
+
const theme = useTheme()
|
|
1006
|
+
// theme.palette.primary.main, theme.spacing(2), theme.typography.h4, theme.breakpoints.up('md')
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
### useMediaQuery Hook
|
|
1010
|
+
|
|
1011
|
+
```tsx
|
|
1012
|
+
import useMediaQuery from '@mui/material/useMediaQuery'
|
|
1013
|
+
import { useTheme } from '@mui/material/styles'
|
|
1014
|
+
|
|
1015
|
+
const theme = useTheme()
|
|
1016
|
+
const isMobile = useMediaQuery(theme.breakpoints.down('sm'))
|
|
1017
|
+
```
|
|
1018
|
+
|
|
1019
|
+
### useColorScheme Hook
|
|
1020
|
+
|
|
1021
|
+
```tsx
|
|
1022
|
+
import { useColorScheme } from '@mui/material'
|
|
1023
|
+
const { mode, setMode } = useColorScheme()
|
|
1024
|
+
```
|
|
1025
|
+
|
|
1026
|
+
---
|
|
1027
|
+
|
|
1028
|
+
## Common MUI Utility Values
|
|
1029
|
+
|
|
1030
|
+
### Spacing
|
|
1031
|
+
`theme.spacing(1)` = `8px`, `theme.spacing(2)` = `16px`, `theme.spacing(3)` = `24px`, etc.
|
|
1032
|
+
|
|
1033
|
+
### Breakpoints
|
|
1034
|
+
`xs: 0`, `sm: 600`, `md: 900`, `lg: 1200`, `xl: 1536`
|
|
1035
|
+
|
|
1036
|
+
For Grid sizes use `Grid size={{ xs: 12, md: 6 }}`
|