Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
157 commits
Select commit Hold shift + click to select a range
fa4206f
Planning docs
vedrani Apr 28, 2026
551f5a4
Planning docs
vedrani Apr 30, 2026
4b3c749
Planning docs
vedrani May 4, 2026
81d14f2
Orchestrator
vedrani May 5, 2026
38b15ce
Orchestrator fix
vedrani May 5, 2026
3b29cd5
Orchestrator fix #2
vedrani May 5, 2026
9b53b7e
Orchestrator fix #3
vedrani May 6, 2026
938b093
Orchestrator fix #4
vedrani May 6, 2026
312c890
Orchestrator fix #5
vedrani May 6, 2026
6984aa6
Orchestrator fix #6
vedrani May 6, 2026
3767585
Orchestrator fix #8
vedrani May 6, 2026
1268d7a
Orchestrator fix #9
vedrani May 6, 2026
68614db
Orchestrator fix #10
vedrani May 6, 2026
97f6cc5
Orchestrator tier1.phase3
vedrani May 6, 2026
4df36f8
Orchestrator fix #1
vedrani May 6, 2026
71960ee
Orchestrator phase3.5
vedrani May 6, 2026
94722fa
Orchestrator fix #1
vedrani May 6, 2026
5271846
Orchestrator fix #2
vedrani May 6, 2026
676ac55
Orchestrator fix #2
vedrani May 6, 2026
2972dcf
Orchestrator Tier.2
vedrani May 6, 2026
93f812c
Orchestrator v4
vedrani May 7, 2026
40a53d9
Orchestrator fix #1
vedrani May 7, 2026
93c5bc6
Orchestrator fix #2
vedrani May 7, 2026
8580b6b
Orchestrator fix #3
vedrani May 7, 2026
dc138e4
Orchestrator fix #4
vedrani May 7, 2026
8e76ce4
Orchestrator fix #5
vedrani May 7, 2026
87c2fb0
Orchestrator fix #5
vedrani May 7, 2026
e832bb4
Orchestrator fix #6
vedrani May 7, 2026
1adc374
Orchestrator fix #7
vedrani May 7, 2026
d3deaab
Orchestrator fix #8
vedrani May 7, 2026
c596c56
Orchestrator fix #9
vedrani May 7, 2026
0b5e166
Orchestrator fix #10
vedrani May 8, 2026
99bd6c8
Orchestrator security + classes
vedrani May 11, 2026
3c68e9a
Orchestrator review-sweep fix#1
vedrani May 11, 2026
9117598
Migrate orchestrator to pnpm
vedrani May 11, 2026
14ffd90
Migrate orchestrator to pnpm
vedrani May 11, 2026
3dbd7ee
Add playwright mcp
vedrani May 12, 2026
0d49194
Add playwright mcp
vedrani May 12, 2026
0ee059f
Details
vedrani May 12, 2026
519c189
Fix storybook
vedrani May 12, 2026
cd469ee
Fix review-sweep
vedrani May 12, 2026
ae22910
Fix regex
vedrani May 12, 2026
39e427c
Add working-base
vedrani May 12, 2026
9d0cf72
Fix danger
vedrani May 12, 2026
a3552a5
Add changeset prompt
vedrani May 12, 2026
7fd239a
Move pnpm settings
vedrani May 13, 2026
313456e
Fix prompts
vedrani May 13, 2026
ff82f54
Rework visual inspection
vedrani May 13, 2026
f3d1a4e
Rework visual inspection #2
vedrani May 13, 2026
31542e2
Small improvements
vedrani May 14, 2026
707f564
Improvements #1
vedrani May 14, 2026
b674551
Improvements #2
vedrani May 14, 2026
df84550
Improvements #3
vedrani May 14, 2026
988b3b1
Improve visual inspection #3
vedrani May 14, 2026
909ba5a
Improve visual inspection #4
vedrani May 14, 2026
098ba0c
Improve visual inspection #5
vedrani May 15, 2026
52ac047
Improve visual inspection #6
vedrani May 15, 2026
904ac90
Improve visual inspection #7
vedrani May 18, 2026
fdd77d4
Fix + progress
vedrani May 18, 2026
0f17cac
Fix + progress
vedrani May 18, 2026
691eb33
Fix + progress #2
vedrani May 18, 2026
c6ecc21
Add pixel-diff
vedrani May 18, 2026
e454ea8
Progress
vedrani May 18, 2026
e6633b4
Progress #2
vedrani May 18, 2026
ed7cc17
Fix snapshots
vedrani May 18, 2026
c46c36e
New improvements #1
vedrani May 20, 2026
2dd5465
Review, lessons and prompt gate added
vedrani May 20, 2026
1407c10
Improvements #1
vedrani May 21, 2026
21fbe5b
Rework prompts
vedrani May 21, 2026
90a5e43
Improvements #2
vedrani May 21, 2026
e3ab5c6
Improvements #3
vedrani May 21, 2026
0345350
Fix #1
vedrani May 22, 2026
ad52127
Fix #2
vedrani May 22, 2026
c821448
Fix #3
vedrani May 22, 2026
ba406f2
Fix #4
vedrani May 22, 2026
af47226
Model config
vedrani May 24, 2026
d9cc981
Update with base-ui rules and fixes
vedrani May 25, 2026
739cfc4
Manifest #1
vedrani May 25, 2026
dd47560
Update gitignore
vedrani May 25, 2026
779c8db
Add rules document for review
vedrani May 25, 2026
32437b9
Improvements #4
vedrani May 25, 2026
a320e08
Note migrated
vedrani May 26, 2026
dcaee5a
Fix
vedrani May 26, 2026
d08bd3e
Restructure base-ui rules and visual differences
vedrani May 26, 2026
f12ca30
Fix rules
vedrani May 27, 2026
63962aa
Typography manifest
vedrani May 28, 2026
3374bbc
Add onChange helper and rules
vedrani May 28, 2026
a38e520
Update to Opus 4.8
vedrani May 28, 2026
caca319
Fix
vedrani May 28, 2026
e6716b0
Add ...rest rule
vedrani May 29, 2026
5c96558
Add cleaning of phantom files
vedrani May 29, 2026
ffd19df
Fix #1
vedrani May 29, 2026
137b751
Fixes
vedrani May 30, 2026
913367d
Manifest progress
vedrani Jun 1, 2026
781f761
Improve rules and review
vedrani Jun 2, 2026
2808517
Update orchestrator rules
vedrani Jun 3, 2026
a937b94
Fix #1
vedrani Jun 4, 2026
3151680
Fix #2
vedrani Jun 4, 2026
efebdbf
Fix #3
vedrani Jun 4, 2026
d876a1f
Fix #4
vedrani Jun 4, 2026
d30aa80
Progress #1
vedrani Jun 5, 2026
0eba95a
Improvements #1
vedrani Jun 8, 2026
7676263
Improvements #2
vedrani Jun 9, 2026
fc5b3d2
Consolidate agents.md #1
vedrani Jun 9, 2026
8dbab9c
Add cypress happo to gate
vedrani Jun 10, 2026
ce64ee6
Move to Fable 5
vedrani Jun 10, 2026
8369853
Add instructions
vedrani Jun 10, 2026
e654f90
Fix happo
vedrani Jun 11, 2026
d5af547
Update manifest
vedrani Jun 11, 2026
bf27b6c
Fix migration bug
vedrani Jun 12, 2026
527183c
Record Tooltip v1/v2 run state + audit notes (#5007)
dulishkovych Jun 15, 2026
18efd7d
Record Dropdown v2 run state (PR #5008)
dulishkovych Jun 15, 2026
61ddded
Fix + Progress
vedrani Jun 17, 2026
28d3e40
Fix cleanup bug
vedrani Jun 17, 2026
c51219c
Progress + graduation
vedrani Jun 17, 2026
0613836
Progress
vedrani Jun 18, 2026
f00f540
Update leasson-learned + manifest (#5017)
azebich Jun 23, 2026
5e97c4a
[PF-1992] Update manifest.json (#5023)
azebich Jun 29, 2026
33bc3f2
Add --audit-pr mode + externalize audit checklist + enforcement tiers
vedrani Jun 29, 2026
8261b70
Restore webpack patch and drop vestigial Utils dep post-rebase
vedrani Jun 29, 2026
bbf8eac
[PF-1994] Migrate Badge to @base-ui/react + Tailwind (#4957)
vedrani May 18, 2026
d9716b5
[PF-1994] Migrate Button to @base-ui/react + Tailwind (#4947)
vedrani May 18, 2026
6ad25b1
[PF-1994] Migrate Backdrop to @base-ui/react + Tailwind (#4954)
vedrani May 22, 2026
4524eed
[PF-1994] Drop @material-ui/core peer-dep from Note, lift React 19 ca…
vedrani May 26, 2026
914d449
[PF-1994] Migrate Typography to @base-ui/react + Tailwind (#4983)
vedrani May 29, 2026
69661a7
[PF-1994] Drop @material-ui/core peer-dep from Form, lift React 19 ca…
vedrani May 29, 2026
bfd7b3d
[PF-1994] Migrate FormLabel to @base-ui/react + Tailwind (#4982)
vedrani May 29, 2026
5849ede
[PF-1994] Migrate Container to @base-ui/react + Tailwind (#4980)
vedrani May 30, 2026
6ab39c9
[PF-1994] Migrate Grid to @base-ui/react + Tailwind (#4988)
vedrani Jun 3, 2026
45b319b
[PF-1994] Migrate ModalContext to @base-ui/react + Tailwind (#4990)
vedrani Jun 3, 2026
8ddae58
[PF-1994] Migrate Menu to @base-ui/react + Tailwind (#4989)
vedrani Jun 3, 2026
2706330
[PF-1994] Migrate FormLayout to @base-ui/react + Tailwind (#4987)
vedrani Jun 3, 2026
c5b0c04
[PF-1994] Migrate Slider to @base-ui/react + Tailwind (#4976)
vedrani Jun 8, 2026
5db13d4
[PF-1994] Migrate Switch to @base-ui/react + Tailwind (#4965)
vedrani Jun 8, 2026
a51608d
[PF-1994] Migrate Utils to @base-ui/react + Tailwind (#4997)
vedrani Jun 9, 2026
df652ba
[PF-1994] Migrate Notification to @base-ui/react + Tailwind (#4995)
vedrani Jun 9, 2026
d1adf85
[PF-1994] Migrate picasso-charts to @base-ui/react + Tailwind (#5011)
azebich Jun 16, 2026
f013124
[PF-1994] Migrate Tabs to @base-ui/react + Tailwind (#4996)
vedrani Jun 17, 2026
34304fb
[PF-1994] Migrate Modal to @base-ui/react + Tailwind (#4993)
vedrani Jun 17, 2026
8b89ead
[PF-1994] Migrate Drawer to @base-ui/react + Tailwind V2 (#4994)
vedrani Jun 17, 2026
f65ef59
[PF-1994] Migrate Page to @base-ui/react + Tailwind (#5003)
vedrani Jun 17, 2026
92179f3
[PF-1994] Migrate Dropdown to @base-ui/react + Tailwind (#5008)
dulishkovych Jun 18, 2026
c47a871
[PF-1994] Migrate Modal fix shades (#5015)
azebich Jun 19, 2026
a66168b
[PF-1994] Migrate picasso-rich-text-editor to @base-ui/react + Tailwi…
vedrani Jun 22, 2026
5fa2bd5
[PF-2024] Migrate file input v1 (#5004)
Kosov234 Jun 23, 2026
e200f76
[PF-1994] Migrate OutlinedInput from @mui/base to native elements (#5…
Kosov234 Jun 23, 2026
d707de4
[PF-1994] Migrate Accordion to @base-ui/react + Tailwind (#5002)
azebich Jun 28, 2026
e86978f
Regenerate pnpm-lock.yaml after rebase
vedrani Jun 29, 2026
30547b5
Sync tsconfig references after rebase
vedrani Jun 29, 2026
7427a85
Add Figma Code Connect infrastructure
Kosov234 Jun 22, 2026
c461f21
Add Figma Code Connect for top 10 Picasso components
Kosov234 Jun 22, 2026
d196a66
Fix Accordion Code Connect to use compound component pattern
Kosov234 Jun 23, 2026
c0c2bb8
Add Figma Code Connect for DatePicker component
Kosov234 Jun 23, 2026
62109fc
Fix Figma Code Connect validation errors across all components
Kosov234 Jun 23, 2026
ea4d5e1
Properly map List styleType
Kosov234 Jun 23, 2026
0aa92da
Remove stale picasso-utils dep from picasso-tailwind-merge
Kosov234 Jun 30, 2026
2ba6acf
Add new Figma Code Connect configs and update old ones
Kosov234 Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions .changeset/accordion-base-ui-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@toptal/picasso-accordion': patch
---

### Accordion

- Re-implement on `@base-ui/react/accordion` + Tailwind with behavioral parity for `children`, `content`, `expanded`, `defaultExpanded`, `disabled`, `expandIcon`, `borders`, `onChange`, `testIds` and `transitionProps`
- The expand/collapse animation is now CSS-driven. `transitionProps.timeout` (number, or `enter`/`exit`) sets the transition duration in ms (the previous height-dependent `timeout: 'auto'` default is approximated by a fixed 300ms); `transitionProps.onExited` still fires after the collapse transition completes
- Drop the vestigial `classes` prop (a no-op since the `@mui/base` / `@material-ui/core` internals were removed) — style overrides go through `className` / `style`
- Remove the `@material-ui/core` peer dependency and lift the React `< 19.0.0` peer cap
7 changes: 7 additions & 0 deletions .changeset/accordion-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-page': patch
---

### Page

- `SidebarItemAccordion` routes its Accordion slot styling through `className` instead of the removed `classes` prop; no visual change
8 changes: 8 additions & 0 deletions .changeset/backdrop-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@toptal/picasso-backdrop': patch
---

### Backdrop

- Replace `@mui/base/Modal` `ModalBackdropSlotProps` import with a local `React.HTMLAttributes<HTMLDivElement>`-based Props type; public Props surface and runtime behavior unchanged
- Lift React peer-dependency cap (drop `< 19.0.0`)
17 changes: 17 additions & 0 deletions .changeset/badge-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
'@toptal/picasso-badge': major
---

### Badge

- Replace the `@mui/base/Badge` wrapper with a plain `<span>` composition (no `@base-ui/react` equivalent — Picasso was already mostly custom; see migration plan v3 §9.9)
- Lift React peer-dependency cap (drop `< 19.0.0`)

## Intentional visual changes

Storybook Happo: clean (all Badge stories byte-identical to master).

Cypress Happo diffs are not Badge regressions — neither component below imports `@toptal/picasso-badge`. The shifts are environmental/render variability triggered by the dependency-graph change (dropping `@mui/base`):

- `PageTopBarMenu / width-1441` — `color-delta: 0.01377`, `ssim: 0.00035`. Sub-perceptual (well under Happo's compare-threshold). PageTopBarMenu composes `Page.TopBar` + `UserBadge`; no `Badge` consumer chain.
- `CategoriesChart / default/with-column-hover` — `color-delta: 0.69023`, `ssim: 0.05961`. Recharts SVG tooltip hover screenshot; the test file already documents existing flakiness ("sometimes the screenshot was taken with mouse over the bar and it triggered tooltip"). CategoriesChart lives under `topkit-analytics-charts` and has no Badge reference anywhere in its module graph.
9 changes: 9 additions & 0 deletions .changeset/container-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@toptal/picasso-container': patch
---

### Container

- Drop residual `@material-ui/core` type import (`PropTypes.Alignment`) in favor of an explicit literal union on the `align` prop. Public API and behavior unchanged.
- Migrate the props interface to `extends BaseProps`, dropping the vestigial `classes` prop from the public type. The prop was inherited from `StandardProps` but was never read in source and had zero internal / external consumer usage per the cross-tier audit.
- Lift `react` peer cap to `>=16.12.0` so the package is compatible with React 19.
11 changes: 11 additions & 0 deletions .changeset/container-tier1-mui-cleanup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@toptal/picasso-container': patch
---

### Container

Duplicate of `container-migration.md` (orchestrator expected that filename). Safe to delete during release cleanup — version coalesces to a single patch bump and the CHANGELOG entry below is the same.

- Drop residual `@material-ui/core` type import (`PropTypes.Alignment`) in favor of an explicit literal union on the `align` prop. Public API and behavior unchanged.
- Migrate the props interface to `extends BaseProps`, dropping the vestigial `classes` prop from the public type. The prop was inherited from `StandardProps` but was never read in source and had zero internal / external consumer usage per the cross-tier audit.
- Lift `react` peer cap to `>=16.12.0` so the package is compatible with React 19.
8 changes: 8 additions & 0 deletions .changeset/drawer-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@toptal/picasso-drawer': patch
---

### Drawer

- Re-implement on `@base-ui/react/dialog` (`Dialog.Root` + `Dialog.Portal` + `Dialog.Backdrop` + `Dialog.Popup`), replacing the `@mui/base/Modal` backing. The Dialog primitive (not `@base-ui/react/drawer`) backs Picasso's Drawer because Drawer has no swipe affordance and `@base-ui/react/drawer` always enables swipe-to-dismiss. The public Props API and behavior are unchanged — backdrop-click and Escape dismissal are preserved; `disableBackdrop` keeps page content interactive and disables outside-press dismissal.
- Slide/backdrop transitions are now driven by `@base-ui/react` `data-[starting-style]`/`data-[ending-style]` instead of `@toptal/picasso-slide` and `@toptal/picasso-backdrop`. The rendered DOM changes from the `@mui/base` Modal shape; internal `base-Modal-*` markup (never part of the public API) is gone, so tests asserting on it need new selectors.
10 changes: 10 additions & 0 deletions .changeset/dropdown-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@toptal/picasso-dropdown': patch
---

### Dropdown
- Remove the `@mui/base` (`ClickAwayListener`) and `@material-ui/core` (`Grow`, `PopperPlacementType`) dependencies; public API and behavioral parity unchanged.
- Click-away dismissal now uses the shared `@toptal/picasso-utils` `ClickAwayListener` (the MUI-free replacement already used by DatePicker and Menu), instead of `@mui/base`'s listener.
- The open grow transition moves from MUI `Grow` to a CSS `@starting-style` entry animation (`transition-[opacity,scale]` + `starting:scale-75 starting:opacity-0`), resting at `scale-100`.
- The `placement` prop type is now imported from `@toptal/picasso-popper` (`PopperPlacementType`) instead of being redefined locally — same 12 members as `@material-ui/core`'s, no removed values, no consumer-visible narrowing.
- The locally narrowed `classes?: { popper?, content? }` surface is preserved unchanged (used by external consumers).
11 changes: 11 additions & 0 deletions .changeset/file-input-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@toptal/picasso-file-input': patch
---

### FileInput

- re-implement FileInput, FileList, FileListItem and ProgressBar on plain
`<input type="file">` + Tailwind; remove `@material-ui/core` JSS
(`makeStyles` / `createStyles`) and drop the `@material-ui/core` peer
dependency. Public prop API and behavior are unchanged.
- widen the `react` peer range (drop the `< 19.0.0` upper bound).
7 changes: 7 additions & 0 deletions .changeset/form-label-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-form-label': patch
---

### FormLabel

- Drop `@material-ui/core` from `peerDependencies`; widen React peer range to `>=16.12.0` (drop `<19.0.0` upper bound). Replace the lone `import type { FormControlLabelProps } from '@material-ui/core/FormControlLabel'` with a local `onChange` type. Public API unchanged; `FormControlLabel`'s narrowed `classes?: { root?, label? }` slot surface preserved for Switch/Radio/Checkbox consumers.
7 changes: 7 additions & 0 deletions .changeset/form-layout-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-form-layout': patch
---

### FormLayout

- Drop `@material-ui/core` peer dependency and lift the `react` peer cap to `>=16.12.0`. Source was already MUI-free; public API unchanged, behavioral parity preserved.
7 changes: 7 additions & 0 deletions .changeset/form-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-form': patch
---

### Form

- Drop `@material-ui/core` from `peerDependencies`; widen React peer range to `>=16.12.0` (drop `<19.0.0` upper bound). Source already MUI-clean; public API unchanged.
8 changes: 8 additions & 0 deletions .changeset/grid-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@toptal/picasso-grid': patch
---

### Grid

- Replace the MUI v4 `GridSize` type re-export with the Picasso-native `GridSize` union; public API unchanged, behavioral parity preserved.
- Drop `@material-ui/core` peer dependency and widen the React peer range to `>=16.12.0`.
7 changes: 7 additions & 0 deletions .changeset/modal-context-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-modal-context': patch
---

### ModalContext

- Drop the vestigial `@material-ui/core` peer-dependency (source is a React context provider that imports nothing from MUI) and lift the `react` peer cap to `>=16.12.0`. Public API unchanged; behavioral parity.
10 changes: 10 additions & 0 deletions .changeset/modal-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@toptal/picasso-modal': patch
---

### Modal

- re-implement on `@base-ui/react`'s `Dialog` (`Dialog.Root` + `Dialog.Portal` + `Dialog.Backdrop` + `Dialog.Popup`), replacing `@mui/base/Modal`. Public Props API is unchanged — `open`, `onClose`, `onOpen`, `onBackdropClick`, `disableBackdropClick`, `hideBackdrop`, `container`, `size`, `align`, `transitionProps`, `transitionDuration`, `paperProps`, `testIds` and the narrowed `classes?: { closeButton }` are all preserved, with behavioral parity (custom focus management, page scroll lock, multi-modal coexistence, backdrop-click and escape close).
- internally the dim overlay is now a `Dialog.Backdrop` element instead of the composed `@toptal/picasso-backdrop` component, and the open/close fade is driven by `data-starting-style`/`data-ending-style` Tailwind transitions instead of `@toptal/picasso-fade`.
- the `@mui/base`, `@toptal/picasso-backdrop` and `@toptal/picasso-fade` are dropped from dependencies; the `react` peer cap is lifted to `>=16.12.0`.
- the `ModalContent` scroll shades now fade in and out via CSS opacity (`data-active` + `transition-opacity`) instead of being conditionally mounted; no API change.
7 changes: 7 additions & 0 deletions .changeset/note-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-note': patch
---

### Note

- Drop `@material-ui/core` from `peerDependencies`; widen React peer range to `>=16.12.0` (drop `<19.0.0` upper bound). Source already MUI-clean; public API unchanged.
8 changes: 8 additions & 0 deletions .changeset/notification-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@toptal/picasso-notification': major
---

### Notification
- Replace the `@material-ui/core/Snackbar` `SnackbarOrigin` type import with a Picasso-native structural type; behavioral parity, `notistack` integration unchanged.
- Drop the vestigial public `classes` prop (audit-verified 0 internal/external usage) via `Omit<StandardProps, 'classes'>`. Removing the prop from the public type is the breaking surface.
- Widen the `react` peer range to `>=16.12.0` (drop the `< 19.0.0` upper bound).
7 changes: 7 additions & 0 deletions .changeset/outlined-input-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-outlined-input': patch
---

### OutlinedInput
- Re-implement on native elements + `react-textarea-autosize`, removing `@mui/base` (`Input` / `TextareaAutosize`) and the `@material-ui/core` `InputBaseComponentProps` type; public API unchanged.
- Behavioral parity: outline root, `startAdornment` / `endAdornment`, `inputComponent`, `multiline` (`rows` / `rowsMax`), `error` / `warning` / `success` states, the narrowed `classes?: { input?, root? }` slots, and root-click-to-focus are all preserved.
9 changes: 9 additions & 0 deletions .changeset/page-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@toptal/picasso-page': patch
---

### Page

- Re-implement the `Page` root shell styling on Tailwind; behavioral parity with the JSS implementation, public Props API unchanged
- Remove `@material-ui/core` from `peerDependencies` — consumers no longer need it installed for this package
- Widen the `react` peer range to `>=16.12.0` (React 19 cap lifted)
9 changes: 9 additions & 0 deletions .changeset/picasso-charts-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@toptal/picasso-charts': major
---

### LineChart

- Re-implement styling without `@material-ui/core` + JSS; behavioral and visual parity preserved. The bottom-Y-axis-label rule now lives in `LineChart`'s self-contained `<style>` block, scoped to a per-instance marker class, replacing the `makeStyles`/`createStyles` JSS hook.
- **Breaking**: remove `@material-ui/core` from `peerDependencies` — `@toptal/picasso-charts` no longer requires consumers to install MUI v4. The styles are no longer registered as a themeable MUI hook (`makeStyles(…, { name: 'LineChart' })`), so any `PicassoProvider.override`/MUI-theme override targeting `LineChart` no longer applies.
- Widen the `react` peer range to `>=16.12.0` (drop the `<19.0.0` upper bound).
8 changes: 8 additions & 0 deletions .changeset/picasso-menu-drop-mui-base.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@toptal/picasso-menu': patch
---

### Menu

- Drop the stale `@mui/base` dependency declaration; source already runs on `@toptal/picasso-popper` + `@toptal/picasso-paper`. Public API unchanged, behavioral parity preserved.
- Lift the `react` peer cap to `>=16.12.0`.
9 changes: 9 additions & 0 deletions .changeset/picasso-rich-text-editor-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@toptal/picasso-rich-text-editor': major
---

### RichTextEditor

- Re-implement styling on Tailwind; remove the `@material-ui/core` dependency (JSS `makeStyles`/`createStyles` → static Tailwind class maps and arbitrary variants). Public component API is unchanged and behavioral parity is the goal.
- **Breaking**: editor content is no longer styled through MUI/JSS-generated class names (`makeStyles` `name:`-prefixed classes such as `LexicalEditor-editorContainer-*`, `PicassoCode-*`, etc.). Consumers that targeted those generated class names from their own stylesheets must migrate to the Tailwind-based markup.
- `@material-ui/core` removed from `peerDependencies` and `devDependencies`; the `react`/`react-dom` peer cap is widened to `>=16.12.0` (React 19 unblocked).
7 changes: 7 additions & 0 deletions .changeset/picasso-shared-react-event-bind.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-shared': patch
---

### picasso-shared

- Fix `toReactEvent` / `toReactChangeEvent`: bind forwarded native event methods (`preventDefault`, `stopPropagation`, …) to the underlying native event. Without binding they were invoked with the Proxy as `this`, throwing "Illegal invocation" in real browsers when a consumer `onChange` called e.g. `event.stopPropagation()`.
8 changes: 8 additions & 0 deletions .changeset/picasso-shared-react-event-helpers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@toptal/picasso-shared': minor
---

### picasso-shared

- add `toReactEvent<R>(event)` boundary-cast helper for bridging native DOM `Event` to React.SyntheticEvent variants at the `@base-ui/react` ↔ Picasso form-component interface. Proxy-based: preserves native event identity, synthesizes the four React-SyntheticEvent shim methods (`nativeEvent`, `persist`, `isDefaultPrevented`, `isPropagationStopped`).
- add `toReactChangeEvent<T>(event)` specialized helper for form-input `onChange` adapters. Constrains `T` to `HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement` and dev-warns when the event target is not a DOM element. Delegates to `toReactEvent` for the Proxy machinery.
6 changes: 6 additions & 0 deletions .changeset/popper-export-placement-type.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@toptal/picasso-popper': patch
---

### Popper
- Surface `PopperPlacementType` from the package entry so consumers can import it instead of redefining the placement union locally. Type-only and additive — no runtime or behavioral change.
19 changes: 19 additions & 0 deletions .changeset/slider-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
'@toptal/picasso-slider': patch
---

### Slider

- Re-implement on `@base-ui/react/slider`; public API unchanged.

## Intentional visual changes

Slider now matches the current Figma design-of-record (diverged from the legacy
`@mui/base` pixels). Pre-authorized in `docs/migration/components/Slider.md`
§"Approved visual deltas":

- Thumb diameter `15px` → `19px` (2px white border retained).
- Rail fill: translucent `bg-gray-500` @ `opacity-[0.24]` → solid `bg-gray-500`.
- Disabled track (under `disableTrackHighlight`): `bg-gray-200` → `bg-gray-500`.
- Mark: `6px` + 2px white border → `9px` solid fill, no border.
- Container vertical rhythm: `my-[6px]` → `mt-[5px] mb-[4px]` + `h-[15px]`.
10 changes: 10 additions & 0 deletions .changeset/switch-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@toptal/picasso-switch': patch
---

### Switch

- Re-implement on `@base-ui/react` (behavioral parity); compound parts (`Switch.Root` + `Switch.Thumb`) replace the single `@mui/base/Switch` slot system
- Adapt the public `onChange(event, checked)` callback over base-ui's `onCheckedChange` so consumer signatures are preserved
- Public API unchanged: `Props` and `ref` keep master's `HTMLButtonElement` typing
- Lift the `react` peer-dependency upper bound to `>=16.12.0` (drop the `< 19.0.0` cap)
10 changes: 10 additions & 0 deletions .changeset/tabs-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@toptal/picasso-tabs': patch
---

### Tabs

- Re-implement on `@base-ui/react`; public API unchanged (behavioral parity).
- Swap `@mui/base/Tabs` + `@mui/base/TabsList` + `@mui/base/Tab` for `@base-ui/react/tabs` (`Tabs.Root` + `Tabs.List` + `Tabs.Tab`).
- Restore MUI v4's sliding active-tab underline on horizontal tabs via `Tabs.Indicator` (the Tailwind migration had replaced it with a static per-tab box-shadow). Vertical tabs keep the static per-tab active bar — no slide.
- Lift the `react` peer cap to `>=16.12.0`.
7 changes: 7 additions & 0 deletions .changeset/typography-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-typography': major
---

### Typography
- Drop `@material-ui/core` peer dependency; widen React peer range to `>=16.12.0`.
- Remove vestigial `classes` prop from the public type via `Omit<StandardProps, 'classes'>`; runtime backstop discards any inherited value. Behavioral parity verified by snapshot + unit tests; public API unchanged for real consumers (audit-verified: 0 internal, 0 external usages).
3 changes: 3 additions & 0 deletions .changeset/typography-mui-cleanup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
---
'@toptal/picasso-typography': patch
---
11 changes: 11 additions & 0 deletions .changeset/utils-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@toptal/picasso-utils': patch
---

### Utils

- Re-implement off `@material-ui/core`; public API unchanged (behavioral parity).
- `capitalize` is now a local implementation (identical output to MUI's, including the throw on non-string input).
- `ClickAwayListener` is now a local Picasso component (same `onClickAway` / `mouseEvent` / `touchEvent` / `disableReactTree` surface).
- `Rotate180` transition migrated from JSS to Tailwind (`transition-transform duration-150 ease-in-out` + `rotate-180`); animation timing/curve unchanged.
- Drop `@material-ui/core` peer dependency; widen the `react` peer to `>=16.12.0`.
20 changes: 20 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"permissions": {
"allow": [
"Bash(pnpm davinci-syntax *)",
"Bash(pnpm davinci-qa *)",
"Bash(pnpm eslint *)",
"Bash(pnpm exec tsc --noEmit *)",
"Bash(pnpm typecheck *)",
"Bash(gh search *)",
"Bash(bash -n *)",
"Bash(pnpm tsc --noEmit *)",
"Bash(pnpm changeset status)",
"Bash(pnpm changeset status *)",
"mcp__playwright__browser_navigate",
"mcp__playwright__browser_snapshot",
"mcp__playwright__browser_console_messages",
"mcp__playwright__browser_take_screenshot"
]
}
}
47 changes: 47 additions & 0 deletions .envrc.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Picasso migration orchestrator — environment template.
#
# Copy to `.envrc` (repo root, gitignored) OR `~/Projects/.envrc`, fill in,
# then run `direnv allow`. The orchestrator's loadEnvrcUpwards() walks up from
# the repo and auto-loads the nearest .envrc via direnv.
#
# No direnv? Either `source` this file before `pnpm orchestrate`, or pass the
# vars inline: HAPPO_API_KEY=… HAPPO_API_SECRET=… pnpm orchestrate --component=Note
#
# NOTE: claude / gh / ssh auth are NOT set here — they're CLI/agent-managed.
# See docs/migration/ORCHESTRATOR.md §"First-time setup".
# Verify your whole setup at once with: pnpm orchestrate --component=<X> --dry-run
# (reads the prerequisite report without starting a real run).

# --- Required for the Happo visual gate ---------------------------------
# Your personal Happo API credentials, with access to the Picasso Happo org
# (account 675). Get them from https://happo.io account settings.
# To run WITHOUT Happo instead, leave these unset and pass
# MIGRATION_GATE_HAPPO=skip (sandbox / smoke runs only).
export HAPPO_API_KEY=
export HAPPO_API_SECRET=

# --- Required for correct pnpm node_modules layout ----------------------
# Any value works (e.g. `dummy`) — only used to authenticate registry fetches,
# not for layout. Without it pnpm falls back to the isolated linker and tsc
# can't resolve React types.
export NPM_TOKEN=dummy

# --- Optional: model preset (fable | opus) ------------------------------
# Default: fable (current config — claude-fable-5[1m]). opus is claude-opus-4-8[1m]
# at the same effort, ≈half fable's per-token cost. Override per-run with
# `--preset=opus`; `--model` / `--effort` / `--thinking-tokens` override fields.
# export MIGRATION_MODEL_PRESET=fable

# --- Optional: gate / behavior knobs (env-only) -------------------------
# Defaults are sensible; uncomment to override per-clone (e.g. a sandbox clone
# that always skips the visual gate). Full list + effects:
# docs/migration/ORCHESTRATOR.md §"Environment knobs".
# export MIGRATION_GATE_HAPPO=skip # bypass Happo visual gate (sandbox/smoke)
# export MIGRATION_GATE_CHANGESET=skip # bypass changeset validation
# export MIGRATION_GATE_DOCTRINE=skip # bypass code-doctrine check
# export MIGRATION_GATE_HAPPO_CYPRESS_STRICT=1 # make Cypress visual diffs gate (default: advisory)
# export MIGRATION_GATE_HAPPO_CYPRESS=skip # disable the Cypress visual suite

# --- Optional: Confluence status sync (silently skipped if unset) -------
# export ATLASSIAN_EMAIL=
# export ATLASSIAN_API_TOKEN=
Loading
Loading