From e93f40bf03c4ea943ff9561c2dd032125a05ffc1 Mon Sep 17 00:00:00 2001 From: Javier Delgado Date: Tue, 3 Mar 2026 15:19:36 -0300 Subject: [PATCH] [CPS-2606] Migrate to Tailwind 4 --- .changeset/sharp-cases-cry.md | 52 +++ .nvmrc | 1 + .storybook/main.js | 5 +- .storybook/styles.css | 7 +- cypress.config.mjs | 5 +- cypress/assets/tailwind.css | 7 +- package.json | 5 +- packages/base-tailwind/package.json | 4 +- packages/base-tailwind/src/index.js | 8 +- .../Accordion/src/Accordion/Accordion.tsx | 4 +- .../src/Accordion/__snapshots__/test.tsx.snap | 25 +- .../AccountSelect/__snapshots__/test.tsx.snap | 14 +- .../src/Alert/__snapshots__/test.tsx.snap | 4 +- .../Autocomplete/__snapshots__/test.tsx.snap | 50 +-- .../AvatarEditContainer.tsx | 2 +- .../AvatarDropzoneSvg/AvatarDropzoneSvg.tsx | 3 +- .../src/AvatarUpload/AvatarUpload.tsx | 2 +- .../AvatarUpload/__snapshots__/test.tsx.snap | 2 +- packages/base/Backdrop/package.json | 3 +- .../base/Backdrop/src/Backdrop/Backdrop.tsx | 4 +- packages/base/Backdrop/src/Backdrop/test.tsx | 4 +- packages/base/Badge/src/Badge/Badge.tsx | 2 +- .../src/Badge/__snapshots__/test.tsx.snap | 4 +- .../src/Button/__snapshots__/test.tsx.snap | 4 +- .../ButtonBase/__snapshots__/test.tsx.snap | 22 +- packages/base/Button/src/ButtonBase/styles.ts | 2 +- .../__snapshots__/test.tsx.snap | 2 +- .../ButtonGroup/__snapshots__/test.tsx.snap | 6 +- .../ButtonRadio/__snapshots__/test.tsx.snap | 2 +- .../ButtonSplit/__snapshots__/test.tsx.snap | 4 +- .../src/Calendar/__snapshots__/test.tsx.snap | 88 ++-- .../Calendar/src/CalendarDay/CalendarDay.tsx | 2 +- packages/base/Collapse/package.json | 3 +- .../DatePicker/src/DatePicker/DatePicker.tsx | 2 +- .../DatePicker/__snapshots__/test.tsx.snap | 2 +- .../MonthSelect/__snapshots__/test.tsx.snap | 2 +- .../YearSelect/__snapshots__/test.tsx.snap | 14 +- .../src/Dropdown/__snapshots__/test.tsx.snap | 16 +- packages/base/Fade/package.json | 3 +- .../src/FileInput/__snapshots__/test.tsx.snap | 4 +- .../src/FileList/__snapshots__/test.tsx.snap | 2 +- .../src/FileListItem/FileListItem.tsx | 1 + .../FileListItem/__snapshots__/test.tsx.snap | 4 +- .../src/FormError/__snapshots__/test.tsx.snap | 2 +- .../FormWarning/__snapshots__/test.tsx.snap | 2 +- .../src/Helpbox/__snapshots__/test.tsx.snap | 2 +- .../src/Input/__snapshots__/test.tsx.snap | 20 +- .../src/InputAdornment/InputAdornment.tsx | 5 +- packages/base/Link/src/Link/Link.tsx | 6 +- .../Link/src/Link/__snapshots__/test.tsx.snap | 8 +- packages/base/Link/src/Link/test.tsx | 4 +- packages/base/Menu/src/Menu/Menu.tsx | 2 +- .../Menu/src/Menu/__snapshots__/test.tsx.snap | 6 +- packages/base/Menu/src/MenuItem/MenuItem.tsx | 2 +- .../src/MenuItem/__snapshots__/test.tsx.snap | 12 +- .../src/Modal/__snapshots__/test.tsx.snap | 32 +- .../base/Modal/src/ModalPaper/ModalPaper.tsx | 2 +- .../__snapshots__/test.tsx.snap | 24 +- .../NumberInput/__snapshots__/test.tsx.snap | 4 +- .../src/OutlinedInput/stylesInput.ts | 2 +- .../src/OverviewBlock/OverviewBlock.tsx | 4 +- .../__snapshots__/test.tsx.snap | 6 +- .../base/Page/src/PageFooter/PageFooter.tsx | 2 +- packages/base/Page/src/PageFooter/styles.ts | 4 +- .../PageSidebar/__snapshots__/test.tsx.snap | 6 +- .../PageTopBar/__snapshots__/test.tsx.snap | 2 +- .../src/PageTopBarMenu/PageTopBarMenu.tsx | 2 +- .../__snapshots__/test.tsx.snap | 2 +- .../SidebarItem/__snapshots__/test.tsx.snap | 143 +++--- .../base/Page/src/SidebarLogo/SidebarLogo.tsx | 2 +- .../SidebarLogo/__snapshots__/test.tsx.snap | 2 +- .../base/Page/src/SidebarMenu/SidebarMenu.tsx | 2 +- .../SidebarMenu/__snapshots__/test.tsx.snap | 4 +- .../base/Page/src/TopBarItem/TopBarItem.tsx | 2 +- .../Pagination/src/Pagination/Pagination.tsx | 6 +- .../Pagination/__snapshots__/test.tsx.snap | 44 +- packages/base/Paper/package.json | 3 +- .../PromptModal/__snapshots__/test.tsx.snap | 24 +- .../src/Section/__snapshots__/test.tsx.snap | 4 +- .../NativeSelect/__snapshots__/test.tsx.snap | 4 +- .../__snapshots__/test.tsx.snap | 18 +- .../__snapshots__/test.tsx.snap | 2 +- .../__snapshots__/test.tsx.snap | 2 +- .../__snapshots__/test.tsx.snap | 4 +- .../__snapshots__/test.tsx.snap | 28 +- .../ScrollMenu/__snapshots__/test.tsx.snap | 8 +- .../src/ShowMore/__snapshots__/test.tsx.snap | 12 +- packages/base/Slide/package.json | 3 +- packages/base/Step/package.json | 1 - .../TableExpandableRow/TableExpandableRow.tsx | 5 +- .../__snapshots__/test.tsx.snap | 4 +- packages/base/Tabs/src/Tab/Tab.tsx | 4 +- .../Tabs/src/Tab/__snapshots__/test.tsx.snap | 6 +- .../Tabs/src/Tabs/__snapshots__/test.tsx.snap | 24 +- .../Tag/src/Tag/__snapshots__/test.tsx.snap | 10 +- .../src/TagGroup/__snapshots__/test.tsx.snap | 8 +- .../__snapshots__/test.tsx.snap | 2 +- .../TagSelector/__snapshots__/test.tsx.snap | 16 +- .../src/TagSelectorInput/TagSelectorInput.tsx | 2 +- .../__snapshots__/test.tsx.snap | 4 +- .../base/Test-Utils/src/test-utils/styles.css | 7 +- .../Timepicker/src/TimePicker/TimePicker.tsx | 2 +- .../TimePicker/__snapshots__/test.tsx.snap | 4 +- packages/base/Typography/package.json | 3 +- .../Typography/src/Typography/Typography.tsx | 4 +- .../utils/Modal/__snapshots__/test.tsx.snap | 22 +- .../src/Form/__snapshots__/test.tsx.snap | 8 +- .../RichTextEditorButton.tsx | 2 +- packages/picasso-tailwind/package.json | 4 +- packages/picasso-tailwind/src/index.js | 1 - packages/picasso/README.md | 18 +- tailwind.config.js | 3 - yarn.lock | 419 +++++++++++------- 113 files changed, 829 insertions(+), 636 deletions(-) create mode 100644 .changeset/sharp-cases-cry.md create mode 100644 .nvmrc diff --git a/.changeset/sharp-cases-cry.md b/.changeset/sharp-cases-cry.md new file mode 100644 index 0000000000..c72259b478 --- /dev/null +++ b/.changeset/sharp-cases-cry.md @@ -0,0 +1,52 @@ +--- +'@toptal/picasso-rich-text-editor': major +'@toptal/picasso-input-adornment': major +'@toptal/picasso-account-select': major +'@toptal/picasso-outlined-input': major +'@toptal/picasso-overview-block': major +'@toptal/picasso-autocomplete': major +'@toptal/picasso-avatar-upload': major +'@toptal/picasso-notification': major +'@toptal/picasso-number-input': major +'@toptal/picasso-prompt-modal': major +'@toptal/picasso-tagselector': major +'@toptal/picasso-tailwind': major +'@toptal/picasso-date-picker': major +'@toptal/picasso-date-select': major +'@toptal/picasso-pagination': major +'@toptal/picasso-test-utils': major +'@toptal/picasso-timepicker': major +'@toptal/picasso-typography': major +'@toptal/picasso-accordion': major +'@toptal/picasso-file-input': major +'@toptal/base-tailwind': major +'@toptal/picasso-backdrop': major +'@toptal/picasso-calendar': major +'@toptal/picasso-dropdown': major +'@toptal/picasso-show-more': major +'@toptal/picasso-forms': major +'@toptal/picasso-helpbox': major +'@toptal/picasso-section': major +'@toptal/picasso-avatar': major +'@toptal/picasso-button': major +'@toptal/picasso-select': major +'@toptal/picasso-slider': major +'@toptal/picasso-alert': major +'@toptal/picasso-badge': major +'@toptal/picasso-input': major +'@toptal/picasso-modal': major +'@toptal/picasso-table': major +'@toptal/picasso-utils': major +'@toptal/picasso-form': major +'@toptal/picasso-link': major +'@toptal/picasso-menu': major +'@toptal/picasso-page': major +'@toptal/picasso-tabs': major +'@toptal/picasso-tag': major +--- + +Upgraded Tailwind CSS from v3 to v4: + +- updated `tailwindcss` peer dependency from `^3.4.10` to `^4.2.1` +- updated deprecated utility classes +- min node version is 20 or higher diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000..2edeafb09d --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20 \ No newline at end of file diff --git a/.storybook/main.js b/.storybook/main.js index 34f626c3da..e3fea671e0 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -73,10 +73,7 @@ module.exports = { postcssOptions: { config: false, plugins: { - tailwindcss: { - config: require.resolve('../tailwind.config.js'), - }, - autoprefixer: {}, + '@tailwindcss/postcss': {}, }, }, }, diff --git a/.storybook/styles.css b/.storybook/styles.css index b5c61c9567..11e7ce9e76 100644 --- a/.storybook/styles.css +++ b/.storybook/styles.css @@ -1,3 +1,4 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@layer theme, base, components; +@import 'tailwindcss/theme.css' layer(theme); +@import 'tailwindcss/utilities.css'; +@config "../tailwind.config.js"; diff --git a/cypress.config.mjs b/cypress.config.mjs index 32880f7255..85e86972ca 100644 --- a/cypress.config.mjs +++ b/cypress.config.mjs @@ -65,10 +65,7 @@ export default defineConfig({ postcssOptions: { config: false, plugins: { - tailwindcss: { - config: './tailwind.config.js', - }, - autoprefixer: {}, + '@tailwindcss/postcss': {}, }, }, }, diff --git a/cypress/assets/tailwind.css b/cypress/assets/tailwind.css index b5c61c9567..7a56098bf1 100644 --- a/cypress/assets/tailwind.css +++ b/cypress/assets/tailwind.css @@ -1,3 +1,4 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@layer theme, base, components; +@import 'tailwindcss/theme.css' layer(theme); +@import 'tailwindcss/utilities.css'; +@config "../../tailwind.config.js"; diff --git a/package.json b/package.json index 6664530444..838789fae0 100644 --- a/package.json +++ b/package.json @@ -191,7 +191,8 @@ "react-test-renderer": "^19.2.0", "remark-gfm": "^4.0.0", "syncpack": "^13.0.2", - "tailwindcss": "^3.4.10", + "tailwindcss": "^4.2.1", + "@tailwindcss/postcss": "^4.2.1", "thread-loader": "^4.0.2", "ts-loader": "^9.5.1", "ts-node": "^10.9.2", @@ -205,7 +206,7 @@ "@nx/js": "21.5.1" }, "engines": { - "node": ">=18" + "node": ">=20" }, "files": [ "src" diff --git a/packages/base-tailwind/package.json b/packages/base-tailwind/package.json index 96a7274eb7..38c54f51fb 100644 --- a/packages/base-tailwind/package.json +++ b/packages/base-tailwind/package.json @@ -24,10 +24,10 @@ "prepublishOnly": "yarn build:package" }, "devDependencies": { - "tailwindcss": "^3.4.10" + "tailwindcss": "^4.2.1" }, "peerDependencies": { - "tailwindcss": "^3.4.10" + "tailwindcss": "^4.2.1" }, "sideEffects": false, "files": [ diff --git a/packages/base-tailwind/src/index.js b/packages/base-tailwind/src/index.js index 71a8f2c911..3a707f60c9 100644 --- a/packages/base-tailwind/src/index.js +++ b/packages/base-tailwind/src/index.js @@ -1,4 +1,10 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - theme: {}, + theme: { + extend: { + lineHeight: { + 5: '1.25rem', + }, + }, + }, } diff --git a/packages/base/Accordion/src/Accordion/Accordion.tsx b/packages/base/Accordion/src/Accordion/Accordion.tsx index 5dc151e139..7e44bfa7e6 100644 --- a/packages/base/Accordion/src/Accordion/Accordion.tsx +++ b/packages/base/Accordion/src/Accordion/Accordion.tsx @@ -145,7 +145,9 @@ export const Accordion = forwardRef(function Accordion( > {children} {expandIcon ? ( - decorateWithExpandIconClasses(expandIcon, expandIconClass) + ) : (
- +

user-profile-picture.png

diff --git a/packages/base/FileInput/src/FileListItem/FileListItem.tsx b/packages/base/FileInput/src/FileListItem/FileListItem.tsx index c4de287595..b0d53ba107 100644 --- a/packages/base/FileInput/src/FileListItem/FileListItem.tsx +++ b/packages/base/FileInput/src/FileListItem/FileListItem.tsx @@ -98,6 +98,7 @@ const FileListItem = ({ file, index, disabled, onRemove, testIds }: Props) => { content={error ? 'Dismiss' : 'Remove File'} >

user-profile-picture.png

@@ -40,7 +40,7 @@ exports[`FileListItem renders 1`] = `