Skip to content

[P0-P4] Remove Ant Design from the OSS frontend (shadcn/ui + Midnight Bloom) - #2212

Open
hari-kuriakose wants to merge 126 commits into
mainfrom
feat/shadcn-oss-migration
Open

[P0-P4] Remove Ant Design from the OSS frontend (shadcn/ui + Midnight Bloom)#2212
hari-kuriakose wants to merge 126 commits into
mainfrom
feat/shadcn-oss-migration

Conversation

@hari-kuriakose

Copy link
Copy Markdown
Contributor

Implements P1-01 … P1-04 of UN_SHADCN_IMPL_PLAN.md.

Contains the P0 foundation commit too (a0473a1) — see #2211 for that in isolation. Review commit-by-commit:

Commit Scope
a0473a1 P0 foundation — deps, Midnight Bloom tokens, 32 primitives, theme provider
26a8c64 P1-01/02 icons → lucide (91 files, 87 icons)
612875b P1-03 Typography shim (93 files)
a0f3848 P1-04 Button shim (70 files)

The main decision to review: shims instead of find-and-replace

The plan specified mapping antd props to Tailwind classes inline. That is unsafe for Typography and Button, because both carry behavior, not just styling — and silently dropping behavior is a C4 violation, not a restyle:

  • Typography ellipsisellipsis={{ tooltip: true }} truncates and surfaces full text on hover; {{ rows: 2 }} clamps lines. 12 call-sites use the object form. Tailwind's truncate is CSS-only, so a class swap would delete the tooltip.
  • Button loading (234 usages) — swaps in a spinner and disables the button. Dropping the disable would permit double-submits on in-flight requests.
  • Button danger — orthogonal to type, so not a 1:1 variant map (danger+text must stay ghost-with-destructive-text).

So each got a small shim presenting antd's API on shadcn primitives + Midnight Bloom tokens. The 295 Typography and 70 Button call-sites then become import swaps with JSX untouched — same elements, same order, same props, which is exactly what C4 asks for. Per D9/§5.0 both live in OSS so cloud plugins import them in Phase C.

CustomButton (76 usages) is a pass-through over antd's Button, so it routes through the shim automatically.

Two subtle bugs caught

  • FileUpload.jsx / FileWidget.jsx import antd's Upload component, shadowed by the lucide Upload icon — would have broken both upload widgets.
  • Workflows.jsx defines its own User component; importing lucide's User made it render itself (infinite recursion).
  • useRetrievalStrategies.js emits icon name strings consumed by a modal's ICON_MAP; the modal's keys became lucide names while the hook still emitted antd names, so every lookup would have silently fallen back to a default icon.

Verification

  • Build passes; 39 tests across 6 files green (23 of them new, covering the shim behaviors above)
  • Lint: 0 errors, same 24 pre-existing warnings as main
  • Browser: no console errors; antd elements on the landing page fall 33 → 24; the Login button keeps exact geometry (50px, same color/position). Radius 6px→8px is the intended --radius-md token.

Plan estimates are running low — worth correcting

Item Plan Actual
Icons 162 files / 43 icons 91 files / 87 icons
Typography 158 sites 295 sites
Button 130 sites 70 files

The original enumeration used single-line regexes that missed multi-line import blocks. I re-measured all remaining components; accurate per-component counts are in the commit history.

🤖 Generated with Claude Code

hari-kuriakose and others added 4 commits July 27, 2026 01:35
Implements P0-01..P0-16 of UN_SHADCN_IMPL_PLAN.md (spec: UN_SHADCN_SPEC.md).
Installs the shadcn/ui + Tailwind v4 stack alongside Ant Design; antd still
renders every screen, so this phase is intentionally a no-op visually.

- Deps: Radix primitives, CVA/clsx/tailwind-merge, lucide-react, next-themes,
  sonner, react-hook-form + zod, Tailwind v4. antd deliberately retained for
  the coexistence period (spec §7).
- Fonts: self-hosted @fontsource Inter + Geist Mono (no CDN; prod serves via
  nginx and must not depend on an external host).
- Tokens: src/index.css now carries the Midnight Bloom light+dark palette
  (D8). Tailwind is imported first so its layer ordering is correct, and the
  colour tokens are mapped with `@theme inline` — with a plain `@theme`
  Tailwind snapshots the light value and dark mode silently breaks.
- Legacy CSS vars renamed to --legacy-* (D6): variables.css defined --primary
  and --secondary, which collide with the shadcn tokens.
- 32 primitives generated into src/components/ui, plus hand-written spinner
  and kbd (no registry entry) and success/warning badge variants.
- Theme: next-themes ThemeProvider mirrors the existing session theme onto the
  `.dark` class. How the theme is persisted and toggled is unchanged (C4).
- Toasts: sonner Toaster mounted and a shared useAppToast helper added for
  cloud plugins to import (D9). ALERT_SURFACE keeps antd as the single active
  notification surface until P2-06, so alerts are not double-rendered.

Two fixes the plan did not anticipate, both required:
- .gitignore: the Python `lib/` rule also matched frontend/src/lib/, which is
  where components.json points `@/lib/utils`. Without the negation, cn() would
  never reach the repo and every primitive would fail to resolve in CI.
- biome.json: enable css.parser.tailwindDirectives, otherwise Biome cannot
  parse @theme/@plugin/@custom-variant and fails CI with 4 parse errors.

Gates: build (plugins absent, the optionalPluginImports path) passes; 16 tests
green; dark mode verified in headless Chromium — the `bg-background` utility
itself flips rgb(250,250,250) -> rgb(26,26,26), proving `@theme inline` works;
no visual regression (antd element count, button geometry, colours and radii
all unchanged — only the body font moves to Inter, which is intended).

Lint findings that remain (3 errors, 24 warnings) are pre-existing: pristine
main reports 227/261 with the same binary, and none of the findings are in
files this change touches.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implements P1-01 (mapping table) and P1-02 (apply migration) of
UN_SHADCN_IMPL_PLAN.md. 91 files, 87 unique icons, zero @ant-design/icons
imports remaining in OSS.

docs/icon-map.md records every mapping and flags the ones that are not exact,
since lucide is not a 1:1 replacement for antd's icon set:

- CheckCircleFilled / PlayCircleFilled / InfoCircleFilled -> lucide has no
  filled variants, so these render as outlines. Where the solid weight carries
  meaning, the doc shows the fill-current treatment.
- MoreOutlined -> EllipsisVertical, NOT Ellipsis. antd's renders vertical (the
  10 call-sites are all overflow menus); plain Ellipsis is horizontal.
- CaretDownOutlined -> ChevronDown trades a solid triangle for a stroke, which
  also matches the shadcn/Radix idiom used elsewhere.
- SlackOutlined -> MessagesSquare. lucide dropped brand icons, so the Slack
  glyph is simply gone; this is the one place a brand mark is lost.
- ScheduleOutlined -> CalendarClock, ArrowsAltOutlined -> Move,
  ExportOutlined -> ExternalLink: closest available, no exact match.

Three name collisions the rename introduced, all fixed with aliases:

- FileUpload.jsx and FileWidget.jsx import antd's `Upload` COMPONENT, which the
  lucide `Upload` icon shadowed. Left unfixed this would have broken both file
  upload widgets, not merely the icon.
- Workflows.jsx defines its own `User` component; importing lucide's `User`
  made it render itself. This was an infinite recursion, caught by the build.

useRetrievalStrategies.js needed a matching update: RetrievalStrategyModal's
ICON_MAP keys were renamed to lucide names, but the hook still emitted antd
names, so every lookup would have missed and silently fallen back to the
default icon. The backend contract is unchanged — only the frontend key names
moved.

Verified: build passes; 16 existing tests green plus a temporary smoke test
confirming migrated icons render as lucide svgs; lint reports 0 errors and the
same 24 pre-existing warnings; no page errors at runtime. The 4 `anticon`
elements still in the DOM belong to antd's own notification component, not app
code, and go away with P2-06.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implements P1-03 of UN_SHADCN_IMPL_PLAN.md. 93 call-site files plus a new
`@/components/ui/typography` primitive. Zero antd Typography imports remain.

Deviation from the plan, and why: the plan said convert Typography to
"semantic tags + Tailwind type classes". That is unsafe here. antd's
`ellipsis` prop is behaviour, not styling — `ellipsis={{ tooltip: true }}`
truncates AND surfaces the full text on hover, and `ellipsis={{ rows: 2 }}`
clamps to N lines. 12 call-sites use the object form. Swapping in a bare
`truncate` class would silently drop the tooltip, which is a behaviour
regression and therefore a C4 violation, not a restyle.

So this adds a small shim that presents antd's API (`type`, `strong`,
`italic`, `delete`, `code`, `mark`, `ellipsis`, `level`, and the
`Typography.Text` namespace) on top of Midnight Bloom tokens, with `ellipsis`
implemented against the shadcn Tooltip. The 295 call-sites then become an
import rewrite with the JSX untouched: same elements, same order, same props.
Per D9/§5.0 it lives in OSS so cloud plugins import the same component.

Two details worth noting:
- The line-clamp classes are written out in a lookup table rather than
  interpolated as `line-clamp-${rows}`. Tailwind scans source statically and
  never sees a class name assembled at runtime, so the interpolated form would
  have produced no CSS.
- The tooltip renders whenever requested rather than only when text actually
  overflows. antd measures the DOM to decide; matching that would need a
  resize observer per element. Showing it unconditionally keeps the content
  reachable, which is the purpose of the prop.

11 unit tests cover the shim, including the ellipsis behaviours that made the
regex approach unsafe. Full suite is 27 tests across 5 files, all green.
Build passes, lint reports 0 errors and the same 24 pre-existing warnings, and
the app renders with no console errors (antd element count drops 33 -> 29 on
the landing page as Typography moves off antd).

Plan estimate correction: P1-03 was scoped at 158 sites; the real count is 295
(192 `<Typography.Text>` alone). As with icons (43 -> 87), the original
enumeration missed multi-line import blocks.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implements P1-04 of UN_SHADCN_IMPL_PLAN.md. 70 call-site files plus a new
`@/components/ui/antd-button` wrapper over the shadcn primitive. Zero antd
Button imports remain.

Same reasoning as the Typography shim (P1-03): antd's Button carries behaviour
that shadcn's does not, so the plan's prop-mapping-by-find-and-replace would
have changed what the UI does, not just how it looks (C4):

- `loading` (234 usages) swaps in a spinner AND disables the button. Dropping
  the disable would let users double-submit during in-flight requests.
- `icon` (106) is a leading slot, not a child.
- `danger` (12) is orthogonal to `type`, so it is not a 1:1 variant mapping —
  danger+text has to stay ghost-with-destructive-text rather than becoming a
  solid destructive button.
- `htmlType` maps to the DOM `type` attribute, because antd claims `type` for
  its visual variant. The shim defaults DOM type to "button" so a converted
  button cannot accidentally submit a form.

The mapping is type=primary->default, link->link, text->ghost,
dashed/default->outline, with danger overriding to destructive (or ghost +
destructive text for text/link). size small->sm, large->lg, and icon-only
buttons get the icon size.

CustomButton (76 usages) is a thin pass-through over antd's Button, so it now
routes through the shim automatically — no separate conversion needed.

12 unit tests cover the shim, focused on the behaviours that made the naive
approach unsafe: loading disables, loading hides the icon, danger+text styling,
htmlType mapping, block/shape. Full suite is 39 tests across 6 files, green.

Verified in the browser: antd button count on the landing page drops to 0 while
the Login button keeps its exact geometry (50px tall, same colour and position)
and total antd elements fall 29 -> 24. Radius moves 6px -> 8px, which is the
intended Midnight Bloom --radius-md token.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a5fef313-4024-4b96-8935-a1ae97f9b482

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/shadcn-oss-migration

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Follow-up to P1-03/P1-04, no behaviour change beyond one deletion.

- docs/shim-convention.md records the rule the next ~15 components follow:
  shim when antd implements behaviour shadcn does not, direct swap when the
  difference is only styling. Names compatibility layers `antd-<component>.jsx`
  so they read as migration debt with an exit, lists the decision (with usage
  counts) for every remaining component, and flags `Space` — it wraps each
  child in its own div, so replacing it with `gap-*` silently breaks any CSS
  selector matching `> *`.

- Renamed typography.jsx -> antd-typography.jsx (94 import lines) so both
  shims follow that convention rather than one each.

- Removed the now-dead `components: { Button: { colorPrimary: "#092C4C" } }`
  override from ConfigProvider. No antd Buttons remain after P1-04, so it
  styled nothing.

Worth stating plainly, because the P1-04 message did not: that override was
painting every antd primary button the old Unstract navy. They now take
--primary from Midnight Bloom, so primary buttons across the authenticated app
move navy #092C4C -> violet #6f5cef. That is the intended end state under D8,
but it is a site-wide colour change and the earlier "geometry preserved" note
only covered the unauthenticated landing page, where the Login control is not
an antd Button.

Build, 39 tests and lint all green after the rename.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@hari-kuriakose

Copy link
Copy Markdown
Contributor Author

⚠️ Correction: primary buttons change colour site-wide (navy → violet)

My P1-04 commit message said geometry was preserved and implied no colour change. That was measured on the unauthenticated landing page only, where the Login control isn't an antd Button — so it understated the blast radius.

App.jsx had a ConfigProvider override painting every antd Button colorPrimary: "#092C4C" (the old Unstract navy). With no antd Buttons left after P1-04, that override styles nothing and has been deleted. Primary buttons now take --primary from Midnight Bloom, so every type="primary" button in the authenticated app moves #092C4C navy → #6f5cef violet.

This is the intended end state under D8 (Midnight Bloom is the approved palette) — flagging it because it's a site-wide visual change that deserves to be an explicit decision rather than a side effect noticed in review. If primary buttons should stay navy, that's a token change in index.css, not a code change.

Same mechanism explains the notification "Close" links going blue → violet in the screenshot.

Also in 5146c8d

  • docs/shim-convention.md — the rule for the remaining ~15 components: shim when antd implements behaviour shadcn doesn't, direct swap when the difference is only styling. Includes the per-component decision with usage counts, and the naming convention (antd-<component>.jsx marks migration debt with an exit).
  • Renamed typography.jsxantd-typography.jsx (94 import lines) so both shims follow one convention.
  • One trap recorded for P1-05: Space wraps each child in its own <div>. Replacing it with gap-* on the parent removes those wrappers, so any CSS selector matching > * stops applying. Needs a grep of .map()/conditional children before scripting.

hari-kuriakose and others added 6 commits July 27, 2026 03:28
Implements P1-05 of UN_SHADCN_IMPL_PLAN.md. 74 call-site files plus
`@/components/ui/antd-layout`. Zero antd Space/Row/Col/Flex imports remain.

The plan classified these as a direct swap to flex/grid utilities. They are
not, for a concrete reason: antd's `Space` wraps every child in its own
`.ant-space-item` div, and Row/Col emit `.ant-row`/`.ant-col`. This repo has
20 hand-written CSS rules that select those internals — e.g.
`.ant-space .ant-space-item .ant-card` in onBoard.css and
`.file-history-modal .action-buttons .ant-space`. Collapsing the wrappers into
`gap-*` on the parent deletes the elements those selectors match, so the
styling silently stops applying: a regression, not a restyle (C4).

22 Space call-sites also build children from `.map()` or conditionals, where
per-child wrappers change what `> *` matches.

So the shim keeps antd's DOM shape, including the `ant-*` class names the
existing CSS targets, while dropping the antd dependency. Those class names are
emitted deliberately and go away in P4 when the dependent CSS is cleaned up.

Details preserved: antd's size tokens (small/middle/large -> 8/16/24px) and
numeric/array sizes; Space's falsy-child filtering, so conditional children do
not leave empty gaps; the 24-column Col basis with span/offset as percentages;
and Row's negative-margin + Col-padding gutter model.

11 unit tests cover the shim, centred on the wrapper-div structure that the
existing CSS depends on. Full suite is 50 tests across 7 files, green. Build
passes and lint is back to the 24-warning baseline with none in the new file
(the two I introduced were single-line if-returns, now braced).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implements P1-06 of UN_SHADCN_IMPL_PLAN.md, completing phase P1. 51 call-site
files plus `@/components/ui/antd-leaves` covering Tag, Spin, Alert, Image,
Divider, Empty, Avatar and Progress.

These are the "direct swap" tier of docs/shim-convention.md — none of them
carry behaviour the shadcn primitives lack. They are still gathered behind one
module so ~60 call-sites convert by import instead of hand-rewriting JSX, which
keeps the diff mechanical (C4).

Checked before deciding, per the convention: `Spin` has ZERO `spinning={...}`
usages, so there is no overlay mode to reproduce and no wrapper is needed —
every site is a bare indicator. Most already route through the existing
SpinnerLoader widget, which now picks up the shim automatically.

Mapping notes:
- Tag colour tokens fold onto Badge variants (success/green -> success,
  error/red -> destructive, and so on). One call-site passes a raw
  `rgb(45, 183, 245)`, which antd would have applied directly, so unrecognised
  colours fall through to inline style rather than being dropped.
- Alert keeps message/description/showIcon/closable/banner, with its own
  dismiss state so `closable` still works.
- Image does not reimplement antd's `preview` lightbox: no call-site enables
  it. If one appears later it needs a real implementation, not a prop no-op.

Build passes, 50 tests green, lint back to the 24-warning baseline with none in
the new file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implements P2-01..P2-06 of UN_SHADCN_IMPL_PLAN.md. 76 call-site files plus
`@/components/ui/antd-overlays` (Modal, Tooltip, Dropdown, Popconfirm, Popover,
Collapse) and `@/hooks/useConfirm`.

P2-01 useConfirm: promise-returning confirm dialog over AlertDialog, so
`if (await confirm({...}))` replaces antd's callback-style Modal.confirm. OSS
owned per D9 because the 3 cloud Modal.confirm sites must import it rather than
reimplement it. It resolves false on Escape and outside-click, so the promise
can never dangle.

P2-02..P2-05 overlays. Behaviours preserved that a prop swap would have lost:
- Modal renders an OK/Cancel footer BY DEFAULT and only omits it for
  footer={null}. Call-sites relying on the implicit footer keep their buttons.
- The legacy `visible` alias still works alongside `open` (2 sites use it).
- destroyOnClose unmounts the body, which Radix does not do on its own.
- confirmLoading disables OK, matching the Button shim's loading semantics.
- closable={false} hides the close affordance; this shadcn DialogContent
  renders it unconditionally, so it is suppressed by class rather than prop.
- Dropdown accepts antd's `menu={{ items }}` data shape and maps it onto
  Radix's composed children.
- Popconfirm routes onto AlertDialog so inline confirms and useConfirm() share
  one behaviour rather than diverging.

P2-06 notifications: sonner is now the only surface. The ALERT_SURFACE flag,
antd's notification.useNotification(), the Close/Close All buttons and
contextHolder are all removed. showAppToast now accepts a React node so the
rendered markdown + Execution/Request ID lines carry over unchanged, and a
`message` export mirrors antd's imperative message.* API for the 3 files that
used it. Toaster is positioned top-right to match where antd's stack appeared
(sonner defaults to bottom-right) — C4.

Verified in the browser: 2 sonner toasts render, 0 antd notifications, and
total antd elements on the landing page fall 24 -> 3. Build passes, 68 tests
across 9 files green (18 new), lint back at the 24-warning baseline with none
in the new files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implements P3-01 (pattern), P3-02 (bulk Form conversion) and P3-03 (input
controls). 61 call-site files plus `@/components/ui/antd-form` and
`@/components/ui/antd-inputs`.

This is the phase the plan flagged as highest risk, and the reason is the
imperative form API: the codebase drives antd Forms through a form instance —
setFieldsValue on edit, `await form.validateFields().catch(() => null)` as the
submit guard, resetFields on cancel — across 14 useForm() sites and 102
Form.Items. Hand-rewriting those onto raw react-hook-form would be 102
independent chances to change submit or validation behaviour, and one missed
guard silently submits invalid data.

