mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 17:35:10 +03:00
## Summary - `serverCompatibleLocalStorage.getItem()` already guards against localStorage access itself throwing (SSR, private browsing, sandboxed iframes), but returns whatever string is stored without checking it's valid JSON. - `react-resizable-panels`' own `useDefaultLayout()` calls `JSON.parse()` on that value with no try/catch, so a stored value that isn't valid JSON (overwritten by another script sharing the origin, a browser extension, or a leftover value from a previous format) throws and crashes the whole panel group instead of falling back to the default layout. - Fix: validate the value is parseable JSON in `getItem()` itself (matching the file's existing best-effort persistence philosophy) and return `null` — same as a missing value — when it isn't. ## Evidence (Sentry, past week) - [SUPABASE-APP-KA8](https://supabase.sentry.io/issues/7726278966/) — `SyntaxError: Unexpected token 'K', "KV-OK" is not valid JSON`, full-page crash via `globalErrorBoundary` on `/project/[ref]/sql/[id]`. ## Test plan - [ ] Manually confirmed the existing `transformLayoutKey`/try-catch behavior for a missing or inaccessible key is unchanged - [ ] Considered adding a unit test for `serverCompatibleLocalStorage.getItem()`, but it isn't currently exported; happy to export it and add a test if reviewers want one 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01RUrmUfMBpPqkgerh9onNTM --- _Generated by [Claude Code](https://claude.ai/code/session_01RUrmUfMBpPqkgerh9onNTM)_ --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Ali Waseem <waseema393@gmail.com>
packages/ui
Supabase's shared React component library. Built on Radix UI primitives and shadcn/ui, styled with Tailwind CSS, and used across all Supabase apps.
Usage
Import from the 'ui' package alias:
import { Badge, Button, Input } from 'ui'
Some of the components have the _Shadcn_ suffix. These components should be preferred, they're in a process of replacing the other ones.
Utilities
// deep object merge (used for themes)
import { clipboard, cn, mergeDeep } from 'ui' // Tailwind class merging (shadcn-ui/cn)
// copy-to-clipboard helper
Styling conventions
- Tailwind only — no inline styles or CSS modules.
- Prefer shadcn semantic pairs (
bg-card text-card-foreground,bg-muted text-muted-foreground,bg-tertiary text-tertiary-foreground) over hardcoded colors. Legacy utilities such astext-foreground-lightandborder-defaultare compatibility aliases only. - Control surface roles (
bg-field,bg-control-raised,border-control-hover; CSS--controlaliases raised) live inbuild/css/source/semantic.css. Prefer those over inventing fills. Legacybg-controlis still the accent wash alias. - Themes set the core
--hue(or the split--surface-hue/--primary-hue),--chroma,--surface,--foreground-lightness, and--contrastinputs, plus their--muted-foreground-leveland--tertiary-foreground-levelhierarchy. Semantic colors are derived from them in OKLCH;--contrast: 1is the baseline and the supported adjustment range is0.75to1.25. - The workspace root owns the actual
tailwind.config.js. The file in this package is a stub for IntelliSense only.