@matteoaliano/forest-ui 0.6.0 → 0.7.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/package.json +1 -1
- package/skills/forest-alkemy-plus/SKILL.md +2 -2
- package/skills/forest-alkemy-plus/references/upgrading.md +137 -0
- package/skills/forest-agency/SKILL.md +0 -94
- package/skills/forest-agency/references/components.md +0 -202
- package/skills/forest-agency/references/patterns.md +0 -405
- package/skills/forest-external/SKILL.md +0 -94
- package/skills/forest-external/references/components.md +0 -202
- package/skills/forest-external/references/patterns.md +0 -405
- package/skills/forest-internal/SKILL.md +0 -94
- package/skills/forest-internal/references/components.md +0 -202
- package/skills/forest-internal/references/patterns.md +0 -405
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@ name: forest-alkemy-plus
|
|
|
3
3
|
description: Forest UI Design System rules for the Alkemy+ (charcoal/red) preset. Enforces correct imports, component usage, and theming with @matteoaliano/forest-ui. Use when the project uses forest-ui, forest-alkemy-plus preset, or when user builds UI components in a forest-ui project. Triggers on "forest", "forest-ui", "forest alkemy", "forest alkemy+", "@matteoaliano/forest-ui".
|
|
4
4
|
metadata:
|
|
5
5
|
author: Forest Design System
|
|
6
|
-
version: 0.
|
|
6
|
+
version: 0.7.0
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Forest UI — Alkemy+ Preset
|
|
@@ -75,7 +75,7 @@ import "@matteoaliano/forest-ui/fonts/alkemy-beta/alkemy-beta.css";
|
|
|
75
75
|
|
|
76
76
|
**Charts:** BarChart, LineChart, PieChart, ScatterChart, Gauge, SparkLineChart, useChartColors, plus composition primitives (see components.md)
|
|
77
77
|
|
|
78
|
-
See `references/components.md` for full API details
|
|
78
|
+
See `references/components.md` for full API details, `references/patterns.md` for code examples, and `references/upgrading.md` for update / re-sync guidance.
|
|
79
79
|
|
|
80
80
|
## Tooltip vs Popover
|
|
81
81
|
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Forest UI — Upgrading
|
|
2
|
+
|
|
3
|
+
How to keep `@matteoaliano/forest-ui` and its peer dependencies up to date.
|
|
4
|
+
|
|
5
|
+
## TL;DR
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm update @matteoaliano/forest-ui # bump within the semver range
|
|
9
|
+
npx @matteoaliano/forest-ui # re-sync the Claude Code skill
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
That's it for routine minor/patch updates. For majors, read the changelog first.
|
|
13
|
+
|
|
14
|
+
## Check the installed version
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm list @matteoaliano/forest-ui
|
|
18
|
+
# → @matteoaliano/forest-ui@0.6.0
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Or read it directly from `package.json`.
|
|
22
|
+
|
|
23
|
+
## See available versions
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm view @matteoaliano/forest-ui versions --json | tail
|
|
27
|
+
npm view @matteoaliano/forest-ui version # latest
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Upgrade within the current semver range (minor / patch)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm update @matteoaliano/forest-ui
|
|
34
|
+
# pnpm update @matteoaliano/forest-ui
|
|
35
|
+
# yarn upgrade @matteoaliano/forest-ui
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This respects the `^` or `~` range in `package.json` and will **not** cross a major boundary.
|
|
39
|
+
|
|
40
|
+
## Upgrade across a major (e.g. 0.x → 1.0)
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install @matteoaliano/forest-ui@latest
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Before running**, check the changelog for:
|
|
47
|
+
|
|
48
|
+
- Removed / renamed components
|
|
49
|
+
- Prop name changes
|
|
50
|
+
- Changed default variants (e.g. Button defaults)
|
|
51
|
+
- Theme token renames
|
|
52
|
+
- Peer-dependency bumps (MUI, Emotion)
|
|
53
|
+
|
|
54
|
+
Commit your lockfile before upgrading so a rollback is one `git checkout` away.
|
|
55
|
+
|
|
56
|
+
## Re-sync the Claude Code skill
|
|
57
|
+
|
|
58
|
+
The skill ships **inside** the package and evolves with it. After every upgrade:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx @matteoaliano/forest-ui
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This refreshes `.claude/skills/forest-alkemy-plus/` with the latest component list, prop signatures, and patterns. **Skipping this step means Claude is working from stale rules** — it may recommend components that no longer exist or miss new ones.
|
|
65
|
+
|
|
66
|
+
Automate it by wiring `postinstall`:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"scripts": {
|
|
71
|
+
"postinstall": "forest-ui"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Commit `.claude/skills/` so every teammate (and CI) gets the same snapshot.
|
|
77
|
+
|
|
78
|
+
## Peer dependencies
|
|
79
|
+
|
|
80
|
+
Forest UI has multiple peer deps — keep them aligned with the major the package was built against:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npm install @matteoaliano/forest-ui@latest \
|
|
84
|
+
@mui/material @mui/x-data-grid @mui/x-date-pickers @mui/x-charts \
|
|
85
|
+
@emotion/react @emotion/styled dayjs
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
If you see `UNMET PEER DEPENDENCY` warnings after an upgrade, the package expects a newer MUI / Emotion — bump them together, not individually. Running two different MUI majors in the same app breaks theming silently.
|
|
89
|
+
|
|
90
|
+
Check what's required:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm view @matteoaliano/forest-ui peerDependencies
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Verify the upgrade
|
|
97
|
+
|
|
98
|
+
Quick checklist after bumping:
|
|
99
|
+
|
|
100
|
+
- [ ] App builds (`npm run build` / `next build`)
|
|
101
|
+
- [ ] No TypeScript errors on component props you use
|
|
102
|
+
- [ ] No runtime console errors about missing theme tokens
|
|
103
|
+
- [ ] `<ForestProvider>` still wraps the app root
|
|
104
|
+
- [ ] Fonts still render (Aeonik / Aeonik Mono / Alkemy BETA)
|
|
105
|
+
- [ ] Visual spot-check on one page per preset in use
|
|
106
|
+
- [ ] `.claude/skills/forest-alkemy-plus/SKILL.md` `version` frontmatter matches the new package version
|
|
107
|
+
|
|
108
|
+
## Rollback
|
|
109
|
+
|
|
110
|
+
If something breaks and you need to revert:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
git checkout -- package.json package-lock.json
|
|
114
|
+
npm install
|
|
115
|
+
npx @matteoaliano/forest-ui # re-sync to restore older skill
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Or pin to a known-good version explicitly:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
npm install @matteoaliano/forest-ui@0.5.2
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## When a breaking change affects your code
|
|
125
|
+
|
|
126
|
+
1. **Read the error at face value.** MUI-layer errors usually point to the renamed prop or component.
|
|
127
|
+
2. **Search the synced skill's `components.md`** — it's the authoritative component list for the installed version.
|
|
128
|
+
3. **Don't shim.** Don't wrap deprecated components in custom adapters; update callsites directly. Shims accumulate and block the next upgrade.
|
|
129
|
+
4. **If a component was removed**, the skill's `components.md` won't list it anymore — search the forest-ui CHANGELOG or the repo's Storybook for the replacement.
|
|
130
|
+
|
|
131
|
+
## Never do this on upgrade
|
|
132
|
+
|
|
133
|
+
- Don't skip `npx @matteoaliano/forest-ui` — stale skills are worse than no skills
|
|
134
|
+
- Don't upgrade MUI separately from forest-ui — they're paired
|
|
135
|
+
- Don't mix two forest-ui majors in a monorepo without a shared hoist
|
|
136
|
+
- Don't suppress peer-dep warnings — they're the early signal for theme breakage
|
|
137
|
+
- Don't commit `package.json` without `package-lock.json` — reproducibility breaks
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: forest-agency
|
|
3
|
-
description: Forest UI Design System rules for the Agency (charcoal/red) preset. Enforces correct imports, component usage, and theming with @matteoaliano/forest-ui. Use when the project uses forest-ui, forest-agency preset, or when user builds UI components in a forest-ui project. Triggers on "forest", "forest-ui", "forest agency", "@matteoaliano/forest-ui".
|
|
4
|
-
metadata:
|
|
5
|
-
author: Forest Design System
|
|
6
|
-
version: 0.5.2
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Forest UI — Agency Preset
|
|
10
|
-
|
|
11
|
-
## Golden Rules
|
|
12
|
-
|
|
13
|
-
1. **NEVER import from `@mui/material` directly.** Always import from `@matteoaliano/forest-ui`. All MUI components, layout primitives, transitions, form helpers, and hooks are re-exported. The only exception is `@mui/icons-material` — import icons from there directly.
|
|
14
|
-
2. **ALWAYS wrap your app root with `<ForestProvider>`** — it applies the theme and CSS baseline.
|
|
15
|
-
3. **NEVER use inline colors or spacing values.** Use design tokens or MUI's `sx` prop with theme values (`p: 4`, `backgroundColor: "primary.main"`).
|
|
16
|
-
4. **NEVER create custom component wrappers** for things Forest UI already provides.
|
|
17
|
-
5. **TypeScript is required.** All components export their prop types (e.g. `type ButtonProps`).
|
|
18
|
-
6. **ALWAYS use the Outlined variant of MUI icons.** Import from `@mui/icons-material/*Outlined` (e.g. `CloseOutlined`, `MailOutlined`). Never use filled, Rounded, Sharp, or TwoTone variants.
|
|
19
|
-
|
|
20
|
-
## Setup
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npm install @matteoaliano/forest-ui @mui/material @mui/x-data-grid @mui/x-date-pickers @mui/x-charts dayjs @emotion/react @emotion/styled
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
> **Note:** `@mui/material`, `@mui/x-data-grid`, `@mui/x-date-pickers`, and `@mui/x-charts` are **peer dependencies** — install them but **always import from `@matteoaliano/forest-ui`**, not from these packages directly. Forest UI re-exports everything.
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
import { ForestProvider } from "@matteoaliano/forest-ui";
|
|
30
|
-
|
|
31
|
-
function App() {
|
|
32
|
-
return (
|
|
33
|
-
<ForestProvider preset="forest-agency">
|
|
34
|
-
{/* All app content here */}
|
|
35
|
-
</ForestProvider>
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Typography & Fonts
|
|
41
|
-
|
|
42
|
-
- **Aeonik** — the default font for all UI text (headings, body, labels, buttons, etc.)
|
|
43
|
-
- **Aeonik Mono** — use for numeric values: prices, stats, table figures, counters, dates, IDs, code snippets
|
|
44
|
-
- **Alkemy Beta** — use for page titles (h1/hero headings). Not for general UI text
|
|
45
|
-
|
|
46
|
-
Import the font CSS files you need in your app entry point:
|
|
47
|
-
|
|
48
|
-
```tsx
|
|
49
|
-
import "@matteoaliano/forest-ui/fonts/aeonik/aeonik.css";
|
|
50
|
-
import "@matteoaliano/forest-ui/fonts/aeonik-mono/aeonik-mono.css";
|
|
51
|
-
import "@matteoaliano/forest-ui/fonts/alkemy-beta/alkemy-beta.css";
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Available Components
|
|
55
|
-
|
|
56
|
-
**Inputs:** Button, ButtonGroup, TextField, Select + MenuItem, MultiSelect, Checkbox, RadioGroup + Radio, Switch, ToggleButton + ToggleButtonGroup, Fab, IconButton, Autocomplete, Search, DatePicker, Input
|
|
57
|
-
|
|
58
|
-
**Data Display:** Badge, Chip, Divider, Typography, Tooltip, Logo, Table family (Table, TableHead, TableBody, TableRow, TableCell, TableContainer, TableFooter, TablePagination, TableSortLabel), DataGrid + GridColDef, List family (List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListItemAvatar, ListItemSecondaryAction, ListSubheader), Avatar + AvatarGroup, ImageList + ImageListItem + ImageListItemBar, Rating
|
|
59
|
-
|
|
60
|
-
**Surfaces:** Accordion family, AppBar + Toolbar + AppBarNavItem, Card family + CardActionArea, Paper, Drawer + SwipeableDrawer
|
|
61
|
-
|
|
62
|
-
**Feedback:** Alert + AlertTitle, Dialog family, Backdrop, LinearProgress, CircularProgress, Skeleton, Modal, Popover, Snackbar + SnackbarContent, Slider
|
|
63
|
-
|
|
64
|
-
**Navigation:** Breadcrumbs, Link, Menu + MenuList, Pagination + PaginationItem, Stepper family (Stepper, Step, StepLabel, StepButton, StepConnector, StepContent, StepIcon), Tabs + Tab + TabScrollButton, SidebarNav + SidebarItem + useSidebar, BottomNavigation + BottomNavigationAction, SpeedDial + SpeedDialAction + SpeedDialIcon, MobileStepper
|
|
65
|
-
|
|
66
|
-
**Layout:** Box, Stack, Grid, Container
|
|
67
|
-
|
|
68
|
-
**Form Helpers:** FormControl, FormControlLabel, FormGroup, FormHelperText, FormLabel, InputAdornment, InputBase, InputLabel, OutlinedInput, FilledInput
|
|
69
|
-
|
|
70
|
-
**Transitions:** Collapse, Fade, Grow, Slide, Zoom
|
|
71
|
-
|
|
72
|
-
**Utilities:** ClickAwayListener, NoSsr, Portal, Popper, TextareaAutosize, SvgIcon, ButtonBase, GlobalStyles
|
|
73
|
-
|
|
74
|
-
**Hooks:** useMediaQuery, useScrollTrigger, useFormControl, useTheme
|
|
75
|
-
|
|
76
|
-
**Charts:** BarChart, LineChart, PieChart, ScatterChart, Gauge, SparkLineChart, useChartColors, plus composition primitives (see components.md)
|
|
77
|
-
|
|
78
|
-
See `references/components.md` for full API details and `references/patterns.md` for code examples.
|
|
79
|
-
|
|
80
|
-
## Tooltip vs Popover
|
|
81
|
-
|
|
82
|
-
- **Tooltip** — Use for **text-only hints**. The Tooltip has a dark (black) background and is meant for short, plain-text labels or descriptions. Do not nest rich content inside a Tooltip.
|
|
83
|
-
- **Popover** — Use when you need to display **rich or interactive content** such as Chips, lists, buttons, or any nested components. Popover renders in a neutral surface container that supports arbitrary children.
|
|
84
|
-
|
|
85
|
-
**Rule of thumb:** If the overlay content is just a string, use `<Tooltip>`. If it contains components, use `<Popover>`.
|
|
86
|
-
|
|
87
|
-
## Common Anti-Patterns
|
|
88
|
-
|
|
89
|
-
1. **Importing from `@mui/material`** instead of `@matteoaliano/forest-ui` — all components, hooks, and layout primitives are available from forest-ui
|
|
90
|
-
2. **Hardcoded color values** (`backgroundColor: "#7f56d9"`) instead of theme tokens (`backgroundColor: "primary.main"`)
|
|
91
|
-
3. **Hardcoded spacing** (`padding: "16px"`) instead of theme spacing (`p: 4`)
|
|
92
|
-
4. **Missing `<ForestProvider>`** at the app root — theme won't apply
|
|
93
|
-
5. **Using filled MUI icons** (`Close`) instead of Outlined (`CloseOutlined`)
|
|
94
|
-
6. **Building custom multi-select** instead of using the `<MultiSelect>` component
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
# Forest UI — Component Reference
|
|
2
|
-
|
|
3
|
-
> Full API reference for all components exported by `@matteoaliano/forest-ui`.
|
|
4
|
-
|
|
5
|
-
## Import Pattern
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
// CORRECT — import from forest-ui
|
|
9
|
-
import { Button, TextField, Alert } from "@matteoaliano/forest-ui";
|
|
10
|
-
|
|
11
|
-
// WRONG — never import from @mui/material
|
|
12
|
-
import Button from "@mui/material/Button";
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
> **All MUI components are re-exported.** Never import from `@mui/material` — always use `@matteoaliano/forest-ui`. The only exception is `@mui/icons-material` for icons.
|
|
16
|
-
|
|
17
|
-
## Layout
|
|
18
|
-
|
|
19
|
-
| Component | Import | Key Props |
|
|
20
|
-
|-----------|--------|-----------|
|
|
21
|
-
| `Box` | `import { Box } from "@matteoaliano/forest-ui"` | `sx`, `component`, all HTML attributes |
|
|
22
|
-
| `Stack` | `import { Stack } from "@matteoaliano/forest-ui"` | `direction`, `spacing`, `divider`, `alignItems`, `justifyContent` |
|
|
23
|
-
| `Grid` | `import { Grid } from "@matteoaliano/forest-ui"` | `container`, `size`, `spacing`, `offset`, `columns`, `direction` |
|
|
24
|
-
| `Container` | `import { Container } from "@matteoaliano/forest-ui"` | `maxWidth: "xs" \| "sm" \| "md" \| "lg" \| "xl" \| false`, `fixed`, `disableGutters` |
|
|
25
|
-
|
|
26
|
-
## Form Helpers
|
|
27
|
-
|
|
28
|
-
| Component | Import | Key Props |
|
|
29
|
-
|-----------|--------|-----------|
|
|
30
|
-
| `FormControl` | `import { FormControl } from "@matteoaliano/forest-ui"` | `variant`, `fullWidth`, `error`, `disabled`, `required`, `size` |
|
|
31
|
-
| `FormControlLabel` | `import { FormControlLabel } from "@matteoaliano/forest-ui"` | `control` (required), `label`, `labelPlacement`, `disabled` |
|
|
32
|
-
| `FormGroup` | `import { FormGroup } from "@matteoaliano/forest-ui"` | `row`, `children` |
|
|
33
|
-
| `FormHelperText` | `import { FormHelperText } from "@matteoaliano/forest-ui"` | `error`, `disabled`, `margin` |
|
|
34
|
-
| `FormLabel` | `import { FormLabel } from "@matteoaliano/forest-ui"` | `error`, `focused`, `required`, `disabled`, `color` |
|
|
35
|
-
| `InputAdornment` | `import { InputAdornment } from "@matteoaliano/forest-ui"` | `position: "start" \| "end"`, `variant`, `disablePointerEvents` |
|
|
36
|
-
| `InputBase` | `import { InputBase } from "@matteoaliano/forest-ui"` | `value`, `onChange`, `placeholder`, `multiline`, `rows`, `startAdornment`, `endAdornment` |
|
|
37
|
-
| `InputLabel` | `import { InputLabel } from "@matteoaliano/forest-ui"` | `shrink`, `variant`, `error`, `required`, `disabled` |
|
|
38
|
-
| `OutlinedInput` | `import { OutlinedInput } from "@matteoaliano/forest-ui"` | `label`, `notched`, all InputBase props |
|
|
39
|
-
| `FilledInput` | `import { FilledInput } from "@matteoaliano/forest-ui"` | All InputBase props |
|
|
40
|
-
|
|
41
|
-
## Inputs
|
|
42
|
-
|
|
43
|
-
| Component | Import | Variants / Key Props | Default Props |
|
|
44
|
-
|-----------|--------|----------------------|---------------|
|
|
45
|
-
| `Button` | `import { Button } from "@matteoaliano/forest-ui"` | `variant: "contained" \| "outlined" \| "text"`, `color`, `size: "small" \| "medium" \| "large"`, `disabled`, `startIcon`, `endIcon`, `fullWidth`, `href` | `variant="contained"` |
|
|
46
|
-
| `ButtonGroup` | `import { ButtonGroup } from "@matteoaliano/forest-ui"` | `variant: "contained" \| "outlined" \| "text"`, `size: "small" \| "medium" \| "large"`, `orientation: "horizontal" \| "vertical"`, `color`, `disabled`, `fullWidth` | `variant="contained"` |
|
|
47
|
-
| `TextField` | `import { TextField } from "@matteoaliano/forest-ui"` | `variant: "outlined" \| "filled" \| "standard"`, `size: "small" \| "medium"`, `label`, `error`, `helperText`, `fullWidth`, `multiline`, `rows`, `type`, `placeholder`, `required`, `disabled` | — |
|
|
48
|
-
| `Select` + `MenuItem` | `import { Select, MenuItem } from "@matteoaliano/forest-ui"` | `variant: "outlined" \| "filled" \| "standard"`, `size: "small" \| "medium"`, `multiple`, `displayEmpty`, `label`, `labelId`, `renderValue`, `native`, `error`, `disabled` | — |
|
|
49
|
-
| `MultiSelect` | `import { MultiSelect } from "@matteoaliano/forest-ui"` | `options: { label, value }[]`, `value: string[]`, `onChange: (values) => void`, `selectAll: boolean`, `selectAllLabel: string`, `label` + all SelectProps | `selectAll={true}`, `selectAllLabel="Select All"` |
|
|
50
|
-
| `Checkbox` | `import { Checkbox } from "@matteoaliano/forest-ui"` | `color: "default" \| "primary" \| "secondary" \| "error" \| "info" \| "success" \| "warning"`, `size: "small" \| "medium"`, `checked`, `indeterminate`, `disabled` | — |
|
|
51
|
-
| `RadioGroup` + `Radio` | `import { RadioGroup, Radio } from "@matteoaliano/forest-ui"` | `row`, `value`, `onChange`; Radio: `color`, `size: "small" \| "medium" \| "large"`, `disabled` | — |
|
|
52
|
-
| `Switch` | `import { Switch } from "@matteoaliano/forest-ui"` | `color: "default" \| "primary" \| "secondary" \| "error" \| "info" \| "success" \| "warning"`, `size: "small" \| "medium"`, `checked`, `disabled` | — |
|
|
53
|
-
| `ToggleButton` + `ToggleButtonGroup` | `import { ToggleButton, ToggleButtonGroup } from "@matteoaliano/forest-ui"` | `value`, `exclusive`, `onChange`, `orientation: "horizontal" \| "vertical"`, `size: "small" \| "medium" \| "large"`, `color`, `fullWidth` | — |
|
|
54
|
-
| `Fab` | `import { Fab } from "@matteoaliano/forest-ui"` | `variant: "circular" \| "extended"`, `size: "small" \| "medium" \| "large"`, `color`, `disabled`, `href` | `color="primary"` |
|
|
55
|
-
| `IconButton` | `import { IconButton } from "@matteoaliano/forest-ui"` | `color: "inherit" \| "primary" \| "secondary" \| "error" \| "info" \| "success" \| "warning" \| "default"`, `size: "small" \| "medium" \| "large"`, `disabled`, `disableRipple` | — |
|
|
56
|
-
| `Autocomplete` | `import { Autocomplete } from "@matteoaliano/forest-ui"` | `options`, `renderInput` (required), `multiple`, `freeSolo`, `disableClearable`, `loading`, `groupBy`, `limitTags`, `filterOptions` | — |
|
|
57
|
-
| `Search` | `import { Search } from "@matteoaliano/forest-ui"` | `onClear`, `placeholder`, all TextField props (except `variant`) | `variant="outlined"`, `placeholder="Search..."`, built-in search icon and clear button |
|
|
58
|
-
| `Input` | `import { Input } from "@matteoaliano/forest-ui"` | `value`, `onChange`, `placeholder`, `multiline`, `rows`, `startAdornment`, `endAdornment`, `disabled`, `error` — all InputBase props | — |
|
|
59
|
-
| `DatePicker` | `import { DatePicker } from "@matteoaliano/forest-ui"` | All MUI X DatePicker props (`value`, `onChange`, `label`, `format`, `minDate`, `maxDate`, `disabled`, `readOnly`) | Wraps with `LocalizationProvider` + `AdapterDayjs` automatically |
|
|
60
|
-
|
|
61
|
-
## Data Display
|
|
62
|
-
|
|
63
|
-
| Component | Import | Variants / Key Props | Default Props |
|
|
64
|
-
|-----------|--------|----------------------|---------------|
|
|
65
|
-
| `Badge` | `import { Badge } from "@matteoaliano/forest-ui"` | `variant: "standard" \| "dot"`, `color`, `badgeContent`, `max`, `invisible`, `showZero`, `overlap: "rectangular" \| "circular"`, `anchorOrigin` | — |
|
|
66
|
-
| `Chip` | `import { Chip } from "@matteoaliano/forest-ui"` | `variant: "filled" \| "outlined"`, `color`, `size: "small" \| "medium"`, `label`, `onDelete`, `clickable`, `avatar`, `icon` | `deleteIcon={<CloseOutlined />}` |
|
|
67
|
-
| `Divider` | `import { Divider } from "@matteoaliano/forest-ui"` | `orientation: "horizontal" \| "vertical"`, `variant: "fullWidth" \| "inset" \| "middle"`, `textAlign`, `flexItem` | — |
|
|
68
|
-
| `Typography` | `import { Typography } from "@matteoaliano/forest-ui"` | `variant: "h1"-"h6" \| "subtitle1" \| "subtitle2" \| "body1" \| "body2" \| "caption" \| "overline" \| "button"`, `align`, `gutterBottom`, `noWrap` | — |
|
|
69
|
-
| `Tooltip` | `import { Tooltip } from "@matteoaliano/forest-ui"` | `title` (required), `placement` (12 positions), `arrow`, `followCursor`, `enterDelay`, `leaveDelay` | `arrow={true}` |
|
|
70
|
-
| `Avatar` | `import { Avatar } from "@matteoaliano/forest-ui"` | `src`, `alt`, `variant: "circular" \| "rounded" \| "square"`, `sizes`, `children` (fallback) |
|
|
71
|
-
| `AvatarGroup` | `import { AvatarGroup } from "@matteoaliano/forest-ui"` | `max`, `total`, `spacing`, `variant` |
|
|
72
|
-
| `ImageList` | `import { ImageList } from "@matteoaliano/forest-ui"` | `variant: "masonry" \| "quilted" \| "standard" \| "woven"`, `cols`, `gap`, `rowHeight` |
|
|
73
|
-
| `ImageListItem` | `import { ImageListItem } from "@matteoaliano/forest-ui"` | `cols`, `rows` |
|
|
74
|
-
| `ImageListItemBar` | `import { ImageListItemBar } from "@matteoaliano/forest-ui"` | `title`, `subtitle`, `position`, `actionIcon` |
|
|
75
|
-
| `Logo` | `import { Logo } from "@matteoaliano/forest-ui"` | `product: "wsuite" \| "studio" \| "feedati"`, `variant: "logo" \| "logomark"`, `sx` | `product="wsuite"`, `variant="logo"`, `height={32}` |
|
|
76
|
-
| `Rating` | `import { Rating } from "@matteoaliano/forest-ui"` | `value`, `onChange`, `precision`, `max`, `size`, `readOnly`, `disabled` |
|
|
77
|
-
| `Table` family | `import { Table, TableHead, TableBody, TableRow, TableCell, TableContainer } from "@matteoaliano/forest-ui"` | Table: `size: "small" \| "medium"`, `stickyHeader`; TableCell: `align`, `padding`, `sortDirection`, `variant`; TableRow: `hover`, `selected` | — |
|
|
78
|
-
| `DataGrid` | `import { DataGrid, type GridColDef, type GridRenderCellParams, type GridRowSelectionModel } from "@matteoaliano/forest-ui"` | `rows`, `columns`, `paginationModel`, `sortModel`, `filterModel`, `checkboxSelection`, `loading`, `density`. Types: `GridColDef`, `GridRowsProp`, `GridRowParams`, `GridCellParams`, `GridRenderCellParams`, `GridRowSelectionModel`, `GridSortModel`, `GridFilterModel`, `GridPaginationModel` | — |
|
|
79
|
-
| `List` family | `import { List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListItemAvatar, ListSubheader } from "@matteoaliano/forest-ui"` | `dense`, `disablePadding`; ListItemButton: `selected`, `disabled`; ListItemText: `primary`, `secondary` | — |
|
|
80
|
-
| `TableFooter` | `import { TableFooter } from "@matteoaliano/forest-ui"` | `component`, `children` |
|
|
81
|
-
| `TablePagination` | `import { TablePagination } from "@matteoaliano/forest-ui"` | `count`, `page`, `rowsPerPage`, `onPageChange`, `onRowsPerPageChange` |
|
|
82
|
-
| `TableSortLabel` | `import { TableSortLabel } from "@matteoaliano/forest-ui"` | `active`, `direction: "asc" \| "desc"`, `onClick` |
|
|
83
|
-
| `ListItemSecondaryAction` | `import { ListItemSecondaryAction } from "@matteoaliano/forest-ui"` | `children` |
|
|
84
|
-
| `SnackbarContent` | `import { SnackbarContent } from "@matteoaliano/forest-ui"` | `message`, `action` |
|
|
85
|
-
|
|
86
|
-
## Surfaces
|
|
87
|
-
|
|
88
|
-
| Component | Import | Variants / Key Props | Default Props |
|
|
89
|
-
|-----------|--------|----------------------|---------------|
|
|
90
|
-
| `Accordion` family | `import { Accordion, AccordionSummary, AccordionDetails, AccordionActions } from "@matteoaliano/forest-ui"` | `expanded`, `defaultExpanded`, `onChange`, `disabled`, `disableGutters`, `square` | — |
|
|
91
|
-
| `AppBar` + `Toolbar` | `import { AppBar, Toolbar } from "@matteoaliano/forest-ui"` | `position`, `color`, `elevation`; Toolbar: `variant: "dense" \| "regular"` | — |
|
|
92
|
-
| `AppBarNavItem` | `import { AppBarNavItem } from "@matteoaliano/forest-ui"` | `label` (required), `icon`, `selected`, `href`, `sx` — navigation button for AppBar | — |
|
|
93
|
-
| `Card` family | `import { Card, CardContent, CardHeader, CardActions, CardMedia } from "@matteoaliano/forest-ui"` | `variant: "elevation" \| "outlined"`, `elevation`, `raised`; CardHeader: `title`, `subheader`, `avatar`, `action` | — |
|
|
94
|
-
| `Paper` | `import { Paper } from "@matteoaliano/forest-ui"` | `variant: "elevation" \| "outlined"`, `elevation` (0-24), `square` | — |
|
|
95
|
-
| `CardActionArea` | `import { CardActionArea } from "@matteoaliano/forest-ui"` | `onClick`, `href`, `disabled` |
|
|
96
|
-
| `Drawer` | `import { Drawer } from "@matteoaliano/forest-ui"` | `open`, `onClose`, `anchor: "left" \| "right" \| "top" \| "bottom"`, `variant: "permanent" \| "persistent" \| "temporary"`, `hideBackdrop` | `anchor="right"`, `hideBackdrop={true}` |
|
|
97
|
-
| `SwipeableDrawer` | `import { SwipeableDrawer } from "@matteoaliano/forest-ui"` | `onOpen` (required), `onClose` (required), `open`, `anchor`, `swipeAreaWidth` |
|
|
98
|
-
|
|
99
|
-
## Feedback
|
|
100
|
-
|
|
101
|
-
| Component | Import | Variants / Key Props | Default Props |
|
|
102
|
-
|-----------|--------|----------------------|---------------|
|
|
103
|
-
| `Alert` + `AlertTitle` | `import { Alert, AlertTitle } from "@matteoaliano/forest-ui"` | `severity: "success" \| "info" \| "warning" \| "error"`, `variant: "filled" \| "outlined" \| "standard"`, `color`, `icon`, `action`, `onClose` | — |
|
|
104
|
-
| `Dialog` family | `import { Dialog, DialogTitle, DialogContent, DialogActions, DialogContentText } from "@matteoaliano/forest-ui"` | `open` (required), `onClose`, `fullWidth`, `maxWidth`, `fullScreen`, `scroll: "paper" \| "body"` | — |
|
|
105
|
-
| `Backdrop` | `import { Backdrop } from "@matteoaliano/forest-ui"` | `open` (required), `invisible`, `onClick` | — |
|
|
106
|
-
| `LinearProgress` | `import { LinearProgress } from "@matteoaliano/forest-ui"` | `variant: "indeterminate" \| "determinate" \| "buffer" \| "query"`, `value` (0-100), `color` | — |
|
|
107
|
-
| `CircularProgress` | `import { CircularProgress } from "@matteoaliano/forest-ui"` | `variant: "indeterminate" \| "determinate"`, `value` (0-100), `color`, `size`, `thickness` | — |
|
|
108
|
-
| `Skeleton` | `import { Skeleton } from "@matteoaliano/forest-ui"` | `variant: "text" \| "circular" \| "rectangular" \| "rounded"`, `animation: "pulse" \| "wave" \| false`, `width`, `height` | — |
|
|
109
|
-
| `Modal` | `import { Modal } from "@matteoaliano/forest-ui"` | `open` (required), `onClose`, `children`, `keepMounted`, `disableAutoFocus`, `disableEscapeKeyDown` | — |
|
|
110
|
-
| `Popover` | `import { Popover } from "@matteoaliano/forest-ui"` | `open` (required), `anchorEl`, `onClose`, `anchorOrigin`, `transformOrigin`, `elevation` | — |
|
|
111
|
-
| `Snackbar` | `import { Snackbar } from "@matteoaliano/forest-ui"` | `open`, `message`, `autoHideDuration`, `onClose`, `action`, `anchorOrigin` | — |
|
|
112
|
-
| `Slider` | `import { Slider } from "@matteoaliano/forest-ui"` | `value`, `onChange`, `min`, `max`, `step`, `marks`, `valueLabelDisplay`, `orientation`, `size` | — |
|
|
113
|
-
|
|
114
|
-
## Navigation
|
|
115
|
-
|
|
116
|
-
| Component | Import | Variants / Key Props | Default Props |
|
|
117
|
-
|-----------|--------|----------------------|---------------|
|
|
118
|
-
| `Breadcrumbs` | `import { Breadcrumbs } from "@matteoaliano/forest-ui"` | `separator`, `maxItems`, `itemsAfterCollapse`, `itemsBeforeCollapse` | — |
|
|
119
|
-
| `Link` | `import { Link } from "@matteoaliano/forest-ui"` | `href`, `underline: "none" \| "hover" \| "always"`, `color`, `variant` | — |
|
|
120
|
-
| `Menu` + `MenuList` | `import { Menu, MenuList } from "@matteoaliano/forest-ui"` | Menu: `open` (required), `anchorEl`, `onClose`; use with `MenuItem` | — |
|
|
121
|
-
| `Pagination` | `import { Pagination } from "@matteoaliano/forest-ui"` | `count`, `page`, `onChange`, `variant: "text" \| "outlined"`, `shape`, `size`, `color`, `showFirstButton`, `showLastButton` | — |
|
|
122
|
-
| `Stepper` family | `import { Stepper, Step, StepLabel } from "@matteoaliano/forest-ui"` | `activeStep`, `orientation`, `alternativeLabel`, `nonLinear`; Step: `completed`, `disabled`; StepLabel: `optional`, `error` | — |
|
|
123
|
-
| `Tabs` + `Tab` | `import { Tabs, Tab } from "@matteoaliano/forest-ui"` | Tabs: `value`, `onChange`, `variant: "standard" \| "scrollable" \| "fullWidth"`, `orientation`, `centered`; Tab: `label`, `icon`, `iconPosition`, `disabled`, `value` | — |
|
|
124
|
-
| `SidebarNav` | `import { SidebarNav, SidebarItem, useSidebar } from "@matteoaliano/forest-ui"` | `open`, `onOpenChange`, `behavior: "permanent" \| "hover"`, `expandedWidth`, `collapsedWidth`, `showToggle`, `header`, `footer` | `expandedWidth=240`, `collapsedWidth=48`, `behavior="permanent"` |
|
|
125
|
-
| `SidebarItem` | (same import) | `icon` (required), `label` (required), `endAdornment`, `selected`, `onClick`, `disabled` | — |
|
|
126
|
-
| `BottomNavigation` | `import { BottomNavigation } from "@matteoaliano/forest-ui"` | `value`, `onChange`, `showLabels` |
|
|
127
|
-
| `BottomNavigationAction` | `import { BottomNavigationAction } from "@matteoaliano/forest-ui"` | `label`, `icon`, `value`, `showLabel` |
|
|
128
|
-
| `SpeedDial` | `import { SpeedDial } from "@matteoaliano/forest-ui"` | `ariaLabel` (required), `open`, `onOpen`, `onClose`, `icon`, `direction` |
|
|
129
|
-
| `SpeedDialAction` | `import { SpeedDialAction } from "@matteoaliano/forest-ui"` | `icon`, `tooltipTitle`, `onClick` |
|
|
130
|
-
| `SpeedDialIcon` | `import { SpeedDialIcon } from "@matteoaliano/forest-ui"` | `icon`, `openIcon` |
|
|
131
|
-
| `MobileStepper` | `import { MobileStepper } from "@matteoaliano/forest-ui"` | `steps`, `activeStep`, `variant: "dots" \| "progress" \| "text"`, `nextButton`, `backButton` |
|
|
132
|
-
| `PaginationItem` | `import { PaginationItem } from "@matteoaliano/forest-ui"` | `type`, `page`, `selected`, `disabled`, `shape`, `size` |
|
|
133
|
-
| `StepButton` | `import { StepButton } from "@matteoaliano/forest-ui"` | `optional`, `children`, `onClick` |
|
|
134
|
-
| `StepConnector` | `import { StepConnector } from "@matteoaliano/forest-ui"` | (styling via theme) |
|
|
135
|
-
| `StepContent` | `import { StepContent } from "@matteoaliano/forest-ui"` | `children`, `TransitionComponent`, `transitionDuration` |
|
|
136
|
-
| `StepIcon` | `import { StepIcon } from "@matteoaliano/forest-ui"` | `active`, `completed`, `error`, `icon` |
|
|
137
|
-
| `TabScrollButton` | `import { TabScrollButton } from "@matteoaliano/forest-ui"` | `direction: "left" \| "right"`, `orientation`, `disabled` |
|
|
138
|
-
|
|
139
|
-
## Charts
|
|
140
|
-
|
|
141
|
-
Requires `@mui/x-charts` peer dependency. All chart components are re-exported from `@matteoaliano/forest-ui` — never import directly from `@mui/x-charts`. Chart colors are automatically applied from the theme's 12-color series palette.
|
|
142
|
-
|
|
143
|
-
### Chart Components
|
|
144
|
-
|
|
145
|
-
| Component | Import | Variants / Key Props | Default Props |
|
|
146
|
-
|-----------|--------|----------------------|---------------|
|
|
147
|
-
| `BarChart` | `import { BarChart } from "@matteoaliano/forest-ui"` | `series` (supports `variant: "solid" \| "striped"` per series), `colors`, `xAxis`, `yAxis`, `width`, `height` | `grid horizontal`, `borderRadius=4`, highlight/fade on hover |
|
|
148
|
-
| `LineChart` | `import { LineChart } from "@matteoaliano/forest-ui"` | `series`, `colors`, `xAxis`, `yAxis`, `width`, `height` | `curve="linear"`, `strokeWidth=3`, `grid horizontal`, highlight/fade on hover |
|
|
149
|
-
| `PieChart` | `import { PieChart } from "@matteoaliano/forest-ui"` | `series` (data: `{ id, value, label, color? }[]`), `colors`, `width`, `height` | highlight/fade on hover |
|
|
150
|
-
| `ScatterChart` | `import { ScatterChart } from "@matteoaliano/forest-ui"` | `series`, `colors`, `xAxis`, `yAxis`, `width`, `height` | — |
|
|
151
|
-
| `Gauge` | `import { Gauge } from "@matteoaliano/forest-ui"` | `value`, `valueMin`, `valueMax`, `startAngle`, `endAngle`, `width`, `height` | — |
|
|
152
|
-
| `SparkLineChart` | `import { SparkLineChart } from "@matteoaliano/forest-ui"` | `data`, `plotType: "line" \| "bar"`, `width`, `height`, `colors` | — |
|
|
153
|
-
| `useChartColors` | `import { useChartColors } from "@matteoaliano/forest-ui"` | `useChartColors(count)` — returns `string[]` of theme chart series colors (max 12) | — |
|
|
154
|
-
|
|
155
|
-
### Chart Composition Primitives
|
|
156
|
-
|
|
157
|
-
For building custom chart layouts, these low-level primitives are also available:
|
|
158
|
-
|
|
159
|
-
- **Containers:** `ChartContainer`, `ResponsiveChartContainer`, `ChartsSurface`, `ChartsClipPath`
|
|
160
|
-
- **Axis & Grid:** `ChartsAxis`, `ChartsXAxis`, `ChartsYAxis`, `ChartsGrid`, `ChartsReferenceLine`
|
|
161
|
-
- **Legend & Tooltip:** `ChartsLegend`, `DefaultChartsLegend`, `ChartsTooltip`, `ChartsAxisTooltipContent`, `ChartsItemTooltipContent`, `ContinuousColorLegend`, `PiecewiseColorLegend`
|
|
162
|
-
- **Gauge parts:** `GaugeContainer`, `GaugeReferenceArc`, `GaugeValueArc`, `GaugeValueText`
|
|
163
|
-
- **Plot layers — Bar:** `BarPlot`, `BarElement`, `BarElementPath`, `BarLabel`
|
|
164
|
-
- **Plot layers — Line & Area:** `LinePlot`, `LineElement`, `AreaPlot`, `AreaElement`, `LineHighlightPlot`, `MarkPlot`, `AnimatedArea`, `AnimatedLine`
|
|
165
|
-
- **Plot layers — Pie:** `PiePlot`, `PieArc`, `PieArcPlot`, `PieArcLabel`, `PieArcLabelPlot`
|
|
166
|
-
- **Plot layers — Scatter:** `ScatterPlot`, `Scatter`
|
|
167
|
-
- **Interaction:** `ChartsAxisHighlight`, `ChartsOnAxisClickHandler`, `ChartsVoronoiHandler`, `HighlightedProvider`
|
|
168
|
-
- **Text:** `ChartsText`
|
|
169
|
-
- **Hooks:** `useDrawingArea`, `useChartId`, `useSvgRef`, `useXAxis`, `useXScale`, `useYAxis`, `useYScale`, `useAxisTooltip`, `useItemTooltip`, `useMouseTracker`, `useHighlighted`, `useItemHighlighted`, `useGaugeState`
|
|
170
|
-
- **Color palettes:** `blueberryTwilightPalette`, `cheerfulFiestaPalette`, `mangoFusionPalette` (each with `Light` and `Dark` variants)
|
|
171
|
-
|
|
172
|
-
## Transitions
|
|
173
|
-
|
|
174
|
-
| Component | Import | Key Props |
|
|
175
|
-
|-----------|--------|-----------|
|
|
176
|
-
| `Collapse` | `import { Collapse } from "@matteoaliano/forest-ui"` | `in`, `timeout`, `orientation: "vertical" \| "horizontal"`, `collapsedSize`, `unmountOnExit` |
|
|
177
|
-
| `Fade` | `import { Fade } from "@matteoaliano/forest-ui"` | `in`, `timeout`, `appear` |
|
|
178
|
-
| `Grow` | `import { Grow } from "@matteoaliano/forest-ui"` | `in`, `timeout`, `appear` |
|
|
179
|
-
| `Slide` | `import { Slide } from "@matteoaliano/forest-ui"` | `in`, `direction: "up" \| "down" \| "left" \| "right"`, `timeout`, `container` |
|
|
180
|
-
| `Zoom` | `import { Zoom } from "@matteoaliano/forest-ui"` | `in`, `timeout`, `appear` |
|
|
181
|
-
|
|
182
|
-
## Utilities
|
|
183
|
-
|
|
184
|
-
| Component | Import | Key Props |
|
|
185
|
-
|-----------|--------|-----------|
|
|
186
|
-
| `ClickAwayListener` | `import { ClickAwayListener } from "@matteoaliano/forest-ui"` | `onClickAway` (required), `mouseEvent`, `touchEvent`, `children` |
|
|
187
|
-
| `NoSsr` | `import { NoSsr } from "@matteoaliano/forest-ui"` | `defer`, `fallback`, `children` |
|
|
188
|
-
| `Portal` | `import { Portal } from "@matteoaliano/forest-ui"` | `container`, `disablePortal`, `children` |
|
|
189
|
-
| `Popper` | `import { Popper } from "@matteoaliano/forest-ui"` | `open` (required), `anchorEl`, `placement`, `transition`, `modifiers` |
|
|
190
|
-
| `TextareaAutosize` | `import { TextareaAutosize } from "@matteoaliano/forest-ui"` | `minRows`, `maxRows`, all textarea HTML attributes |
|
|
191
|
-
| `SvgIcon` | `import { SvgIcon } from "@matteoaliano/forest-ui"` | `viewBox`, `fontSize`, `color`, `children` (SVG path elements) |
|
|
192
|
-
| `ButtonBase` | `import { ButtonBase } from "@matteoaliano/forest-ui"` | `onClick`, `disabled`, `href`, `component`, `disableRipple` |
|
|
193
|
-
| `GlobalStyles` | `import { GlobalStyles } from "@matteoaliano/forest-ui"` | `styles` (required) — CSS object or function |
|
|
194
|
-
|
|
195
|
-
## Hooks
|
|
196
|
-
|
|
197
|
-
| Hook | Import | Signature |
|
|
198
|
-
|------|--------|-----------|
|
|
199
|
-
| `useMediaQuery` | `import { useMediaQuery } from "@matteoaliano/forest-ui"` | `useMediaQuery(query): boolean` — responsive breakpoint detection |
|
|
200
|
-
| `useScrollTrigger` | `import { useScrollTrigger } from "@matteoaliano/forest-ui"` | `useScrollTrigger(options?): boolean` — detect scroll for hide-on-scroll AppBars |
|
|
201
|
-
| `useFormControl` | `import { useFormControl } from "@matteoaliano/forest-ui"` | `useFormControl(): FormControlState` — access parent FormControl state |
|
|
202
|
-
| `useTheme` | `import { useTheme } from "@matteoaliano/forest-ui"` | `useTheme(): Theme` — access the current MUI theme object |
|