So antd's Form surface is reimplemented on react-hook-form and call-sites
convert by import alone. docs/form-pattern.md records the pattern, with
GroupCreateEditModal as the worked reference (it exercises setFieldsValue,
the validateFields guard, resetFields and a required rule).

The load-bearing detail: validateFields REJECTS when invalid. Two tests pin it
— one asserts the rejection reaches `.catch()`, one asserts onFinish does not
fire while a required field is empty. antd rule objects (required/min/max/
pattern/custom validator) are translated to RHF options, and a thrown
validator error becomes the inline message.

P3-03 covers Input (+ TextArea 14 sites, Password, Search), Select, Checkbox,
Switch, Radio and InputNumber. The awkward part is onChange shape: antd hands a
DOM event to Input but a raw value to Select/Switch, and gives Checkbox an
event with target.checked where Radix gives a boolean. Call-sites are written
against antd's convention, so the shim rebuilds those shapes instead of
rewriting ~90 handlers. Select accepts both `options` data and Select.Option
children (6 files use the latter).

Build passes, 78 tests across 10 files green (10 new for the Form shim), lint
back at the 24-warning baseline. antd importers now 73 files, down from 163 at
the start of P1.

Note: the new tests use @testing-library/user-event v13's direct API, not
v14's `.setup()` — this repo is on v13.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Completes P3-04, P3-05 and all of P4. antd, @ant-design/icons, @rjsf/antd and
@react-awesome-query-builder/antd are gone from package.json, and `grep -rl
"from 'antd'"` over src/ returns nothing.

P3-05 (RJSF) turned out far smaller than D3 assumed. RjsfFormLayout already
supplies its own `widgets` and `templates` for every field type, so @rjsf/antd
was contributing only theme chrome — swapping the import to @rjsf/core is the
whole change. There was no widget registry to rebuild.

P3-04 (date/time) follows D7 deliberately: the pickers are rebuilt on native
date/datetime-local/time inputs, but they still EXCHANGE MOMENT OBJECTS,
because call-sites are written as `value={moment(v)}` and
`onChange={(d) => onChange(d?.toISOString())}`. Dropping moment would change
timezone/DST behaviour, which D7 says needs its own reviewed pass — so this
change stays confined to the widget layer and moment remains a dependency.

P4 adds the shared DataTable (D5/D9) over TanStack + shadcn table, presenting
antd's Table API (columns/dataSource/rowKey/rowSelection/pagination/loading)
so all 16 call-sites convert by import and both repos share one table
implementation. antd-structure covers the remaining Card, Tabs, List, Layout,
Upload, Result, Drawer, Menu, Segmented, Pagination, Steps, Tree and Skeleton.

Final removals:
- ConfigProvider dropped from App.jsx; next-themes already owns theming.
- theme.useToken() replaced by the --card CSS variable.
- The three deep imports (antd/es/tabs/TabPane x2, antd/es/input/Search) now
  resolve to Tabs.TabPane and Input.Search on the shims.
- antd-vendor manual chunk, the antd optimizeDeps entries, and the Less
  preprocessor option (antd was the only Less consumer) removed from
  vite.config.js.
- Query builder swapped to @react-awesome-query-builder/ui, promoted to a
  direct dependency because the cloud overlay has no manifest of its own (D4).

Note on the DOM: three `ant-row`/`ant-col` elements still appear at runtime.
Those are emitted deliberately by the P1-05 layout shim because 20 hand-written
CSS rules select them; they are our class names, not antd. They go away when
that CSS is cleaned up.

P4 exit gate: 0 antd imports in src, 0 antd entries in package.json, build
passes, 78 tests green, no runtime page errors. Lint shows 3 errors and 26
warnings, all pre-existing — the errors are two SVG assets byte-identical to
main, and none of the findings are in files this migration added.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Additions to the OSS shim layer surfaced while converting the enterprise
plugins. They live here rather than in the plugins per D9/§5.0 — a component
needed by more than one call-site is OSS-owned, so the two repos cannot drift.

antd-structure gains four components used only by cloud plugins today:
- Descriptions (4 sites) — label/value grid
- Statistic (2) — figure with prefix/suffix/precision
- FloatButton (2) — fixed-position action button
- Transfer (2) — dual list with move-between controls
- Badge — antd's count/dot overlay. Note this is NOT shadcn's Badge, which is
  a pill label; antd calls that one Tag. Naming them apart avoids a confusing
  collision later.

useAppToast gains a `notification` export mirroring antd's imperative
notification API, including the useNotification() hook form that returns
[api, contextHolder]. antd's config shape is `{ message, description }` while
sonner takes a title plus `{ description }`, so the remap happens here instead
of at each call-site.

Verified both ways: the OSS build passes with src/plugins absent (the
optionalPluginImports path), and the P0-G2 overlay build passes with all 53
plugins present and antd uninstalled. 78 tests green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@hari-kuriakose hari-kuriakose changed the title [P1] antd → shadcn: icons, Typography, Button [P0-P4] Remove Ant Design from the OSS frontend (shadcn/ui + Midnight Bloom) Jul 27, 2026
@hari-kuriakose

Copy link
Copy Markdown
Contributor Author

Migration complete — P0 through P4, plus the cloud plugins

Result: grep -rl "from 'antd'" src/ returns nothing, and antd, @ant-design/icons, @rjsf/antd and @react-awesome-query-builder/antd are all out of package.json.

Cloud side: Zipstack/unstract-cloud#1683 (190 files, all 53 plugins). This PR must land first — the plugins import the shims defined here.

Phase Scope
P0 Foundation — Tailwind v4, Midnight Bloom tokens, 32 primitives, theme provider
P1 Icons (91 files / 87 icons), Typography, Button, layout, leaves
P2 Modal, Tooltip, Dropdown, Popconfirm, Popover, Collapse, useConfirm(), sonner
P3 Form + inputs, date/time, RJSF
P4 DataTable (TanStack), remaining structure, antd removal

The judgment call that shaped this

The plan said to map antd props to Tailwind classes inline. I didn't, wherever the evidence showed behavior rather than styling — silently dropping behavior is a C4 violation, not a restyle:

  • Form.validateFields() rejects on invalid. Call-sites are written await form.validateFields().catch(() => null) and bail on null. Had it resolved instead, every guard would silently pass and submit bad data.
  • Button loading (234 usages) shows a spinner and disables — dropping the disable permits double-submits.
  • ellipsis={{ tooltip }} truncates and reveals full text on hover; truncate is CSS-only.
  • Space wraps each child in .ant-space-item, and 20 hand-written CSS rules select those wrappers.

So each got a shim presenting antd's API on shadcn primitives, and ~700 call-sites converted by import swap with JSX untouched. docs/shim-convention.md records the rule; docs/form-pattern.md documents the highest-risk one.

Two P3 items came in far under estimate

  • RJSF (D3): RjsfFormLayout already supplies its own widgets and templates, so @rjsf/antd contributed only theme chrome. Swapping to @rjsf/core was a one-line change — there was no widget registry to rebuild.
  • Date/time (D7): the pickers are rebuilt on native inputs but still exchange moment objects, because call-sites do onChange={(d) => onChange(d?.toISOString())}. Dropping moment changes timezone/DST behavior, which D7 says needs its own reviewed pass. moment remains a dependency deliberately.

Known follow-ups (not blockers)

  1. Primary buttons moved navy → violet site-wide (disclosed earlier in this PR). Intended under D8; reversible via one token.
  2. ant-row/ant-col/ant-space-item class names still appear in the DOM. Those are emitted deliberately by the layout shim because 20 CSS rules select them. They go when that CSS is cleaned up — the plan's P4-09 CSS prune is the remaining piece.
  3. Query-builder vanilla styling — functional, but needs Tailwind polish to match.
  4. The antd-* shims are migration debt with a documented exit story, not permanent API.

Verification

Build passes both with and without the plugin overlay (P0-G1 and P0-G2). 78 tests across 10 files, 51 of them new and targeted at exactly the behaviors above. Lint matches the main baseline — the 3 errors are two SVG assets byte-identical to main, and zero findings are in files this migration added.

hari-kuriakose and others added 15 commits July 27, 2026 13:33
…oll-lock check

Closes the four items I previously reported as complete but had not actually
finished. Each is now verified against the plan's own criteria rather than by
assertion.

