refactor: replace Bootstrap with Tailwind CSS and Base UI - #3196
refactor: replace Bootstrap with Tailwind CSS and Base UI#3196Soxasora wants to merge 104 commits into
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
Ah, my recreation attempt must've been poor.
Yeah. My bad. |
|
Have you tried QAing a production build? I got one finding from claude that implies, if true, that css minification might break some css rules.
Also, I've attached some simplification/efficiency/latitude stuff that I haven't verified and might be relevant for #3216 p3 findingsP3-1 — latent traps (author backlog)
P3-2 — duplication the shared modules already solve
P3-3 — dead weight
P3-4 — altitude
|
Tried today, minification produced the same behavior as unminified CSS. This is more a CSS ordering bug, I'm saving P3 findings for #3216, lots of really good insights. Fixed:
stickybar-menu.mp4wip:
|
…useless importants
…down asMenuItems composition
…assNames instead of array
…ng on empty urls, dismiss first and then toggle the link off
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 0afa998. Configure here.
| setEditedLinkUrl('') | ||
| if (isLinkEditMode) setIsLinkEditMode(false) | ||
| hideFloatingElem(false) | ||
| onDismiss() |
There was a problem hiding this comment.
Link popover dismisses on selection change
Medium Severity
$updateLink now calls onDismiss() whenever the current selection is not the tracked link. That races the plugin’s SELECTION_CHANGE_COMMAND handler, which resets dismissed and then updates nodeKey. The still-mounted editor sees the new selection against the old key and sets dismissed back to true, so the popover does not appear for the newly selected link.
Reviewed by Cursor Bugbot for commit 0afa998. Configure here.







Description
Part of #3190, supersedes #3126, #3187, and #3188.
This PR replaces Bootstrap with Tailwind CSS v4, Base UI primitives, and shared SN components while preserving the existing design.
react-select(multiselect) is replaced by Base UI Combobox--sn-*design tokens for light, dark, and territory-branded themes, sharedz-indexstacking, mobile safe areas, and reusable component recipes.@layer components, allowing call-site utilities to override component defaults consistently.Base UI brings keyboard navigation, focus management, portal positioning, and dismissal behavior for interactive components.
The most relevant changes include swipe-dismissable toasts and mobile drawer, improved form semantics and link editor.
Screenshots
tbd, even though the migration targets visual parity
Additional Context
This PR touches almost every single area that's displayed to stackers.
The most important areas to QA are forms, editor interactions, mobile navigation, wallet onboarding (new!), and territory-branded views (less priority).
This PR is not merge-clean. Code style, comments and docs will be cleaned/updated by a subsequent new cleanup PR.
Checklist
Are your changes backward compatible? Please answer below:
Yes, this PR only handles the styling implementation.
On a scale of 1-10 how well and how have you QA'd this change and any features it might affect? Please answer below:
6/10, components were checked as they were migrated. Pending a full end-to-end regression pass.
For frontend changes: Tested on mobile, light and dark mode? Please answer below:
Yes, during component migration. Pending a full parity pass.
Did you introduce any new environment variables? If so, call them out explicitly here:
No
Did you use AI for this? If so, how much did it assist you?
Yes, substantially. It assisted with mechanical Bootstrap-to-Tailwind conversions, Base UI rewrites, token and cascade analysis, and follow-up fixes. The resulting changes were then reviewed and adjusted manually.
This PR lacks the slop/inconsistencies cleanup, a new PR will be created for that.
Note
High Risk
Broad front-end refactor touching forms, editor, navigation, and theming across nearly all user-visible surfaces; regressions in layout, focus, and form submission are likely without full QA.
Overview
This PR replaces Bootstrap and React Bootstrap across the app with Tailwind CSS v4 utilities, Base UI primitives, and shared
@/components/ui/*building blocks, while aiming for visual parity.Design system: Bootstrap/
--bs-*and--theme-*tokens give way to canonical--sn-*tokens; dark mode switches fromdata-bs-themetodata-theme. Component CSS modules are wrapped in@layer componentsso Tailwind utilities can override defaults. README anddocs/dev/styling.mddocument the new stack.Forms: The monolithic
components/form.jsis removed and re-exported from acomponents/form/package (inputs, checkboxes, copy helpers, date pickers, etc.), using Base UI for checkboxes/combobox-style controls andInputAddoninstead ofInputGroup.UI behavior fixes bundled with the migration: Lexical link editor uses a anchored Popover instead of manual floating DOM; carousel arrow keys listen on a focused container (works inside dialogs); delete cache updates
lexicalState/html; screenshot capture hides nav via[data-sn-navigation]; badges gain sr-only text and optional interactive popovers; portaled menu delete uses a dedicated confirm hook.Naming cleanup:
accordian-item→accordion-itemon Base UI Collapsible.Reviewed by Cursor Bugbot for commit 0afa998. Bugbot is set up for automated code reviews on this repo. Configure here.