Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
  •  
  •  
  •  
12 changes: 12 additions & 0 deletions .changeset/calendar-react-day-picker-react-19.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
'@toptal/picasso-calendar': patch
'@toptal/picasso': patch
---

### Calendar

- upgrade `react-day-picker` to `^8.10.2`, the first 8.x release that runs under React 19: it admits React 19 in its peer range and imports `react/jsx-runtime` instead of inlining a copy that read React 18 internals. No `Calendar` API or behavior change; it renders identically under React 18

### Picasso

- remove the unused direct `react-day-picker` dependency from `@toptal/picasso`; nothing under the aggregate imports it, and it stays installed transitively via `@toptal/picasso-calendar`
7 changes: 7 additions & 0 deletions .changeset/charts-recharts-react-19.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-charts': patch
---

### Charts

- upgrade `recharts` to `^2.15.4`, the first release that runs under React 19: it admits React 19 in its peer range and no longer relies on `defaultProps` for `XAxis`, `YAxis`, `ReferenceArea` and `ReferenceLine`, which React 19 stops applying on function components. No `LineChart` or `BarChart` API or behavior change
12 changes: 12 additions & 0 deletions .changeset/collapse-tailwind-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
'@toptal/picasso-collapse': minor
---

### Collapse

- drop the react-transition-group dependency, whose `findDOMNode` path React 19 removes, and reimplement on the shared timer-driven `useTransitionStatus` hook. Public props are unchanged
- the expand and collapse animations start about 50 ms sooner: the height handoff runs on the next frame instead of after an internal delay
- the object form of `timeout` now sets the CSS transition duration correctly per direction, including a distinct `appear` duration for the mount transition (previously it produced an invalid inline value)
- unrecognized props (including `data-private`) now reach the rendered DOM node — previously they were silently dropped
- add the `CollapseProps` type export and deprecate the misnamed `FadeProps` re-export (kept as an alias, so no action is required yet)
- prop descriptions are corrected (`children`, `appear` and `onEnter` were stale or wrong) and promoted to JSDoc, so they surface in IDE tooltips and generated docs
24 changes: 24 additions & 0 deletions .changeset/date-fns-v4-upgrade.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
'@toptal/picasso-calendar': major
'@toptal/picasso-date-picker': major
'@toptal/picasso': major
---

### Calendar

- **consumer action** (the reason for the major): `@toptal/picasso-calendar` now installs `date-fns@^4`, while its `react-day-picker@8` dependency still declares a `date-fns ^2 || ^3` peer that no 8.x release widens. npm 7+ and yarn consumers, direct or via `@toptal/picasso`, hit an `ERESOLVE` peer conflict on install until they add an override for `react-day-picker > date-fns` or install with `--legacy-peer-deps`. Runtime is unaffected: react-day-picker reaches date-fns only through named barrel imports, and all 31 functions it uses are unchanged in v4. The peer disappears with the react-day-picker v9 migration (PF-2297)
- upgrade `date-fns` to `^4.1.0`, the range `@base-ui/react` peers
- import `isWeekend` and `isSameMonth` from the `date-fns` barrel; date-fns v3 removed the default export from every submodule, so the old form resolves to `undefined`

### DatePicker

- upgrade `date-fns` to `^4.1.0` and `date-fns-tz` to `^3.2.0`, the first `date-fns-tz` line whose peer range admits date-fns v3 and v4
- rename `utcToZonedTime` to `toZonedTime`, which is what `date-fns-tz@3` calls it. This is internal to `timezoneConvert`; the `timezone` prop behaves exactly as before
- import `parse`, `isValid`, `format`, `isWithinInterval`, `isEqual`, `isBefore` and `isAfter` from the `date-fns` barrel instead of per-function submodules, for the same reason as Calendar
- one absorbed upstream semantic: date-fns v3+ `isWithinInterval` normalizes reversed intervals instead of throwing, so a `DatePicker` given `minDate > maxDate` no longer crashes and treats the interval as swapped

