From 24bbfff0274a5a68a783069026d51f1b003cb12a Mon Sep 17 00:00:00 2001 From: amahajan Date: Mon, 21 Jul 2025 17:05:21 -0500 Subject: [PATCH 1/6] Add an open to select color-scheme --- src/style/core.ts | 70 +++++++++++++++++------------------------------ website/Nav.tsx | 12 +++++++- website/root.css | 18 ++++++++++++ 3 files changed, 54 insertions(+), 46 deletions(-) diff --git a/src/style/core.ts b/src/style/core.ts index 25dc3c863c..9615aed5f1 100644 --- a/src/style/core.ts +++ b/src/style/core.ts @@ -3,34 +3,6 @@ import { css } from '@linaria/core'; import { cell } from './cell'; import { bottomSummaryRowClassname, row, topSummaryRowClassname } from './row'; -const lightTheme = ` - --rdg-color: #000; - --rdg-border-color: #ddd; - --rdg-summary-border-color: #aaa; - --rdg-background-color: hsl(0deg 0% 100%); - --rdg-header-background-color: hsl(0deg 0% 97.5%); - --rdg-header-draggable-background-color: hsl(0deg 0% 90.5%); - --rdg-row-hover-background-color: hsl(0deg 0% 96%); - --rdg-row-selected-background-color: hsl(207deg 76% 92%); - --rdg-row-selected-hover-background-color: hsl(207deg 76% 88%); - - --rdg-checkbox-focus-color: hsl(207deg 100% 69%); -`; - -const darkTheme = ` - --rdg-color: #ddd; - --rdg-border-color: #444; - --rdg-summary-border-color: #555; - --rdg-background-color: hsl(0deg 0% 13%); - --rdg-header-background-color: hsl(0deg 0% 10.5%); - --rdg-header-draggable-background-color: hsl(0deg 0% 17.5%); - --rdg-row-hover-background-color: hsl(0deg 0% 9%); - --rdg-row-selected-background-color: hsl(207deg 76% 42%); - --rdg-row-selected-hover-background-color: hsl(207deg 76% 38%); - - --rdg-checkbox-focus-color: hsl(207deg 100% 89%); -`; - const root = css` @layer rdg.Defaults { *, @@ -41,13 +13,37 @@ const root = css` } @layer rdg.Root { - ${lightTheme} + --_rdg-color-scheme: light dark; --rdg-selection-width: 2px; --rdg-selection-color: hsl(207, 75%, 66%); --rdg-font-size: 14px; --rdg-cell-frozen-box-shadow: 2px 0 5px -2px rgba(136, 136, 136, 0.3); --rdg-border-width: 1px; --rdg-summary-border-width: calc(var(--rdg-border-width) * 2); + --rdg-color: light-dark(#000, #ddd); + --rdg-border-color: light-dark(#ddd, #444); + --rdg-summary-border-color: light-dark(#aaa, #555); + --rdg-background-color: light-dark(hsl(0deg 0% 100%), hsl(0deg 0% 13%)); + --rdg-header-background-color: light-dark(hsl(0deg 0% 97.5%), hsl(0deg 0% 10.5%)); + --rdg-header-draggable-background-color: light-dark(hsl(0deg 0% 90.5%), hsl(0deg 0% 17.5%)); + --rdg-row-hover-background-color: light-dark(hsl(0deg 0% 96%), hsl(0deg 0% 9%)); + --rdg-row-selected-background-color: light-dark(hsl(207deg 76% 92%), hsl(207deg 76% 42%)); + --rdg-row-selected-hover-background-color: light-dark(hsl(207deg 76% 88%), hsl(207deg 76% 38%)); + --rdg-checkbox-focus-color: hsl(207deg 100% 69%); + + @container style(--rdg-color-scheme) { + --_rdg-color-scheme: var(--rdg-color-scheme); + } + + &.rdg-dark { + --_rdg-color-scheme: dark; + } + + &.rdg-light { + --_rdg-color-scheme: light; + } + + color-scheme: var(--_rdg-color-scheme); &:dir(rtl) { --rdg-cell-frozen-box-shadow: -2px 0 5px -2px rgba(136, 136, 136, 0.3); @@ -55,7 +51,6 @@ const root = css` display: grid; - color-scheme: var(--rdg-color-scheme, light dark); accent-color: light-dark(hsl(207deg 100% 29%), hsl(207deg 100% 79%)); /* https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context */ @@ -78,21 +73,6 @@ const root = css` grid-row: 1/-1; } - &.rdg-dark { - --rdg-color-scheme: dark; - ${darkTheme} - } - - &.rdg-light { - --rdg-color-scheme: light; - } - - @media (prefers-color-scheme: dark) { - &:not(.rdg-light) { - ${darkTheme} - } - } - > :nth-last-child(1 of .${topSummaryRowClassname}) { > .${cell} { border-block-end: var(--rdg-summary-border-width) solid var(--rdg-summary-border-color); diff --git a/website/Nav.tsx b/website/Nav.tsx index cb4684f5d7..9b221b3d0e 100644 --- a/website/Nav.tsx +++ b/website/Nav.tsx @@ -1,4 +1,4 @@ -import { useId } from 'react'; +import { useId, useState } from 'react'; import { Link } from '@tanstack/react-router'; import { css } from '@linaria/core'; @@ -50,6 +50,8 @@ const rtlCheckboxClassname = css` padding-inline-start: 8px; `; +export type Theme = 'light' | 'dark' | 'system'; + interface Props { direction: Direction; onDirectionChange: (direction: Direction) => void; @@ -58,6 +60,7 @@ interface Props { export default function Nav({ direction, onDirectionChange }: Props) { const demosNavId = useId(); const linksNavId = useId(); + const [theme, setTheme] = useState('system'); return (
@@ -118,6 +121,13 @@ export default function Nav({ direction, onDirectionChange }: Props) { +

Theme

+ +

Direction