Skip to content

UI overhaul - #77

Merged
carlassmann merged 43 commits into
mainfrom
ccssmnn/migrate-to-base-ui-and-improve
May 6, 2026
Merged

UI overhaul#77
carlassmann merged 43 commits into
mainfrom
ccssmnn/migrate-to-base-ui-and-improve

Conversation

@carlassmann

Copy link
Copy Markdown
Owner

This PR started as a PR for migrating to base-ui and turned into an overhaul of the UI.
It's even more clean. The interactions are more intentional.
The organization of feature specific code got cleaned up a lot.

Add backend support with handler/operation/part hierarchy:
- router → handler → operations/parts → parts → ∅
- New rules: only-router-may-import-handlers, only-handlers-may-import-operations
- Extended: no-feature-part-composition (import-level for server), only-screens-and-widgets-may-import-parts (+ handler, operation)
- no-utility-definitions-in-ui-modules: server parts/operations exempt (they ARE the logic)
- Fixed no-deep-feature-imports alias detection in error messages
- Removed use-case/operation model, replaced with handler/operation/part
- Server rules commented out in eslint config until migration
@vercel

vercel Bot commented Mar 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
tilly Ready Ready Preview, Comment May 6, 2026 7:24pm

- close parts re-export loophole: only-screens-and-widgets-may-import-parts
  now also flags ExportNamedDeclaration / ExportAllDeclaration with a source;
  promote ReminderForm, PersonSelector and ListFilter to widgets and drop
  internal-only ReminderFields from the reminders barrel
- enforce only-routes-may-import-screens on app/components|hooks|lib and
  apply only-screens-and-widgets-may-import-parts to routes too
- replace bare module-level state in SwipeableListItem with a typed
  active-swipe controller and unmount cleanup so virtualized rows can't
  leave stale close callbacks behind
- strip debug console.log chatter from push/notification flows
Bring in-range patch and minor releases up to date via bun update, and
bump the exact-pinned packages where a safe patch/minor was available
(@ai-sdk/gateway, @clerk/clerk-react, ai, react, react-dom, @types/react).

Knock-on fixes required by the bumps:

- @base-ui/react 1.4: DrawerPreview graduated to Drawer, rename the import
- eslint-plugin-react-hooks 7.1 added immutability and effect-cascade rules:
  * useOnlineStatus moves its event handlers inside the effect so they
    aren't referenced before declaration
  * useIsMobile switches to useSyncExternalStore so it no longer calls
    setState synchronously inside useEffect
- @types/react 19.2.14 tightened ChangeEvent/InputEvent: drop the unused
  onInput→onChange shim in Textarea so the underlying handler types match

Skipped majors that need separate consideration: astro 5→6, eslint 9→10,
typescript 5→6, jsdom 27→29, knip 5→6, @types/node 22→25, @astrojs/{node,
react,vercel} majors, @vitejs/plugin-react 5→6, vercel 50→53, satori
0.19→0.26, prettier-plugin-tailwindcss 0.7→0.8, @clack/prompts 0→1,
@hugeicons/core-free-icons 3→4, @vercel/config 0.0→0.3.
Bumps that needed real investigation:

- typescript 5.9 → 6.0
- @types/node 22 → 25 (local node is v24)
- jsdom 27 → 29
- knip 5 → 6
- vercel CLI 50 → 53
- @clack/prompts 0 → 1, satori 0.19 → 0.26 (script-only deps)
- @hugeicons/core-free-icons 3 → 4 (37 import sites unaffected)
- @vercel/config 0 → 0.3 (vercel.ts uses /v1 subpath, still exported)
- prettier-plugin-tailwindcss 0.7 → 0.8

While at it, fix a regression I caused last commit: the new export-from
check on only-screens-and-widgets-may-import-parts was over-broad and
also blocked the legitimate barrel pattern of feature-index re-exporting
hooks/lib. Split the leaf zones: parts stay strictly private (no
re-exports), feature-lib and hook are barrel-reexportable from
feature-index. Tests updated, plugin tests now 174/174.

Skipped (peer-dep blocked or knock-on majors):
- astro 5 → 6: @vite-pwa/astro@1.2.0 (latest) only peers astro ≤ 5
- @astrojs/{node,react,vercel} v10, @vitejs/plugin-react 6: gated by astro 6
- eslint 9 → 10: eslint-plugin-react@7.37.5 (latest) peers eslint ≤ 9.7
- @eslint/js 10: tied to eslint 10
The deployed function runs `nodejs24.x` (per .vercel/output/functions/
_render.func/.vc-config.json), so the types should track Node 24, not 25.
The @astrojs/vercel adapter picks the runtime from the local node version
at build time, and our local toolchain is on v24 too.
CI's bun resolves @typescript-eslint/* differently than local: rule
tester's nested utils@8.57.0 conflicted with the rule's RuleCreator
hitting top-level utils@8.59.2, breaking RuleModule type compatibility
in the plugin's tests. Bump the plugin's deps to ^8.59.2 so all copies
unify.
CI failed because the plugin's TypeScript source was compiled to dist/,
which is gitignored and not built in CI. Rather than wire up a CI build
step, drop the TS toolchain entirely: the tsc-emitted JS becomes the
source-of-truth, mirroring the simpler setup in syntwin-mono.

Also fix downstream issues this exposed:
- exclude tools/ from root tsconfig so astro check stops type-checking
  the plugin's tests against the now-untyped JS rules
- ignore *.setup.ts in eslint config; vitest.setup.ts uses navigator
  globally and pulled in spurious no-undef errors
- in vitest.setup.ts, also handle the case where navigator exists but
  lacks .language (the case in the GitHub Actions runner)
@carlassmann
carlassmann marked this pull request as ready for review May 6, 2026 19:54
@carlassmann
carlassmann merged commit a9372a8 into main May 6, 2026
4 checks passed
@carlassmann
carlassmann deleted the ccssmnn/migrate-to-base-ui-and-improve branch May 6, 2026 20:01
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.

1 participant