### Picasso

- major for `@toptal/picasso-date-picker` and the `@toptal/picasso` aggregate alongside Calendar: both install `@toptal/picasso-calendar`, so the same install-time peer conflict reaches their consumers, with the same resolution

No other API or behavior change in any package.
8 changes: 8 additions & 0 deletions .changeset/emoji-mart-react-19-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@toptal/picasso-rich-text-editor': patch
---

### RichTextEditor

- drop the `@emoji-mart/react` dependency and render emoji-mart's `Picker` through a local component instead. `@emoji-mart/react` has not been published since January 2023 and its peer range excludes React 19, so no upgrade could unblock React 19; the wrapper was around 20 lines and used no API React 19 removes. `emoji-mart` and `@emoji-mart/data` were already direct dependencies, so nothing is added to the dependency tree
- the local component pushes prop updates into the picker from an effect instead of during render, as the upstream wrapper did
12 changes: 12 additions & 0 deletions .changeset/final-form-v5-upgrade.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
'@toptal/picasso-forms': major
---

### Form

- upgrade the final-form ecosystem to the versions that support React 19: `final-form@^5.0.1`, `final-form-arrays@^4.0.1`, `react-final-form@^7.0.1`, `react-final-form-arrays@^5.0.0` and `react-final-form-listeners@^3.0.1`. The majors are upstream's Flow-to-TypeScript rewrite; the re-exported `FieldArray`, `useFieldArray`, `OnChange`, `OnFocus`, `OnBlur` and `ExternallyChanged` surfaces are unchanged
- **consumer action**: `react-final-form` is a regular dependency of this package and its React context is instance-bound, so apps that also depend on `react-final-form` directly must move to `react-final-form@^7` / `final-form@^5` in the same upgrade. Staying on `^6` yields two library instances, and `useForm`/`useField` used inside a Picasso `<Form>` then throws `"... must be used inside of a <Form> component"`
- `react-final-form@7` derives checkbox/radio `checked` from `parse` instead of `format` — consumers passing `format`/`parse` to `Form.Checkbox` or `Form.Radio` should re-verify checked-state behavior. Hidden checkbox inputs now render `value=""`, so consumer snapshots covering `Form.Checkbox` need a one-time regeneration
- fields register in an effect under `react-final-form@7` and render twice on mount (previously once) — visually inert, but render-count assertions in consumer tests will shift
- `react-final-form-listeners@3.0.1` ships a broken `types` path, corrected by a pnpm patch
- drop the `@types/react-final-form-listeners` dev dependency — the package now ships its own types
11 changes: 11 additions & 0 deletions .changeset/notistack-react-19-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@toptal/picasso': minor
'@toptal/picasso-shared': minor
'@toptal/picasso-provider': patch
'@toptal/picasso-notification': patch
---

### Notification

- upgrade `notistack` from `3.0.1` to `3.0.2`, the first release whose peer range admits React 19. It ships no code changes, so notification behavior and appearance are unchanged
- **consumer action** for `@toptal/picasso` and `@toptal/picasso-shared`: `notistack` is a pinned peer dependency, so consumers must move to `notistack@3.0.2`. The pin stays exact to guarantee a single notistack instance, since `SnackbarProvider` and `useSnackbar` communicate through React context and would not find each other across two copies
7 changes: 7 additions & 0 deletions .changeset/provider-favicon-react-19-head.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-provider': patch
---

### Favicon

