compote-ui 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/button/button.variants.js +1 -1
- package/dist/components/checkbox/checkbox.svelte +2 -2
- package/dist/components/dialog/alert-dialog.svelte +4 -4
- package/dist/components/dialog/dialog.svelte +1 -1
- package/dist/components/field/field-input.svelte +1 -1
- package/dist/components/field/field-textarea.svelte +1 -1
- package/dist/components/field/field.svelte +25 -2
- package/dist/components/field/index.d.ts +1 -1
- package/dist/components/field/types.d.ts +8 -0
- package/dist/components/listbox/listbox.svelte +1 -1
- package/dist/components/number-input/number-input.svelte +1 -1
- package/dist/components/select/select.svelte +4 -8
- package/dist/components/switch/switch.svelte +1 -1
- package/dist/components/tree-view/tree-view.svelte +2 -4
- package/dist/theme.css +19 -24
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ export const button = tv({
|
|
|
3
3
|
base: 'focus-visible:outline-ring inline-flex cursor-pointer items-center justify-center rounded bg-transparent text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 disabled:pointer-events-none disabled:opacity-50',
|
|
4
4
|
variants: {
|
|
5
5
|
variant: {
|
|
6
|
-
default: 'bg-primary text-
|
|
6
|
+
default: 'bg-primary text-ink-inverse hover:bg-primary/90 active:bg-primary/80',
|
|
7
7
|
outline: 'border text-ink hover:bg-surface-2',
|
|
8
8
|
ghost: 'text-ink hover:bg-surface-2'
|
|
9
9
|
},
|
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
: ''} data-focus-visible:outline-ring flex size-5 shrink-0 items-center justify-center rounded-sm border bg-transparent transition-colors hover:border-primary/50 data-disabled:pointer-events-none data-disabled:opacity-50 data-focus-visible:outline-2 data-focus-visible:outline-offset-2 data-invalid:border-danger data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary"
|
|
19
19
|
>
|
|
20
20
|
<Checkbox.Indicator>
|
|
21
|
-
<PhCheck class="size-3.5 text-
|
|
21
|
+
<PhCheck class="size-3.5 text-ink-inverse" />
|
|
22
22
|
</Checkbox.Indicator>
|
|
23
23
|
<Checkbox.Indicator indeterminate>
|
|
24
|
-
<PhMinus class="size-3.5 text-
|
|
24
|
+
<PhMinus class="size-3.5 text-ink-inverse" />
|
|
25
25
|
</Checkbox.Indicator>
|
|
26
26
|
</Checkbox.Control>
|
|
27
27
|
{#if label}
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
|
|
21
21
|
const confirmClass = $derived(
|
|
22
22
|
variant === 'destructive'
|
|
23
|
-
? 'inline-flex h-9 items-center justify-center rounded-md bg-red-600 px-4 text-sm font-medium text-
|
|
24
|
-
: 'inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-
|
|
23
|
+
? 'inline-flex h-9 items-center justify-center rounded-md bg-red-600 px-4 text-sm font-medium text-ink-inverse shadow-sm transition-colors hover:bg-red-700 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring'
|
|
24
|
+
: 'inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-ink-inverse shadow-sm transition-colors hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring'
|
|
25
25
|
);
|
|
26
26
|
</script>
|
|
27
27
|
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
{/if}
|
|
47
47
|
<div class="mt-6 flex justify-end gap-3">
|
|
48
48
|
<Dialog.CloseTrigger
|
|
49
|
-
class="inline-flex h-9 items-center justify-center rounded-md border bg-surface-1 px-4 text-sm font-medium shadow-sm transition-colors hover:bg-surface-2 hover:text-ink focus-visible:ring-1 focus-visible:ring-
|
|
49
|
+
class="inline-flex h-9 items-center justify-center rounded-md border bg-surface-1 px-4 text-sm font-medium shadow-sm transition-colors hover:bg-surface-2 hover:text-ink focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
|
|
50
50
|
onclick={onCancel}
|
|
51
51
|
>
|
|
52
52
|
{cancelLabel}
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
</button>
|
|
57
57
|
</div>
|
|
58
58
|
<Dialog.CloseTrigger
|
|
59
|
-
class="absolute top-3 right-3 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-
|
|
59
|
+
class="absolute top-3 right-3 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-none"
|
|
60
60
|
>
|
|
61
61
|
<PhX class="h-4 w-4" />
|
|
62
62
|
<span class="sr-only">Close</span>
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
{/if}
|
|
49
49
|
|
|
50
50
|
<Dialog.CloseTrigger
|
|
51
|
-
class="absolute top-3 right-3 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-2 focus-visible:ring-
|
|
51
|
+
class="absolute top-3 right-3 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:outline-none active:opacity-50"
|
|
52
52
|
>
|
|
53
53
|
<PhX class="size-4" />
|
|
54
54
|
<span class="sr-only">Close</span>
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
{...rest}
|
|
25
25
|
bind:value
|
|
26
26
|
class={cn(
|
|
27
|
-
'flex h-9 w-full rounded-md border bg-surface-1 px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-ink-dim focus-visible:ring-1 focus-visible:ring-
|
|
27
|
+
'flex h-9 w-full rounded-md border bg-surface-1 px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-ink-dim focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-invalid:border-danger data-invalid:focus-visible:ring-danger data-readonly:cursor-default data-readonly:opacity-70',
|
|
28
28
|
startIcon && 'pl-9',
|
|
29
29
|
endIcon && 'pr-9',
|
|
30
30
|
className
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{...rest}
|
|
11
11
|
{value}
|
|
12
12
|
class={cn(
|
|
13
|
-
'flex min-h-20 w-full resize-y rounded-md border bg-surface-1 px-3 py-2 text-sm shadow-sm transition-colors placeholder:text-ink-dim focus-visible:ring-1 focus-visible:ring-
|
|
13
|
+
'flex min-h-20 w-full resize-y rounded-md border bg-surface-1 px-3 py-2 text-sm shadow-sm transition-colors placeholder:text-ink-dim focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-invalid:border-danger data-invalid:focus-visible:ring-danger data-readonly:cursor-default data-readonly:opacity-70',
|
|
14
14
|
className
|
|
15
15
|
)}
|
|
16
16
|
/>
|
|
@@ -3,9 +3,32 @@
|
|
|
3
3
|
import type { FieldRootProps } from './types';
|
|
4
4
|
import { cn } from 'tailwind-variants';
|
|
5
5
|
|
|
6
|
-
let {
|
|
6
|
+
let {
|
|
7
|
+
form,
|
|
8
|
+
field,
|
|
9
|
+
helperText,
|
|
10
|
+
class: className,
|
|
11
|
+
invalid,
|
|
12
|
+
required,
|
|
13
|
+
children,
|
|
14
|
+
...rest
|
|
15
|
+
}: FieldRootProps = $props();
|
|
16
|
+
|
|
17
|
+
const isInvalid = $derived(form && field ? form.invalid(field) : (invalid ?? false));
|
|
18
|
+
const isRequired = $derived(form && field ? form.isRequired(field) : (required ?? false));
|
|
19
|
+
const errorText = $derived(form && field ? (form.errors[field]?.[0] ?? null) : null);
|
|
7
20
|
</script>
|
|
8
21
|
|
|
9
|
-
<Field.Root
|
|
22
|
+
<Field.Root
|
|
23
|
+
{...rest}
|
|
24
|
+
invalid={isInvalid}
|
|
25
|
+
required={isRequired}
|
|
26
|
+
class={cn('group flex flex-col gap-1.5', className)}
|
|
27
|
+
>
|
|
10
28
|
{@render children?.()}
|
|
29
|
+
{#if errorText}
|
|
30
|
+
<Field.ErrorText>{errorText}</Field.ErrorText>
|
|
31
|
+
{:else if helperText}
|
|
32
|
+
<Field.HelperText>{helperText}</Field.HelperText>
|
|
33
|
+
{/if}
|
|
11
34
|
</Field.Root>
|
|
@@ -4,4 +4,4 @@ export { default as Input } from './field-input.svelte';
|
|
|
4
4
|
export { default as Textarea } from './field-textarea.svelte';
|
|
5
5
|
export { default as HelperText } from './field-helper-text.svelte';
|
|
6
6
|
export { default as ErrorText } from './field-error-text.svelte';
|
|
7
|
-
export type { FieldRootProps, FieldLabelProps, FieldInputProps, FieldTextareaProps, FieldHelperTextProps, FieldErrorTextProps } from './types';
|
|
7
|
+
export type { FormAdapter, FieldRootProps, FieldLabelProps, FieldInputProps, FieldTextareaProps, FieldHelperTextProps, FieldErrorTextProps } from './types';
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { FieldRootBaseProps, FieldLabelBaseProps, FieldInputProps as ArkFieldInputProps, FieldTextareaProps as ArkFieldTextareaProps, FieldHelperTextBaseProps, FieldErrorTextBaseProps } from '@ark-ui/svelte/field';
|
|
3
|
+
export interface FormAdapter {
|
|
4
|
+
invalid(field: string): boolean;
|
|
5
|
+
isRequired(field: string): boolean;
|
|
6
|
+
errors: Record<string, string[]>;
|
|
7
|
+
}
|
|
3
8
|
export interface FieldRootProps extends FieldRootBaseProps {
|
|
4
9
|
class?: string;
|
|
10
|
+
form?: FormAdapter;
|
|
11
|
+
field?: string;
|
|
12
|
+
helperText?: string;
|
|
5
13
|
}
|
|
6
14
|
export interface FieldLabelProps extends FieldLabelBaseProps {
|
|
7
15
|
class?: string;
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
<Listbox.Input
|
|
67
67
|
placeholder={filterPlaceholder}
|
|
68
68
|
oninput={(e) => (filterText = e.currentTarget.value)}
|
|
69
|
-
class="h-8 w-full rounded-xs border border-surface-3 bg-transparent px-2.5 text-sm outline-none placeholder:text-ink-dim focus-visible:ring-1 focus-visible:ring-
|
|
69
|
+
class="h-8 w-full rounded-xs border border-surface-3 bg-transparent px-2.5 text-sm outline-none placeholder:text-ink-dim focus-visible:ring-1 focus-visible:ring-ring"
|
|
70
70
|
/>
|
|
71
71
|
{/if}
|
|
72
72
|
<Listbox.Content class="flex min-h-0 w-full flex-1 flex-col gap-1 overflow-y-auto outline-none">
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
{/if}
|
|
48
48
|
<NumberInput.Control class="relative isolate">
|
|
49
49
|
<NumberInput.Input
|
|
50
|
-
class="h-9 w-full rounded-md border bg-surface-1 px-3 pr-8 text-right text-sm font-medium tabular-nums shadow-sm focus-visible:ring-1 focus-visible:ring-
|
|
50
|
+
class="h-9 w-full rounded-md border bg-surface-1 px-3 pr-8 text-right text-sm font-medium tabular-nums shadow-sm focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-invalid:border-danger data-invalid:focus-visible:ring-danger"
|
|
51
51
|
/>
|
|
52
52
|
<div
|
|
53
53
|
class="absolute top-px right-px bottom-px z-10 flex w-6 flex-col overflow-hidden rounded-r border-l"
|
|
@@ -17,9 +17,6 @@
|
|
|
17
17
|
name,
|
|
18
18
|
...restProps
|
|
19
19
|
}: SelectProps<T> = $props();
|
|
20
|
-
const rootClass = $derived(
|
|
21
|
-
layout === 'horizontal' ? 'flex items-center gap-1.5' : 'grid gap-1.5'
|
|
22
|
-
);
|
|
23
20
|
|
|
24
21
|
const collection = $derived(createListCollection(items));
|
|
25
22
|
</script>
|
|
@@ -30,7 +27,7 @@
|
|
|
30
27
|
deselectable
|
|
31
28
|
value={value ? [value.toString()] : []}
|
|
32
29
|
onValueChange={(valueChangeDetails) => {
|
|
33
|
-
if (valueChangeDetails.items
|
|
30
|
+
if (valueChangeDetails.items == null || valueChangeDetails.items.length === 0) {
|
|
34
31
|
value = null;
|
|
35
32
|
} else {
|
|
36
33
|
value = valueChangeDetails.items[0].value;
|
|
@@ -39,7 +36,7 @@
|
|
|
39
36
|
restProps.onValueChange(valueChangeDetails);
|
|
40
37
|
}
|
|
41
38
|
}}
|
|
42
|
-
class={
|
|
39
|
+
class={cn(layout === 'horizontal' ? 'flex items-center gap-1.5' : 'grid gap-1.5')}
|
|
43
40
|
>
|
|
44
41
|
{#if label}
|
|
45
42
|
<Select.Label>
|
|
@@ -49,11 +46,11 @@
|
|
|
49
46
|
{/if}
|
|
50
47
|
<Select.Control>
|
|
51
48
|
<Select.Trigger
|
|
52
|
-
class="flex h-9 w-full cursor-pointer items-center justify-between rounded-md border bg-surface-1 px-3 text-sm shadow-sm focus-visible:ring-1 focus-visible:ring-
|
|
49
|
+
class="flex h-9 w-full cursor-pointer items-center justify-between rounded-md border bg-surface-1 px-3 text-sm shadow-sm focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none active:bg-surface-2 data-disabled:cursor-not-allowed data-disabled:opacity-50 data-invalid:border-danger data-invalid:focus-visible:ring-danger"
|
|
53
50
|
>
|
|
54
51
|
<div class="flex items-center gap-2">
|
|
55
52
|
<Select.ValueText
|
|
56
|
-
placeholder={placeholder ?? 'Select
|
|
53
|
+
placeholder={placeholder ?? 'Select an item'}
|
|
57
54
|
class={cn('text-nowrap', value ? '' : 'text-ink-dim')}
|
|
58
55
|
/>
|
|
59
56
|
</div>
|
|
@@ -84,5 +81,4 @@
|
|
|
84
81
|
</Select.Positioner>
|
|
85
82
|
</Portal>
|
|
86
83
|
<input type="hidden" {name} value={value ?? ''} />
|
|
87
|
-
<Select.HiddenSelect />
|
|
88
84
|
</Select.Root>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
{/if}
|
|
26
26
|
<Switch.Root {...rootProps} bind:checked class={rootClass}>
|
|
27
27
|
<Switch.Control
|
|
28
|
-
class="relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border-2 border-transparent bg-surface-3 transition-colors duration-150 hover:opacity-90 focus-visible:ring-2 focus-visible:ring-
|
|
28
|
+
class="relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border-2 border-transparent bg-surface-3 transition-colors duration-150 hover:opacity-90 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:outline-hidden data-invalid:ring-2 data-invalid:ring-danger data-invalid:ring-offset-2 data-[state=checked]:bg-primary"
|
|
29
29
|
>
|
|
30
30
|
<Switch.Thumb
|
|
31
31
|
class="pointer-events-none block size-5 rounded-full bg-white shadow-sm ring-0 transition-transform duration-150 data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0"
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
import PhCaretRight from '../../icons/PhCaretRight.svelte';
|
|
9
9
|
import PhMinus from '../../icons/PhMinus.svelte';
|
|
10
10
|
import PhCheck from '../../icons/PhCheck.svelte';
|
|
11
|
-
import PhListMagnifyingGlass from '../../icons/PhListMagnifyingGlass.svelte';
|
|
12
11
|
import PhArrowsInSimple from '../../icons/PhArrowsInSimple.svelte';
|
|
13
12
|
import { Button, Field } from '../..';
|
|
14
13
|
import { SvelteSet } from 'svelte/reactivity';
|
|
@@ -68,7 +67,6 @@
|
|
|
68
67
|
contextNode = nodeId ?? null;
|
|
69
68
|
}
|
|
70
69
|
}
|
|
71
|
-
$inspect('searchTerm:', searchTerm);
|
|
72
70
|
</script>
|
|
73
71
|
|
|
74
72
|
<div class="flex h-full flex-col" role="none" oncontextmenu={handleContextMenu}>
|
|
@@ -147,7 +145,7 @@
|
|
|
147
145
|
|
|
148
146
|
{#snippet nodeCheckbox()}
|
|
149
147
|
<TreeView.NodeCheckbox
|
|
150
|
-
class="
|
|
148
|
+
class="inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-sm border bg-transparent text-ink-inverse data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary"
|
|
151
149
|
>
|
|
152
150
|
<TreeView.NodeCheckboxIndicator>
|
|
153
151
|
{#snippet indeterminate()}
|
|
@@ -182,7 +180,7 @@
|
|
|
182
180
|
</TreeView.BranchText>
|
|
183
181
|
</TreeView.BranchControl>
|
|
184
182
|
<TreeView.BranchContent class="relative">
|
|
185
|
-
<TreeView.BranchIndentGuide class="
|
|
183
|
+
<TreeView.BranchIndentGuide class="absolute inset-y-0 w-px bg-border" />
|
|
186
184
|
{#each node.children as child, childIndex (child.value)}
|
|
187
185
|
{@render renderNode(child as T, [...indexPath, childIndex])}
|
|
188
186
|
{/each}
|
package/dist/theme.css
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
@source './components/**/*.svelte';
|
|
6
6
|
|
|
7
7
|
:root {
|
|
8
|
+
color-scheme: light dark;
|
|
9
|
+
|
|
8
10
|
--dim: 0.3;
|
|
9
11
|
--radius: 6px;
|
|
10
12
|
--font-sans: 'Wix Madefor Text Variable', sans-serif;
|
|
@@ -14,42 +16,32 @@
|
|
|
14
16
|
--color-hue: var(--hue-orange);
|
|
15
17
|
--gray-hue: 250;
|
|
16
18
|
|
|
17
|
-
--compote-ink: var(--gray-15);
|
|
18
|
-
--compote-ink-dim: var(--gray-11);
|
|
19
|
-
--compote-
|
|
20
|
-
--compote-surface-
|
|
21
|
-
--compote-surface-
|
|
22
|
-
--compote-surface-
|
|
23
|
-
--compote-
|
|
19
|
+
--compote-ink: light-dark(var(--gray-15), var(--gray-1));
|
|
20
|
+
--compote-ink-dim: light-dark(var(--gray-11), var(--gray-5));
|
|
21
|
+
--compote-ink-inverse: white;
|
|
22
|
+
--compote-surface-3: light-dark(var(--gray-5), var(--gray-11));
|
|
23
|
+
--compote-surface-2: light-dark(var(--gray-4), var(--gray-12));
|
|
24
|
+
--compote-surface-1: light-dark(var(--gray-3), var(--gray-13));
|
|
25
|
+
--compote-surface-document: light-dark(var(--gray-2), var(--gray-14));
|
|
26
|
+
--compote-well: light-dark(var(--gray-1), var(--gray-15));
|
|
24
27
|
|
|
25
28
|
--compote-primary: oklch(from var(--color-7) l c var(--hue-orange));
|
|
26
29
|
--compote-danger: oklch(from var(--color-7) l c var(--hue-red));
|
|
27
30
|
--compote-warning: oklch(from var(--color-7) l c var(--hue-yellow));
|
|
28
31
|
--compote-success: oklch(from var(--color-7) l c var(--hue-green));
|
|
29
32
|
--compote-info: oklch(from var(--color-7) l c var(--hue-blue));
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
@media (prefers-color-scheme: dark) {
|
|
33
|
-
:root {
|
|
34
|
-
--compote-ink: var(--gray-1);
|
|
35
|
-
--compote-ink-dim: var(--gray-5);
|
|
36
|
-
--compote-surface-3: var(--gray-11);
|
|
37
|
-
--compote-surface-2: var(--gray-12);
|
|
38
|
-
--compote-surface-1: var(--gray-13);
|
|
39
|
-
--compote-surface-document: var(--gray-14);
|
|
40
|
-
--compote-well: var(--gray-15);
|
|
41
33
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
--compote-warning: oklch(from var(--color-7) l c var(--hue-yellow));
|
|
45
|
-
--compote-success: oklch(from var(--color-7) l c var(--hue-green));
|
|
46
|
-
--compote-info: oklch(from var(--color-7) l c var(--hue-blue));
|
|
47
|
-
}
|
|
34
|
+
--compote-border: var(--compote-surface-3);
|
|
35
|
+
--compote-ring: var(--compote-primary);
|
|
48
36
|
}
|
|
49
37
|
|
|
38
|
+
.dark { color-scheme: dark; }
|
|
39
|
+
.light { color-scheme: light; }
|
|
40
|
+
|
|
50
41
|
@theme inline {
|
|
51
42
|
--color-ink: var(--compote-ink);
|
|
52
43
|
--color-ink-dim: var(--compote-ink-dim);
|
|
44
|
+
--color-ink-inverse: var(--compote-ink-inverse);
|
|
53
45
|
--color-surface-3: var(--compote-surface-3);
|
|
54
46
|
--color-surface-2: var(--compote-surface-2);
|
|
55
47
|
--color-surface-1: var(--compote-surface-1);
|
|
@@ -62,6 +54,9 @@
|
|
|
62
54
|
--color-success: var(--compote-success);
|
|
63
55
|
--color-info: var(--compote-info);
|
|
64
56
|
|
|
57
|
+
--color-border: var(--compote-border);
|
|
58
|
+
--color-ring: var(--compote-ring);
|
|
59
|
+
|
|
65
60
|
--font-sans: var(--font-sans);
|
|
66
61
|
--font-mono: var(--font-mono);
|
|
67
62
|
--font-serif: var(--font-serif);
|