Charles Bochet
9d57bc39e5
Migrate from ESLint to OxLint ( #18443 )
...
## Summary
Fully replaces ESLint with OxLint across the entire monorepo:
- **Replaced all ESLint configs** (`eslint.config.mjs`) with OxLint
configs (`.oxlintrc.json`) for every package: `twenty-front`,
`twenty-server`, `twenty-emails`, `twenty-ui`, `twenty-shared`,
`twenty-sdk`, `twenty-zapier`, `twenty-docs`, `twenty-website`,
`twenty-apps/*`, `create-twenty-app`
- **Migrated custom lint rules** from ESLint plugin format to OxLint JS
plugin system (`@oxlint/plugins`), including
`styled-components-prefixed-with-styled`, `no-hardcoded-colors`,
`sort-css-properties-alphabetically`,
`graphql-resolvers-should-be-guarded`,
`rest-api-methods-should-be-guarded`, `max-consts-per-file`, and
Jotai-related rules
- **Migrated custom rule tests** from ESLint `RuleTester` + Jest to
`oxlint/plugins-dev` `RuleTester` + Vitest
- **Removed all ESLint dependencies** from `package.json` files and
regenerated lockfiles
- **Updated Nx targets** (`lint`, `lint:diff-with-main`, `fmt`) in
`nx.json` and per-project `project.json` to use `oxlint` commands with
proper `dependsOn` for plugin builds
- **Updated CI workflows** (`.github/workflows/ci-*.yaml`) — no more
ESLint executor
- **Updated IDE setup**: replaced `dbaeumer.vscode-eslint` with
`oxc.oxc-vscode` extension, configured `source.fixAll.oxc` and
format-on-save with Prettier
- **Replaced all `eslint-disable` comments** with `oxlint-disable`
equivalents across the codebase
- **Updated docs** (`twenty-docs`) to reference OxLint instead of ESLint
- **Renamed** `twenty-eslint-rules` package to `twenty-oxlint-rules`
### Temporarily disabled rules (tracked in `OXLINT_MIGRATION_TODO.md`)
| Rule | Package | Violations | Auto-fixable |
|------|---------|-----------|-------------|
| `twenty/sort-css-properties-alphabetically` | twenty-front | 578 | Yes
|
| `typescript/consistent-type-imports` | twenty-server | 3814 | Yes |
| `twenty/max-consts-per-file` | twenty-server | 94 | No |
### Dropped plugins (no OxLint equivalent)
`eslint-plugin-project-structure`, `lingui/*`, `@stylistic/*`,
`import/order`, `prefer-arrow/prefer-arrow-functions`,
`eslint-plugin-mdx`, `@next/eslint-plugin-next`,
`eslint-plugin-storybook`, `eslint-plugin-react-refresh`. Partial
coverage for `jsx-a11y` and `unused-imports`.
### Additional fixes (pre-existing issues exposed by merge)
- Fixed `EmailThreadPreview.tsx` broken import from main rename
(`useOpenEmailThreadInSidePanel`)
- Restored truthiness guard in `getActivityTargetObjectRecords.ts`
- Fixed `AgentTurnResolver` return types to match entity (virtual
`fileMediaType`/`fileUrl` are resolved via `@ResolveField()`)
## Test plan
- [x] `npx nx lint twenty-front` passes
- [x] `npx nx lint twenty-server` passes
- [x] `npx nx lint twenty-docs` passes
- [x] Custom oxlint rules validated with Vitest: `npx nx test
twenty-oxlint-rules`
- [x] `npx nx typecheck twenty-front` passes
- [x] `npx nx typecheck twenty-server` passes
- [x] CI workflows trigger correctly with `dependsOn:
["twenty-oxlint-rules:build"]`
- [x] IDE linting works with `oxc.oxc-vscode` extension
2026-03-06 01:03:50 +01:00
nitin
5853891b02
refactor!: rename Command Menu page/navigation layer to Side Panel ( #18393 )
2026-03-05 15:46:31 +01:00
Charles Bochet
647c32ff3e
Deprecate runtime theme objects in favor of CSS variables ( #18402 )
...
## Summary
- **Eliminate `ICON_SIZES` / `ICON_STROKES` constants**: all icon
dimensions are now resolved at runtime via
`resolveThemeVariableAsNumber(themeCssVariables.icon.size.X)`, ensuring
values always come from computed CSS variables
- **No more consumer imports from `twenty-ui/theme`**: moved
`ColorSchemeContext`, `ColorSchemeProvider`, `ThemeColor`,
`MAIN_COLOR_NAMES`, `getNextThemeColor`, `AnimationDuration` to
`twenty-ui/theme-constants`
- **Remove `ThemeContext` / `ThemeContextProvider` / `ThemeProvider` /
`ThemeType`**: replaced across ~300 files with `themeCssVariables` (for
CSS contexts) or `resolveThemeVariable` / `resolveThemeVariableAsNumber`
(for JS runtime values)
- **Simplify provider chain**: only `ColorSchemeProvider` remains — it
toggles `light`/`dark` class on `document.documentElement` and provides
`colorScheme` via React context
- **Fix pre-existing test failures**: `useIcons.test.ts`
(non-configurable ES module spy) and
`turnRecordFilterGroupIntoGqlOperationFilter.test.ts`
(`Omit<RecordFilter, 'id'>` type mismatch)
### Theme access pattern (before → after)
| Context | Before | After |
|---------|--------|-------|
| CSS (Linaria) | `${({ theme }) => theme.font.color.primary}` |
`${themeCssVariables.font.color.primary}` |
| JS runtime (icon size, animation) | `theme.icon.size.md` /
`ICON_SIZES.md` |
`resolveThemeVariableAsNumber(themeCssVariables.icon.size.md)` |
| Color scheme check | `theme.name === 'dark'` |
`useContext(ColorSchemeContext).colorScheme === 'dark'` |
2026-03-05 14:39:01 +01:00
Charles Bochet
3bfdc2c83f
chore(twenty-front): migrate command-menu, workflow, page-layout and UI modules from Emotion to Linaria (PR 4-6/10) ( #18342 )
...
## Summary
Continues the Emotion → Linaria migration (PR 4-6 from the [migration
plan](docs/emotion-to-linaria-migration-plan.md)). Migrates **311
files** across four module groups:
| Module | Files |
|---|---|
| command-menu | 53 |
| workflow | 84 |
| page-layout | 84 |
| UI (partial - first ~80 files) | ~80 |
| twenty-ui (TEXT_INPUT_STYLE) | 1 |
| misc (hooks, keyboard-shortcut-menu, file-upload) | ~9 |
### Migration patterns applied
- `import styled from '@emotion/styled'` → `import { styled } from
'@linaria/react'`
- `import { useTheme } from '@emotion/react'` → `import { useContext }
from 'react'` + `import { ThemeContext } from 'twenty-ui/theme'`
- `${({ theme }) => theme.X.Y.Z}` → `${themeCssVariables.X.Y.Z}` (static
CSS variables)
- `theme.spacing(N)` → `themeCssVariables.spacing[N]`
- `styled(motion.div)` → `motion.create(StyledBase)` (11 components)
- `styled(Component)<TypeParams>` → wrapper div approach for non-HTML
elements
- Multi-declaration interpolations split into one CSS property per
interpolation
- Interpolation return types fixed (`&&` → ternary `? : ''`)
- `TEXT_INPUT_STYLE` converted from function to static string constant
(backward compatible)
- Emotion `<Global>` replaced with `useEffect` style injection
- Complex runtime-dependent styles use CSS custom properties via
`style={}` prop
### After this PR
- **Remaining files**: ~400 (object-record: ~160, settings: ~200, UI:
~44)
- **No breaking changes**: CSS variables resolve identically to the
previous Emotion theme values
2026-03-03 16:42:03 +01:00
Charles Bochet
802a5b0af6
chore(twenty-front): migrate auth, activities, AI, pages and small modules from Emotion to Linaria (PR 2-3/10) ( #18328 )
...
## Summary
- Migrate ~200 files from `@emotion/styled` / `@emotion/react` to
`@linaria/react` + `themeCssVariables`, continuing the zero-runtime
CSS-in-JS migration (PR 2-3 of the [migration
plan](docs/emotion-to-linaria-migration-plan.md))
- Modules covered: **auth** (19), **activities** (53), **ai** (30),
**pages** (70), **action-menu** (3), **object-metadata** (4),
**onboarding** (2), **workspace** (2), **file** (3), **error-handler**
(2), **front-components** (1), **geo-map** (1), **loading** (5),
**testing** (5), plus a `style` prop addition to `TableRow`
- Handles `styled(FunctionComponent)<Props>` incompatibility with
Linaria by using CSS custom properties via `style` + `var()` references
## Test plan
- [x] `npx nx lint:diff-with-main twenty-front` passes
- [x] `npx nx typecheck twenty-front` passes
- [ ] Visual spot-check of auth, onboarding, settings, activities, and
AI chat screens
- [ ] No remaining `@emotion/styled` or `@emotion/react` imports in
migrated files
Made with [Cursor](https://cursor.com )
2026-03-03 11:17:47 +01:00
Raphaël Bosi
198bf5a333
Complete color refactoring ( #15414 )
...
# Complete color refactoring
Closes https://github.com/twentyhq/core-team-issues/issues/1779
- Updated all colors to use Radix colors with P3 color space allowing
for brighter colors
- Created our own gray scale interpolated on Radix's scale to have the
same values for grays as the old ones in the app
- Introduced dark and light colors as well as there transparent versions
- Added many new colors from radix that can be used in the tags or in
the graphs
- Updated multiple color utilities to match new behaviors
- Changed the computation of Avatar colors to return only colors from
the theme (before it was random hsl)
These changes allow the user to use new colors in tags or charts, the
colors are brighter and with better contrast. We have a full range of
color variations from 1 to 12 where before we only had 4 adaptative
colors.
All these changes will allow us to develop custom themes for the user
soon, where users can choose their accent colors, background colors and
there contrast.
2025-10-29 18:08:51 +00:00
Charles Bochet
b14063fe06
Re-add prettier ( #13812 )
...
Re add prettier in eslint.configs
2025-08-11 14:10:04 +02:00
Félix Malfait
464a480043
Continue ESLINT9 Migration ( #13795 )
...
Might already fix #13793
2025-08-10 23:25:58 +02:00
Etienne
76a8a644a2
fix mail thread design ( #12167 )
...
## Before
METADATA
<img width="400" alt="Screenshot 2025-05-21 at 11 34 51"
src="https://github.com/user-attachments/assets/b057dd3f-3ba1-4597-86a4-84157941f10a "
/>
SUBJECT
<img width="400" alt="Screenshot 2025-05-21 at 11 34 38"
src="https://github.com/user-attachments/assets/c41bc102-a84d-443f-bf8c-a77ca9eacd2c "
/>
SHARE_EVERYTHING
<img width="400" alt="Screenshot 2025-05-21 at 11 34 04"
src="https://github.com/user-attachments/assets/0ed39c88-3516-4ebf-9950-5ceabbc38f13 "
/>
## After
SHARE_EVERYTHING
<img width="400" alt="Screenshot 2025-05-21 at 11 29 18"
src="https://github.com/user-attachments/assets/72efbf0f-021b-4012-8516-8b7b8318a1e8 "
/>
METADAT
<img width="400" alt="Screenshot 2025-05-21 at 11 28 49"
src="https://github.com/user-attachments/assets/73065e89-c5ab-4938-ae71-e557aa3fe8f3 "
/>
SUBJECT
<img width="400" alt="Screenshot 2025-05-21 at 11 28 35"
src="https://github.com/user-attachments/assets/10487afb-602d-41fc-bb66-15d71e2fb90f "
/>
Design :
https://www.figma.com/design/xt8O9mFeLl46C5InWwoMrN/Twenty?node-id=23338-52430&t=9NbeB5idQaaOWPAq-0
2025-05-21 12:07:17 +02:00
Harshit Rai Verma
d34ec7b253
Fix: "Not shared" label not visible due to extra long email subject ( #11492 )
...
Closes #11408
- Added `min-width: 100px` in `EmailThreadNotShared`
- Added `isShared` prop to `StyledSubject` for better subject handling
in shared visibility scenarios
---------
Co-authored-by: Félix Malfait <felix.malfait@gmail.com >
Co-authored-by: Félix Malfait <felix@twenty.com >
2025-04-11 10:13:33 +02:00
Paul Rastoin
4a4e65fe4a
[REFACTOR] Twenty UI multi barrel ( #11301 )
...
# Introduction
closes https://github.com/twentyhq/core-team-issues/issues/591
Same than for `twenty-shared` made in
https://github.com/twentyhq/twenty/pull/11083 .
## TODO
- [x] Manual migrate twenty-website twenty-ui imports
## What's next:
- Generate barrel and migration script factorization within own package
+ tests
- Refactoring using preconstruct ? TimeBox
- Lint circular dependencies
- Lint import from barrel and forbid them
### Preconstruct
We need custom rollup plugins addition, but preconstruct does not expose
its rollup configuration. It might be possible to handle this using the
babel overrides. But was a big tunnel.
We could give it a try afterwards ! ( allowing cjs interop and stuff
like that )
Stuck to vite lib app
Closed related PRs:
- https://github.com/twentyhq/twenty/pull/11294
- https://github.com/twentyhq/twenty/pull/11203
2025-04-03 09:47:55 +00:00
Raphaël Bosi
2680f1d6be
583 refactor useCommandMenu hook ( #10984 )
...
Closes https://github.com/twentyhq/core-team-issues/issues/583
- Split hook into smaller hooks
- Create tests
2025-03-18 15:37:28 +01:00
Raphaël Bosi
daa501549e
271 remove is command menu v2 enabled ( #10809 )
...
Closes https://github.com/twentyhq/core-team-issues/issues/271
This PR
- Removes the feature flag IS_COMMAND_MENU_V2_ENABLED
- Removes all old Right drawer components
- Removes the Action menu bar
- Removes unused Copilot page
2025-03-12 16:26:29 +01:00
Raphaël Bosi
e86116aa57
491 save the page component instance id for side panel navigation ( #10700 )
...
Closes https://github.com/twentyhq/core-team-issues/issues/491
This PR:
- Duplicates the right drawer pages for the command menu and replace all
the states used in these pages by component states (The right drawer
pages will be deleted when we deprecate the command menu v1)
- Wraps those pages into a component instance provider
- We store the component instance id upon navigation to restore the
states when we navigate back to a page
The only pages which are not updated for now are the pages related to
the workflow objects, this will be done in another PR.
In another PR, to improve the navigation experience I will replace the
icons and titles of the chips by the label identifier and the avatar if
the page is a record page.
https://github.com/user-attachments/assets/a76d3345-01f3-4db9-8a55-331cca8b87e0
---------
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com >
2025-03-06 17:09:40 +01:00
Etienne
e1731bb31e
chore: update codegen config for enum naming convention ( #9751 )
...
Co-authored-by: etiennejouan <jouan.etienne@gmail.com >
2025-01-21 11:34:33 +01:00
sid0-0
7b7c67fb64
fix: Handling filename overflow in mobile viewports ( #7364 )
...
Fixes #7330
Fixes https://github.com/twentyhq/twenty/issues/7516
<div style="display: flex">
<img style="max-width:50%"
src="https://github.com/user-attachments/assets/51027a9d-8745-4cc7-9f17-4000e3615e44 "/>
<img style="max-width:50%"
src="https://github.com/user-attachments/assets/827f69ba-c581-402f-9498-6b1a4dde7b69 "/>
</div>
---------
Co-authored-by: sid0-0 <a@b.com >
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com >
2024-10-10 10:12:38 +02:00
Raphaël Bosi
20d06b3c0f
7182 person avatar is not the same color in emails and calendar ( #7185 )
...
Fixes #7182 and displayName in calendar
2024-09-21 00:35:39 +02:00
gitstart-app[bot]
fed12ddfcd
Improve performance of demo workspace - Rename getImageAbsoluteURIOrBase64 function ( #6282 )
...
### Description
1. This PR is a continuation of a previous PR:
https://github.com/twentyhq/twenty/pull/6201#pullrequestreview-2175601222
2. One test case was removed here:
`packages/twenty-front/src/utils/image/__tests__/getImageAbsoluteURI.test.ts`
because since we are not handling base64 images anymore, the result is
the same of the last test case. Would you rather we update the test
instead?
### Refs
- #3514
- https://github.com/twentyhq/twenty/pull/6201
### Demo
https://www.loom.com/share/4f32b535c77a4d418e319b095d09452c?sid=df34adf8-b013-44ef-b794-d54846f52d2d
Fixes #3514
---------
Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com >
2024-07-29 14:07:21 +02:00
Lucas Bordeau
03b3c8a67a
Refactored all FieldDisplay types for performance optimization ( #5768 )
...
This PR is the second part of
https://github.com/twentyhq/twenty/pull/5693 .
It optimizes all remaining field types.
The observed improvements are :
- x2 loading time improvement on table rows
- more consistent render time
Here's a summary of measured improvements, what's given here is the
average of hundreds of renders with a React Profiler component. (in our
Storybook performance stories)
| Component | Before (µs) | After (µs) |
| ----- | ------------- | --- |
| TextFieldDisplay | 127 | 83 |
| EmailFieldDisplay | 117 | 83 |
| NumberFieldDisplay | 97 | 56 |
| DateFieldDisplay | 240 | 52 |
| CurrencyFieldDisplay | 236 | 110 |
| FullNameFieldDisplay | 131 | 85 |
| AddressFieldDisplay | 118 | 81 |
| BooleanFieldDisplay | 130 | 100 |
| JSONFieldDisplay | 248 | 49 |
| LinksFieldDisplay | 1180 | 140 |
| LinkFieldDisplay | 140 | 78 |
| MultiSelectFieldDisplay | 770 | 130 |
| SelectFieldDisplay | 230 | 87 |
2024-06-12 18:36:25 +02:00
martmull
9f6a6c3282
5622 add a syncemail onboarding step ( #5689 )
...
- add sync email onboarding step
- refactor calendar and email visibility enums
- add a new table `keyValuePair` in `core` schema
- add a new resolved boolean field `skipSyncEmail` in current user
https://github.com/twentyhq/twenty/assets/29927851/de791475-5bfe-47f9-8e90-76c349fba56f
2024-06-05 18:16:53 +02:00
Abdullah
cfd83d6b8e
[UI] Remove theme constants from twenty-front and use the ones exported from twenty-ui. ( #5558 )
...
Some parts of the Frontend used theme constants exported from
`modules/ui` while other parts used theme constants exported from
`twenty-ui`.
This PR centralizes theme constants by removing them from `modules/ui`
completely.
2024-05-25 16:09:25 +02:00
Thaïs
b6d0b8a895
refactor: move Checkmark, Avatar, Chip and Tooltip to twenty-ui ( #4946 )
...
Split from https://github.com/twentyhq/twenty/pull/4518
Part of #4766
2024-04-15 12:05:06 +02:00
Charles Bochet
cfb0cce9b8
Refactor Views by cleaning the code, relying on apolloCache and improving performances ( #4516 )
...
* Wip refactoring view
* Post merge conflicts
* Fix review
* Add create view capability
* Fix create object missing view
* Fix tests
2024-03-20 14:21:58 +01:00
gitstart-app[bot]
872fb2bd49
TWNTY-4450 - Add tests for /modules/activities/emails ( #4520 )
...
* Add tests for `/modules/activities/emails`
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: Thiago Nascimbeni <tnascimbeni@gmail.com >
* Fix tests
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: Thiago Nascimbeni <tnascimbeni@gmail.com >
* Remove temporary changes
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: Thiago Nascimbeni <tnascimbeni@gmail.com >
---------
Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com >
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: Thiago Nascimbeni <tnascimbeni@gmail.com >
2024-03-18 17:10:07 +01:00
Hyunsu Joo
e8e5af6fcb
fix: Close the email side panel upon clicking an open email thread ( #4329 )
...
* fix: state consistency issue while closing the email thread right drawer (#4205 )
* Refactored to use useRecoilCallback in RightDrawer open/close hook
* - registered an email drawer click outside callback to memorize the thread id when drawer was closed
- added a state to memorize then event that triggered right drawer close
- added a predicate that checks if event that close email thread right drawer is not the same that the open email thread click event AND that the thread that we want to open is not the thread that is just being closed.
---------
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com >
2024-03-14 18:11:27 +01:00
gitstart-app[bot]
f543191552
TWNTY-3825 - ESLint rule: const naming ( #4171 )
...
* ESLint rule: const naming
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: KlingerMatheus <klinger.matheus@gitstart.dev >
* Refactor according to review
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: KlingerMatheus <klinger.matheus@gitstart.dev >
* refactor: Reverts changes on `twenty-server`
Co-authored-by: KlingerMatheus <klinger.matheus@gitstart.dev >
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
---------
Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com >
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: KlingerMatheus <klinger.matheus@gitstart.dev >
2024-02-25 13:52:48 +01:00
bosiraphael
2ba9a209e8
3804 use email visibility to display only the shared information frontend ( #3875 )
...
* create and use component
* visibility working
* Fix click behavior for email thread previews
* Add dynamic styling to EmailThreadPreview component
* refactor to respect the convention
2024-02-08 17:49:29 +01:00
Thomas Trompette
389c263e2e
Design fixes + hide email tab if not a company or a person ( #3720 )
...
Design fixes + hide email tab
Co-authored-by: Thomas Trompette <thomast@twenty.com >
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com >
2024-01-31 16:55:04 +01:00
Thomas Trompette
511627ccb8
Fix count avatar color + align thread preview items ( #3695 )
...
Fix count avatar and align items
Co-authored-by: Thomas Trompette <thomast@twenty.com >
2024-01-30 15:01:12 +01:00
Thomas Trompette
96bcddc056
Add participant avatars + remove tbody from fetchMore loader ( #3679 )
...
* Add participant avatars + remove tbody from fetchMore loader
* Update sender names
---------
Co-authored-by: Thomas Trompette <thomast@twenty.com >
2024-01-30 10:47:15 +01:00
bosiraphael
6004969096
3263 modify timeline messagingservice to allow the frontend to get multiple participants in a thread ( #3611 )
...
* wip
* wip
* add pagination
* wip
* wip
* wip
* update resolver
* wip
* wip
* endpoint is working but there is still work to do
* merge main
* wip
* subject is now first subject
* number of messages is working
* improving query
* fix bug
* fix bug
* added parameter
* pagination introduced a bug
* pagination is working
* fix type
* improve typing
* improve typing
* fix bug
* add displayName
* display displayName in the frontend
* move entities
* fix
* generate metadata
* add avatarUrl
* modify after comments on PR
* updates
* remove email mocks
* remove console log
* move files
* remove mock
* use constant
* use constant
* use fragments
* remove console.log
* generate
* changes made
* update DTO
* generate
2024-01-25 17:04:51 +01:00
Thomas Trompette
e85f65a195
Build message threads ( #3593 )
...
* Adding message thread component
* Add state and mocks
* Rename components and use local state for messages
---------
Co-authored-by: Thomas Trompette <thomast@twenty.com >
2024-01-24 14:32:57 +01:00