UI overhaul - #77
Merged
Merged
Conversation
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
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
- 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.
carlassmann
force-pushed
the
ccssmnn/migrate-to-base-ui-and-improve
branch
from
May 6, 2026 14:25
b696b4a to
a23dbb6
Compare
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.