P4-09 — final cleanup. Its verify command is `grep -rn "legacy-" src/` -> 0.
It was 72. The 42 remaining var() references across 8 legacy variables are now
mapped onto Midnight Bloom semantic tokens and variables.css is deleted:

  --legacy-page-bg-1/2/3   -> var(--card) / var(--background) / var(--muted)
  --legacy-white           -> var(--card)        (it flipped to #000 in dark,
                                                  so it was a surface, not white)
  --legacy-black           -> var(--foreground)  (flipped to #fff in dark)
  --legacy-border-color-*  -> var(--border)
  --legacy-font-family     -> var(--font-sans)
  --legacy-font-size/weight-* -> literals; Tailwind stock matches them exactly

Visible effect: the page background moves #e9e9e9 -> #fafafa, and body
background now follows the theme, which the legacy vars only did for a few
surfaces. Dark mode re-verified end to end after the file was removed.

docs/icon-map.md was stale — it documented 43 icons from the first enumeration
pass, but the real set is 116 (87 OSS, 87 cloud, overlapping). Regenerated from
the verified map with true pre-migration usage counts pulled from git, and 27
inexact pairs called out with the reason each differs: lucide has NO filled
variants (8 icons render lighter), it dropped brand icons (Slack is simply
gone), and several are approximations (FilePdf -> FileText loses the format
hint). This is the artifact a reviewer needs to sanity-check those calls.

Four shims had no tests, which contradicts the rule in shim-convention.md that
every shim must cover the behaviours justifying it. Added 67 tests:
- antd-inputs (14) — the onChange CONVENTIONS, which differ per component and
  which Radix inverts: Input gets an event, InputNumber a number, Checkbox an
  event with target.checked, Switch a boolean.
- antd-datetime (14) — the D7 contract, i.e. onChange hands back a MOMENT so
  `date?.toISOString()` at the call-sites keeps working.
- antd-leaves (17) — including the raw rgb() Tag colour that must not be
  dropped just because it is not a known token.
- antd-structure (22) — DataTable's antd column/render contract, and Badge's
  count/overflow/showZero rules.

P2-02's deferred `body { overflow: hidden }` check is done. Radix's dialog
scroll-lock also sets body overflow and restores the prior value on close; the
risk was it restoring the wrong one and leaving the fixed app shell scrollable.
Three tests pin it: overflow stays hidden before/during/after, survives
repeated cycles, and is NOT left hidden on pages that never pinned it. The
index.css comment now records the outcome instead of reading as a TODO.

One real bug surfaced while writing these tests: the Tabs shim passed both
`value` and `defaultValue` to Radix, and a present-but-undefined `value` makes
Radix treat the component as controlled — which would have frozen every
uncontrolled tab set. Now it passes exactly one.

Test suite: 148 tests across 15 files, up from 78. Build passes, lint at the
24-warning baseline with zero findings in migration files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The dev-deploy frontend image build failed:

    error: lockfile had changes, but lockfile is frozen
    process "/bin/sh -c bun install --frozen-lockfile --ignore-scripts"
    did not complete successfully: exit code: 1

`bun remove antd @ant-design/icons @rjsf/antd
@react-awesome-query-builder/antd` and the `@tanstack/react-table` /
`@react-awesome-query-builder/ui` additions updated bun.lock in the working
tree, but that file was never staged — every earlier commit staged explicit
paths and bun.lock was not among them. So the committed lockfile still listed
antd as a root dependency and was missing @tanstack/react-table, which is
exactly the desync --frozen-lockfile exists to catch.

Nothing about the migration changes; this is the manifest edits reaching git.

Why local checks did not catch it: `bun install --frozen-lockfile` in the
worktree passes, because it validates the WORKING lockfile, which was already
correct. Only a clean checkout — i.e. Docker — sees the committed one. Verified
the fix by copying package.json + bun.lock into an empty directory and running
the container's exact command there: exit 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two bugs found by comparing the dev deployment against production. Both are in
the P4 structure shim, and both produce a page that is "correct" in the DOM but
broken on screen — so no test, build or lint caught them.

1. Layout had no flex-grow. antd's Layout is `flex: auto`; mine computed
   `flex: 0 1 auto` and resolved to height 0. Every descendant using `flex: 1`
   then collapsed: on the dashboard, `.metrics-dashboard-container` was 0px
   tall while its child was 212px, so the whole page rendered at y=858, below
   a clipped viewport. The content was in the DOM the entire time, which is
   why it looked like a data problem rather than a CSS one.

   Layout.Content had the same issue (`flex-1` vs antd's `flex: auto`).

2. Layout.Sider ignored `collapsed` / `collapsedWidth`. It always applied
   `width`, so with a stored `collapsed: true` preference the rail sat at the
   full 240px while SideNavBar hid every label behind `!collapsed` — an
   icons-only sidebar in an expanded gutter. `collapsible` and `collapsedWidth`
   were also leaking onto the DOM as invalid attributes.

Layout now also switches to a row when it contains a Sider, matching antd's
hasSider auto-detection. That is done via an explicit `__isSider` marker rather
than `c.type === Layout.Sider`: the identity check is fragile because Sider is
assigned after Layout and does not survive HMR or wrapping.

7 regression tests cover both: flex-auto on Layout and Content, row/column
switching, collapsed vs expanded width, and no antd-only props reaching the
DOM. Full suite 155 tests, build and lint green.

Worth noting for the remaining review: this is the class of defect the shim
unit tests structurally cannot catch. They assert rendered output in jsdom,
which has no layout engine — height 0 and height 212 look identical there.
Only a real browser shows it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Follow-up to the previous Layout fix, which was only half right.

`flex-auto` landed and the Sider collapse fix worked (the rail correctly
renders at 65px now), but the dashboard was still empty:
`.metrics-dashboard-container` remained 0px against production's 607px.

The reason is the OTHER half of antd's Layout behaviour. A Layout containing a
Sider lays out as a ROW; mine stayed a column, so the content area got no
height. My first attempt inferred this from `React.Children`, which cannot
work here: PageLayout renders `<SideNavBar>`, and the Sider lives *inside*
that component. Compile-time child inspection can never see it.

antd solves this with runtime context, so this does too — a Sider registers
itself with the nearest ancestor Layout on mount, however deeply nested. The
`__isSider` marker from the previous commit is gone; it was unreachable.

Confirmed against production, whose outer Layout is
`ant-layout ant-layout-has-sider` with `flex-direction: row` at 713px, versus
mine at `flex-col` and 0px.

The new test renders a Sider inside another component, matching how the real
app does it — the earlier test passed a Sider as a direct child, which is
exactly the case that already worked and why the bug survived.

156 tests, build and lint green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Third layout defect found by comparing the dev deployment against production.

On the workflows page the "Create Prompt Studio" dialog rendered at y=-109 with
`transform: none` — pinned to the top of the viewport with its header clipped
off-screen.

Cause: shadcn's DialogContent is ALREADY centred, via
`top-[50%] translate-y-[-50%]`. My Modal shim treated antd's `centered` prop as
something it had to implement and appended `top-1/2 -translate-y-1/2` — the
same geometry spelled differently. tailwind-merge sees two competing
translate/top utilities, keeps one, and the dialog ends up with no transform at
all.

antd's `centered` is therefore a no-op here: the base component already does
it. The prop is still destructured so it cannot land on the DOM as an invalid
attribute, with a comment explaining why it is deliberately unused — otherwise
this looks like an oversight and gets "fixed" back.

Two regression tests: the base translate utilities must survive alongside
`centered`, and the conflicting spelling must be absent.

Audited the other shims for the same pattern (a wrapper adding positioning
utilities on top of a shadcn primitive's own). The remaining `absolute`/`fixed`
classes in antd-leaves and antd-structure are on elements those shims create
themselves, so there is nothing to conflict with.

158 tests, build and lint green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Fourth defect found against the live deployment.

The Add LLM / Add Connector pickers render
`<List grid={{ gutter: 16, column: 4 }}>`. antd switches to an n-column grid
for that; my shim always rendered a divided vertical list, so every adapter
appeared one-per-row in a 600px scroller instead of 4-up. Measured in the
browser: `.list-of-srcs` children all sat at the same x with display:block.

The shim now honours `grid.column` (grid + grid-cols-n) and `grid.gutter`
(gap), and keeps the stacked divide-y list when no grid prop is passed. Column
classes are written out in a lookup rather than interpolated, since Tailwind
scans statically — same reasoning as the line-clamp table in antd-typography.

Two tests: grid mode applies grid-cols-4 and the gutter and drops divide-y;
non-grid mode still stacks.

160 tests, build and lint green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Fifth defect found against the live deployment.

The Add LLM adapter settings form (RJSF) rendered 1109px tall in an 800px
viewport. The dialog was pushed to y=-194 and the Submit button sat off-screen,
so the form could be filled in but never saved.

antd wraps modal content in `.ant-modal-body`, and this app's CSS caps that
element — `.add-source-modal .ant-modal-body { height: 695px; overflow: hidden
auto }`, `.retrieval-strategy-modal .ant-modal-body { max-height: 70vh }` and
several more. My Modal shim rendered children directly into DialogContent, so
none of those rules matched anything and nothing constrained the height.

Content is now wrapped in a `.ant-modal-body` element. The class name is what
makes the existing per-modal CSS work again; the `max-h-[70vh] overflow-y-auto`
on it is the fallback for modals that never had a bespoke rule.

Found while verifying P3-05: the RJSF form itself is correct on @rjsf/core —
9 inputs, 3 required markers, descriptions, prefilled defaults, password reveal,
and Test Connection / Submit / Close all render. It was only unreachable.

161 tests, build and lint green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This is the systemic cause behind most of the layout defects found against the
live deployment, rather than another one-off.

The app has ~200 hand-written CSS rules that target antd's internal class
names — `.ant-card-body`, `.ant-modal-content`, `.ant-tabs-nav`,
`.ant-table-body`, `.ant-btn`, `.ant-typography` and ~65 more. antd emitted
those elements; my shims did not, so every one of those rules silently matched
nothing. 109 of them set layout properties (height, overflow, display, flex,
padding), which is exactly why screens looked structurally right in the DOM and
wrong on screen.

Measured before and after: **109 dead layout rules across 53 classes → 8
across 8**. The 8 that remain are leaf styling on features this app does not
currently render (card meta, textarea counters, tab overflow controls).

The shims now emit the class names alongside their Tailwind classes. This is
deliberate coupling to the legacy CSS, not an accident, and it is temporary:
when that CSS is eventually rewritten against the design tokens, the hooks come
out. The P1-05 layout shim already did this for `.ant-space-item`/`.ant-row`;
this extends the same approach to the rest.

Also fixed while here: Divider, Radio.Group/Radio, Segmented items, Popover
inner, Result subtitle, Dropdown menu items and Collapse header/content were
missing their hooks.

Found by static audit rather than by opening screens — the previous five bugs
were each discovered one page at a time, which does not scale and would have
missed the ones on screens nobody happened to visit.

161 tests, build and lint green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…udio

Most severe defect so far: opening any Prompt Studio project showed "Couldn't
load this page" and rendered nothing.

Cause: PromptCardItems.jsx and NotesCard.jsx render `<Collapse.Panel>`, and
SetOrg.jsx renders `<Card.Meta>`. Neither sub-component existed on the shims,
so React received `undefined` as an element type and threw error #130. That
does not degrade one component — it takes down the entire route.

Collapse now supports both antd forms: the `items` data prop and the legacy
`<Collapse><Collapse.Panel header=…>` children, including `showArrow={false}`
which PromptCardItems relies on. Card.Meta renders avatar/title/description.

Added a completeness guard (shim-completeness.test.jsx) instead of only fixing
the two. It scans the app source for every `<Foo.Bar>` usage and asserts the
shims actually expose it. The per-component tests could not have caught this:
nothing in them rendered Collapse.Panel, so its absence was invisible until a
real page tried. The guard covers 14 sub-components today and fails loudly for
any future gap.

It earned its place immediately — it caught that my first Collapse.Panel
assignment had not landed (biome had reordered the export block my patch
anchored to, so the edit silently no-opped).

176 tests across 16 files, build and lint at the 24-warning baseline.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Found by static audit rather than by clicking: scanning for `Foo.bar(...)`
calls on shim components turned up two undefined statics.

ConfirmModal calls `Modal.useModal()` and then `modal.confirm({...})`. Neither
existed, so every consumer threw a TypeError the moment its button was clicked.
That is 12 components — delete actions across prompt studio, workflows, manage
docs, LLM profiles, custom synonyms and the top nav.

useModal now returns `[api, contextHolder]` and implements confirm/info/
success/error/warning/destroyAll on AlertDialog, so it shares behaviour with
useConfirm() instead of becoming a second confirm pattern. Escape and
outside-click resolve as Cancel.

Modal.confirm is implemented too — the fully-imperative form callable outside
React, which mounts its own root. No OSS call-site uses it today, but the cloud
plugins have three.

Extended the completeness guard to cover static calls, not just `<Foo.Bar>`
JSX. It now strips comments before scanning: a doc comment mentioning
`Modal.confirm` is not a call-site, and flagging it would teach people to
ignore the test.

180 tests across 16 files, build and lint at the 24-warning baseline.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Eleventh defect. The workflows "Create Prompt Studio" dialog rendered at
y=-127 with its header clipped off-screen, even after the earlier centring fix.

That earlier fix was correct — the classes were right this time. The override
came from the app's own stylesheet:

    .prompt-studio-modal { padding: 10px; top: 20px; }

antd's modal wrapper is statically positioned, so `top: 20px` read as "20px
from the top of the viewport" and worked. The shadcn Dialog is
`position: fixed` and centres itself with `top: 50%` + `translateY(-50%)`, so
the same rule overrode the centring while the transform still applied — pulling
the dialog 127px above the viewport.

Removed the rule and left a comment explaining why, since it looks arbitrary
otherwise. Centring is the component's job now.

Added css-collisions.test.js rather than only fixing the one rule: it scans
every stylesheet for a modal/dialog ROOT selector setting top/bottom/transform
and fails with the offending file and rule. It deliberately ignores inner
elements (`__body`, descendant selectors, `.ant-*`), which cannot fight the
root's positioning. The remaining `.retrieval-strategy-modal__*` rules are
inner elements and are correctly not flagged.

This is the third distinct failure mode that jsdom cannot see (height 0, dead
CSS hooks, and now positional overrides), so it is worth having a static guard
rather than relying on someone opening the right screen.

182 tests across 17 files, build and lint at the 24-warning baseline.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Twelfth defect, and the most silent one yet: Prompt Studio's Export button did
nothing. No menu, no error, no network request — I instrumented fetch and XHR
to confirm zero calls were made.

Export is the child of a `<Dropdown>`, and Radix renders its trigger with
`asChild`, attaching handlers through a ref. Neither CustomButton nor the base
shadcn Button forwarded refs, so the ref went nowhere and the trigger was never
wired up. A dropped ref throws nothing and logs nothing, which is why this
survived 182 passing tests and a full route sweep — the page rendered fine,
the button just wasn't connected to anything.

Both now forward refs. That covers the 24 Dropdown call-sites, plus Popover
and Tooltip triggers that use the same asChild mechanism.

Audited the other primitives: Badge, Kbd, Label, Skeleton and Spinner are also
plain functions, but none is used with asChild anywhere, so they are not
causing breakage. Left alone rather than changed speculatively.

Four regression tests: the base Button and CustomButton each forward to a real
DOM node, a Dropdown wrapping CustomButton gets aria-haspopup/data-state
(proving Radix wired the trigger), and the menu actually opens on click.

186 tests across 18 files, build and lint at the 24-warning baseline.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Found by the shim-completeness guard once the enterprise plugins were
overlaid: ReviewHeader.jsx:910 renders <Dropdown.Button>Download File</...>,
and Dropdown.Button was undefined. That is React error #130, which takes
down the whole manual-review route rather than just the button — the same
failure mode as the Collapse.Panel bug.

Dropdown.Button is NOT Dropdown. In <Dropdown> the child IS the trigger, so
naively aliasing the two would make "Download File" open a menu instead of
downloading. antd's split button keeps the halves separate: children is a
real action button wired to onClick, and only the chevron opens the menu.
The three new tests pin exactly that separation, since it is the one thing
an alias would silently get wrong.

The chevron half carries aria-label="More actions" so both halves stay
distinguishable by accessible name.
The shim accepted `presets`, `disabledDate`, `allowClear`, `onOk` and
`format` and did nothing with them. Nothing crashed, so this survived the
migration invisibly — but three of the five are behaviour, not decoration:

  - `presets`      MetricsDashboard's "Last 7/30/90 Days" buttons never
                   rendered. Those are the primary way the range gets set,
                   so the control looked finished while its main affordance
                   was missing.
  - `disabledDate` MetricsDashboard uses it to block future dates. Ignored,
                   users could query tomorrow. Now probed outward from today
                   and mapped onto the inputs' min/max, which is the bound a
                   native input can actually enforce.
  - `allowClear`   antd defaults to true; MetricsDashboard passes false
                   because its handler drops anything that is not a complete
                   pair. Emitting null there strands it on a stale range.

`onOk` now fires when a range becomes complete (there is no popup confirm
button to hang it off). `format` and `size` are destructured to keep them
off the DOM.

Also stops forcing moment on the way out. ExecutionLogs holds moment,
MetricsDashboard holds dayjs; the shim rebuilt every emitted date as moment,
handing MetricsDashboard a type it never opted into. It happens not to break
because that code only calls .toISOString(), which both implement — but it
quietly reverses D7's promise that this layer does not change what flows
through it. Emitted dates are now cloned from the caller's own instance.

Each of the five behaviours has a test, and each was mutation-checked: the
prop was re-broken one at a time and the matching test failed every time, so
these assert the fix rather than restating it.
… broken

Live check on the dashboard caught this: the preset buttons rendered, but
`disabledDate` produced no `max` bound, so future dates were still pickable
— the very thing the previous commit claimed to fix.

Cause: `new sample.constructor(isoish)` looks like a reasonable way to
rebuild a date in the caller's library. It is wrong for both libraries in
use. dayjs's internal constructor takes a config OBJECT, so handed a string
it ignores it and returns TODAY. moment's returns an object that throws on
.format(). So the disabledDate probe compared today against today on every
iteration, never crossed the boundary, and yielded no bound.

Now clones the caller's instance and re-points it field by field, which both
libraries support (dayjs setters return a new instance, moment's mutate and
return this; assigning the result covers both). The result is asserted to
land on the exact requested instant before it is returned.

The reason this got through: the test used a hand-written dayjs-shaped stub
whose constructor DID accept a date string, so it validated the stub rather
than the shim. Replaced with the real dayjs and moment, plus a case pinning
the actual predicate MetricsDashboard passes. Re-broken deliberately to
confirm the new test fails against the old approach.
hari-kuriakose and others added 23 commits August 2, 2026 15:30
The specs, config and @playwright/test all live in tests/e2e/ui now, so
frontend/ no longer needs the dependency, the test:ui scripts, the
vitest `tests/ui/**` exclude, or the playwright artefact gitignore entries —
each of those pointed at a path that no longer exists.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The previous 23 specs guarded bugs already fixed in this branch — useful once,
but they encode symptoms rather than behaviour, and none of them said whether
the product works. Replaced with 19 tests covering what each page is FOR,
mapped to tests/critical_paths.yaml:

  navigation      the sidebar reaches each primary destination; the Platform
                  fly-out is the only route to the settings screens
  prompt-studio   listing offers creation, the form refuses to submit empty,
                  a project opens on its authoring surface  [prompt-studio-author]
  workflows       same three for workflows                  [workflow-author]
  api deployments the endpoint and the enable/disable control are present
                                                       [api-deployment-provision]
  settings        each adapter screen offers registration; the LLM picker
                  lists providers                            [adapter-register-llm]

Kept `the app serves a document` as the harness sanity check.

Every selector was verified against a running app rather than read off the
source, which caught three that would have been silently wrong:

  - `.card-list-content` / `.ant-list-item` match nothing; both listings use
    `.list-view-row`, so those tests would have skipped forever
  - the create-project form renders the SERVER's "This field may not be blank",
    never the client-side string in AddCustomToolFormModal.jsx
  - the workflow form shows no error text at all, so that test now asserts the
    dialog refuses to close — the behaviour that actually protects the user
  - a bare /Logs/ landmark matches the Logs footer present on every page, so
    navigation asserts the Logs-only "ETL Executions" tab instead

Scope is deliberately small. Per critical_paths.yaml: "We intentionally do NOT
chase 100% coverage."

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…nder

Opening any Agentic Prompt Studio project died with "Couldn't load this page".
The cause was React error #130 (args[]=undefined) — AccuracyOverviewPanel
renders <Skeleton.Button> and <Skeleton.Input>, neither of which the shim
defined, and an undefined element type takes down the whole route rather than
just that component.

Sweeping every `<Foo.Bar>` the plugin tree renders turned up a second one:
<Menu.ItemGroup>, used by the verticals Playground — the same crash waiting on
a different route.

shim-completeness could not have caught either. It scans OSS `src/` for
sub-component usage, and the plugins that use these live in a gitignored tree
that is simply absent from an OSS checkout. Registering Skeleton there helps
once plugins are present; the by-value assertions added alongside cover the
case where they are not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The Docker build runs `bun install --frozen-lockfile` against bun.lock, which
still pinned react-diff-viewer-continued@3.4.0, react-helmet-async@2.0.5 and
react-social-login-buttons@3.9.1 — the pre-React-19 versions. package.json had
moved on, so the build failed with "lockfile had changes, but lockfile is
frozen". My earlier upgrade only ran npm install and never touched bun.lock.

Regenerated with bun 1.3; verified `bun install --frozen-lockfile` (the exact
command the Dockerfile runs) now succeeds, and that the app builds and all 352
tests pass against the bun-resolved tree.

Also drops the tracked bun.lockb: it is the legacy binary lockfile, the
Dockerfile never references it, and the local bun kept rewriting it as a
side effect of every install.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Tab height. antd pads line-style tabs `12px 0` for a 46px nav. I had set
`py-0` globally to fix ONE call-site — the doc-manager toolbar, which centres
its tabs against a file name and 32px buttons, where padding pushes the label
above the row's centre line. That made every other nav half height: Agentic
Prompt Studio's project tabs measured 24px against the reference's 46px.

Pad by default and let that toolbar opt out in its own CSS, rather than making
every standalone nav wrong to suit it.

Also adds tests/e2e/ui/agentic-prompt-studio.spec.js, covering the path that
broke: listing -> open project -> authoring surface renders, all eight tabs
present, and the two authoring tabs render their controls. The crash asserted
against is the Skeleton.Button #130 — invisible to vitest unless something
renders that exact sub-component, and invisible to shim-completeness because
it scans OSS src/ while these plugins are gitignored.

Walked Schema, Extraction Prompt and Settings against us-central: buttons and
copy match the reference exactly. The tab height was the only mismatch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Brings 16 commits of main into the migration branch and converts the antd
code they introduced, so the branch never carries antd it exists to remove.

Conflicts, and how they were resolved:

- ListView.{jsx,css}, PlatformApiKeys.css: main deleted these; we had edited
  them. Took main's deletion. Main replaced ListView with ResourceTable and
  rewired every caller, so keeping ListView alive would mean diverging from
  main permanently. Our ListView shadcn delta was 35 lines — the knowledge
  transferred to the new component, the file did not.
- PlatformApiKeys.jsx: main collapsed 508 lines into a 57-line wrapper over
  the new shared ApiKeyManager. Took main's structure wholesale.
- ListOfTools/Workflows/ConnectorsPage: import-block conflicts only (our
  lucide/shim imports vs main's antd). Kept ours, adding the React hooks
  main's merged bodies newly depend on (useCallback/useRef).
- tests/rig/cli.py, test_cli.py: both sides added real features. Unioned —
  main's _write_synthetic_junit_safe helper is semantically identical to the
  inline try/except we had, so it replaces ours and keeps the vitest/
  playwright runner branch alongside main's isolation-error gate.

The antd conversion (the reason this is one commit and not two): antd is no
longer a dependency here, so main's new ResourceTable, ApiKeyManager,
GlobalApiDeploymentKeys and PlatformApiKeys did not merely look out of place
— they broke `bun run build` outright. Rewired all four onto the existing
shims and lucide icons. No new shim components were needed; every antd
component they used was already covered.

Two shim gaps this surfaced, both fixed with tests:

- Form.useWatch did not exist. GlobalApiDeploymentKeys drives a fieldset off
  it: an "allow all deployments" checkbox disables the deployment picker and
  drops its required-rule.
- Form.Item `initialValue` was silently ignored (4 call-sites). A watcher
  above the <Form> runs before the child Controller registers, so the seed was
  not readable on first render — call-sites branching on `=== false` took the
  wrong path for that frame. Wired it through Controller's defaultValue and
  gave useWatch antd's third defaultValue argument.

Also corrected one stale assertion main shipped: pagination.test.js expected
follow-up pages to omit page_size, but fetchAllPages deliberately sends it on
every page. Fixed the test, not the code — dropping page_size would silently
re-cap later pages at the endpoint's default.

Verified: 361 frontend tests pass (up from 359), 32 rig tests pass, build
green, biome clean. The Form.useWatch test was confirmed to fail against a
deliberately broken shim before being kept.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every route rendering ResourceTable with at least one row died on
"Couldn't load this page" — /tools and /workflows both, in the deployed
snapshot.223 build.

The Modified cell wrapped a bare string:

    <Tooltip title={formattedDateTime(iso)}>{rel}</Tooltip>

`timeAgo()` returns a string. Tooltip renders a Radix trigger with `asChild`,
which slots onto a single ELEMENT child; slotting onto text throws
"Primitive.button failed to slot onto its children", and the route-level error
boundary turns that into the generic load failure. antd's Tooltip accepted a
bare string, so the shape came through the conversion looking fine.

Wrapping `rel` in a <span> fixes it.

Why it reached a deployed build: ResourceTable renders fine with an EMPTY
list — every throwing cell is inside a row. Connectors (0 rows) and Platform
API Keys (0 rows) both rendered, so the component looked healthy; only lists
with data crashed. The new test therefore renders a populated row, which is
the only shape that reproduces it. Verified to fail against the unfixed
component before being kept.

Also mirrors optionalPluginImports() from vite.config.js into
vitest.config.mjs. GetStaticData.js optionally imports a cloud plugin; the
build stubs it when absent, but vitest does not read vite.config.js, so in the
OSS-only checkout any test reaching GetStaticData failed to COLLECT rather than
to assert. That is the same build/test config asymmetry the jsxInJs() note in
that file already warns about — this is the second instance of it.

OSS: 363 tests pass (28 files, up from 361/27), build green, biome clean.
Cloud overlay: 366 pass; the 2 remaining failures are the pre-existing
cloud-plugin ones (lucide icon CSS, defaultProps), unchanged by this commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three reported regressions, one root cause: main's ResourceTable and LogsTable
were written against antd's <Table> API, and the antd-island conversion swapped
their IMPORTS to the shims without checking that the props they pass exist on
DataTable. They did not, and nothing said so.

1. Rows were not clickable (Prompt Studio, Workflows). ResourceTable passes
   `onRow={(item) => ({ onClick })}`. DataTable declared nine props and spread
   the rest onto its wrapper <div>, where React drops an unknown `onRow`
   attribute silently. `rowClassName` IS declared, so rows still rendered with
   cursor:pointer — they looked clickable and did nothing.

2. A long description broke the layout. ResourceTable also passes
   `tableLayout="fixed"`, dropped the same way. Column widths are rendered onto
   the <th> only, and under the browser's AUTO algorithm a width is a hint, not
   a bound — so one long description stretched the Name column until Actions
   left the viewport. Forwarding it makes the widths authoritative; the Name
   cell now clamps to one line, and Typography's ellipsis supplies the tooltip.

3. The Logs page would not load: LogsTable had the same Radix slot bug fixed in
   ResourceTable last commit — `<Tooltip>{record.executedAt}</Tooltip>` over a
   string. My earlier sweep for this used a single-line grep and missed every
   instance where the child sits on its own line, so I reported that fix as
   complete when it was not. A multi-line audit found four in OSS
   (LogsTable, DetailedLogs, LogModal, LLMUsageTable) and one in the cloud
   plugins (LookupUsageTab, committed separately).

Guards added, each verified to fail against the unfixed code first:

- DataTable: onRow is invoked with (record, index) and its handlers reach the
  row; tableLayout lands on the <table>. The existing tests all assert what
  RENDERS, which is why they passed against a table that had stopped
  responding to clicks.
- cascade-and-affordances: a source scan for `<Tooltip>` wrapping a non-element
  child. It has to be a source scan — these live inside column render()
  callbacks that only run once a row exists, so an empty-list smoke test walks
  straight past them. Brace-aware attribute matching, or a `title={a > b}` ends
  the open tag early and reports false positives.

OSS: 368 tests pass (up from 363), build green, biome clean on changed files.
Cloud overlay: 371 pass, build green; the 2 remaining failures are the
pre-existing cloud-plugin ones (lucide icon CSS, defaultProps).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… sidebar item

The Figma design (node 586-119) keeps the shell's surfaces light and spends the
brand violet only on the selected nav item.

`.topNav` and `.side-bar` were both `var(--primary)`; they become `--card` and
`--sidebar`, with hairlines where the two planes now meet. Everything toned for
those dark surfaces had to flip with them: the top bar's white page heading, the
navy avatar chip (#184772, a leftover from the pre-violet bar), and the
sidebar's white labels, dividers and section headings.

Two things were not just a colour swap:

- The product logos ship as white-ink and dark-ink pairs rather than one
  recolourable SVG (the brand accent dots are baked in), so the top bar picks
  by theme off `sessionDetails.currentTheme`.
- The sidebar icons were single-colour SVGs recoloured wholesale with
  `filter: brightness(0) invert(1)`. A filter reaches black or white but not an
  arbitrary hue, and the design needs the active icon violet — so they are now
  the SVG used as a mask over a `currentColor` fill, and follow their row in one
  declaration. The masked span needs an explicit `display`/height, since the
  <img> it replaced was a replaced element sized intrinsically.

The active row uses `--violet-600`, not `--primary`: the latter measures 4.04:1
on the violet wash, under AA for the 13px label, and its description was 2.97:1
at 0.8 opacity. Dark mode overrides to `--violet-300`, since there the wash sits
on a near-black sidebar and a darker violet would be worse.

Verified rendering in a dev namespace, expanded and collapsed. All nav text
clears WCAG AA: rest 17.4:1, active 5.24:1, section headings 4.74:1.
`showHeader` was undeclared in DataTable, so it fell into `...props` and was
spread onto the wrapper <div> — React warned about an unknown DOM attribute on
every render of the logs panel, and a call site asking for `showHeader={false}`
silently got a header anyway. Same silent-prop-drop as `onRow` and
`tableLayout` before it.

Declare it (default true) and omit the <thead> entirely when false, as antd
does, rather than emitting an empty one: ~12 app CSS rules target
`.ant-table-thead` and would still reserve its height.
ManageDocsModal uses antd's declarative uploader - `action` + `headers` +
`name`, no `customRequest` - the mode where antd POSTs the file itself. The
shim only implemented `beforeUpload` and `customRequest`, so `action` fell
into `...props` and was spread onto a <span> (React: "You can only pass the
`action` prop to <form>"), and the no-uploader branch reported
`status: "done"` for a request it had never sent.

Prompt Studio therefore logged "File uploaded successfully", pushed an empty
document object into listOfDocs - the blank row showing "Not Indexed" /
"Not Summarized" - and lost it on reload, because nothing reached the server.

UploadBase now POSTs multipart to `action`, emits uploading -> done/error and
hands back the parsed body as `info.file.response`, so both `response.data[0]`
and `response.errors[0].detail` resolve at the call site. `customRequest`
still wins when present and the no-uploader path is unchanged, so FileUpload
and FileWidget keep working.

Two adjacent defects in the same path: a rejected `beforeUpload` (the
duplicate-filename veto) raised an unhandled rejection that killed the rest of
the loop, and the file input is now cleared after selection so retrying the
same file after a failure fires change again.
Conflicts were import blocks only, in PromptOutput.jsx and
PromptOutputsModal.jsx: main still imports from antd where this branch has
swapped in the shims. Resolved to the shim side.

Two follow-ons the auto-merge could not see:

- ProfileIcon.jsx arrives new from main (#2240) still importing `Image` from
  "antd", which the no-antd guard rejects. Repointed at the antd-leaves shim.
- `Image` is now unused in both conflicted files — #2240 replaced the inline
  <Image> with <ProfileIcon>.

vite.config.js merged clean: the branch's tailwind/jsxInJs work and #2249's
allowedHosts + HMR protocol both survive, so the local port of those hunks
that was carried on this branch is no longer needed.
antd lets a single option be disabled so a value the viewer cannot use is
still LABELLED without being re-selectable. The shim dropped the flag on both
routes into a Select: the `<Select.Option>` children normalisation mapped only
`value` and `label`, and the rendered `SelectItem` was given no `disabled`
prop at all. `SelectOption.disabled` was declared in the interface but only
Radio.Group ever read it, so call-sites type-checked and silently lost the
guard.

Three call-sites depend on it, each appending one disabled entry for an id the
access-filtered list does not contain:

  - challenge-manager  "Adapter not shared with you"
  - agentic Settings   "Connector unavailable"
  - AddLlmProfile      the profile's own adapter

All three exist to name an inaccessible adapter while keeping it unselectable,
because re-selecting one fails validation on save. Without the flag the option
rendered as an ordinary choice, so the failure only surfaced on submit.

Both routes now carry `disabled` and the item honours it. Tests cover the
`options` data prop and the `Select.Option` child, asserting `aria-disabled`
on the `role="option"` element - the inner span that `getByText` returns does
not hold it. Both fail without the fix.

Verified in a dev namespace that an ordinary Select is unaffected: nine
options, none carrying the flag, all `aria-disabled` absent and selection
still working - `undefined` does not disable anything.
…d v4

`SelectContent` capped its height with the Tailwind v3 bare-custom-property
shorthand, where the property sits inside the arbitrary value with no var()
around it. v4 removed that shorthand and emits the value verbatim, so the
browser saw a property name where a value belongs, discarded the declaration,
and every Select in the app shipped with no cap at all.

Radix gives SelectContent an inline `display:flex; flex-direction:column` and
the Viewport an inline `flex: 1`, so with nothing bounding the container the
Viewport grew to the full option list. `scrollHeight === clientHeight`, which
also keeps `canScrollDown` false - hence no chevrons and no scrollbar either.
Combined with `body { overflow: hidden }` in index.css, the Prompt Studio LLM
dropdown ran off the bottom of the window and the overflowing options were
simply unreachable.

Nothing errors on this: not the build, not biome, not jsdom. The same shorthand
silently killed `transform-origin` on popover, tooltip and dropdown-menu (four
utilities), repaired here too - cosmetic only, those overlays now zoom from the
anchor corner rather than their own centre.

The cap is `min(16rem, var(--radix-select-content-available-height))`. 16rem is
antd's `listHeight` default, which is what these dropdowns looked like before
the migration, and one plugin call site (agentic ProjectDetail) literally passes
`listHeight={256}`. `min()` keeps Radix's collision-aware shrinking near the
window edge. The change is global and unoverridable: the antd shim renders
SelectContent with no className and no call site can reach it.

Also drops the Viewport's `h-[var(--radix-select-trigger-height)]`. It has never
done anything - `flex-basis: 0%` supersedes `height` on a column flex item's
main axis - but it would come alive and clamp every dropdown to one 32px row if
Radix ever stopped setting `flex: 1`.

Guarded by a source-text test that fails on the v3 shorthand anywhere under
src/, plus an assertion that SelectContent keeps a max-height; both fail without
the fix. The guard's comment describes the broken form instead of spelling it,
because Tailwind scans test files too and would emit the very dead rule that a
build-level grep for `property:--name` is meant to catch.

Verified in a dev namespace: content max-height 256px (was none); 21 options
clamp to 256 and stay on-screen with the viewport scrolling 254/722 and both
chevrons rendering; a one-option Select stays 44px with no scroll box; and at a
430px-tall window the available height drops to 207px, `min()` picks it over the
cap, and the list flips above the trigger still fully visible.

Note for reviewers: Radix injects `[data-radix-select-viewport]{scrollbar-width:
none}` from inside the portal, so there is no visible scrollbar - the affordance
is the chevrons plus wheel/keyboard. antd showed a real one.
Creating an API deployment from Prompt Studio failed silently: the modal
stopped, no notification appeared, and the console showed

  ReferenceError: Cannot access 'errorDetails2' before initialization

The catch block declared `const errorDetails` inside an
`if (errorDetails)` guard, shadowing the outer binding for the whole
block. The inner initializer therefore read the inner binding while it
was still in the temporal dead zone and threw — before setAlertDetails
was ever reached, so no toast fired and the step-rollback below it never
ran either.

Replace the hand-rolled message building with the
setAlertDetails(handleException(...)) pattern the other three catch
blocks in this same file already use. The hook does everything the
inline version was reimplementing, and better:

  - server_error returns errors[0].detail, so the message no longer
    renders as "null: <detail>" (attr is null on these payloads)
  - the setBackendErrors argument handles validation_error, keeping
    field-bound errors inline and only toasting non-field ones
  - it attaches the requestId and handles ERR_NETWORK / ERR_CANCELED,
    which the inline version dropped

Verified against a namespace with no default adapters configured: the
toast now reads "No default adapters found, configure them through
Platform Settings" with its Request ID, and the ReferenceError is gone.
Error alerts are sticky (duration: 0) so the user can read and copy the
Request ID. That is deliberate, but it means a repeated failure leaves a
pile of toasts that each need their own close button.

Show a "Clear all (N)" chip above the stack whenever more than one toast
is up. A single toast keeps just its own X, which is already a one-click
dismiss.

No new dependency: useSonner() ships with the sonner already in use, and
dismissAppToast() has always cleared everything when called with no
argument — it simply had no caller.

The chip sets `pointer-events: auto` because Radix sets
`pointer-events: none` on <body> while a modal dialog is open and that
inherits down. A modal being open is exactly when toasts pile up, so
without it the control renders but cannot be clicked.

`<Toaster offset>` and the chip's `top` are a pair — the offset reserves
the band the chip pins itself into, so changing one means changing the
other.
… fire

antd calls `onChange(checked, event)`; the shim called it with the boolean
alone. Both card toggles are written

    onChange={(checked, e) => { e.stopPropagation(); updateStatus(...) }}

so `e` was undefined and `e.stopPropagation()` threw before the handler's
real work ran. The API deployment never toggled, no PUT was sent, and the
controlled `checked` snapped the pill back — looking inert rather than
broken. Same for the Pipelines toggle.

Drive onChange off the Root's own onClick rather than Radix's
onCheckedChange: Radix routes that through useControllableState, which
invokes the callback from inside a state updater, i.e. during the next
render — after the click has finished bubbling — so stopPropagation would
have run too late to stop anything. Reading aria-checked off the button
gives the pre-toggle state for controlled and uncontrolled switches alike,
and a <button> turns keyboard activation into a click, so both input paths
still work.

The existing test asserted the one-arg signature, so it asserted the bug;
it now checks the antd contract, that a stopPropagation handler survives
and shields the card behind it, and that a caller's own onClick is kept.
antd counts `Space`'s children with rc-util's `toArray`, which descends
into fragments. `React.Children.toArray` does not — it counts `<>…</>` as
one child — so a call-site that renders its items behind `{cond && <>…</>}`
collapsed into a single `.ant-space-item`: the gaps between the items
disappeared and any block-level child, such as a vertical `Divider`,
broke onto its own line. That stacked the LLMWhisperer playground header
vertically and cost the API-keys table its inter-button gaps.
…e shim

Two antd Table props the shim dropped, both visible on LLMWhisperer's billing
page:

`columns[].children` — antd's banded header, where the parent carries a title
and the leaves carry the dataIndex. The converter ignored `children`, so the
band collapsed to one accessor-less leaf: the processing-modes table rendered
its group title above sixteen blank rows. Column defs are now built
recursively, header cells span their leaves, and TanStack's placeholder rows
are skipped.

`scroll={{ x, y }}` — undeclared, so it fell into `...props` and onto the
wrapper div; all ten call-sites silently got a full-height table with no pinned
header. `y` caps shadcn's own overflow wrapper (the scrolling ancestor sticky
resolves against, so the cap cannot go on the outer div) and pins the header
rows; `x` becomes a min-width. antd renders the header as a second table, which
one table cannot do, so each header row's offset is measured after layout.
antd lays Descriptions out as a real table with the label beside its value — a
th when bordered, an inline span and a colon when not. The shim emitted a dl of
stacked label-above-value pairs, which cost LLMWhisperer's billing page its
pricing table: each plan card listed the four processing modes and their prices
as loose text.

The layout was only half of it. Three plugin CSS rules hook antd's own DOM and
were matching nothing at all: `.pricing-table th` (label cell transparent and
black, not grey), the free card's `.ant-descriptions-item-content
{ display: none }` — which is what leaves that card showing modes without
prices — and the verticals Playground's cell padding.

`items` and `<Descriptions.Item>` children now go through one path, with
antd's per-size padding. The colon comes from ::after, so a label's own text
stays what the call-site wrote.
FullPageLayout carried className="container", which Tailwind v4 now claims
as a utility capping width at the current breakpoint (1536px at 2xl). The
class was only ever meant to select this file's own background rules, so
the collision silently clamped every page under the layout and left a dead
strip down the right-hand side on wider viewports.

Rename to .full-page-layout. The only two references are the JSX and its
own stylesheet.
.island-layout sits in a column flex container alongside ToolNavBar, so
height: 100% resolved against the container's FULL height and ignored the
~42px the nav bar had already taken. The island overflowed its parent by
exactly the nav bar's height, pushing the last row of content below the
fold — unreachable, because body is overflow-y: hidden. On the API Hub
list that measured as a parent of 875px with children summing to 917.14px,
and the bottom row of cards was clipped mid-border.

flex: 1 wins on the main axis wherever the parent is a flex column, which
is all 22 call sites today; height: 100% stays as the fallback for any
parent that is not, where flex is inert.
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
C Security Rating on New Code (required ≥ A)
C Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@jaseemjaskp
jaseemjaskp marked this pull request as ready for review August 25, 2026 14:05
@github-actions

Copy link
Copy Markdown
Contributor

Frontend Lint Report (Biome)

Issues found. Please fix the following problems:

�[0msrc/components/custom-tools/combined-output/CombinedOutput.jsx�[0m�[0m:�[0m�[0m56�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m54 │ �[0m�[0m �[0m�[0m �[0m�[0mb�[0m�[0mu�[0m�[0mi�[0m�[0ml�[0m�[0md�[0m�[0mE�[0m�[0mn�[0m�[0mr�[0m�[0mi�[0m�[0mc�[0m�[0mh�[0m�[0me�[0m�[0md�[0m�[0mF�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mB�[0m�[0mu�[0m�[0mn�[0m�[0md�[0m�[0ml�[0m�[0me�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mb�[0m�[0mu�[0m�[0mi�[0m�[0ml�[0m�[0md�[0m�[0mE�[0m�[0mn�[0m�[0mr�[0m�[0mi�[0m�[0mc�[0m�[0mh�[0m�[0me�[0m�[0md�[0m�[0mF�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mB�[0m�[0mu�[0m�[0mn�[0m�[0md�[0m�[0ml�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m55 │ �[0m�[0m �[0m�[0m �[0m�[0mg�[0m�[0me�[0m�[0mt�[0m�[0mE�[0m�[0mn�[0m�[0mr�[0m�[0mi�[0m�[0mc�[0m�[0mh�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mF�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mI�[0m�[0mt�[0m�[0me�[0m�[0mm�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mg�[0m�[0me�[0m�[0mt�[0m�[0mE�[0m�[0mn�[0m�[0mr�[0m�[0mi�[0m�[0mc�[0m�[0mh�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mF�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mI�[0m�[0mt�[0m�[0me�[0m�[0mm�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m56 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m57 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m58 │ �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mb�[0m�[0mu�[0m�[0mi�[0m�[0ml�[0m�[0md�[0m�[0mD�[0m�[0me�[0m�[0mf�[0m�[0ma�[0m�[0mu�[0m�[0ml�[0m�[0mt�[0m�[0mP�[0m�[0mr�[0m�[0mo�[0m�[0mf�[0m�[0mi�[0m�[0ml�[0m�[0me�[0m�[0mO�[0m�[0mu�[0m�[0mt�[0m�[0mp�[0m�[0mu�[0m�[0mt�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0m(�[0m�[0md�[0m�[0ma�[0m�[0mt�[0m�[0ma�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/custom-tools/combined-output/CombinedOutput.jsx�[0m�[0m:�[0m�[0m95�[0m�[0m:�[0m�[0m5�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m93 │ �[0m�[0m �[0m�[0m �[0m�[0ml�[0m�[0me�[0m�[0mt�[0m�[0m �[0m�[0mh�[0m�[0ma�[0m�[0ms�[0m�[0mE�[0m�[0mn�[0m�[0mr�[0m�[0mi�[0m�[0mc�[0m�[0mh�[0m�[0me�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mf�[0m�[0ma�[0m�[0ml�[0m�[0ms�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m94 │ �[0m�[0m �[0m�[0m �[0m�[0mf�[0m�[0mo�[0m�[0mr�[0m�[0m �[0m�[0m(�[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mi�[0m�[0mt�[0m�[0me�[0m�[0mm�[0m�[0m �[0m�[0mo�[0m�[0mf�[0m�[0m �[0m�[0mp�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0ms�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m95 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0mi�[0m�[0mt�[0m�[0me�[0m�[0mm�[0m�[0m?�[0m�[0m.�[0m�[0mp�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0m_�[0m�[0mt�[0m�[0my�[0m�[0mp�[0m�[0me�[0m�[0m �[0m�[0m=�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0mp�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0mT�[0m�[0my�[0m�[0mp�[0m�[0me�[0m�[0m.�[0m�[0mn�[0m�[0mo�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0m)�[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m96 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m97 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mv�[0m�[0ma�[0m�[0ml�[0m�[0mu�[0m�[0me�[0m�[0m,�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  95 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0mi�[0m�[0mt�[0m�[0me�[0m�[0mm�[0m�[0m?�[0m�[0m.�[0m�[0mp�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0m_�[0m�[0mt�[0m�[0my�[0m�[0mp�[0m�[0me�[0m�[0m�[2m·�[0m�[0m=�[0m�[0m=�[0m�[0m=�[0m�[0m�[2m·�[0m�[0mp�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0mT�[0m�[0my�[0m�[0mp�[0m�[0me�[0m�[0m.�[0m�[0mn�[0m�[0mo�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m     │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/custom-tools/header/Header.jsx�[0m�[0m:�[0m�[0m29�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m27 │ �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m28 │ �[0m�[0m �[0m�[0m �[0m�[0mS�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0ml�[0m�[0me�[0m�[0mP�[0m�[0ma�[0m�[0ms�[0m�[0ms�[0m�[0mT�[0m�[0mo�[0m�[0mg�[0m�[0mg�[0m�[0ml�[0m�[0me�[0m�[0mS�[0m�[0mw�[0m�[0mi�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mS�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0ml�[0m�[0me�[0m�[0mP�[0m�[0ma�[0m�[0ms�[0m�[0ms�[0m�[0mT�[0m�[0mo�[0m�[0mg�[0m�[0mg�[0m�[0ml�[0m�[0me�[0m�[0mS�[0m�[0mw�[0m�[0mi�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m29 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m30 │ �[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m31 │ �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0ma�[0m�[0mw�[0m�[0ma�[0m�[0mi�[0m�[0mt�[0m�[0m �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m(�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/custom-tools/header/Header.jsx�[0m�[0m:�[0m�[0m35�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m33 │ �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m34 │ �[0m�[0m �[0m�[0m �[0m�[0mP�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0mS�[0m�[0mh�[0m�[0ma�[0m�[0mr�[0m�[0me�[0m�[0mB�[0m�[0mu�[0m�[0mt�[0m�[0mt�[0m�[0mo�[0m�[0mn�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mP�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0mS�[0m�[0mh�[0m�[0ma�[0m�[0mr�[0m�[0me�[0m�[0mB�[0m�[0mu�[0m�[0mt�[0m�[0mt�[0m�[0mo�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m35 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m36 │ �[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m37 │ �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0ma�[0m�[0mw�[0m�[0ma�[0m�[0mi�[0m�[0mt�[0m�[0m �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m(�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/custom-tools/header/Header.jsx�[0m�[0m:�[0m�[0m41�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m39 │ �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m40 │ �[0m�[0m �[0m�[0m �[0m�[0mC�[0m�[0ml�[0m�[0mo�[0m�[0mn�[0m�[0me�[0m�[0mB�[0m�[0mu�[0m�[0mt�[0m�[0mt�[0m�[0mo�[0m�[0mn�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mC�[0m�[0ml�[0m�[0mo�[0m�[0mn�[0m�[0me�[0m�[0mB�[0m�[0mu�[0m�[0mt�[0m�[0mt�[0m�[0mo�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m41 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m42 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m43 │ �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mn�[0m�[0mo�[0m�[0mo�[0m�[0mp�[0m�[0mC�[0m�[0mh�[0m�[0me�[0m�[0mc�[0m�[0mk�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0m(�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0mP�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mi�[0m�[0ms�[0m�[0me�[0m�[0m.�[0m�[0mr�[0m�[0me�[0m�[0ms�[0m�[0mo�[0m�[0ml�[0m�[0mv�[0m�[0me�[0m�[0m(�[0m�[0mt�[0m�[0mr�[0m�[0mu�[0m�[0me�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/custom-tools/header/Header.jsx�[0m�[0m:�[0m�[0m144�[0m�[0m:�[0m�[0m5�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m143 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mo�[0m�[0mk�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0ma�[0m�[0mw�[0m�[0ma�[0m�[0mi�[0m�[0mt�[0m�[0m �[0m�[0mc�[0m�[0mh�[0m�[0me�[0m�[0mc�[0m�[0mk�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0ms�[0m�[0m(�[0m�[0md�[0m�[0me�[0m�[0mt�[0m�[0ma�[0m�[0mi�[0m�[0ml�[0m�[0ms�[0m�[0m?�[0m�[0m.�[0m�[0mt�[0m�[0mo�[0m�[0mo�[0m�[0ml�[0m�[0m_�[0m�[0mi�[0m�[0md�[0m�[0m,�[0m�[0m �[0m�[0m"�[0m�[0me�[0m�[0mx�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m"�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m144 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m!�[0m�[0mo�[0m�[0mk�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m145 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m146 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mO�[0m�[0mp�[0m�[0mt�[0m�[0mi�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  144 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0m!�[0m�[0mo�[0m�[0mk�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/custom-tools/header/Header.jsx�[0m�[0m:�[0m�[0m275�[0m�[0m:�[0m�[0m5�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m274 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mo�[0m�[0mk�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0ma�[0m�[0mw�[0m�[0ma�[0m�[0mi�[0m�[0mt�[0m�[0m �[0m�[0mc�[0m�[0mh�[0m�[0me�[0m�[0mc�[0m�[0mk�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0ms�[0m�[0m(�[0m�[0md�[0m�[0me�[0m�[0mt�[0m�[0ma�[0m�[0mi�[0m�[0ml�[0m�[0ms�[0m�[0m?�[0m�[0m.�[0m�[0mt�[0m�[0mo�[0m�[0mo�[0m�[0ml�[0m�[0m_�[0m�[0mi�[0m�[0md�[0m�[0m,�[0m�[0m �[0m�[0m"�[0m�[0mA�[0m�[0mP�[0m�[0mI�[0m�[0m �[0m�[0md�[0m�[0me�[0m�[0mp�[0m�[0ml�[0m�[0mo�[0m�[0my�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m"�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m275 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m!�[0m�[0mo�[0m�[0mk�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m276 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m277 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m/�[0m�[0m/�[0m�[0m �[0m�[0mC�[0m�[0mh�[0m�[0me�[0m�[0mc�[0m�[0mk�[0m�[0m �[0m�[0mf�[0m�[0mo�[0m�[0mr�[0m�[0m �[0m�[0me�[0m�[0mx�[0m�[0mi�[0m�[0ms�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0m �[0m�[0mA�[0m�[0mP�[0m�[0mI�[0m�[0m �[0m�[0md�[0m�[0me�[0m�[0mp�[0m�[0ml�[0m�[0mo�[0m�[0my�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0ms�[0m�[0m �[0m�[0mb�[0m�[0me�[0m�[0mf�[0m�[0mo�[0m�[0mr�[0m�[0me�[0m�[0m �[0m�[0mp�[0m�[0mr�[0m�[0mo�[0m�[0mc�[0m�[0me�[0m�[0me�[0m�[0md�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  275 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0m!�[0m�[0mo�[0m�[0mk�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/custom-tools/prompt-card/Header.jsx�[0m�[0m:�[0m�[0m55�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m53 │ �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m54 │ �[0m�[0m �[0m�[0m �[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mM�[0m�[0me�[0m�[0mn�[0m�[0mu�[0m�[0mI�[0m�[0mt�[0m�[0me�[0m�[0mm�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mM�[0m�[0me�[0m�[0mn�[0m�[0mu�[0m�[0mI�[0m�[0mt�[0m�[0me�[0m�[0mm�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m55 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m56 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m57 │ �[0m�[0ml�[0m�[0me�[0m�[0mt�[0m�[0m �[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mP�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0mR�[0m�[0mu�[0m�[0mn�[0m�[0mG�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0mP�[0m�[0ml�[0m�[0mu�[0m�[0mg�[0m�[0mi�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/custom-tools/prompt-card/PromptCardItems.jsx�[0m�[0m:�[0m�[0m34�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m32 │ �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m33 │ �[0m�[0m �[0m�[0m �[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mI�[0m�[0mn�[0m�[0md�[0m�[0mi�[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mo�[0m�[0mr�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mI�[0m�[0mn�[0m�[0md�[0m�[0mi�[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mo�[0m�[0mr�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m34 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m35 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m36 │ �[0m�[0ml�[0m�[0me�[0m�[0mt�[0m�[0m �[0m�[0mA�[0m�[0mg�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mc�[0m�[0mT�[0m�[0ma�[0m�[0mb�[0m�[0ml�[0m�[0me�[0m�[0mC�[0m�[0mh�[0m�[0me�[0m�[0mc�[0m�[0mk�[0m�[0ml�[0m�[0mi�[0m�[0ms�[0m�[0mt�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/custom-tools/tool-ide/ToolIde.jsx�[0m�[0m:�[0m�[0m49�[0m�[0m:�[0m�[0m32�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m48 │ �[0m�[0m/�[0m�[0m/�[0m�[0m �[0m�[0mC�[0m�[0ml�[0m�[0mo�[0m�[0mu�[0m�[0md�[0m�[0m-�[0m�[0mo�[0m�[0mn�[0m�[0ml�[0m�[0my�[0m�[0m �[0m�[0m—�[0m�[0m �[0m�[0mO�[0m�[0mS�[0m�[0mS�[0m�[0m �[0m�[0ms�[0m�[0mt�[0m�[0mu�[0m�[0mb�[0m�[0m.�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m49 │ �[0m�[0ml�[0m�[0me�[0m�[0mt�[0m�[0m �[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mD�[0m�[0mi�[0m�[0mr�[0m�[0mt�[0m�[0my�[0m�[0mS�[0m�[0me�[0m�[0me�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0m(�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m50 │ �[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m51 │ �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0ma�[0m�[0mw�[0m�[0ma�[0m�[0mi�[0m�[0mt�[0m�[0m �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m(�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/custom-tools/tool-ide/ToolIde.jsx�[0m�[0m:�[0m�[0m55�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m53 │ �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m54 │ �[0m�[0m �[0m�[0m �[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mD�[0m�[0mi�[0m�[0mr�[0m�[0mt�[0m�[0my�[0m�[0mS�[0m�[0me�[0m�[0me�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mD�[0m�[0mi�[0m�[0mr�[0m�[0mt�[0m�[0my�[0m�[0mS�[0m�[0me�[0m�[0me�[0m�[0md�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m55 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m56 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m57 │ �[0m�[0m/�[0m�[0m/�[0m�[0m �[0m�[0mC�[0m�[0ml�[0m�[0mo�[0m�[0mu�[0m�[0md�[0m�[0m-�[0m�[0mo�[0m�[0mn�[0m�[0ml�[0m�[0my�[0m�[0m �[0m�[0m—�[0m�[0m �[0m�[0mO�[0m�[0mS�[0m�[0mS�[0m�[0m �[0m�[0ms�[0m�[0mt�[0m�[0mu�[0m�[0mb�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0ms�[0m�[0mo�[0m�[0ml�[0m�[0mv�[0m�[0me�[0m�[0ms�[0m�[0m �[0m�[0mt�[0m�[0mr�[0m�[0mu�[0m�[0me�[0m�[0m �[0m�[0mt�[0m�[0mo�[0m�[0m �[0m�[0ms�[0m�[0mk�[0m�[0mi�[0m�[0mp�[0m�[0m �[0m�[0mt�[0m�[0mh�[0m�[0me�[0m�[0m �[0m�[0mg�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0m.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/custom-tools/tool-ide/ToolIde.jsx�[0m�[0m:�[0m�[0m67�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m65 │ �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m66 │ �[0m�[0m �[0m�[0m �[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mE�[0m�[0mx�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0mG�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mE�[0m�[0mx�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0mG�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m67 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m68 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m69 │ �[0m�[0mf�[0m�[0mu�[0m�[0mn�[0m�[0mc�[0m�[0mt�[0m�[0mi�[0m�[0mo�[0m�[0mn�[0m�[0m �[0m�[0mT�[0m�[0mo�[0m�[0mo�[0m�[0ml�[0m�[0mI�[0m�[0md�[0m�[0me�[0m�[0m(�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/deployments/api-deployment/ApiDeployment.jsx�[0m�[0m:�[0m�[0m285�[0m�[0m:�[0m�[0m5�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m284 │ �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mh�[0m�[0ma�[0m�[0mn�[0m�[0md�[0m�[0ml�[0m�[0me�[0m�[0mM�[0m�[0ma�[0m�[0mn�[0m�[0ma�[0m�[0mg�[0m�[0me�[0m�[0mC�[0m�[0mo�[0m�[0mO�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0m(�[0m�[0md�[0m�[0me�[0m�[0mp�[0m�[0ml�[0m�[0mo�[0m�[0my�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m285 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m!�[0m�[0md�[0m�[0me�[0m�[0mp�[0m�[0ml�[0m�[0mo�[0m�[0my�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m?�[0m�[0m.�[0m�[0mi�[0m�[0md�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m286 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mh�[0m�[0ma�[0m�[0mn�[0m�[0md�[0m�[0ml�[0m�[0me�[0m�[0mC�[0m�[0mo�[0m�[0mO�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0mA�[0m�[0mc�[0m�[0mt�[0m�[0mi�[0m�[0mo�[0m�[0mn�[0m�[0m(�[0m�[0md�[0m�[0me�[0m�[0mp�[0m�[0ml�[0m�[0mo�[0m�[0my�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m.�[0m�[0mi�[0m�[0md�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m287 │ �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  285 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0m!�[0m�[0md�[0m�[0me�[0m�[0mp�[0m�[0ml�[0m�[0mo�[0m�[0my�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m?�[0m�[0m.�[0m�[0mi�[0m�[0md�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/helpers/custom-tools/CustomToolsHelper.jsx�[0m�[0m:�[0m�[0m34�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m32 │ �[0m�[0m �[0m�[0m �[0m�[0mf�[0m�[0me�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mO�[0m�[0mu�[0m�[0mt�[0m�[0mp�[0m�[0mu�[0m�[0mt�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mf�[0m�[0me�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mO�[0m�[0mu�[0m�[0mt�[0m�[0mp�[0m�[0mu�[0m�[0mt�[0m�[0ms�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m33 │ �[0m�[0m �[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0ms�[0m�[0me�[0m�[0mt�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mA�[0m�[0ms�[0m�[0ms�[0m�[0mi�[0m�[0mg�[0m�[0mn�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mr�[0m�[0me�[0m�[0ms�[0m�[0me�[0m�[0mt�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mA�[0m�[0ms�[0m�[0ms�[0m�[0mi�[0m�[0mg�[0m�[0mn�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0ms�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m34 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m35 │ �[0m�[0mf�[0m�[0mu�[0m�[0mn�[0m�[0mc�[0m�[0mt�[0m�[0mi�[0m�[0mo�[0m�[0mn�[0m�[0m �[0m�[0mC�[0m�[0mu�[0m�[0ms�[0m�[0mt�[0m�[0mo�[0m�[0mm�[0m�[0mT�[0m�[0mo�[0m�[0mo�[0m�[0ml�[0m�[0ms�[0m�[0mH�[0m�[0me�[0m�[0ml�[0m�[0mp�[0m�[0me�[0m�[0mr�[0m�[0m(�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m36 │ �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0m[�[0m�[0mi�[0m�[0ms�[0m�[0mL�[0m�[0mo�[0m�[0ma�[0m�[0md�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0m,�[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0mt�[0m�[0mI�[0m�[0ms�[0m�[0mL�[0m�[0mo�[0m�[0ma�[0m�[0md�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0m]�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mS�[0m�[0mt�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0m(�[0m�[0mt�[0m�[0mr�[0m�[0mu�[0m�[0me�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/navigations/side-nav-bar/SideNavBar.jsx�[0m�[0m:�[0m�[0m87�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m85 │ �[0m�[0m �[0m�[0m �[0m�[0ma�[0m�[0mw�[0m�[0ma�[0m�[0mi�[0m�[0mt�[0m�[0m �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m(�[0m�[0m"�[0m�[0m.�[0m�[0m.�[0m�[0m/�[0m�[0m.�[0m�[0m.�[0m�[0m/�[0m�[0m.�[0m�[0m.�[0m�[0m/�[0m�[0mp�[0m�[0ml�[0m�[0mu�[0m�[0mg�[0m�[0mi�[0m�[0mn�[0m�[0ms�[0m�[0m/�[0m�[0ml�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0m-�[0m�[0ms�[0m�[0mt�[0m�[0mu�[0m�[0md�[0m�[0mi�[0m�[0mo�[0m�[0m"�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m86 │ �[0m�[0m �[0m�[0m �[0m�[0ml�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mS�[0m�[0mt�[0m�[0mu�[0m�[0md�[0m�[0mi�[0m�[0mo�[0m�[0mE�[0m�[0mn�[0m�[0ma�[0m�[0mb�[0m�[0ml�[0m�[0me�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mt�[0m�[0mr�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m87 │ �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m88 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m89 │ �[0m�[0ml�[0m�[0me�[0m�[0mt�[0m�[0m �[0m�[0mm�[0m�[0ma�[0m�[0mn�[0m�[0mu�[0m�[0ma�[0m�[0ml�[0m�[0mR�[0m�[0me�[0m�[0mv�[0m�[0mi�[0m�[0me�[0m�[0mw�[0m�[0mS�[0m�[0me�[0m�[0mt�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0ms�[0m�[0mE�[0m�[0mn�[0m�[0ma�[0m�[0mb�[0m�[0ml�[0m�[0me�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mf�[0m�[0ma�[0m�[0ml�[0m�[0ms�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/pipelines-or-deployments/pipelines/Pipelines.jsx�[0m�[0m:�[0m�[0m350�[0m�[0m:�[0m�[0m5�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m349 │ �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mh�[0m�[0ma�[0m�[0mn�[0m�[0md�[0m�[0ml�[0m�[0me�[0m�[0mM�[0m�[0ma�[0m�[0mn�[0m�[0ma�[0m�[0mg�[0m�[0me�[0m�[0mC�[0m�[0mo�[0m�[0mO�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0m(�[0m�[0mp�[0m�[0mi�[0m�[0mp�[0m�[0me�[0m�[0ml�[0m�[0mi�[0m�[0mn�[0m�[0me�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m350 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m!�[0m�[0mp�[0m�[0mi�[0m�[0mp�[0m�[0me�[0m�[0ml�[0m�[0mi�[0m�[0mn�[0m�[0me�[0m�[0m?�[0m�[0m.�[0m�[0mi�[0m�[0md�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m351 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mh�[0m�[0ma�[0m�[0mn�[0m�[0md�[0m�[0ml�[0m�[0me�[0m�[0mC�[0m�[0mo�[0m�[0mO�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0mA�[0m�[0mc�[0m�[0mt�[0m�[0mi�[0m�[0mo�[0m�[0mn�[0m�[0m(�[0m�[0mp�[0m�[0mi�[0m�[0mp�[0m�[0me�[0m�[0ml�[0m�[0mi�[0m�[0mn�[0m�[0me�[0m�[0m.�[0m�[0mi�[0m�[0md�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m352 │ �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  350 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0m!�[0m�[0mp�[0m�[0mi�[0m�[0mp�[0m�[0me�[0m�[0ml�[0m�[0mi�[0m�[0mn�[0m�[0me�[0m�[0m?�[0m�[0m.�[0m�[0mi�[0m�[0md�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/ui/cascade-and-affordances.test.jsx�[0m�[0m:�[0m�[0m128�[0m�[0m:�[0m�[0m13�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m126 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mf�[0m�[0mu�[0m�[0ml�[0m�[0ml�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mp�[0m�[0ma�[0m�[0mt�[0m�[0mh�[0m�[0m.�[0m�[0mj�[0m�[0mo�[0m�[0mi�[0m�[0mn�[0m�[0m(�[0m�[0md�[0m�[0mi�[0m�[0mr�[0m�[0m,�[0m�[0m �[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m127 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mi�[0m�[0ms�[0m�[0mD�[0m�[0mi�[0m�[0mr�[0m�[0me�[0m�[0mc�[0m�[0mt�[0m�[0mo�[0m�[0mr�[0m�[0my�[0m�[0m(�[0m�[0m)�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m128 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m �[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0m"�[0m�[0mn�[0m�[0mo�[0m�[0md�[0m�[0me�[0m�[0m_�[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0mu�[0m�[0ml�[0m�[0me�[0m�[0ms�[0m�[0m"�[0m�[0m)�[0m�[0m �[0m�[0mw�[0m�[0ma�[0m�[0ml�[0m�[0mk�[0m�[0m(�[0m�[0mf�[0m�[0mu�[0m�[0ml�[0m�[0ml�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m129 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m130 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  128 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m�[2m·�[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m�[2m·�[0m�[0m"�[0m�[0mn�[0m�[0mo�[0m�[0md�[0m�[0me�[0m�[0m_�[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0mu�[0m�[0ml�[0m�[0me�[0m�[0ms�[0m�[0m"�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mw�[0m�[0ma�[0m�[0ml�[0m�[0mk�[0m�[0m(�[0m�[0mf�[0m�[0mu�[0m�[0ml�[0m�[0ml�[0m�[0m)�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/ui/cascade-and-affordances.test.jsx�[0m�[0m:�[0m�[0m138�[0m�[0m:�[0m�[0m13�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m136 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m/�[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m\�[0m�[0ms�[0m�[0m*�[0m�[0m\�[0m�[0m{�[0m�[0m(�[0m�[0m[�[0m�[0m^�[0m�[0m}�[0m�[0m]�[0m�[0m*�[0m�[0m)�[0m�[0m\�[0m�[0m}�[0m�[0m\�[0m�[0ms�[0m�[0m*�[0m�[0mf�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0m\�[0m�[0ms�[0m�[0m*�[0m�[0m"�[0m�[0ml�[0m�[0mu�[0m�[0mc�[0m�[0mi�[0m�[0md�[0m�[0me�[0m�[0m-�[0m�[0mr�[0m�[0me�[0m�[0ma�[0m�[0mc�[0m�[0mt�[0m�[0m"�[0m�[0m/�[0m�[0m,�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m137 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m138 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m!�[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0ms�[0m�[0m)�[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m139 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0ms�[0m�[0m[�[0m�[0m1�[0m�[0m]�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m140 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m.�[0m�[0ms�[0m�[0mp�[0m�[0ml�[0m�[0mi�[0m�[0mt�[0m�[0m(�[0m�[0m"�[0m�[0m,�[0m�[0m"�[0m�[0m)�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  138 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0m!�[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0ms�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/ui/cascade-and-affordances.test.jsx�[0m�[0m:�[0m�[0m166�[0m�[0m:�[0m�[0m11�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m164 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m165 │ �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m166 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m!�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m.�[0m�[0me�[0m�[0mn�[0m�[0md�[0m�[0ms�[0m�[0mW�[0m�[0mi�[0m�[0mt�[0m�[0mh�[0m�[0m(�[0m�[0m"�[0m�[0m.�[0m�[0mc�[0m�[0ms�[0m�[0ms�[0m�[0m"�[0m�[0m)�[0m�[0m)�[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m167 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mf�[0m�[0mo�[0m�[0mr�[0m�[0m �[0m�[0m(�[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mm�[0m�[0m �[0m�[0mo�[0m�[0mf�[0m�[0m �[0m�[0mt�[0m�[0mx�[0m�[0mt�[0m�[0m.�[0m�[0mm�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0mA�[0m�[0ml�[0m�[0ml�[0m�[0m(�[0m�[0m/�[0m�[0m(�[0m�[0m[�[0m�[0m^�[0m�[0m{�[0m�[0m}�[0m�[0m]�[0m�[0m*�[0m�[0m)�[0m�[0m\�[0m�[0m{�[0m�[0m(�[0m�[0m[�[0m�[0m^�[0m�[0m}�[0m�[0m]�[0m�[0m*�[0m�[0m)�[0m�[0m\�[0m�[0m}�[0m�[0m/�[0m�[0mg�[0m�[0m)�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m168 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0ml�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0m[�[0m�[0m1�[0m�[0m]�[0m�[0m.�[0m�[0mt�[0m�[0mr�[0m�[0mi�[0m�[0mm�[0m�[0m(�[0m�[0m)�[0m�[0m.�[0m�[0ms�[0m�[0mp�[0m�[0ml�[0m�[0mi�[0m�[0mt�[0m�[0m(�[0m�[0m"�[0m�[0m\�[0m�[0mn�[0m�[0m"�[0m�[0m)�[0m�[0m.�[0m�[0mp�[0m�[0mo�[0m�[0mp�[0m�[0m(�[0m�[0m)�[0m�[0m.�[0m�[0mt�[0m�[0mr�[0m�[0mi�[0m�[0mm�[0m�[0m(�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  166 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0m!�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m.�[0m�[0me�[0m�[0mn�[0m�[0md�[0m�[0ms�[0m�[0mW�[0m�[0mi�[0m�[0mt�[0m�[0mh�[0m�[0m(�[0m�[0m"�[0m�[0m.�[0m�[0mc�[0m�[0ms�[0m�[0ms�[0m�[0m"�[0m�[0m)�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/ui/cascade-and-affordances.test.jsx�[0m�[0m:�[0m�[0m170�[0m�[0m:�[0m�[0m13�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m168 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0ml�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0m[�[0m�[0m1�[0m�[0m]�[0m�[0m.�[0m�[0mt�[0m�[0mr�[0m�[0mi�[0m�[0mm�[0m�[0m(�[0m�[0m)�[0m�[0m.�[0m�[0ms�[0m�[0mp�[0m�[0ml�[0m�[0mi�[0m�[0mt�[0m�[0m(�[0m�[0m"�[0m�[0m\�[0m�[0mn�[0m�[0m"�[0m�[0m)�[0m�[0m.�[0m�[0mp�[0m�[0mo�[0m�[0mp�[0m�[0m(�[0m�[0m)�[0m�[0m.�[0m�[0mt�[0m�[0mr�[0m�[0mi�[0m�[0mm�[0m�[0m(�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m169 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mb�[0m�[0mo�[0m�[0md�[0m�[0my�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0m[�[0m�[0m2�[0m�[0m]�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m170 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m!�[0m�[0m/�[0m�[0mf�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0m-�[0m�[0ms�[0m�[0mi�[0m�[0mz�[0m�[0me�[0m�[0m:�[0m�[0m\�[0m�[0ms�[0m�[0m*�[0m�[0m\�[0m�[0md�[0m�[0m+�[0m�[0mp�[0m�[0mx�[0m�[0m/�[0m�[0m.�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0m(�[0m�[0mb�[0m�[0mo�[0m�[0md�[0m�[0my�[0m�[0m)�[0m�[0m)�[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m171 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m/�[0m�[0mw�[0m�[0mi�[0m�[0md�[0m�[0mt�[0m�[0mh�[0m�[0m|�[0m�[0mh�[0m�[0me�[0m�[0mi�[0m�[0mg�[0m�[0mh�[0m�[0mt�[0m�[0m/�[0m�[0m.�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0m(�[0m�[0mb�[0m�[0mo�[0m�[0md�[0m�[0my�[0m�[0m)�[0m�[0m)�[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m172 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0ms�[0m�[0ms�[0m�[0mR�[0m�[0mu�[0m�[0ml�[0m�[0me�[0m�[0ms�[0m�[0m.�[0m�[0mp�[0m�[0mu�[0m�[0ms�[0m�[0mh�[0m�[0m(�[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  170 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0m!�[0m�[0m/�[0m�[0mf�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0m-�[0m�[0ms�[0m�[0mi�[0m�[0mz�[0m�[0me�[0m�[0m:�[0m�[0m\�[0m�[0ms�[0m�[0m*�[0m�[0m\�[0m�[0md�[0m�[0m+�[0m�[0mp�[0m�[0mx�[0m�[0m/�[0m�[0m.�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0m(�[0m�[0mb�[0m�[0mo�[0m�[0md�[0m�[0my�[0m�[0m)�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/ui/cascade-and-affordances.test.jsx�[0m�[0m:�[0m�[0m171�[0m�[0m:�[0m�[0m13�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m169 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mb�[0m�[0mo�[0m�[0md�[0m�[0my�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mm�[0m�[0m[�[0m�[0m2�[0m�[0m]�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m170 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m!�[0m�[0m/�[0m�[0mf�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0m-�[0m�[0ms�[0m�[0mi�[0m�[0mz�[0m�[0me�[0m�[0m:�[0m�[0m\�[0m�[0ms�[0m�[0m*�[0m�[0m\�[0m�[0md�[0m�[0m+�[0m�[0mp�[0m�[0mx�[0m�[0m/�[0m�[0m.�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0m(�[0m�[0mb�[0m�[0mo�[0m�[0md�[0m�[0my�[0m�[0m)�[0m�[0m)�[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m171 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0m/�[0m�[0mw�[0m�[0mi�[0m�[0md�[0m�[0mt�[0m�[0mh�[0m�[0m|�[0m�[0mh�[0m�[0me�[0m�[0mi�[0m�[0mg�[0m�[0mh�[0m�[0mt�[0m�[0m/�[0m�[0m.�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0m(�[0m�[0mb�[0m�[0mo�[0m�[0md�[0m�[0my�[0m�[0m)�[0m�[0m)�[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m172 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0ms�[0m�[0ms�[0m�[0mR�[0m�[0mu�[0m�[0ml�[0m�[0me�[0m�[0ms�[0m�[0m.�[0m�[0mp�[0m�[0mu�[0m�[0ms�[0m�[0mh�[0m�[0m(�[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m173 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mf�[0m�[0mi�[0m�[0ml�[0m�[0me�[0m�[0m:�[0m�[0m �[0m�[0mp�[0m�[0ma�[0m�[0mt�[0m�[0mh�[0m�[0m.�[0m�[0mr�[0m�[0me�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0mi�[0m�[0mv�[0m�[0me�[0m�[0m(�[0m�[0mp�[0m�[0mr�[0m�[0mo�[0m�[0mc�[0m�[0me�[0m�[0ms�[0m�[0ms�[0m�[0m.�[0m�[0mc�[0m�[0mw�[0m�[0md�[0m�[0m(�[0m�[0m)�[0m�[0m,�[0m�[0m �[0m�[0mf�[0m�[0mu�[0m�[0ml�[0m�[0ml�[0m�[0m)�[0m�[0m,�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  171 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0m/�[0m�[0mw�[0m�[0mi�[0m�[0md�[0m�[0mt�[0m�[0mh�[0m�[0m|�[0m�[0mh�[0m�[0me�[0m�[0mi�[0m�[0mg�[0m�[0mh�[0m�[0mt�[0m�[0m/�[0m�[0m.�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0m(�[0m�[0mb�[0m�[0mo�[0m�[0md�[0m�[0my�[0m�[0m)�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/ui/cascade-and-affordances.test.jsx�[0m�[0m:�[0m�[0m449�[0m�[0m:�[0m�[0m13�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m447 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mf�[0m�[0mu�[0m�[0ml�[0m�[0ml�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0mp�[0m�[0ma�[0m�[0mt�[0m�[0mh�[0m�[0m.�[0m�[0mj�[0m�[0mo�[0m�[0mi�[0m�[0mn�[0m�[0m(�[0m�[0md�[0m�[0mi�[0m�[0mr�[0m�[0m,�[0m�[0m �[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m448 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mi�[0m�[0ms�[0m�[0mD�[0m�[0mi�[0m�[0mr�[0m�[0me�[0m�[0mc�[0m�[0mt�[0m�[0mo�[0m�[0mr�[0m�[0my�[0m�[0m(�[0m�[0m)�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m449 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m �[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0m"�[0m�[0mn�[0m�[0mo�[0m�[0md�[0m�[0me�[0m�[0m_�[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0mu�[0m�[0ml�[0m�[0me�[0m�[0ms�[0m�[0m"�[0m�[0m)�[0m�[0m �[0m�[0mw�[0m�[0ma�[0m�[0ml�[0m�[0mk�[0m�[0m(�[0m�[0mf�[0m�[0mu�[0m�[0ml�[0m�[0ml�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m450 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mu�[0m�[0me�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m451 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  449 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m.�[0m�[0mn�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m�[2m·�[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m�[2m·�[0m�[0m"�[0m�[0mn�[0m�[0mo�[0m�[0md�[0m�[0me�[0m�[0m_�[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0mu�[0m�[0ml�[0m�[0me�[0m�[0ms�[0m�[0m"�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mw�[0m�[0ma�[0m�[0ml�[0m�[0mk�[0m�[0m(�[0m�[0mf�[0m�[0mu�[0m�[0ml�[0m�[0ml�[0m�[0m)�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m      │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/components/ui/shims/antd-overlays.test.jsx�[0m�[0m:�[0m�[0m202�[0m�[0m:�[0m�[0m44�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m200 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0md�[0m�[0me�[0m�[0mr�[0m�[0m(�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m201 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m<�[0m�[0mT�[0m�[0mo�[0m�[0mo�[0m�[0ml�[0m�[0mt�[0m�[0mi�[0m�[0mp�[0m�[0m �[0m�[0mt�[0m�[0mi�[0m�[0mt�[0m�[0ml�[0m�[0me�[0m�[0m=�[0m�[0m"�[0m�[0mD�[0m�[0mi�[0m�[0ms�[0m�[0ma�[0m�[0mb�[0m�[0ml�[0m�[0me�[0m�[0m �[0m�[0mA�[0m�[0mP�[0m�[0mI�[0m�[0m �[0m�[0md�[0m�[0me�[0m�[0mp�[0m�[0ml�[0m�[0mo�[0m�[0my�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m"�[0m�[0m>�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m202 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m<�[0m�[0mA�[0m�[0mn�[0m�[0mt�[0m�[0mS�[0m�[0mw�[0m�[0mi�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0mc�[0m�[0mh�[0m�[0me�[0m�[0mc�[0m�[0mk�[0m�[0me�[0m�[0md�[0m�[0m �[0m�[0mo�[0m�[0mn�[0m�[0mC�[0m�[0mh�[0m�[0ma�[0m�[0mn�[0m�[0mg�[0m�[0me�[0m�[0m=�[0m�[0m{�[0m�[0m(�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m}�[0m�[0m �[0m�[0m/�[0m�[0m>�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m203 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m<�[0m�[0m/�[0m�[0mT�[0m�[0mo�[0m�[0mo�[0m�[0ml�[0m�[0mt�[0m�[0mi�[0m�[0mp�[0m�[0m>�[0m�[0m,�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m204 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/widgets/co-owner-management/CoOwnerManagement.jsx�[0m�[0m:�[0m�[0m68�[0m�[0m:�[0m�[0m5�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m67 │ �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mh�[0m�[0ma�[0m�[0mn�[0m�[0md�[0m�[0ml�[0m�[0me�[0m�[0mA�[0m�[0mp�[0m�[0mp�[0m�[0ml�[0m�[0my�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0ma�[0m�[0ms�[0m�[0my�[0m�[0mn�[0m�[0mc�[0m�[0m �[0m�[0m(�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m68 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0mp�[0m�[0me�[0m�[0mn�[0m�[0md�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0mA�[0m�[0md�[0m�[0md�[0m�[0ms�[0m�[0m.�[0m�[0ml�[0m�[0me�[0m�[0mn�[0m�[0mg�[0m�[0mt�[0m�[0mh�[0m�[0m �[0m�[0m=�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0m0�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m69 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mr�[0m�[0ms�[0m�[0mT�[0m�[0mo�[0m�[0mA�[0m�[0md�[0m�[0md�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0m[�[0m�[0m.�[0m�[0m.�[0m�[0m.�[0m�[0mp�[0m�[0me�[0m�[0mn�[0m�[0md�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0mA�[0m�[0md�[0m�[0md�[0m�[0ms�[0m�[0m]�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m70 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0mt�[0m�[0mA�[0m�[0mp�[0m�[0mp�[0m�[0ml�[0m�[0my�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0m(�[0m�[0mt�[0m�[0mr�[0m�[0mu�[0m�[0me�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  68 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0mp�[0m�[0me�[0m�[0mn�[0m�[0md�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0mA�[0m�[0md�[0m�[0md�[0m�[0ms�[0m�[0m.�[0m�[0ml�[0m�[0me�[0m�[0mn�[0m�[0mg�[0m�[0mt�[0m�[0mh�[0m�[0m�[2m·�[0m�[0m=�[0m�[0m=�[0m�[0m=�[0m�[0m�[2m·�[0m�[0m0�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m     │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/hooks/useCoOwnerManagement.jsx�[0m�[0m:�[0m�[0m27�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m25 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mt�[0m�[0mr�[0m�[0my�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m26 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m �[0m�[0ma�[0m�[0mw�[0m�[0ma�[0m�[0mi�[0m�[0mt�[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0mr�[0m�[0mv�[0m�[0mi�[0m�[0mc�[0m�[0me�[0m�[0m.�[0m�[0mg�[0m�[0me�[0m�[0mt�[0m�[0mS�[0m�[0mh�[0m�[0ma�[0m�[0mr�[0m�[0me�[0m�[0md�[0m�[0mU�[0m�[0ms�[0m�[0me�[0m�[0mr�[0m�[0ms�[0m�[0m(�[0m�[0mr�[0m�[0me�[0m�[0ms�[0m�[0mo�[0m�[0mu�[0m�[0mr�[0m�[0mc�[0m�[0me�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m27 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mf�[0m�[0m.�[0m�[0mc�[0m�[0mu�[0m�[0mr�[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m �[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m28 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0mt�[0m�[0mC�[0m�[0mo�[0m�[0mO�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0mD�[0m�[0ma�[0m�[0mt�[0m�[0ma�[0m�[0m(�[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m29 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mO�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0ms�[0m�[0m:�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0ms�[0m�[0m.�[0m�[0md�[0m�[0ma�[0m�[0mt�[0m�[0ma�[0m�[0m?�[0m�[0m.�[0m�[0mc�[0m�[0mo�[0m�[0m_�[0m�[0mo�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0ms�[0m�[0m �[0m�[0m|�[0m�[0m|�[0m�[0m �[0m�[0m[�[0m�[0m]�[0m�[0m,�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  27 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mf�[0m�[0m.�[0m�[0mc�[0m�[0mu�[0m�[0mr�[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m�[2m·�[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m�[2m·�[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m     │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/hooks/useCoOwnerManagement.jsx�[0m�[0m:�[0m�[0m33�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m31 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m32 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m(�[0m�[0me�[0m�[0mr�[0m�[0mr�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m33 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mf�[0m�[0m.�[0m�[0mc�[0m�[0mu�[0m�[0mr�[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m �[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m34 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0me�[0m�[0mr�[0m�[0mr�[0m�[0m?�[0m�[0m.�[0m�[0mr�[0m�[0me�[0m�[0ms�[0m�[0mp�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0me�[0m�[0m?�[0m�[0m.�[0m�[0ms�[0m�[0mt�[0m�[0ma�[0m�[0mt�[0m�[0mu�[0m�[0ms�[0m�[0m �[0m�[0m=�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0m4�[0m�[0m0�[0m�[0m4�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m35 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0mt�[0m�[0mC�[0m�[0mo�[0m�[0mO�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0mO�[0m�[0mp�[0m�[0me�[0m�[0mn�[0m�[0m(�[0m�[0mf�[0m�[0ma�[0m�[0ml�[0m�[0ms�[0m�[0me�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  33 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mf�[0m�[0m.�[0m�[0mc�[0m�[0mu�[0m�[0mr�[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m�[2m·�[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m�[2m·�[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m     │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/hooks/useCoOwnerManagement.jsx�[0m�[0m:�[0m�[0m66�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m64 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m]�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m65 │ �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m66 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mf�[0m�[0m.�[0m�[0mc�[0m�[0mu�[0m�[0mr�[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m �[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m67 │ �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m68 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0mn�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mr�[0m�[0mL�[0m�[0mi�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0m=�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  66 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mf�[0m�[0m.�[0m�[0mc�[0m�[0mu�[0m�[0mr�[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m�[2m·�[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m�[2m·�[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m     │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/hooks/useCoOwnerManagement.jsx�[0m�[0m:�[0m�[0m80�[0m�[0m:�[0m�[0m9�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/use-block-statements�\lint/style/useBlockStatements�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mBlock statements are preferred in this position.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m78 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m79 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m �[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0m(�[0m�[0me�[0m�[0mr�[0m�[0mr�[0m�[0m)�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m80 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mf�[0m�[0m �[0m�[0m(�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mf�[0m�[0m.�[0m�[0mc�[0m�[0mu�[0m�[0mr�[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m �[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m81 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0mt�[0m�[0mA�[0m�[0ml�[0m�[0me�[0m�[0mr�[0m�[0mt�[0m�[0mD�[0m�[0me�[0m�[0mt�[0m�[0ma�[0m�[0mi�[0m�[0ml�[0m�[0ms�[0m�[0m(�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m82 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mh�[0m�[0ma�[0m�[0mn�[0m�[0md�[0m�[0ml�[0m�[0me�[0m�[0mE�[0m�[0mx�[0m�[0mc�[0m�[0me�[0m�[0mp�[0m�[0mt�[0m�[0mi�[0m�[0mo�[0m�[0mn�[0m�[0m(�[0m�[0me�[0m�[0mr�[0m�[0mr�[0m�[0m,�[0m�[0m �[0m�[0m"�[0m�[0mU�[0m�[0mn�[0m�[0ma�[0m�[0mb�[0m�[0ml�[0m�[0me�[0m�[0m �[0m�[0mt�[0m�[0mo�[0m�[0m �[0m�[0mf�[0m�[0me�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m �[0m�[0mc�[0m�[0mo�[0m�[0m-�[0m�[0mo�[0m�[0mw�[0m�[0mn�[0m�[0me�[0m�[0mr�[0m�[0m �[0m�[0mi�[0m�[0mn�[0m�[0mf�[0m�[0mo�[0m�[0mr�[0m�[0mm�[0m�[0ma�[0m�[0mt�[0m�[0mi�[0m�[0mo�[0m�[0mn�[0m�[0m"�[0m�[0m)�[0m�[0m,�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mUnsafe fix: Wrap the statement with a `JsBlockStatement`�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m  80 │ �[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0m�[2m·�[0m�[0mi�[0m�[0mf�[0m�[0m�[2m·�[0m�[0m(�[0m�[0ml�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mR�[0m�[0me�[0m�[0mf�[0m�[0m.�[0m�[0mc�[0m�[0mu�[0m�[0mr�[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m�[2m·�[0m�[0m!�[0m�[0m=�[0m�[0m=�[0m�[0m�[2m·�[0m�[0mr�[0m�[0me�[0m�[0mq�[0m�[0mu�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mI�[0m�[0md�[0m�[0m)�[0m�[0m�[2m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0mr�[0m�[0me�[0m�[0mt�[0m�[0mu�[0m�[0mr�[0m�[0mn�[0m�[0m;�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m     │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[32m+�[0m�[0m�[32m+�[0m�[0m
�[0m
�[0msrc/pages/CustomTools.jsx�[0m�[0m:�[0m�[0m18�[0m�[0m:�[0m�[0m20�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/linter/rules/no-empty-block-statements�\lint/suspicious/noEmptyBlockStatements�]8;;�\�[0m�[0m �[0m�[0m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[33m⚠�[0m�[0m �[0m�[0m�[33mUnexpected empty block.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m16 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m(�[0m�[0m"�[0m�[0m.�[0m�[0m.�[0m�[0m/�[0m�[0mp�[0m�[0ml�[0m�[0mu�[0m�[0mg�[0m�[0mi�[0m�[0mn�[0m�[0ms�[0m�[0m/�[0m�[0ml�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0m-�[0m�[0ms�[0m�[0mt�[0m�[0mu�[0m�[0md�[0m�[0mi�[0m�[0mo�[0m�[0m"�[0m�[0m)�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m17 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m.�[0m�[0mt�[0m�[0mh�[0m�[0me�[0m�[0mn�[0m�[0m(�[0m�[0m(�[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0ms�[0m�[0me�[0m�[0mt�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mL�[0m�[0mi�[0m�[0ms�[0m�[0mt�[0m�[0mC�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0m(�[0m�[0m(�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0m.�[0m�[0mL�[0m�[0mo�[0m�[0mo�[0m�[0mk�[0m�[0mu�[0m�[0mp�[0m�[0mL�[0m�[0mi�[0m�[0ms�[0m�[0mt�[0m�[0m)�[0m�[0m)�[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m18 │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m.�[0m�[0mc�[0m�[0ma�[0m�[0mt�[0m�[0mc�[0m�[0mh�[0m�[0m(�[0m�[0m(�[0m�[0m)�[0m�[0m �[0m�[0m=�[0m�[0m>�[0m�[0m �[0m�[0m{�[0m�[0m}�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m19 │ �[0m�[0m �[0m�[0m �[0m�[0m}�[0m�[0m,�[0m�[0m �[0m�[0m[�[0m�[0m]�[0m�[0m)�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m20 │ �[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mEmpty blocks are usually the result of an incomplete refactoring. Remove the empty block or add a comment inside it if it is intentional.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/deployments/create-api-deployment-from-prompt-studio/CreateApiDeploymentFromPromptStudio.css�[0m�[0m �[0m�[0mformat�[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[31m✖�[0m�[0m �[0m�[0m�[31mFile content differs from formatting output�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m 84�[0m�[0m �[0m�[0m�[1m 84�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m 85�[0m�[0m �[0m�[0m�[1m 85�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m/�[0m�[0m*�[0m�[0m �[0m�[0mF�[0m�[0mo�[0m�[0mr�[0m�[0mm�[0m�[0m �[0m�[0mt�[0m�[0me�[0m�[0mx�[0m�[0mt�[0m�[0ma�[0m�[0mr�[0m�[0me�[0m�[0ma�[0m�[0m �[0m�[0ms�[0m�[0mt�[0m�[0my�[0m�[0ml�[0m�[0me�[0m�[0ms�[0m�[0m �[0m�[0mf�[0m�[0mo�[0m�[0mr�[0m�[0m �[0m�[0mD�[0m�[0mi�[0m�[0ms�[0m�[0mp�[0m�[0ml�[0m�[0ma�[0m�[0my�[0m�[0m �[0m�[0mN�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m �[0m�[0ma�[0m�[0mn�[0m�[0md�[0m�[0m �[0m�[0mA�[0m�[0mP�[0m�[0mI�[0m�[0m �[0m�[0mN�[0m�[0ma�[0m�[0mm�[0m�[0me�[0m�[0m �[0m�[0m*�[0m�[0m/�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m 86�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m�[31m.�[0m�[0m�[31mc�[0m�[0m�[31mr�[0m�[0m�[31me�[0m�[0m�[31ma�[0m�[0m�[31mt�[0m�[0m�[31me�[0m�[0m�[31m-�[0m�[0m�[31ma�[0m�[0m�[31mp�[0m�[0m�[31mi�[0m�[0m�[31m-�[0m�[0m�[31md�[0m�[0m�[31me�[0m�[0m�[31mp�[0m�[0m�[31ml�[0m�[0m�[31mo�[0m�[0m�[31my�[0m�[0m�[31mm�[0m�[0m�[31me�[0m�[0m�[31mn�[0m�[0m�[31mt�[0m�[0m�[31m-�[0m�[0m�[31mf�[0m�[0m�[31mr�[0m�[0m�[31mo�[0m�[0m�[31mm�[0m�[0m�[31m-�[0m�[0m�[31mp�[0m�[0m�[31mr�[0m�[0m�[31mo�[0m�[0m�[31mm�[0m�[0m�[31mp�[0m�[0m�[31mt�[0m�[0m�[31m-�[0m�[0m�[31ms�[0m�[0m�[31mt�[0m�[0m�[31mu�[0m�[0m�[31md�[0m�[0m�[31mi�[0m�[0m�[31mo�[0m�[0m�[31m-�[0m�[0m�[31mm�[0m�[0m�[31mo�[0m�[0m�[31md�[0m�[0m�[31ma�[0m�[0m�[31ml�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m 87�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[31m.�[0m�[0m�[31ma�[0m�[0m�[31mn�[0m�[0m�[31mt�[0m�[0m�[31m-�[0m�[0m�[31mf�[0m�[0m�[31mo�[0m�[0m�[31mr�[0m�[0m�[31mm�[0m�[0m�[31m-�[0m�[0m�[31mi�[0m�[0m�[31mt�[0m�[0m�[31me�[0m�[0m�[31mm�[0m�[0m�[31m-�[0m�[0m�[31mc�[0m�[0m�[31mo�[0m�[0m�[31mn�[0m�[0m�[31mt�[0m�[0m�[31mr�[0m�[0m�[31mo�[0m�[0m�[31ml�[0m�[0m�[31m-�[0m�[0m�[31mi�[0m�[0m�[31mn�[0m�[0m�[31mp�[0m�[0m�[31mu�[0m�[0m�[31mt�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m 86�[0m�[0m�[1m │ �[0m�[0m�[32m+�[0m�[0m �[0m�[0m�[32m.�[0m�[0m�[32mc�[0m�[0m�[32mr�[0m�[0m�[32me�[0m�[0m�[32ma�[0m�[0m�[32mt�[0m�[0m�[32me�[0m�[0m�[32m-�[0m�[0m�[32ma�[0m�[0m�[32mp�[0m�[0m�[32mi�[0m�[0m�[32m-�[0m�[0m�[32md�[0m�[0m�[32me�[0m�[0m�[32mp�[0m�[0m�[32ml�[0m�[0m�[32mo�[0m�[0m�[32my�[0m�[0m�[32mm�[0m�[0m�[32me�[0m�[0m�[32mn�[0m�[0m�[32mt�[0m�[0m�[32m-�[0m�[0m�[32mf�[0m�[0m�[32mr�[0m�[0m�[32mo�[0m�[0m�[32mm�[0m�[0m�[32m-�[0m�[0m�[32mp�[0m�[0m�[32mr�[0m�[0m�[32mo�[0m�[0m�[32mm�[0m�[0m�[32mp�[0m�[0m�[32mt�[0m�[0m�[32m-�[0m�[0m�[32ms�[0m�[0m�[32mt�[0m�[0m�[32mu�[0m�[0m�[32md�[0m�[0m�[32mi�[0m�[0m�[32mo�[0m�[0m�[32m-�[0m�[0m�[32mm�[0m�[0m�[32mo�[0m�[0m�[32md�[0m�[0m�[32ma�[0m�[0m�[32ml�[0m�[0m�[1m�[2m�[32m·�[0m�[0m�[32m.�[0m�[0m�[32ma�[0m�[0m�[32mn�[0m�[0m�[32mt�[0m�[0m�[32m-�[0m�[0m�[32mf�[0m�[0m�[32mo�[0m�[0m�[32mr�[0m�[0m�[32mm�[0m�[0m�[32m-�[0m�[0m�[32mi�[0m�[0m�[32mt�[0m�[0m�[32me�[0m�[0m�[32mm�[0m�[0m�[32m-�[0m�[0m�[32mc�[0m�[0m�[32mo�[0m�[0m�[32mn�[0m�[0m�[32mt�[0m�[0m�[32mr�[0m�[0m�[32mo�[0m�[0m�[32ml�[0m�[0m�[32m-�[0m�[0m�[32mi�[0m�[0m�[32mn�[0m�[0m�[32mp�[0m�[0m�[32mu�[0m�[0m�[32mt�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m 88�[0m�[0m �[0m�[0m�[1m 87�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0mt�[0m�[0me�[0m�[0mx�[0m�[0mt�[0m�[0ma�[0m�[0mr�[0m�[0me�[0m�[0ma�[0m�[0m[�[0m�[0mm�[0m�[0ma�[0m�[0mx�[0m�[0ml�[0m�[0me�[0m�[0mn�[0m�[0mg�[0m�[0mt�[0m�[0mh�[0m�[0m=�[0m�[0m"�[0m�[0m3�[0m�[0m0�[0m�[0m"�[0m�[0m]�[0m�[0m,�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m 89�[0m�[0m �[0m�[0m�[1m 88�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m.�[0m�[0mc�[0m�[0mr�[0m�[0me�[0m�[0ma�[0m�[0mt�[0m�[0me�[0m�[0m-�[0m�[0ma�[0m�[0mp�[0m�[0mi�[0m�[0m-�[0m�[0md�[0m�[0me�[0m�[0mp�[0m�[0ml�[0m�[0mo�[0m�[0my�[0m�[0mm�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m-�[0m�[0mf�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0m-�[0m�[0mp�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mt�[0m�[0m-�[0m�[0ms�[0m�[0mt�[0m�[0mu�[0m�[0md�[0m�[0mi�[0m�[0mo�[0m�[0m-�[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0ma�[0m�[0ml�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/components/widgets/confirm-modal/ConfirmModal.test.jsx�[0m�[0m:�[0m�[0m1�[0m�[0m:�[0m�[0m1�[0m�[0m �[0m�[0m�]8;;https://biomejs.dev/assist/actions/organize-imports�\assist/source/organizeImports�]8;;�\�[0m�[0m �[0m�[0m�[30m�[47m FIXABLE �[0m�[0m �[0m�[0m━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[31m✖�[0m�[0m �[0m�[0m�[31mThe imports and exports are not sorted.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[31m>�[0m�[0m �[0m�[0m�[1m1 │ �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m �[0m�[0m{�[0m�[0m �[0m�[0mc�[0m�[0ml�[0m�[0me�[0m�[0ma�[0m�[0mn�[0m�[0mu�[0m�[0mp�[0m�[0m,�[0m�[0m �[0m�[0mr�[0m�[0me�[0m�[0mn�[0m�[0md�[0m�[0me�[0m�[0mr�[0m�[0m,�[0m�[0m �[0m�[0ms�[0m�[0mc�[0m�[0mr�[0m�[0me�[0m�[0me�[0m�[0mn�[0m�[0m,�[0m�[0m �[0m�[0mw�[0m�[0ma�[0m�[0mi�[0m�[0mt�[0m�[0mF�[0m�[0mo�[0m�[0mr�[0m�[0m �[0m�[0m}�[0m�[0m �[0m�[0mf�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0m �[0m�[0m"�[0m�[0m@�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0m-�[0m�[0ml�[0m�[0mi�[0m�[0mb�[0m�[0mr�[0m�[0ma�[0m�[0mr�[0m�[0my�[0m�[0m/�[0m�[0mr�[0m�[0me�[0m�[0ma�[0m�[0mc�[0m�[0mt�[0m�[0m"�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m �[0m�[0m�[1m   │ �[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m�[1m�[31m^�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m2 │ �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m �[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mr�[0m�[0mE�[0m�[0mv�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m �[0m�[0mf�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0m �[0m�[0m"�[0m�[0m@�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0mi�[0m�[0mn�[0m�[0mg�[0m�[0m-�[0m�[0ml�[0m�[0mi�[0m�[0mb�[0m�[0mr�[0m�[0ma�[0m�[0mr�[0m�[0my�[0m�[0m/�[0m�[0mu�[0m�[0ms�[0m�[0me�[0m�[0mr�[0m�[0m-�[0m�[0me�[0m�[0mv�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0m"�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m3 │ �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m �[0m�[0m{�[0m�[0m �[0m�[0ma�[0m�[0mf�[0m�[0mt�[0m�[0me�[0m�[0mr�[0m�[0mE�[0m�[0ma�[0m�[0mc�[0m�[0mh�[0m�[0m,�[0m�[0m �[0m�[0md�[0m�[0me�[0m�[0ms�[0m�[0mc�[0m�[0mr�[0m�[0mi�[0m�[0mb�[0m�[0me�[0m�[0m,�[0m�[0m �[0m�[0me�[0m�[0mx�[0m�[0mp�[0m�[0me�[0m�[0mc�[0m�[0mt�[0m�[0m,�[0m�[0m �[0m�[0mi�[0m�[0mt�[0m�[0m,�[0m�[0m �[0m�[0mv�[0m�[0mi�[0m�[0m �[0m�[0m}�[0m�[0m �[0m�[0mf�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0m �[0m�[0m"�[0m�[0mv�[0m�[0mi�[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0m"�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m�[1m�[34mℹ�[0m�[0m �[0m�[0m�[34mSafe fix: Organize Imports (Biome)�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m  4�[0m�[0m �[0m�[0m�[1m  4�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m  5�[0m�[0m �[0m�[0m�[1m  5�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0mi�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mr�[0m�[0mt�[0m�[0m �[0m�[0m{�[0m�[0m �[0m�[0mD�[0m�[0mr�[0m�[0mo�[0m�[0mp�[0m�[0md�[0m�[0mo�[0m�[0mw�[0m�[0mn�[0m�[0m �[0m�[0m}�[0m�[0m �[0m�[0mf�[0m�[0mr�[0m�[0mo�[0m�[0mm�[0m�[0m �[0m�[0m"�[0m�[0m@�[0m�[0m/�[0m�[0mc�[0m�[0mo�[0m�[0mm�[0m�[0mp�[0m�[0mo�[0m�[0mn�[0m�[0me�[0m�[0mn�[0m�[0mt�[0m�[0ms�[0m�[0m/�[0m�[0mu�[0m�[0mi�[0m�[0m/�[0m�[0ms�[0m�[0mh�[0m�[0mi�[0m�[0mm�[0m�[0ms�[0m�[0m/�[0m�[0ma�[0m�[0mn�[0m�[0mt�[0m�[0md�[0m�[0m-�[0m�[0mo�[0m�[0mv�[0m�[0me�[0m�[0mr�[0m�[0ml�[0m�[0ma�[0m�[0my�[0m�[0ms�[0m�[0m"�[0m�[0m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m  6�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m  7�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m�[31mi�[0m�[0m�[31mm�[0m�[0m�[31mp�[0m�[0m�[31mo�[0m�[0m�[31mr�[0m�[0m�[31mt�[0m�[0m�[2m�[31m·�[0m�[0m�[31m{�[0m�[0m�[2m�[31m·�[0m�[0m�[1m�[31mr�[0m�[0m�[1m�[31me�[0m�[0m�[1m�[31ms�[0m�[0m�[1m�[31me�[0m�[0m�[1m�[31mt�[0m�[0m�[1m�[31mC�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31mn�[0m�[0m�[1m�[31mf�[0m�[0m�[1m�[31mi�[0m�[0m�[1m�[31mr�[0m�[0m�[1m�[31mm�[0m�[0m�[2m�[31m·�[0m�[0m�[31m}�[0m�[0m�[2m�[31m·�[0m�[0m�[31mf�[0m�[0m�[31mr�[0m�[0m�[31mo�[0m�[0m�[31mm�[0m�[0m�[2m�[31m·�[0m�[0m�[31m"�[0m�[0m�[31m.�[0m�[0m�[31m/�[0m�[0m�[1m�[31mc�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31mn�[0m�[0m�[1m�[31mf�[0m�[0m�[1m�[31mi�[0m�[0m�[1m�[31mr�[0m�[0m�[1m�[31mm�[0m�[0m�[1m�[31mS�[0m�[0m�[1m�[31mt�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31mr�[0m�[0m�[1m�[31me�[0m�[0m�[31m"�[0m�[0m�[31m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m  8�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m�[31mi�[0m�[0m�[31mm�[0m�[0m�[31mp�[0m�[0m�[31mo�[0m�[0m�[31mr�[0m�[0m�[31mt�[0m�[0m�[2m�[31m·�[0m�[0m�[31m{�[0m�[0m�[2m�[31m·�[0m�[0m�[1m�[31mC�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31mn�[0m�[0m�[1m�[31mf�[0m�[0m�[1m�[31mi�[0m�[0m�[1m�[31mr�[0m�[0m�[1m�[31mm�[0m�[0m�[1m�[31mH�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31ms�[0m�[0m�[1m�[31mt�[0m�[0m�[2m�[31m·�[0m�[0m�[31m}�[0m�[0m�[2m�[31m·�[0m�[0m�[31mf�[0m�[0m�[31mr�[0m�[0m�[31mo�[0m�[0m�[31mm�[0m�[0m�[2m�[31m·�[0m�[0m�[31m"�[0m�[0m�[31m.�[0m�[0m�[31m/�[0m�[0m�[1m�[31mC�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31mn�[0m�[0m�[1m�[31mf�[0m�[0m�[1m�[31mi�[0m�[0m�[1m�[31mr�[0m�[0m�[1m�[31mm�[0m�[0m�[1m�[31mH�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31ms�[0m�[0m�[1m�[31mt�[0m�[0m�[31m"�[0m�[0m�[31m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m  9�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m�[31mi�[0m�[0m�[31mm�[0m�[0m�[31mp�[0m�[0m�[31mo�[0m�[0m�[31mr�[0m�[0m�[31mt�[0m�[0m�[2m�[31m·�[0m�[0m�[31m{�[0m�[0m�[2m�[31m·�[0m�[0m�[1m�[31mC�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31mn�[0m�[0m�[1m�[31mf�[0m�[0m�[1m�[31mi�[0m�[0m�[1m�[31mr�[0m�[0m�[1m�[31mm�[0m�[0m�[1m�[31mM�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31md�[0m�[0m�[1m�[31ma�[0m�[0m�[1m�[31ml�[0m�[0m�[2m�[31m·�[0m�[0m�[31m}�[0m�[0m�[2m�[31m·�[0m�[0m�[31mf�[0m�[0m�[31mr�[0m�[0m�[31mo�[0m�[0m�[31mm�[0m�[0m�[2m�[31m·�[0m�[0m�[31m"�[0m�[0m�[31m.�[0m�[0m�[31m/�[0m�[0m�[1m�[31mC�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31mn�[0m�[0m�[1m�[31mf�[0m�[0m�[1m�[31mi�[0m�[0m�[1m�[31mr�[0m�[0m�[1m�[31mm�[0m�[0m�[1m�[31mM�[0m�[0m�[1m�[31mo�[0m�[0m�[1m�[31md�[0m�[0m�[1m�[31ma�[0m�[0m�[1m�[31ml�[0m�[0m�[31m"�[0m�[0m�[31m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m  6�[0m�[0m�[1m │ �[0m�[0m�[32m+�[0m�[0m �[0m�[0m�[32mi�[0m�[0m�[32mm�[0m�[0m�[32mp�[0m�[0m�[32mo�[0m�[0m�[32mr�[0m�[0m�[32mt�[0m�[0m�[2m�[32m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0m�[1m�[32mC�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32mn�[0m�[0m�[1m�[32mf�[0m�[0m�[1m�[32mi�[0m�[0m�[1m�[32mr�[0m�[0m�[1m�[32mm�[0m�[0m�[1m�[32mH�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32ms�[0m�[0m�[1m�[32mt�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m�[2m�[32m·�[0m�[0m�[32mf�[0m�[0m�[32mr�[0m�[0m�[32mo�[0m�[0m�[32mm�[0m�[0m�[2m�[32m·�[0m�[0m�[32m"�[0m�[0m�[32m.�[0m�[0m�[32m/�[0m�[0m�[1m�[32mC�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32mn�[0m�[0m�[1m�[32mf�[0m�[0m�[1m�[32mi�[0m�[0m�[1m�[32mr�[0m�[0m�[1m�[32mm�[0m�[0m�[1m�[32mH�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32ms�[0m�[0m�[1m�[32mt�[0m�[0m�[32m"�[0m�[0m�[32m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m  7�[0m�[0m�[1m │ �[0m�[0m�[32m+�[0m�[0m �[0m�[0m�[32mi�[0m�[0m�[32mm�[0m�[0m�[32mp�[0m�[0m�[32mo�[0m�[0m�[32mr�[0m�[0m�[32mt�[0m�[0m�[2m�[32m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0m�[1m�[32mC�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32mn�[0m�[0m�[1m�[32mf�[0m�[0m�[1m�[32mi�[0m�[0m�[1m�[32mr�[0m�[0m�[1m�[32mm�[0m�[0m�[1m�[32mM�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32md�[0m�[0m�[1m�[32ma�[0m�[0m�[1m�[32ml�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m�[2m�[32m·�[0m�[0m�[32mf�[0m�[0m�[32mr�[0m�[0m�[32mo�[0m�[0m�[32mm�[0m�[0m�[2m�[32m·�[0m�[0m�[32m"�[0m�[0m�[32m.�[0m�[0m�[32m/�[0m�[0m�[1m�[32mC�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32mn�[0m�[0m�[1m�[32mf�[0m�[0m�[1m�[32mi�[0m�[0m�[1m�[32mr�[0m�[0m�[1m�[32mm�[0m�[0m�[1m�[32mM�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32md�[0m�[0m�[1m�[32ma�[0m�[0m�[1m�[32ml�[0m�[0m�[32m"�[0m�[0m�[32m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m  8�[0m�[0m�[1m │ �[0m�[0m�[32m+�[0m�[0m �[0m�[0m�[32mi�[0m�[0m�[32mm�[0m�[0m�[32mp�[0m�[0m�[32mo�[0m�[0m�[32mr�[0m�[0m�[32mt�[0m�[0m�[2m�[32m·�[0m�[0m�[32m{�[0m�[0m�[2m�[32m·�[0m�[0m�[1m�[32mr�[0m�[0m�[1m�[32me�[0m�[0m�[1m�[32ms�[0m�[0m�[1m�[32me�[0m�[0m�[1m�[32mt�[0m�[0m�[1m�[32mC�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32mn�[0m�[0m�[1m�[32mf�[0m�[0m�[1m�[32mi�[0m�[0m�[1m�[32mr�[0m�[0m�[1m�[32mm�[0m�[0m�[2m�[32m·�[0m�[0m�[32m}�[0m�[0m�[2m�[32m·�[0m�[0m�[32mf�[0m�[0m�[32mr�[0m�[0m�[32mo�[0m�[0m�[32mm�[0m�[0m�[2m�[32m·�[0m�[0m�[32m"�[0m�[0m�[32m.�[0m�[0m�[32m/�[0m�[0m�[1m�[32mc�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32mn�[0m�[0m�[1m�[32mf�[0m�[0m�[1m�[32mi�[0m�[0m�[1m�[32mr�[0m�[0m�[1m�[32mm�[0m�[0m�[1m�[32mS�[0m�[0m�[1m�[32mt�[0m�[0m�[1m�[32mo�[0m�[0m�[1m�[32mr�[0m�[0m�[1m�[32me�[0m�[0m�[32m"�[0m�[0m�[32m;�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m 10�[0m�[0m �[0m�[0m�[1m  9�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m 11�[0m�[0m �[0m�[0m�[1m 10�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m/�[0m�[0m/�[0m�[0m �[0m�[0mT�[0m�[0mh�[0m�[0me�[0m�[0m �[0m�[0ms�[0m�[0mt�[0m�[0mo�[0m�[0mr�[0m�[0me�[0m�[0m �[0m�[0mi�[0m�[0ms�[0m�[0m �[0m�[0mm�[0m�[0mo�[0m�[0md�[0m�[0mu�[0m�[0ml�[0m�[0me�[0m�[0m-�[0m�[0ml�[0m�[0me�[0m�[0mv�[0m�[0me�[0m�[0ml�[0m�[0m,�[0m�[0m �[0m�[0ms�[0m�[0mo�[0m�[0m �[0m�[0ma�[0m�[0m �[0m�[0md�[0m�[0mi�[0m�[0ma�[0m�[0ml�[0m�[0mo�[0m�[0mg�[0m�[0m �[0m�[0ml�[0m�[0me�[0m�[0mf�[0m�[0mt�[0m�[0m �[0m�[0mo�[0m�[0mp�[0m�[0me�[0m�[0mn�[0m�[0m �[0m�[0mb�[0m�[0my�[0m�[0m �[0m�[0mo�[0m�[0mn�[0m�[0me�[0m�[0m �[0m�[0mt�[0m�[0me�[0m�[0ms�[0m�[0mt�[0m�[0m �[0m�[0mw�[0m�[0mo�[0m�[0mu�[0m�[0ml�[0m�[0md�[0m�[0m �[0m�[0ml�[0m�[0me�[0m�[0ma�[0m�[0mk�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0msrc/index.css�[0m�[0m �[0m�[0mformat�[0m�[0m �[0m�[0m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[31m✖�[0m�[0m �[0m�[0m�[31mFile content differs from formatting output�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m313�[0m�[0m �[0m�[0m�[1m313�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m:�[0m�[0mw�[0m�[0mh�[0m�[0me�[0m�[0mr�[0m�[0me�[0m�[0m(�[0m�[0ms�[0m�[0mp�[0m�[0ma�[0m�[0mn�[0m�[0m,�[0m�[0m �[0m�[0mp�[0m�[0m,�[0m�[0m �[0m�[0ml�[0m�[0ma�[0m�[0mb�[0m�[0me�[0m�[0ml�[0m�[0m,�[0m�[0m �[0m�[0mt�[0m�[0md�[0m�[0m,�[0m�[0m �[0m�[0mt�[0m�[0mh�[0m�[0m,�[0m�[0m �[0m�[0ml�[0m�[0mi�[0m�[0m,�[0m�[0m �[0m�[0ma�[0m�[0m)�[0m�[0m:�[0m�[0mn�[0m�[0mo�[0m�[0mt�[0m�[0m(�[0m�[0m:�[0m�[0mw�[0m�[0mh�[0m�[0me�[0m�[0mr�[0m�[0me�[0m�[0m(�[0m�[0m.�[0m�[0mf�[0m�[0ml�[0m�[0me�[0m�[0mx�[0m�[0m,�[0m�[0m �[0m�[0m.�[0m�[0mi�[0m�[0mn�[0m�[0ml�[0m�[0mi�[0m�[0mn�[0m�[0me�[0m�[0m-�[0m�[0mf�[0m�[0ml�[0m�[0me�[0m�[0mx�[0m�[0m,�[0m�[0m �[0m�[0m.�[0m�[0mg�[0m�[0mr�[0m�[0mi�[0m�[0md�[0m�[0m)�[0m�[0m)�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m314�[0m�[0m �[0m�[0m�[1m314�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m>�[0m�[0m �[0m�[0ms�[0m�[0mv�[0m�[0mg�[0m�[0m.�[0m�[0ml�[0m�[0mu�[0m�[0mc�[0m�[0mi�[0m�[0md�[0m�[0me�[0m�[0m,�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m315�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m�[2m�[31m·�[0m�[0m�[2m�[31m·�[0m�[0m�[31m:�[0m�[0m�[31mw�[0m�[0m�[31mh�[0m�[0m�[31me�[0m�[0m�[31mr�[0m�[0m�[31me�[0m�[0m�[31m(�[0m�[0m�[31ms�[0m�[0m�[31mp�[0m�[0m�[31ma�[0m�[0m�[31mn�[0m�[0m�[31m,�[0m�[0m�[2m�[31m·�[0m�[0m�[31mp�[0m�[0m�[31m,�[0m�[0m�[2m�[31m·�[0m�[0m�[31ml�[0m�[0m�[31ma�[0m�[0m�[31mb�[0m�[0m�[31me�[0m�[0m�[31ml�[0m�[0m�[31m,�[0m�[0m�[2m�[31m·�[0m�[0m�[31mt�[0m�[0m�[31md�[0m�[0m�[31m,�[0m�[0m�[2m�[31m·�[0m�[0m�[31mt�[0m�[0m�[31mh�[0m�[0m�[31m,�[0m�[0m�[2m�[31m·�[0m�[0m�[31ml�[0m�[0m�[31mi�[0m�[0m�[31m,�[0m�[0m�[2m�[31m·�[0m�[0m�[31ma�[0m�[0m�[31m)�[0m�[0m�[31m:�[0m�[0m�[31mn�[0m�[0m�[31mo�[0m�[0m�[31mt�[0m�[0m�[31m(�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m316�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[31m:�[0m�[0m�[31mw�[0m�[0m�[31mh�[0m�[0m�[31me�[0m�[0m�[31mr�[0m�[0m�[31me�[0m�[0m�[31m(�[0m�[0m�[31m.�[0m�[0m�[31mf�[0m�[0m�[31ml�[0m�[0m�[31me�[0m�[0m�[31mx�[0m�[0m�[31m,�[0m�[0m�[2m�[31m·�[0m�[0m�[31m.�[0m�[0m�[31mi�[0m�[0m�[31mn�[0m�[0m�[31ml�[0m�[0m�[31mi�[0m�[0m�[31mn�[0m�[0m�[31me�[0m�[0m�[31m-�[0m�[0m�[31mf�[0m�[0m�[31ml�[0m�[0m�[31me�[0m�[0m�[31mx�[0m�[0m�[31m,�[0m�[0m�[2m�[31m·�[0m�[0m�[31m.�[0m�[0m�[31mg�[0m�[0m�[31mr�[0m�[0m�[31mi�[0m�[0m�[31md�[0m�[0m�[31m)�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m317�[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m │ �[0m�[0m�[31m-�[0m�[0m �[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[1m�[2m�[31m·�[0m�[0m�[31m)�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m�[1m315�[0m�[0m�[1m │ �[0m�[0m�[32m+�[0m�[0m �[0m�[0m�[2m�[32m·�[0m�[0m�[2m�[32m·�[0m�[0m�[32m:�[0m�[0m�[32mw�[0m�[0m�[32mh�[0m�[0m�[32me�[0m�[0m�[32mr�[0m�[0m�[32me�[0m�[0m�[32m(�[0m�[0m�[32ms�[0m�[0m�[32mp�[0m�[0m�[32ma�[0m�[0m�[32mn�[0m�[0m�[32m,�[0m�[0m�[2m�[32m·�[0m�[0m�[32mp�[0m�[0m�[32m,�[0m�[0m�[2m�[32m·�[0m�[0m�[32ml�[0m�[0m�[32ma�[0m�[0m�[32mb�[0m�[0m�[32me�[0m�[0m�[32ml�[0m�[0m�[32m,�[0m�[0m�[2m�[32m·�[0m�[0m�[32mt�[0m�[0m�[32md�[0m�[0m�[32m,�[0m�[0m�[2m�[32m·�[0m�[0m�[32mt�[0m�[0m�[32mh�[0m�[0m�[32m,�[0m�[0m�[2m�[32m·�[0m�[0m�[32ml�[0m�[0m�[32mi�[0m�[0m�[32m,�[0m�[0m�[2m�[32m·�[0m�[0m�[32ma�[0m�[0m�[32m)�[0m�[0m�[32m:�[0m�[0m�[32mn�[0m�[0m�[32mo�[0m�[0m�[32mt�[0m�[0m�[32m(�[0m�[0m�[32m:�[0m�[0m�[32mw�[0m�[0m�[32mh�[0m�[0m�[32me�[0m�[0m�[32mr�[0m�[0m�[32me�[0m�[0m�[32m(�[0m�[0m�[32m.�[0m�[0m�[32mf�[0m�[0m�[32ml�[0m�[0m�[32me�[0m�[0m�[32mx�[0m�[0m�[32m,�[0m�[0m�[2m�[32m·�[0m�[0m�[32m.�[0m�[0m�[32mi�[0m�[0m�[32mn�[0m�[0m�[32ml�[0m�[0m�[32mi�[0m�[0m�[32mn�[0m�[0m�[32me�[0m�[0m�[32m-�[0m�[0m�[32mf�[0m�[0m�[32ml�[0m�[0m�[32me�[0m�[0m�[32mx�[0m�[0m�[32m,�[0m�[0m�[2m�[32m·�[0m�[0m�[32m.�[0m�[0m�[32mg�[0m�[0m�[32mr�[0m�[0m�[32mi�[0m�[0m�[32md�[0m�[0m�[32m)�[0m�[0m�[32m)�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m318�[0m�[0m �[0m�[0m�[1m316�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m>�[0m�[0m �[0m�[0m:�[0m�[0mw�[0m�[0mh�[0m�[0me�[0m�[0mr�[0m�[0me�[0m�[0m(�[0m�[0ms�[0m�[0mp�[0m�[0ma�[0m�[0mn�[0m�[0m,�[0m�[0m �[0m�[0mi�[0m�[0m)�[0m�[0m:�[0m�[0mn�[0m�[0mo�[0m�[0mt�[0m�[0m(�[0m�[0m:�[0m�[0mw�[0m�[0mh�[0m�[0me�[0m�[0mr�[0m�[0me�[0m�[0m(�[0m�[0m.�[0m�[0mf�[0m�[0ml�[0m�[0me�[0m�[0mx�[0m�[0m,�[0m�[0m �[0m�[0m.�[0m�[0mi�[0m�[0mn�[0m�[0ml�[0m�[0mi�[0m�[0mn�[0m�[0me�[0m�[0m-�[0m�[0mf�[0m�[0ml�[0m�[0me�[0m�[0mx�[0m�[0m)�[0m�[0m)�[0m�[0m
�[0m�[0m  �[0m�[0m  �[0m�[0m�[1m319�[0m�[0m �[0m�[0m�[1m317�[0m�[0m�[1m │ �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m �[0m�[0m>�[0m�[0m �[0m�[0ms�[0m�[0mv�[0m�[0mg�[0m�[0m.�[0m�[0ml�[0m�[0mu�[0m�[0mc�[0m�[0mi�[0m�[0md�[0m�[0me�[0m�[0m �[0m�[0m{�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m
�[0m�[34mChecked �[0m�[0m�[34m511�[0m�[0m�[34m �[0m�[0m�[34mfiles�[0m�[0m�[34m in �[0m�[0m�[34m413�[0m�[0m�[2m�[34mms�[0m�[0m�[34m.�[0m�[0m�[34m No fixes applied.�[0m�[0m
�[0m�[0m�[31mFound �[0m�[0m�[31m11�[0m�[0m�[31m errors.�[0m�[0m
�[0m�[0m�[33mFound �[0m�[0m�[33m29�[0m�[0m�[33m warnings.�[0m
�[0mci�[0m�[0m �[0m�[0m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━�[0m�[0m

�[0m�[0m  �[0m�[0m�[1m�[31m✖�[0m�[0m �[0m�[0m�[31mSome �[0m�[0m�[1m�[31merrors�[0m�[0m�[31m were emitted while �[0m�[0m�[1m�[31mrunning checks�[0m�[0m�[31m.�[0m�[0m
�[0m�[0m  �[0m�[0m
�[0m

Run cd frontend && bun run check:fix to auto-fix issues.

@greptile-apps

greptile-apps Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR establishes the shadcn/Midnight Bloom frontend foundation and migrates icons, Typography, and Button usage away from Ant Design compatibility imports.

  • Adds shared UI primitives, theme tokens, and Ant Design-compatible behavior shims.
  • Replaces icon imports and routes existing Button and Typography call sites through local shims.
  • Adds frontend unit coverage and a Playwright UI test group to the repository test rig.

Confidence Score: 4/5

The frontend migration should not merge until the new browser suite targets the frontend service rather than the backend origin.

The rig always supplies a backend URL, and the Playwright configuration prioritizes it over the frontend fallback, so the added UI suite does not exercise the application it is intended to validate.

Files Needing Attention: tests/e2e/ui/playwright.config.js

Important Files Changed

Filename Overview
frontend/src/components/ui/shims/antd-button.tsx Maps commonly used Ant Design Button props, including loading and disabled behavior, onto the new shared button primitive.
frontend/src/components/ui/shims/antd-typography.tsx Provides local Typography components with formatting, truncation, line-clamp, and tooltip compatibility behavior.
frontend/package.json Replaces Ant Design dependencies with the React 19, Radix, shadcn, Tailwind, and supporting frontend stack.
tests/e2e/ui/playwright.config.js Adds browser-suite configuration, but selects the rig-provided backend URL before the frontend origin.
tests/groups.yaml Registers the optional Playwright UI suite as an end-to-end group dependent on the platform smoke gate.
tests/rig/cli.py Adds Playwright command construction and JUnit integration to the shared test runner.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  CallSites[Existing frontend call sites] --> Shims[Ant Design-compatible shims]
  Shims --> Primitives[shadcn / Radix primitives]
  Primitives --> Theme[Midnight Bloom tokens]
  Rig[Test rig UI group] --> Playwright[Playwright]
  Playwright --> Frontend[Frontend service]
Loading

Fix all with Greploop Fix All in Claude Code

Prompt To Fix All With AI
### Issue 1
tests/e2e/ui/playwright.config.js:24-27
**Backend origin overrides frontend**

When the test rig runs the new `ui` group, it exports `UNSTRACT_BACKEND_URL`, which this configuration selects instead of the frontend served on port 3000, causing Playwright to navigate to the backend rather than exercise the migrated UI.

```suggestion
const baseURL =
  process.env.UNSTRACT_FRONTEND_URL ?? "http://localhost:3000";
```

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "fix(frontend): size the island against i..." | Re-trigger Greptile

Comment on lines +24 to +27
const baseURL =
process.env.UNSTRACT_FRONTEND_URL ??
process.env.UNSTRACT_BACKEND_URL ??
"http://localhost:3000";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Backend origin overrides frontend

When the test rig runs the new ui group, it exports UNSTRACT_BACKEND_URL, which this configuration selects instead of the frontend served on port 3000, causing Playwright to navigate to the backend rather than exercise the migrated UI.

Suggested change
const baseURL =
process.env.UNSTRACT_FRONTEND_URL ??
process.env.UNSTRACT_BACKEND_URL ??
"http://localhost:3000";
const baseURL =
process.env.UNSTRACT_FRONTEND_URL ?? "http://localhost:3000";

Knowledge Base Used: Container composition and test infrastructure

Prompt To Fix With AI
This is a comment left during a code review.
Path: tests/e2e/ui/playwright.config.js
Line: 24-27

Comment:
**Backend origin overrides frontend**

When the test rig runs the new `ui` group, it exports `UNSTRACT_BACKEND_URL`, which this configuration selects instead of the frontend served on port 3000, causing Playwright to navigate to the backend rather than exercise the migrated UI.

```suggestion
const baseURL =
  process.env.UNSTRACT_FRONTEND_URL ?? "http://localhost:3000";
```

**Knowledge Base Used:** [Container composition and test infrastructure](https://app.greptile.com/zipstack/-/custom-context/knowledge-base/zipstack/unstract/-/docs/container-composition-and-testing.md)

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

Unstract test results

Per-group results

Status Group Tier Passed Failed Errors Skipped Duration (s)
e2e-api-deployment e2e 3 0 0 0 20.8
e2e-coowners e2e 1 0 0 0 1.2
e2e-etl e2e 1 0 0 0 8.1
e2e-login e2e 2 0 0 0 1.4
e2e-prompt-studio e2e 1 0 0 0 4.3
e2e-smoke e2e 2 0 0 0 1.2
e2e-workflow e2e 1 0 0 0 16.3
frontend unit 0 1 0 0 0.0
integration-backend integration 290 0 0 26 37.0
integration-connectors integration 1 0 0 7 9.2
integration-workers integration 140 0 0 1 46.4
ui e2e 0 1 0 0 0.0
unit-backend unit 1012 0 0 1 41.8
unit-connectors unit 63 0 0 0 10.1
unit-core unit 33 0 0 0 1.4
unit-platform-service unit 15 0 0 0 2.7
unit-rig unit 120 0 0 0 4.7
unit-sdk1 unit 563 0 0 0 29.9
unit-workers unit 1346 0 0 1 106.5
TOTAL 3594 2 0 36 342.8

Critical paths

⚠️ Critical paths not yet covered

  • workflow-execution-fan-out — Multi-file workflow execution fans out to file-processing workers and rejoins. (declared coverage: no groups declared)
✅ Covered critical paths
  • auth-login — covered by e2e-login
  • adapter-register-llm — covered by integration-backend
  • workflow-author — covered by integration-backend
  • co-owner-manage — covered by integration-backend, e2e-coowners
  • workflow-create-execute — covered by e2e-workflow
  • api-deployment-provision — covered by integration-backend
  • api-deployment-auth — covered by integration-backend
  • api-deployment-run — covered by e2e-api-deployment
  • mcp-server-auth — covered by integration-backend
  • mcp-platform-auth — covered by integration-backend
  • prompt-studio-author — covered by integration-backend
  • prompt-studio-fetch-response — covered by e2e-prompt-studio
  • connector-register-test — covered by integration-backend
  • pipeline-etl-execute — covered by e2e-etl
  • usage-aggregate-read — covered by integration-backend
  • usage-token-tracking — covered by e2e-api-deployment
  • callback-result-delivery — covered by e2e-api-deployment

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants