Repository navigation
Commit 7b80238
refactor(frontend): Replace Tailwind with StyleX (#408)
Times are a changing, and who doesn't love a good ol'refactor. The goal
of this PR is to migrate away from Tailwind, and instead over to StyleX.
The reason for this is that we live in a world of agents now, and
constant validation is key to ensuring durable, and good code. StyleX
provides this via type safe styles unlike those of Tailwind, which at
the end of the day are just strings.
🤖 generated description below:
---
## Why
Replace Tailwind throughout the frontend with StyleX. Shared components
accept compiled styles through typed `style` props, so callers can
compose overrides without class strings or raw CSS objects.
## What changed
- Migrate shared components and all incident, filter, and availability
screens. Remove Tailwind, CVA, classnames, tailwind-merge, and `cn`.
- Generate only `tokens.stylex.ts` from Scraps colors, spacing, radii,
and typography. Store direct values with dark-mode media overrides.
Remove `scraps-theme.css` and the intermediate variable aliases.
- Add the StyleX ESLint plugin, a rule that requires StyleX styles, and
negative type and lint tests. Preserve calendar selection, keyboard
focus, dynamic dimensions, and dialog scroll locking.
## Scope
The change covers frontend application styling. The backend and API
contracts are unchanged. No demo page remains.
Global CSS retains font faces and the latest Tailwind Preflight, adapted
as standalone CSS in the reset layer. All native inputs suppress focus
outlines through a global reset rule. Buttons, links, selects, and
textareas retain native focus. Calendar adapters use generated classes
internally, and Radix manages its runtime positioning.
## Tradeoffs
Scraps exports ordinary JavaScript objects that the StyleX compiler
cannot import directly as tokens. A generator converts those values into
a StyleX module and checks the committed output during lint. StyleX
emits the CSS declarations. Preflight uses standard CSS font defaults in
place of its Tailwind compiler helpers. Its MIT notice ships with the
production assets.
## Blast radius
Every frontend screen uses the new styling path. Review the global
reset, calendar adapters, dynamic measurements, and conditional style
precedence closely.
## Verification
- All 193 frontend tests pass, including six style contract tests. Lint,
formatting, type checking, token freshness, the production build, and
applicable precommit and pre-push hooks pass.
- All 118 tokens preserve their previous values in both color schemes
through the installed StyleX compiler. Production CSS contains no
Tailwind symbols or Scraps variable aliases.
- Browser checks cover desktop and mobile layouts, light and dark
rendering, calendars, keyboard focus return, dialogs, scroll unlock, and
textarea resizing. Visual checks are sampled. Dark hover precedence was
checked through compiled CSS, while RTL and week numbers have component
test coverage. Browser checks confirm unchanged dropdown geometry at
1280px, outline removal on all five searchable dropdowns and a regular
form input, and native focus on selects, textareas, and buttons.
---------
Co-authored-by: Spencer Murray <spencer.murray@sentry.io>1 parent 5f35c56 commit 7b80238
81 files changed
Lines changed: 4568 additions & 2778 deletions
File tree
- frontend
- eslint-rules
- public/licenses
- scripts
- src
- components
- routes
- $incidentId
- components
- availability
- components
- components
- filters
- styles
- utils
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
| 2 | + | |
2 | 3 | | |
3 | 4 | | |
4 | | - | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
9 | 11 | | |
10 | 12 | | |
11 | 13 | | |
| |||
15 | 17 | | |
16 | 18 | | |
17 | 19 | | |
18 | | - | |
19 | 20 | | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
31 | 24 | | |
32 | 25 | | |
33 | 26 | | |
34 | 27 | | |
35 | 28 | | |
36 | 29 | | |
37 | | - | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
38 | 47 | | |
39 | 48 | | |
40 | 49 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
| 19 | + | |
| 20 | + | |
20 | 21 | | |
21 | 22 | | |
22 | 23 | | |
| |||
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| 30 | + | |
29 | 31 | | |
30 | 32 | | |
31 | 33 | | |
32 | 34 | | |
33 | | - | |
34 | | - | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
40 | | - | |
41 | | - | |
42 | 40 | | |
43 | 41 | | |
44 | 42 | | |
45 | 43 | | |
46 | 44 | | |
47 | 45 | | |
48 | | - | |
| 46 | + | |
| 47 | + | |
49 | 48 | | |
50 | 49 | | |
51 | 50 | | |
| |||
59 | 58 | | |
60 | 59 | | |
61 | 60 | | |
62 | | - | |
63 | 61 | | |
64 | 62 | | |
65 | 63 | | |
66 | 64 | | |
| 65 | + | |
67 | 66 | | |
68 | 67 | | |
69 | 68 | | |
| |||
0 commit comments