- render the favicon `<link>` tags only once their icon URLs have resolved. React 19 decides whether a `<link>` can be hoisted into `<head>` when the element mounts, and a link mounted with an undefined `href` renders in place and stays there even after the href arrives — so under React 19 the favicons never reached the document head. The icons load asynchronously, so the links now mount with their hrefs already set
99 changes: 99 additions & 0 deletions .changeset/react-19-peer-range.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
---
'@topkit/analytics-charts': minor
'@toptal/picasso': minor
'@toptal/picasso-accordion': minor
'@toptal/picasso-account-select': minor
'@toptal/picasso-alert': minor
'@toptal/picasso-amount': minor
'@toptal/picasso-application-update-notification': minor
'@toptal/picasso-autocomplete': minor
'@toptal/picasso-avatar': minor
'@toptal/picasso-avatar-upload': minor
'@toptal/picasso-backdrop': minor
'@toptal/picasso-badge': minor
'@toptal/picasso-breadcrumbs': minor
'@toptal/picasso-button': minor
'@toptal/picasso-calendar': minor
'@toptal/picasso-carousel': minor
'@toptal/picasso-charts': minor
'@toptal/picasso-checkbox': minor
'@toptal/picasso-codemod': minor
'@toptal/picasso-collapse': minor
'@toptal/picasso-container': minor
'@toptal/picasso-date-picker': minor
'@toptal/picasso-date-select': minor
'@toptal/picasso-drawer': minor
'@toptal/picasso-dropdown': minor
'@toptal/picasso-dropzone': minor
'@toptal/picasso-empty-state': minor
'@toptal/picasso-environment-banner': minor
'@toptal/picasso-fade': minor
'@toptal/picasso-file-input': minor
'@toptal/picasso-form': minor
'@toptal/picasso-form-label': minor
'@toptal/picasso-form-layout': minor
'@toptal/picasso-forms': minor
'@toptal/picasso-grid': minor
'@toptal/picasso-helpbox': minor
'@toptal/picasso-icons': minor
'@toptal/picasso-image': minor
'@toptal/picasso-input': minor
'@toptal/picasso-input-adornment': minor
'@toptal/picasso-link': minor
'@toptal/picasso-list': minor
'@toptal/picasso-loader': minor
'@toptal/picasso-logo': minor
'@toptal/picasso-menu': minor
'@toptal/picasso-modal': minor
'@toptal/picasso-modal-context': minor
'@toptal/picasso-note': minor
'@toptal/picasso-notification': minor
'@toptal/picasso-number-input': minor
'@toptal/picasso-outlined-input': minor
'@toptal/picasso-overview-block': minor
'@toptal/picasso-page': minor
'@toptal/picasso-pagination': minor
'@toptal/picasso-paper': minor
'@toptal/picasso-password-input': minor
'@toptal/picasso-pictograms': minor
'@toptal/picasso-popper': minor
'@toptal/picasso-prompt-modal': minor
'@toptal/picasso-provider': minor
'@toptal/picasso-query-builder': minor
'@toptal/picasso-quote': minor
'@toptal/picasso-radio': minor
'@toptal/picasso-rating': minor
'@toptal/picasso-rich-text-editor': minor
'@toptal/picasso-section': minor
'@toptal/picasso-select': minor
'@toptal/picasso-shared': minor
'@toptal/picasso-show-more': minor
'@toptal/picasso-skeleton-loader': minor
'@toptal/picasso-slide': minor
'@toptal/picasso-slider': minor
'@toptal/picasso-step': minor
'@toptal/picasso-switch': minor
'@toptal/picasso-table': minor
'@toptal/picasso-tabs': minor
'@toptal/picasso-tag': minor
'@toptal/picasso-tagselector': minor
'@toptal/picasso-tailwind-merge': minor
'@toptal/picasso-test-utils': minor
'@toptal/picasso-timeline': minor
'@toptal/picasso-timepicker': minor
'@toptal/picasso-tooltip': minor
'@toptal/picasso-tree-view': minor
'@toptal/picasso-typography': minor
'@toptal/picasso-typography-overflow': minor
'@toptal/picasso-user-badge': minor
'@toptal/picasso-utils': minor
---

Allow React 19: the `react` and `react-dom` peer ranges become `^17.0.0 || ^18.0.0 || ^19.0.0` on every Picasso package.

