Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions components/src/DesignTokens/DesignTokens.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,20 @@ import * as NoteStories from '../Note/Note.stories.svelte';

### Web

The `<DesignTokens>` component makes colours, type sizes and other design tokens available to its children as CSS variables.
The `<DesignTokens>` component makes colours, type sizes and other design tokens available to its children as CSS variables. Set the `theme` prop to `light` or `dark` to yield light and dark semantic colours or `auto` to follow the user's preference.

```html
<script>
import DesignTokens from '@swr-data-lab/components';
</script>

<DesignTokens>
<DesignTokens theme="auto">
<p>I'm a sample paragraph</p>
</DesignTokens>

<style>
p {
color: var(--violet-dark-1); // this works
color: var(--colours-textPrimary); // this works
}
</style>
```
Expand Down
12 changes: 9 additions & 3 deletions components/src/DesignTokens/DesignTokens.svelte
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
<script lang="ts">
import type { Snippet } from 'svelte';
import { shades, semantics } from './Tokens';
import isDarkMode from '../isDarkMode';

interface DesignTokensProps {
theme?: 'light' | 'dark' | 'auto';
children?: Snippet;
}
let { children }: DesignTokensProps = $props();

let { theme = 'auto', children }: DesignTokensProps = $props();

let computedTheme = $derived(theme === 'auto' ? ($isDarkMode ? 'dark' : 'light') : theme);

const colours = { ...shades, ...semantics };
const rules = [
Expand All @@ -22,7 +27,7 @@
];
</script>

<div class="container" style={rules.join(';')}>
<div class="container" style={rules.join(';')} data-theme={computedTheme}>
{#if children}
{@render children()}
{/if}
Expand Down Expand Up @@ -51,7 +56,8 @@
--color-logoFill: var(--logoFill-light);
--color-pageFill: var(--pageFill-light);
--color-surfaceFill: var(--surfaceFill-light);
@media (prefers-color-scheme: dark) {

&[data-theme='dark'] {
--color-logoFill: var(--logoFill-dark);
--color-pageFill: var(--pageFill-dark);
--color-surfaceFill: var(--surfaceFill-dark);
Expand Down
1 change: 1 addition & 0 deletions components/src/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Design Tokens
export { default as DesignTokens } from './DesignTokens/DesignTokens.svelte';
export { tokens as tokens } from './DesignTokens/index.js';
export { default as isDarkMode } from './isDarkMode/isDarkMode.svelte';

// Typography
export { default as Headline } from './Headline/Headline.svelte';
Expand Down
2 changes: 2 additions & 0 deletions components/src/isDarkMode/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import isDarkMode from './isDarkMode.svelte.js';
export default isDarkMode;
10 changes: 10 additions & 0 deletions components/src/isDarkMode/isDarkMode.stories.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<script context="module" lang="ts">
import { defineMeta } from '@storybook/addon-svelte-csf';
import isDarkMode from './isDarkMode.svelte.js';

const { Story } = defineMeta({
title: 'Meta/isDarkMode'
});
</script>

<Story name="Basic" asChild>{JSON.stringify($isDarkMode)}</Story>
6 changes: 6 additions & 0 deletions components/src/isDarkMode/isDarkMode.svelte.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { MediaQuery } from 'svelte/reactivity';
import { readable } from 'svelte/store';

const dm = new MediaQuery('prefers-color-scheme: dark', false);
const isDarkMode = readable(dm.current);
export default isDarkMode;