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.
Files changed (106) hide show
  1. package/.agent/INSTRUCTIONS.md +82 -0
  2. package/.agent/README.md +483 -0
  3. package/.agent/backend/skills/architect/SKILL.md +436 -0
  4. package/.agent/backend/skills/auth-and-permissions/SKILL.md +168 -0
  5. package/.agent/backend/skills/brainstorm/SKILL.md +127 -0
  6. package/.agent/backend/skills/code-reviewer/SKILL.md +324 -0
  7. package/.agent/backend/skills/create-blueprint/SKILL.md +650 -0
  8. package/.agent/backend/skills/debug-issue/SKILL.md +53 -0
  9. package/.agent/backend/skills/explore-codebase/SKILL.md +45 -0
  10. package/.agent/backend/skills/quick-execute/SKILL.md +99 -0
  11. package/.agent/backend/skills/refactor-safely/SKILL.md +46 -0
  12. package/.agent/backend/skills/security-assessment/SKILL.md +174 -0
  13. package/.agent/backend/workflows/module-runner.claude.md +226 -0
  14. package/.agent/backend/workflows/module-runner.codex.md +155 -0
  15. package/.agent/backend/workflows/module-runner.cursor.md +212 -0
  16. package/.agent/frontend/skills/architect/SKILL.md +644 -0
  17. package/.agent/frontend/skills/auth-and-permissions/SKILL.md +43 -0
  18. package/.agent/frontend/skills/create-blueprint/SKILL.md +635 -0
  19. package/.agent/frontend/skills/debug-issue/SKILL.md +28 -0
  20. package/.agent/frontend/skills/explore-codebase/SKILL.md +29 -0
  21. package/.agent/frontend/skills/feature-workflow/SKILL.md +61 -0
  22. package/.agent/frontend/skills/react-quality-review/SKILL.md +126 -0
  23. package/.agent/frontend/skills/react-quality-review/examples.md +24 -0
  24. package/.agent/frontend/skills/react-quality-review/rules/_sections.md +26 -0
  25. package/.agent/frontend/skills/react-quality-review/rules/_template.md +28 -0
  26. package/.agent/frontend/skills/react-quality-review/rules/advanced-event-handler-refs.md +55 -0
  27. package/.agent/frontend/skills/react-quality-review/rules/advanced-init-once.md +42 -0
  28. package/.agent/frontend/skills/react-quality-review/rules/react-rules-calling.md +66 -0
  29. package/.agent/frontend/skills/react-quality-review/rules/react-rules-hooks.md +91 -0
  30. package/.agent/frontend/skills/react-quality-review/rules/react-rules-purity.md +121 -0
  31. package/.agent/frontend/skills/react-quality-review/rules/rendering-activity.md +26 -0
  32. package/.agent/frontend/skills/react-quality-review/rules/rendering-conditional-render.md +40 -0
  33. package/.agent/frontend/skills/react-quality-review/rules/rendering-content-visibility.md +38 -0
  34. package/.agent/frontend/skills/react-quality-review/rules/rendering-hoist-jsx.md +46 -0
  35. package/.agent/frontend/skills/react-quality-review/rules/rendering-usetransition-loading.md +75 -0
  36. package/.agent/frontend/skills/react-quality-review/rules/rerender-defer-reads.md +39 -0
  37. package/.agent/frontend/skills/react-quality-review/rules/rerender-dependencies.md +45 -0
  38. package/.agent/frontend/skills/react-quality-review/rules/rerender-derived-state-no-effect.md +40 -0
  39. package/.agent/frontend/skills/react-quality-review/rules/rerender-derived-state.md +29 -0
  40. package/.agent/frontend/skills/react-quality-review/rules/rerender-functional-setstate.md +74 -0
  41. package/.agent/frontend/skills/react-quality-review/rules/rerender-lazy-state-init.md +58 -0
  42. package/.agent/frontend/skills/react-quality-review/rules/rerender-memo-with-default-value.md +38 -0
  43. package/.agent/frontend/skills/react-quality-review/rules/rerender-memo.md +44 -0
  44. package/.agent/frontend/skills/react-quality-review/rules/rerender-move-effect-to-event.md +45 -0
  45. package/.agent/frontend/skills/react-quality-review/rules/rerender-no-inline-components.md +82 -0
  46. package/.agent/frontend/skills/react-quality-review/rules/rerender-simple-expression-in-memo.md +35 -0
  47. package/.agent/frontend/skills/react-quality-review/rules/rerender-transitions.md +40 -0
  48. package/.agent/frontend/skills/react-quality-review/rules/rerender-use-ref-transient-values.md +73 -0
  49. package/.agent/frontend/skills/refactor-safely/SKILL.md +29 -0
  50. package/.agent/frontend/skills/vuexy-component-guide/SKILL.md +369 -0
  51. package/.agent/frontend/skills/vuexy-component-guide/examples.md +662 -0
  52. package/.agent/frontend/skills/vuexy-component-guide/reference.md +1036 -0
  53. package/.agent/frontend/workflows/build-feature-react.workflow.md +82 -0
  54. package/.agent/frontend/workflows/feature-module-runner.md +101 -0
  55. package/.agent/monolith/skills/architect/SKILL.md +648 -0
  56. package/.agent/monolith/skills/auth-and-permissions/SKILL.md +43 -0
  57. package/.agent/monolith/skills/code-reviewer/SKILL.md +281 -0
  58. package/.agent/monolith/skills/create-blueprint/SKILL.md +635 -0
  59. package/.agent/monolith/skills/debug-issue/SKILL.md +28 -0
  60. package/.agent/monolith/skills/explore-codebase/SKILL.md +29 -0
  61. package/.agent/monolith/skills/feature-workflow/SKILL.md +61 -0
  62. package/.agent/monolith/skills/react-quality-review/SKILL.md +126 -0
  63. package/.agent/monolith/skills/react-quality-review/examples.md +24 -0
  64. package/.agent/monolith/skills/react-quality-review/rules/_sections.md +26 -0
  65. package/.agent/monolith/skills/react-quality-review/rules/_template.md +28 -0
  66. package/.agent/monolith/skills/react-quality-review/rules/advanced-event-handler-refs.md +55 -0
  67. package/.agent/monolith/skills/react-quality-review/rules/advanced-init-once.md +42 -0
  68. package/.agent/monolith/skills/react-quality-review/rules/react-rules-calling.md +66 -0
  69. package/.agent/monolith/skills/react-quality-review/rules/react-rules-hooks.md +91 -0
  70. package/.agent/monolith/skills/react-quality-review/rules/react-rules-purity.md +121 -0
  71. package/.agent/monolith/skills/react-quality-review/rules/rendering-activity.md +26 -0
  72. package/.agent/monolith/skills/react-quality-review/rules/rendering-conditional-render.md +40 -0
  73. package/.agent/monolith/skills/react-quality-review/rules/rendering-content-visibility.md +38 -0
  74. package/.agent/monolith/skills/react-quality-review/rules/rendering-hoist-jsx.md +46 -0
  75. package/.agent/monolith/skills/react-quality-review/rules/rendering-usetransition-loading.md +75 -0
  76. package/.agent/monolith/skills/react-quality-review/rules/rerender-defer-reads.md +39 -0
  77. package/.agent/monolith/skills/react-quality-review/rules/rerender-dependencies.md +45 -0
  78. package/.agent/monolith/skills/react-quality-review/rules/rerender-derived-state-no-effect.md +40 -0
  79. package/.agent/monolith/skills/react-quality-review/rules/rerender-derived-state.md +29 -0
  80. package/.agent/monolith/skills/react-quality-review/rules/rerender-functional-setstate.md +74 -0
  81. package/.agent/monolith/skills/react-quality-review/rules/rerender-lazy-state-init.md +58 -0
  82. package/.agent/monolith/skills/react-quality-review/rules/rerender-memo-with-default-value.md +38 -0
  83. package/.agent/monolith/skills/react-quality-review/rules/rerender-memo.md +44 -0
  84. package/.agent/monolith/skills/react-quality-review/rules/rerender-move-effect-to-event.md +45 -0
  85. package/.agent/monolith/skills/react-quality-review/rules/rerender-no-inline-components.md +82 -0
  86. package/.agent/monolith/skills/react-quality-review/rules/rerender-simple-expression-in-memo.md +35 -0
  87. package/.agent/monolith/skills/react-quality-review/rules/rerender-transitions.md +40 -0
  88. package/.agent/monolith/skills/react-quality-review/rules/rerender-use-ref-transient-values.md +73 -0
  89. package/.agent/monolith/skills/refactor-safely/SKILL.md +29 -0
  90. package/.agent/monolith/skills/vuexy-component-guide/SKILL.md +369 -0
  91. package/.agent/monolith/skills/vuexy-component-guide/examples.md +662 -0
  92. package/.agent/monolith/skills/vuexy-component-guide/reference.md +1036 -0
  93. package/.agent/monolith/workflows/add-new-api-feature-module.md +63 -0
  94. package/.agent/monolith/workflows/backend-quality-review.md +27 -0
  95. package/.agent/monolith/workflows/build-feature-backend.workflow.md +91 -0
  96. package/.agent/monolith/workflows/build-feature-react.workflow.md +82 -0
  97. package/.agent/monolith/workflows/feature-module-runner.md +97 -0
  98. package/.agent/templates/FEATURE_PLAN.md +42 -0
  99. package/.agent/templates/MODULE.md +45 -0
  100. package/.agent/templates/REVIEW_REPORT.md +44 -0
  101. package/.agent/templates/SECURITY_REPORT.md +70 -0
  102. package/.agent/templates/TEST_PLAN.md +49 -0
  103. package/README.md +131 -0
  104. package/package.json +42 -0
  105. package/scripts/setup-rules.js +224 -0
  106. 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 }}`