mirror of
https://github.com/supabase/supabase.git
synced 2026-10-10 11:55:05 +03:00
## Problem The design-system Sidebar page was mostly an upstream shadcn paste: first-person voice, a broken `/blocks` link, missing structure images, CLI install steps that do not match this monorepo, and a long changelog / data-fetching tutorial that do not apply here. Separately, it still taught classic shadcn **HSL channel** variables plus `hsl(var(--sidebar-*))`. In this monorepo those tokens are **full colours**. Mixing the two patterns produces invalid CSS. Related call-site cleanup: https://github.com/supabase/supabase/pull/51161 ## Solution - Rewrite the Sidebar docs as a shorter monorepo guide: import from `'ui'`, structure, theming, provider / sidebar props, menu building blocks, controlled mode, state styling. - Move Studio’s `--sidebar-*` aliases into shared `packages/ui` compat CSS so every app on the shared theme gets working `bg-sidebar` utilities. - Drop the duplicate definitions from Studio `globals.css`. Left alone on purpose: brand / destructive channel tokens and docs that correctly use `hsl(var(--brand-…))`. ## Review instructions Design-system preview: [design-system](https://design-system-git-dnywh-docssidebar-full-colour-tokens-supabase.vercel.app/) 1. [Live Sidebar docs](https://supabase.com/design-system/docs/components/sidebar) · [Preview Sidebar docs](https://design-system-git-dnywh-docssidebar-full-colour-tokens-supabase.vercel.app/design-system/docs/components/sidebar). Confirm the page is no longer the upstream essay: no broken images, no `/blocks` link, imports from `'ui'`, theming shows full-colour aliases. 2. Smoke Studio: left nav should look unchanged (same aliases, now from compat.css). 3. Optional: in DevTools, confirm `--sidebar-background` resolves to a full `oklch(...)` colour. ## Checklist - [x] I have read [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) - [ ] If I wrote a new docs topic or edited an existing topic, I used the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs [style guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
438 lines
8.9 KiB
CSS
438 lines
8.9 KiB
CSS
@import 'config/tailwind.config.css';
|
|
@import 'config/typography.css';
|
|
|
|
@source '../pages/**/*.{js,ts,jsx,tsx}';
|
|
@source '../components/**/*.{js,ts,jsx,tsx}';
|
|
@source './../../../packages/ui/src/**/*.{tsx,ts,js}';
|
|
@source './../../../packages/ui-patterns/src/**/*.{tsx,ts,js}';
|
|
|
|
@theme inline {
|
|
--font-heading: var(--font-heading, var(--font-sans));
|
|
}
|
|
|
|
@theme {
|
|
/* Scale Tailwind's default radius tokens by 4/3 to match the Studio curve. */
|
|
--radius: 0.333333rem;
|
|
--radius-xs: 0.166667rem;
|
|
--radius-sm: 0.333333rem;
|
|
--radius-md: 0.5rem;
|
|
--radius-lg: 0.666667rem;
|
|
--radius-xl: 1rem;
|
|
--radius-2xl: 1.333333rem;
|
|
--radius-3xl: 2rem;
|
|
--radius-4xl: 2.666667rem;
|
|
|
|
--text-grid: 13px;
|
|
|
|
--color-typography-body-light: var(--foreground-light);
|
|
--color-typography-body-dark: var(--foreground-light);
|
|
--color-typography-body-secondary-light: var(--foreground-lighter);
|
|
--color-typography-body-secondary-dark: var(--foreground-lighter);
|
|
--color-typography-body-strong-light: var(--foreground-default);
|
|
--color-typography-body-strong-dark: var(--foreground-default);
|
|
--color-typography-body-faded-light: var(--foreground-muted);
|
|
--color-typography-body-faded-dark: var(--foreground-muted);
|
|
|
|
--color-table-body-light: var(--background-default);
|
|
--color-table-body-dark: var(--background-default);
|
|
--color-table-header-light: var(--background-surface-100);
|
|
--color-table-header-dark: var(--background-surface-100);
|
|
--color-table-footer-light: var(--background-surface-100);
|
|
--color-table-footer-dark: var(--background-surface-100);
|
|
--color-table-border-light: var(--border-default);
|
|
--color-table-border-dark: var(--border-default);
|
|
|
|
--color-panel-body-light: var(--background-surface-100);
|
|
--color-panel-body-dark: var(--background-surface-100);
|
|
--color-panel-header-light: var(--background-surface-100);
|
|
--color-panel-header-dark: var(--background-surface-100);
|
|
--color-panel-footer-light: var(--background-surface-100);
|
|
--color-panel-footer-dark: var(--background-surface-100);
|
|
--color-panel-border-light: var(--border-default);
|
|
--color-panel-border-dark: var(--border-default);
|
|
--color-panel-border-interior-light: var(--border-muted);
|
|
--color-panel-border-interior-dark: var(--border-muted);
|
|
--color-panel-border-hover-light: var(--border-muted);
|
|
--color-panel-border-hover-dark: var(--border-muted);
|
|
|
|
--animate-shimmer: shimmer 2s infinite linear;
|
|
--animate-badge-shimmer: badge-shimmer 3s ease-in-out infinite;
|
|
--animate-badge-pulse: badge-pulse 3s ease-in-out infinite;
|
|
--animate-chevron-up: chevron-up 2s ease-in-out infinite;
|
|
--animate-sway: sway 3s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
--animate-marketplace-featured-progress: marketplace-featured-progress linear forwards;
|
|
|
|
/* font sizing and weights optimized for Inter */
|
|
--text-sm: 0.8125rem;
|
|
--text-base: 0.9375rem;
|
|
--text-lg: 1rem;
|
|
--text-xl: 1.125rem;
|
|
--text-2xl: 1.375rem;
|
|
--text-3xl: 1.75rem;
|
|
--text-4xl: 2.125rem;
|
|
--text-5xl: 2.875rem;
|
|
--text-6xl: 3.625rem;
|
|
--text-7xl: 4.375rem;
|
|
--text-8xl: 5.875rem;
|
|
--text-9xl: 7.875rem;
|
|
--font-weight-normal: 450;
|
|
}
|
|
|
|
@keyframes shimmer {
|
|
0% {
|
|
background-position: -1000px 0;
|
|
}
|
|
100% {
|
|
background-position: 1000px 0;
|
|
}
|
|
}
|
|
|
|
@keyframes badge-shimmer {
|
|
0% {
|
|
transform: rotate(-45deg) translateX(-100%);
|
|
opacity: 0;
|
|
}
|
|
10% {
|
|
opacity: 1;
|
|
}
|
|
40% {
|
|
opacity: 1;
|
|
}
|
|
50% {
|
|
transform: rotate(-45deg) translateX(100%);
|
|
opacity: 0;
|
|
}
|
|
100% {
|
|
transform: rotate(-45deg) translateX(100%);
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
@keyframes badge-pulse {
|
|
0%,
|
|
100% {
|
|
opacity: 1;
|
|
}
|
|
50% {
|
|
opacity: 0.8;
|
|
}
|
|
}
|
|
|
|
@keyframes chevron-up {
|
|
0%,
|
|
100% {
|
|
opacity: 0.2;
|
|
}
|
|
50% {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
@keyframes sway {
|
|
0%,
|
|
100% {
|
|
transform: rotate(-10deg) scale(1.5) translateY(4rem);
|
|
}
|
|
50% {
|
|
transform: rotate(10deg) scale(1.5) translateY(2rem);
|
|
}
|
|
}
|
|
|
|
@keyframes marketplace-featured-progress {
|
|
from {
|
|
transform: scaleX(0);
|
|
}
|
|
to {
|
|
transform: scaleX(1);
|
|
}
|
|
}
|
|
|
|
:root {
|
|
/* --sidebar-* aliases live in packages/ui compat.css (shared with other apps). */
|
|
--header-height: 3rem;
|
|
}
|
|
|
|
@layer base {
|
|
*,
|
|
::after,
|
|
::before,
|
|
::backdrop,
|
|
::file-selector-button {
|
|
border-color: var(--border-default, currentColor);
|
|
}
|
|
}
|
|
|
|
html,
|
|
body,
|
|
#__next,
|
|
.main {
|
|
@apply bg-dash-sidebar relative;
|
|
@apply text-foreground;
|
|
@apply overflow-x-clip;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
-webkit-font-smoothing: antialiased;
|
|
overscroll-behavior: none;
|
|
font-weight: 450;
|
|
}
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
@layer base {
|
|
h1,
|
|
h2,
|
|
h3,
|
|
h4,
|
|
h5,
|
|
h6 {
|
|
@apply font-heading;
|
|
}
|
|
}
|
|
|
|
h1,
|
|
h2,
|
|
h3,
|
|
h4,
|
|
h5,
|
|
h6 {
|
|
@apply font-semibold;
|
|
}
|
|
|
|
.form-group .form-text,
|
|
.Form .form-text {
|
|
@apply text-foreground-lighter;
|
|
}
|
|
|
|
.form-group input,
|
|
.form-group input[type='text'],
|
|
.form-group input[type='email'],
|
|
.form-group input[type='url'],
|
|
.form-group input[type='password'],
|
|
.form-group input[type='number'],
|
|
.form-group input[type='date'],
|
|
.form-group input[type='datetime-local'],
|
|
.form-group input[type='month'],
|
|
.form-group input[type='search'],
|
|
.form-group input[type='tel'],
|
|
.form-group input[type='time'],
|
|
.form-group input[type='week'],
|
|
.form-group input[multiple],
|
|
.form-group textarea,
|
|
.form-group select,
|
|
input.form-control,
|
|
.form-control input,
|
|
.form-control textarea {
|
|
@apply block;
|
|
@apply box-border;
|
|
/* @apply w-full ; */
|
|
@apply rounded-md;
|
|
@apply shadow-xs;
|
|
@apply text-foreground;
|
|
@apply border;
|
|
@apply bg-studio;
|
|
@apply border-strong border;
|
|
/* Prefer shared focus-ring over legacy green box-shadow / ring-current stacks */
|
|
@apply focus-ring;
|
|
}
|
|
|
|
.form-group input,
|
|
.form-group select,
|
|
.form-group textarea {
|
|
@apply px-4 py-2;
|
|
}
|
|
|
|
/* icons in date / time inputs */
|
|
.dark input[type='date']::-webkit-calendar-picker-indicator,
|
|
.dark input[type='datetime-local']::-webkit-calendar-picker-indicator,
|
|
.dark input[type='time']::-webkit-calendar-picker-indicator {
|
|
filter: invert(0.8);
|
|
}
|
|
|
|
input.is-invalid {
|
|
@apply bg-red-100;
|
|
@apply border border-red-700;
|
|
@apply focus-ring focus-visible:ring-destructive;
|
|
@apply placeholder:text-red-600;
|
|
}
|
|
|
|
input::placeholder {
|
|
@apply text-foreground-lighter;
|
|
}
|
|
|
|
.form-group input::placeholder {
|
|
@apply text-foreground-lighter;
|
|
}
|
|
|
|
.billing-input-fixed {
|
|
@apply w-full appearance-none rounded-sm border bg-gray-700 py-2 px-3 leading-tight text-gray-300 shadow-sm;
|
|
}
|
|
|
|
.input-mono {
|
|
input,
|
|
textarea {
|
|
@apply font-mono;
|
|
}
|
|
}
|
|
|
|
.input-sm {
|
|
input,
|
|
textarea {
|
|
@apply text-sm;
|
|
}
|
|
}
|
|
|
|
.input-xs {
|
|
input,
|
|
textarea {
|
|
@apply text-xs;
|
|
}
|
|
}
|
|
|
|
input[type='radio'] {
|
|
@apply p-0;
|
|
}
|
|
|
|
input[type='number'] {
|
|
-moz-appearance: textfield; /* Firefox, Not included in tailwind styles reset */
|
|
}
|
|
|
|
/* TODO: It doesnt' work, need to check */
|
|
.hide-scrollbar {
|
|
scrollbar-width: none; /* Firefox */
|
|
-ms-overflow-style: none; /* Internet Explorer 10+ */
|
|
}
|
|
|
|
.hide-scrollbar::-webkit-scrollbar {
|
|
width: 0;
|
|
height: 0;
|
|
display: none;
|
|
}
|
|
|
|
div[data-radix-portal]:not(.portal--toast) {
|
|
z-index: 2147483646 !important;
|
|
}
|
|
|
|
.billing-compute-radio {
|
|
label {
|
|
@apply items-center justify-between;
|
|
&:last-child {
|
|
opacity: 100 !important;
|
|
}
|
|
}
|
|
}
|
|
|
|
.recharts-tooltip-cursor {
|
|
@apply fill-transparent;
|
|
}
|
|
|
|
.expandable-tr {
|
|
display: grid;
|
|
grid-template-columns: repeat(5, 1fr);
|
|
}
|
|
|
|
.expanded-row-content {
|
|
display: grid;
|
|
grid-column: 1/-1;
|
|
justify-content: flex-start;
|
|
}
|
|
|
|
.multi-select {
|
|
button {
|
|
display: block;
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
@media (prefers-color-scheme: dark) {
|
|
html {
|
|
color-scheme: dark;
|
|
}
|
|
}
|
|
|
|
.text-area-resize-none {
|
|
textarea {
|
|
@apply resize-none;
|
|
}
|
|
}
|
|
|
|
.capitalize-sentence:first-letter {
|
|
text-transform: capitalize;
|
|
}
|
|
|
|
.input-clear {
|
|
input {
|
|
@apply pr-7;
|
|
}
|
|
}
|
|
|
|
/* to do: remove this CSS and do the same thing in a reusable tooltip component */
|
|
[data-radix-popper-content-wrapper] {
|
|
@apply z-50!;
|
|
}
|
|
|
|
.settings-container {
|
|
@apply mx-auto max-w-4xl xl:max-w-6xl;
|
|
}
|
|
|
|
.react-grid-item.react-grid-placeholder {
|
|
@apply bg-brand-500!;
|
|
}
|
|
|
|
.react-grid-item > .react-resizable-handle::after {
|
|
content: '';
|
|
position: absolute;
|
|
right: 3px !important;
|
|
bottom: 3px !important;
|
|
width: 6px !important;
|
|
height: 6px !important;
|
|
@apply border-strong! dark:border-r-2! dark:border-b-2! dark:border-overlay!;
|
|
}
|
|
|
|
@keyframes typewriter {
|
|
from {
|
|
width: 0;
|
|
}
|
|
}
|
|
|
|
@keyframes blink-caret {
|
|
50% {
|
|
border-color: transparent;
|
|
}
|
|
}
|
|
|
|
/* Zoomable image (react-medium-image-zoom) */
|
|
|
|
[data-rmiz-modal]:focus,
|
|
[data-rmiz-modal-overlay]:focus {
|
|
outline: none !important;
|
|
}
|
|
|
|
[data-rmiz-modal-overlay],
|
|
[data-rmiz-modal-img] {
|
|
transition-timing-function: cubic-bezier(0.24, 0.25, 0.05, 1) !important;
|
|
}
|
|
|
|
[data-rmiz-modal-overlay='visible'] {
|
|
@apply bg-background!;
|
|
opacity: 0.8;
|
|
}
|
|
|
|
[data-rmiz-modal-img] {
|
|
image-rendering: high-quality;
|
|
}
|
|
|
|
.prose.text-sm ol > li::before {
|
|
top: 0.05rem;
|
|
}
|
|
|
|
.prose.text-sm ul > li::before {
|
|
top: 0.65rem;
|
|
}
|
|
|
|
.prose :where(strong, b):not(:where([class~='not-prose'], [class~='not-prose'] *)),
|
|
strong,
|
|
b {
|
|
@apply font-bold;
|
|
}
|