- the `< 19.0.0` cap set in v100 is lifted now that the unit suite runs green on React 19 next to React 18 (`pnpm test:react19`, CI job `react19-validate`), Collapse no longer depends on `react-transition-group`, element refs are read from the location each React major stores them in, and the head-tag rendering React 19 hoists at mount is handled in the provider
- explicit majors rather than an open range, so the next React major stays opted out until it is validated the same way
- the floor stays React 17, the minimum `@base-ui/react` supports; `@toptal/picasso-show-more` joins the uniform range after its earlier uncapped `>=17.0.0`
- the published declarations type-check against `@types/react` 19 as well as 17 and 18: `JSX.Element` (a global React 19's types removed) becomes `React.ReactElement`, refs created with `useRef(null)` are accepted as `RefObject<T | null>`, elements read through `cloneElement` carry the props they are read for, the `content` and `children` HTML attributes no longer collide with Picasso's own props on Accordion, Dropdown, Table.ExpandableRow and Tooltip, and `OverridableComponent` (picasso-shared) returns what the installed React's component types return. `Dropdown` now declares the render-function `children` it already supported, and that function receives `{ open }` (previously the untyped form passed `{ isOpen }`)
- a `@toptal/picasso-shared` names the two element shapes those declarations share, re-exported from `@toptal/picasso`: `IconElement` for the `icon`/`expandIcon`/`image` props that receive an `<Icon />`-like element and add classes to it, and `TransitionChild` for the single child `Fade` and `Slide` clone with transition classes, style and a ref. Existing usages type-check unchanged; the types exist so the same shape is not spelled out on every package. `@toptal/picasso-utils` adds `NullableRefObject<T>`, the ref object `useRef<T>(null)` returns on every `@types/react` major, for refs that are both read and passed to a JSX `ref` prop
- no runtime changes beyond `Form` rendering a function child the way `react-final-form` documents
13 changes: 13 additions & 0 deletions .changeset/react-helmet-async-react-19-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
'@toptal/picasso-provider': minor
'@toptal/picasso-page': patch
---

### Provider

- upgrade `react-helmet-async` from `2.0.3` to `3.0.0`, the only release whose peer range admits React 19. No 2.x release supports it. The public API is unchanged — `Helmet` remains a class component, and `HelmetProvider`, `HelmetData` and the `HelmetProps` type are still exported — and React 16–18 keeps the existing code path, so behavior is unchanged for current consumers
- on React 19, `<Helmet>` renders real DOM elements for React to hoist and `<HelmetProvider>` becomes a transparent passthrough. This changes four behaviors once consumers move to React 19: the SSR `context` object is no longer populated, and `prioritizeSeoTags`, `helmetData` and `canUseDOM` become inert. `htmlAttributes` and `bodyAttributes` continue to work on both code paths

### Page

- declare `react-helmet-async` as a dependency. `Page.Helmet` imported it without declaring it, so the import resolved to whatever copy the consumer happened to hoist — or to none at all. The dependency is now explicit and pinned to the same version the provider uses, which keeps `Page.Helmet` and `<HelmetProvider>` on one instance
7 changes: 7 additions & 0 deletions .changeset/rte-emoji-picker-keyup-listener-leak.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-rich-text-editor': patch
---

### RichTextEditor

- fix accumulating `keyup` listeners on `document.body` — the emoji picker's escape-key cleanup passed a new function reference to `removeEventListener`, so every time the picker opened another permanent listener was left behind
14 changes: 14 additions & 0 deletions .changeset/show-more-css-line-clamp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
'@toptal/picasso-show-more': minor
'@toptal/picasso': patch
---

### ShowMore

- replace the unmaintained `react-truncate` dependency (last published 2018, React peer locked to `<= 16`) with a dependency-free CSS `line-clamp` implementation; the public API is unchanged and the toggle still appears only when content actually overflows
- the SSR output now contains the full text already clamped by CSS, where previously the text was truncated only client-side after measurement
- collapsed content now keeps the full text in the DOM (clamping is visual), so it stays selectable, findable and queryable in tests

### Picasso

- remove the unused `react-truncate` dependency
Loading
Loading