@misoto22/design 0.3.1
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/LICENSE +21 -0
- package/dist/components/Accordion/Accordion.d.ts +34 -0
- package/dist/components/Accordion/Accordion.js +37 -0
- package/dist/components/Accordion/Accordion.js.map +1 -0
- package/dist/components/Alert/Alert.d.ts +32 -0
- package/dist/components/Alert/Alert.js +49 -0
- package/dist/components/Alert/Alert.js.map +1 -0
- package/dist/components/AppShell/AppShell.d.ts +38 -0
- package/dist/components/AppShell/AppShell.js +92 -0
- package/dist/components/AppShell/AppShell.js.map +1 -0
- package/dist/components/Avatar/Avatar.d.ts +29 -0
- package/dist/components/Avatar/Avatar.js +39 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Badge/Badge.d.ts +30 -0
- package/dist/components/Badge/Badge.js +29 -0
- package/dist/components/Badge/Badge.js.map +1 -0
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +31 -0
- package/dist/components/Breadcrumb/Breadcrumb.js +31 -0
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/components/Button/Button.d.ts +70 -0
- package/dist/components/Button/Button.js +81 -0
- package/dist/components/Button/Button.js.map +1 -0
- package/dist/components/Calendar/Calendar.d.ts +28 -0
- package/dist/components/Calendar/Calendar.js +87 -0
- package/dist/components/Calendar/Calendar.js.map +1 -0
- package/dist/components/Card/Card.d.ts +49 -0
- package/dist/components/Card/Card.js +64 -0
- package/dist/components/Card/Card.js.map +1 -0
- package/dist/components/Checkbox/Checkbox.d.ts +23 -0
- package/dist/components/Checkbox/Checkbox.js +24 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/components/Collapsible/Collapsible.d.ts +31 -0
- package/dist/components/Collapsible/Collapsible.js +35 -0
- package/dist/components/Collapsible/Collapsible.js.map +1 -0
- package/dist/components/Combobox/Combobox.d.ts +63 -0
- package/dist/components/Combobox/Combobox.js +151 -0
- package/dist/components/Combobox/Combobox.js.map +1 -0
- package/dist/components/Command/Command.d.ts +98 -0
- package/dist/components/Command/Command.js +166 -0
- package/dist/components/Command/Command.js.map +1 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +38 -0
- package/dist/components/ContextMenu/ContextMenu.js +79 -0
- package/dist/components/ContextMenu/ContextMenu.js.map +1 -0
- package/dist/components/DatePicker/DatePicker.d.ts +98 -0
- package/dist/components/DatePicker/DatePicker.js +214 -0
- package/dist/components/DatePicker/DatePicker.js.map +1 -0
- package/dist/components/Dialog/Dialog.d.ts +48 -0
- package/dist/components/Dialog/Dialog.js +72 -0
- package/dist/components/Dialog/Dialog.js.map +1 -0
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +49 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +89 -0
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/components/EmptyState/EmptyState.d.ts +31 -0
- package/dist/components/EmptyState/EmptyState.js +30 -0
- package/dist/components/EmptyState/EmptyState.js.map +1 -0
- package/dist/components/ErrorState/ErrorState.d.ts +34 -0
- package/dist/components/ErrorState/ErrorState.js +32 -0
- package/dist/components/ErrorState/ErrorState.js.map +1 -0
- package/dist/components/Field/Field.d.ts +44 -0
- package/dist/components/Field/Field.js +54 -0
- package/dist/components/Field/Field.js.map +1 -0
- package/dist/components/FigureBand/FigureBand.d.ts +51 -0
- package/dist/components/FigureBand/FigureBand.js +52 -0
- package/dist/components/FigureBand/FigureBand.js.map +1 -0
- package/dist/components/FloatingIconButton/FloatingIconButton.d.ts +29 -0
- package/dist/components/FloatingIconButton/FloatingIconButton.js +32 -0
- package/dist/components/FloatingIconButton/FloatingIconButton.js.map +1 -0
- package/dist/components/Input/Input.d.ts +22 -0
- package/dist/components/Input/Input.js +21 -0
- package/dist/components/Input/Input.js.map +1 -0
- package/dist/components/Kbd/Kbd.d.ts +20 -0
- package/dist/components/Kbd/Kbd.js +21 -0
- package/dist/components/Kbd/Kbd.js.map +1 -0
- package/dist/components/LinkArrow/LinkArrow.d.ts +24 -0
- package/dist/components/LinkArrow/LinkArrow.js +24 -0
- package/dist/components/LinkArrow/LinkArrow.js.map +1 -0
- package/dist/components/NativeSelect/NativeSelect.d.ts +27 -0
- package/dist/components/NativeSelect/NativeSelect.js +46 -0
- package/dist/components/NativeSelect/NativeSelect.js.map +1 -0
- package/dist/components/NavItem/NavItem.d.ts +39 -0
- package/dist/components/NavItem/NavItem.js +31 -0
- package/dist/components/NavItem/NavItem.js.map +1 -0
- package/dist/components/Pagination/Pagination.d.ts +44 -0
- package/dist/components/Pagination/Pagination.js +109 -0
- package/dist/components/Pagination/Pagination.js.map +1 -0
- package/dist/components/Popover/Popover.d.ts +39 -0
- package/dist/components/Popover/Popover.js +57 -0
- package/dist/components/Popover/Popover.js.map +1 -0
- package/dist/components/Progress/Progress.d.ts +31 -0
- package/dist/components/Progress/Progress.js +45 -0
- package/dist/components/Progress/Progress.js.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +43 -0
- package/dist/components/RadioGroup/RadioGroup.js +43 -0
- package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts +31 -0
- package/dist/components/ScrollArea/ScrollArea.js +54 -0
- package/dist/components/ScrollArea/ScrollArea.js.map +1 -0
- package/dist/components/SearchableMenu/SearchableMenu.d.ts +59 -0
- package/dist/components/SearchableMenu/SearchableMenu.js +79 -0
- package/dist/components/SearchableMenu/SearchableMenu.js.map +1 -0
- package/dist/components/Select/Select.d.ts +71 -0
- package/dist/components/Select/Select.js +114 -0
- package/dist/components/Select/Select.js.map +1 -0
- package/dist/components/Separator/Separator.d.ts +30 -0
- package/dist/components/Separator/Separator.js +35 -0
- package/dist/components/Separator/Separator.js.map +1 -0
- package/dist/components/Sheet/Sheet.d.ts +38 -0
- package/dist/components/Sheet/Sheet.js +68 -0
- package/dist/components/Sheet/Sheet.js.map +1 -0
- package/dist/components/Skeleton/Skeleton.d.ts +63 -0
- package/dist/components/Skeleton/Skeleton.js +44 -0
- package/dist/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/components/Slider/Slider.d.ts +35 -0
- package/dist/components/Slider/Slider.js +52 -0
- package/dist/components/Slider/Slider.js.map +1 -0
- package/dist/components/Spinner/Spinner.d.ts +50 -0
- package/dist/components/Spinner/Spinner.js +48 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/StatusDot/StatusDot.d.ts +29 -0
- package/dist/components/StatusDot/StatusDot.js +44 -0
- package/dist/components/StatusDot/StatusDot.js.map +1 -0
- package/dist/components/StatusPill/StatusPill.d.ts +25 -0
- package/dist/components/StatusPill/StatusPill.js +31 -0
- package/dist/components/StatusPill/StatusPill.js.map +1 -0
- package/dist/components/Switch/Switch.d.ts +23 -0
- package/dist/components/Switch/Switch.js +23 -0
- package/dist/components/Switch/Switch.js.map +1 -0
- package/dist/components/Table/Table.d.ts +96 -0
- package/dist/components/Table/Table.js +136 -0
- package/dist/components/Table/Table.js.map +1 -0
- package/dist/components/Tabs/Tabs.d.ts +35 -0
- package/dist/components/Tabs/Tabs.js +48 -0
- package/dist/components/Tabs/Tabs.js.map +1 -0
- package/dist/components/Tag/Tag.d.ts +28 -0
- package/dist/components/Tag/Tag.js +22 -0
- package/dist/components/Tag/Tag.js.map +1 -0
- package/dist/components/Textarea/Textarea.d.ts +20 -0
- package/dist/components/Textarea/Textarea.js +32 -0
- package/dist/components/Textarea/Textarea.js.map +1 -0
- package/dist/components/Toast/Toast.d.ts +24 -0
- package/dist/components/Toast/Toast.js +41 -0
- package/dist/components/Toast/Toast.js.map +1 -0
- package/dist/components/ToggleGroup/ToggleGroup.d.ts +41 -0
- package/dist/components/ToggleGroup/ToggleGroup.js +78 -0
- package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -0
- package/dist/components/Tooltip/Tooltip.d.ts +43 -0
- package/dist/components/Tooltip/Tooltip.js +40 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/fonts/hanken-grotesk-300.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-400.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-500.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-600.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-700.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-400.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-500.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-600.woff2 +0 -0
- package/dist/fonts/newsreader-300.woff2 +0 -0
- package/dist/fonts/newsreader-400.woff2 +0 -0
- package/dist/fonts/newsreader-500.woff2 +0 -0
- package/dist/fonts/newsreader-600.woff2 +0 -0
- package/dist/fonts.css +96 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/keyframes.css +212 -0
- package/dist/lib/cn.d.ts +21 -0
- package/dist/lib/cn.js +9 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/control.d.ts +31 -0
- package/dist/lib/control.js +14 -0
- package/dist/lib/control.js.map +1 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/overlay-container.d.ts +38 -0
- package/dist/lib/overlay-container.js +15 -0
- package/dist/lib/overlay-container.js.map +1 -0
- package/dist/lib/useSelectionIndicator.d.ts +29 -0
- package/dist/lib/useSelectionIndicator.js +45 -0
- package/dist/lib/useSelectionIndicator.js.map +1 -0
- package/dist/semantic.css +127 -0
- package/dist/styles.css +98 -0
- package/dist/themes.css +115 -0
- package/dist/tokens/brand.d.ts +47 -0
- package/dist/tokens/brand.js +38 -0
- package/dist/tokens/brand.js.map +1 -0
- package/dist/tokens.css +323 -0
- package/dist/tokens.d.ts +153 -0
- package/dist/tokens.js +766 -0
- package/dist/tokens.json +765 -0
- package/package.json +130 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["export { cn } from './cn'\nexport { CONTROL_BASE, CONTROL_BORDER, isInvalid } from './control'\nexport { useSelectionIndicator } from './useSelectionIndicator'\nexport type { IndicatorStyle } from './useSelectionIndicator'\n"],"mappings":"AAAA,SAAS,UAAU;AACnB,SAAS,cAAc,gBAAgB,iBAAiB;AACxD,SAAS,6BAA6B;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface OverlayContainerProps {
|
|
5
|
+
/** The element overlays should render into. `null` restores the default. */
|
|
6
|
+
container: HTMLElement | null;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Redirects every overlay in the subtree — popover, select, menu, tooltip — into
|
|
11
|
+
* a given element instead of `document.body`.
|
|
12
|
+
*
|
|
13
|
+
* Two problems, one cause. An overlay portalled to the body is positioned
|
|
14
|
+
* against the VIEWPORT, so inside a bounded frame (a documentation example, a
|
|
15
|
+
* device preview, a canvas) it flips and shifts against edges the reader cannot
|
|
16
|
+
* see, and lands outside the box it belongs to. It also leaves the subtree, so
|
|
17
|
+
* `dir="rtl"` and `data-density` set on that frame stop reaching it.
|
|
18
|
+
*
|
|
19
|
+
* Naming the container fixes both: the panel renders inside the frame,
|
|
20
|
+
* inherits what the frame declares, and collides with the frame's edges.
|
|
21
|
+
*
|
|
22
|
+
* The container must be positioned (`relative` is enough) for the panel to be
|
|
23
|
+
* placed against it rather than against the nearest positioned ancestor.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* const [frame, setFrame] = useState<HTMLElement | null>(null)
|
|
27
|
+
* <div ref={setFrame} className="relative" data-density="compact">
|
|
28
|
+
* <OverlayContainer container={frame}>{children}</OverlayContainer>
|
|
29
|
+
* </div>
|
|
30
|
+
*/
|
|
31
|
+
declare function OverlayContainer({ container, children }: OverlayContainerProps): react.JSX.Element;
|
|
32
|
+
/**
|
|
33
|
+
* The element overlays in this subtree should render into, or `null` for the
|
|
34
|
+
* document body. Every portal in the library reads this.
|
|
35
|
+
*/
|
|
36
|
+
declare function useOverlayContainer(): HTMLElement | null;
|
|
37
|
+
|
|
38
|
+
export { OverlayContainer, type OverlayContainerProps, useOverlayContainer };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext } from "react";
|
|
4
|
+
const OverlayContainerContext = createContext(null);
|
|
5
|
+
function OverlayContainer({ container, children }) {
|
|
6
|
+
return /* @__PURE__ */ jsx(OverlayContainerContext, { value: container, children });
|
|
7
|
+
}
|
|
8
|
+
function useOverlayContainer() {
|
|
9
|
+
return useContext(OverlayContainerContext);
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
OverlayContainer,
|
|
13
|
+
useOverlayContainer
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=overlay-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/overlay-container.tsx"],"sourcesContent":["'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { ReactNode } from 'react'\n\nconst OverlayContainerContext = createContext<HTMLElement | null>(null)\n\nexport interface OverlayContainerProps {\n /** The element overlays should render into. `null` restores the default. */\n container: HTMLElement | null\n children: ReactNode\n}\n\n/**\n * Redirects every overlay in the subtree — popover, select, menu, tooltip — into\n * a given element instead of `document.body`.\n *\n * Two problems, one cause. An overlay portalled to the body is positioned\n * against the VIEWPORT, so inside a bounded frame (a documentation example, a\n * device preview, a canvas) it flips and shifts against edges the reader cannot\n * see, and lands outside the box it belongs to. It also leaves the subtree, so\n * `dir=\"rtl\"` and `data-density` set on that frame stop reaching it.\n *\n * Naming the container fixes both: the panel renders inside the frame,\n * inherits what the frame declares, and collides with the frame's edges.\n *\n * The container must be positioned (`relative` is enough) for the panel to be\n * placed against it rather than against the nearest positioned ancestor.\n *\n * @example\n * const [frame, setFrame] = useState<HTMLElement | null>(null)\n * <div ref={setFrame} className=\"relative\" data-density=\"compact\">\n * <OverlayContainer container={frame}>{children}</OverlayContainer>\n * </div>\n */\nexport function OverlayContainer({ container, children }: OverlayContainerProps) {\n return <OverlayContainerContext value={container}>{children}</OverlayContainerContext>\n}\n\n/**\n * The element overlays in this subtree should render into, or `null` for the\n * document body. Every portal in the library reads this.\n */\nexport function useOverlayContainer(): HTMLElement | null {\n return useContext(OverlayContainerContext)\n}\n"],"mappings":";AAoCS;AAlCT,SAAS,eAAe,kBAAkB;AAG1C,MAAM,0BAA0B,cAAkC,IAAI;AA8B/D,SAAS,iBAAiB,EAAE,WAAW,SAAS,GAA0B;AAC/E,SAAO,oBAAC,2BAAwB,OAAO,WAAY,UAAS;AAC9D;AAMO,SAAS,sBAA0C;AACxD,SAAO,WAAW,uBAAuB;AAC3C;","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
interface IndicatorStyle {
|
|
2
|
+
/** Distance from the container's inline start, in pixels. */
|
|
3
|
+
offset: number;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
top: number;
|
|
7
|
+
/** False until the first measurement, so the pill does not fly in from 0. */
|
|
8
|
+
ready: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Measures the selected child so a single pill can slide between options
|
|
12
|
+
* instead of one filled background switching off while another switches on.
|
|
13
|
+
*
|
|
14
|
+
* Why measure rather than animate each option's own background: a colour that
|
|
15
|
+
* cross-fades reads as two things changing, and a shape that travels reads as
|
|
16
|
+
* one thing moving — which is what actually happened. It is also the only way
|
|
17
|
+
* to get the movement onto the compositor, since `background-color` cannot be
|
|
18
|
+
* transformed.
|
|
19
|
+
*
|
|
20
|
+
* `useLayoutEffect` and not `useEffect`: the measurement has to land in the
|
|
21
|
+
* same frame as the render that caused it, or the pill visibly starts from its
|
|
22
|
+
* old place on first paint.
|
|
23
|
+
*
|
|
24
|
+
* Re-measures on resize and whenever `key` changes — `key` being whatever makes
|
|
25
|
+
* the selection different, usually the selected value.
|
|
26
|
+
*/
|
|
27
|
+
declare function useSelectionIndicator<T extends HTMLElement>(key: string | null): [React.RefObject<T | null>, IndicatorStyle];
|
|
28
|
+
|
|
29
|
+
export { type IndicatorStyle, useSelectionIndicator };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useLayoutEffect, useRef, useState } from "react";
|
|
3
|
+
function useSelectionIndicator(key) {
|
|
4
|
+
const containerRef = useRef(null);
|
|
5
|
+
const [style, setStyle] = useState({
|
|
6
|
+
offset: 0,
|
|
7
|
+
width: 0,
|
|
8
|
+
height: 0,
|
|
9
|
+
top: 0,
|
|
10
|
+
ready: false
|
|
11
|
+
});
|
|
12
|
+
const measure = useCallback(() => {
|
|
13
|
+
const container = containerRef.current;
|
|
14
|
+
const selected = container?.querySelector('[data-indicator-active="true"]');
|
|
15
|
+
if (!container || !selected) {
|
|
16
|
+
setStyle((previous) => ({ ...previous, ready: false }));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const box = container.getBoundingClientRect();
|
|
20
|
+
const target = selected.getBoundingClientRect();
|
|
21
|
+
setStyle({
|
|
22
|
+
// `left` relative to the container, not `inline-start`: the pill is
|
|
23
|
+
// positioned with `transform`, which is physical, and the measurement has
|
|
24
|
+
// to match. It comes out right in both directions because both sides of
|
|
25
|
+
// the subtraction flip together.
|
|
26
|
+
offset: target.left - box.left,
|
|
27
|
+
width: target.width,
|
|
28
|
+
height: target.height,
|
|
29
|
+
top: target.top - box.top,
|
|
30
|
+
ready: true
|
|
31
|
+
});
|
|
32
|
+
}, []);
|
|
33
|
+
useLayoutEffect(() => {
|
|
34
|
+
measure();
|
|
35
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
36
|
+
const observer = new ResizeObserver(measure);
|
|
37
|
+
if (containerRef.current) observer.observe(containerRef.current);
|
|
38
|
+
return () => observer.disconnect();
|
|
39
|
+
}, [key, measure]);
|
|
40
|
+
return [containerRef, style];
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
useSelectionIndicator
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=useSelectionIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/useSelectionIndicator.ts"],"sourcesContent":["'use client'\n\nimport { useCallback, useLayoutEffect, useRef, useState } from 'react'\n\nexport interface IndicatorStyle {\n /** Distance from the container's inline start, in pixels. */\n offset: number\n width: number\n height: number\n top: number\n /** False until the first measurement, so the pill does not fly in from 0. */\n ready: boolean\n}\n\n/**\n * Measures the selected child so a single pill can slide between options\n * instead of one filled background switching off while another switches on.\n *\n * Why measure rather than animate each option's own background: a colour that\n * cross-fades reads as two things changing, and a shape that travels reads as\n * one thing moving — which is what actually happened. It is also the only way\n * to get the movement onto the compositor, since `background-color` cannot be\n * transformed.\n *\n * `useLayoutEffect` and not `useEffect`: the measurement has to land in the\n * same frame as the render that caused it, or the pill visibly starts from its\n * old place on first paint.\n *\n * Re-measures on resize and whenever `key` changes — `key` being whatever makes\n * the selection different, usually the selected value.\n */\nexport function useSelectionIndicator<T extends HTMLElement>(\n key: string | null,\n): [React.RefObject<T | null>, IndicatorStyle] {\n const containerRef = useRef<T>(null)\n const [style, setStyle] = useState<IndicatorStyle>({\n offset: 0,\n width: 0,\n height: 0,\n top: 0,\n ready: false,\n })\n\n const measure = useCallback(() => {\n const container = containerRef.current\n const selected = container?.querySelector<HTMLElement>('[data-indicator-active=\"true\"]')\n if (!container || !selected) {\n setStyle((previous) => ({ ...previous, ready: false }))\n return\n }\n const box = container.getBoundingClientRect()\n const target = selected.getBoundingClientRect()\n setStyle({\n // `left` relative to the container, not `inline-start`: the pill is\n // positioned with `transform`, which is physical, and the measurement has\n // to match. It comes out right in both directions because both sides of\n // the subtraction flip together.\n offset: target.left - box.left,\n width: target.width,\n height: target.height,\n top: target.top - box.top,\n ready: true,\n })\n }, [])\n\n useLayoutEffect(() => {\n measure()\n if (typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(measure)\n if (containerRef.current) observer.observe(containerRef.current)\n return () => observer.disconnect()\n }, [key, measure])\n\n return [containerRef, style]\n}\n"],"mappings":";AAEA,SAAS,aAAa,iBAAiB,QAAQ,gBAAgB;AA6BxD,SAAS,sBACd,KAC6C;AAC7C,QAAM,eAAe,OAAU,IAAI;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAyB;AAAA,IACjD,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AAED,QAAM,UAAU,YAAY,MAAM;AAChC,UAAM,YAAY,aAAa;AAC/B,UAAM,WAAW,WAAW,cAA2B,gCAAgC;AACvF,QAAI,CAAC,aAAa,CAAC,UAAU;AAC3B,eAAS,CAAC,cAAc,EAAE,GAAG,UAAU,OAAO,MAAM,EAAE;AACtD;AAAA,IACF;AACA,UAAM,MAAM,UAAU,sBAAsB;AAC5C,UAAM,SAAS,SAAS,sBAAsB;AAC9C,aAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKP,QAAQ,OAAO,OAAO,IAAI;AAAA,MAC1B,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,KAAK,OAAO,MAAM,IAAI;AAAA,MACtB,OAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,kBAAgB,MAAM;AACpB,YAAQ;AACR,QAAI,OAAO,mBAAmB,YAAa;AAC3C,UAAM,WAAW,IAAI,eAAe,OAAO;AAC3C,QAAI,aAAa,QAAS,UAAS,QAAQ,aAAa,OAAO;AAC/D,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,KAAK,OAAO,CAAC;AAEjB,SAAO,CAAC,cAAc,KAAK;AAC7B;","names":[]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
SEMANTIC ALIASES — what a primitive is FOR
|
|
3
|
+
--------------------------------------------------------------------------
|
|
4
|
+
`tokens.css` owns values; this file owns roles. Components read only from
|
|
5
|
+
here, which is why recolouring the system is one edit in the primitive layer
|
|
6
|
+
and nothing in a component.
|
|
7
|
+
|
|
8
|
+
There is no dark-mode counterpart to this block and there must not be one.
|
|
9
|
+
The dark story is a value swap on --paper / --ink, so an alias pointing at
|
|
10
|
+
var(--ink) re-resolves on its own when [data-mode="dark"] flips. Adding a
|
|
11
|
+
dark override here would freeze one side of that swap.
|
|
12
|
+
|
|
13
|
+
The exceptions are --on-dark and --brand-plate, and they are exceptions for
|
|
14
|
+
a reason rather than an oversight: their ground is a photograph or a foreign
|
|
15
|
+
brand asset, not the theme surface. Each is documented where it is defined.
|
|
16
|
+
========================================================================== */
|
|
17
|
+
|
|
18
|
+
:root {
|
|
19
|
+
/* ─── Surfaces ─────────────────────────────────────────────────────────── */
|
|
20
|
+
--background: var(--paper);
|
|
21
|
+
--background-elevated: var(--paper-2);
|
|
22
|
+
--code-background: var(--bar);
|
|
23
|
+
--nav-background: var(--paper);
|
|
24
|
+
/* Kept as an alias rather than removed: the White Reset retired the card
|
|
25
|
+
surface, so an elevated variant has nothing left to point at. Consumers
|
|
26
|
+
written against it keep resolving, on paper. */
|
|
27
|
+
--card-background: var(--paper);
|
|
28
|
+
|
|
29
|
+
/* ─── Text ─────────────────────────────────────────────────────────────── */
|
|
30
|
+
--foreground: var(--ink);
|
|
31
|
+
--foreground-muted: var(--ink-2);
|
|
32
|
+
--secondary-text: var(--ink-3-aa);
|
|
33
|
+
|
|
34
|
+
/* Text sitting on a PHOTOGRAPH — a hero, a lightbox, a scrim. A photograph
|
|
35
|
+
is a dark ground in BOTH themes, so this must not follow the paper/ink
|
|
36
|
+
swap: as var(--paper) it inverted to near-black in dark mode, which is how
|
|
37
|
+
headings disappeared into their own images. A literal, not var(--ink). */
|
|
38
|
+
--on-dark: #fbfbfa;
|
|
39
|
+
|
|
40
|
+
/* The ground under a THIRD-PARTY brand mark, and for the same reason: a
|
|
41
|
+
foreign logo is drawn against one fixed backdrop and shipped flat, with no
|
|
42
|
+
light-ink sibling. A plate that followed the swap erased it in dark mode.
|
|
43
|
+
Not for our own marks, which are authored against the theme. */
|
|
44
|
+
--brand-plate: #ffffff;
|
|
45
|
+
|
|
46
|
+
/* ─── Lines ────────────────────────────────────────────────────────────── */
|
|
47
|
+
--border-color: var(--rule-2);
|
|
48
|
+
--border-subtle: var(--rule);
|
|
49
|
+
|
|
50
|
+
/* ─── Accent ─────────────────────────────────────────────────────────────
|
|
51
|
+
One pointer, and in a monochrome system it points at ink — law 7.
|
|
52
|
+
|
|
53
|
+
Every surface that marks a CHOICE reads from here rather than from --ink
|
|
54
|
+
directly: a primary button, a checked box, the active tab, the current
|
|
55
|
+
page, a slider's filled range, the selected day. That distinction is the
|
|
56
|
+
whole point of having a pointer at all. While the accent IS ink the two
|
|
57
|
+
render identically, which is why it went unnoticed that half the system
|
|
58
|
+
was reading the primitive — and why re-pointing this one token now
|
|
59
|
+
re-skins the system without a component being touched. */
|
|
60
|
+
--accent: var(--red);
|
|
61
|
+
--accent-hover: var(--red-ink);
|
|
62
|
+
--accent-muted: var(--red-soft);
|
|
63
|
+
--accent-wash: var(--red-soft);
|
|
64
|
+
--accent-foreground: var(--on-red);
|
|
65
|
+
--accent-on-dark: var(--red);
|
|
66
|
+
/* Accent text sitting on an accent-muted panel, which --accent cannot do: it
|
|
67
|
+
clears AA on paper by 4.58:1, and any tint of itself underneath pushes it
|
|
68
|
+
below 4.5. This names the situation so the choice is not left to whoever
|
|
69
|
+
writes the next panel. */
|
|
70
|
+
--accent-on-muted: var(--red-ink);
|
|
71
|
+
|
|
72
|
+
/* ─── Status ─── bound to state, never to brand. ───────────────────────── */
|
|
73
|
+
--success: var(--ok);
|
|
74
|
+
--success-wash: var(--ok-soft);
|
|
75
|
+
--warning: var(--warn);
|
|
76
|
+
--warning-wash: var(--warn-soft);
|
|
77
|
+
--danger-wash: var(--danger-soft);
|
|
78
|
+
--info: var(--ink-2);
|
|
79
|
+
--info-wash: var(--red-soft);
|
|
80
|
+
|
|
81
|
+
/* The photo scrim is always dark by design, so it takes the ink literal
|
|
82
|
+
rather than the semantic token (which inverts). */
|
|
83
|
+
--photo-scrim: #101010;
|
|
84
|
+
|
|
85
|
+
/* ─── Depth ────────────────────────────────────────────────────────────
|
|
86
|
+
Law 2 — a box-shadow is never blurred. The system has no elevation ramp;
|
|
87
|
+
depth is a hard offset in ink, applied per component. These three resolve
|
|
88
|
+
to nothing on purpose, so a component ported from a shadowed system stays
|
|
89
|
+
flat instead of drawing a blur the White Reset does not have. Reach for
|
|
90
|
+
--lift instead, which is the offset idiom expressed once. */
|
|
91
|
+
--shadow-color: transparent;
|
|
92
|
+
--shadow-sm: none;
|
|
93
|
+
--shadow: none;
|
|
94
|
+
--shadow-lg: none;
|
|
95
|
+
/* The one depth cue the system does have: a hard 3px ink offset, no blur.
|
|
96
|
+
Used by a plate that must read as sitting above the page. */
|
|
97
|
+
--lift: 3px 3px 0 0 var(--shadow-offset);
|
|
98
|
+
--lift-sm: 2px 2px 0 0 var(--shadow-offset);
|
|
99
|
+
|
|
100
|
+
/* ─── Focus + motion ─── the site's long-lived names onto the primitives. */
|
|
101
|
+
--ring: var(--focus);
|
|
102
|
+
--ring-offset: var(--focus-off);
|
|
103
|
+
--ease-out-expo: var(--ease);
|
|
104
|
+
--duration-fast: var(--fast);
|
|
105
|
+
--duration-base: var(--mid);
|
|
106
|
+
--duration-slow: var(--slow);
|
|
107
|
+
--overlay: var(--scrim);
|
|
108
|
+
--disabled-opacity: 0.5;
|
|
109
|
+
|
|
110
|
+
/* ─── Stacking ─── five component-facing names onto the seven ranks. ───── */
|
|
111
|
+
--z-dropdown: var(--z-drawer);
|
|
112
|
+
--z-overlay: var(--z-scrim);
|
|
113
|
+
|
|
114
|
+
/* ─── Layout ───────────────────────────────────────────────────────────── */
|
|
115
|
+
--page-pad: var(--pad);
|
|
116
|
+
--w-page: var(--maxw);
|
|
117
|
+
/* Caps the prose track only, which is what a 73ch measure is for. */
|
|
118
|
+
--w-reading: 46rem;
|
|
119
|
+
/* The cap on a listed record's description — a row, a card, a CV entry. In
|
|
120
|
+
`ch` rather than px so it tracks the type it is set in, and one token
|
|
121
|
+
rather than the six hand-picked widths surfaces had drifted into. A
|
|
122
|
+
ceiling, not a width: a narrower column still wins. */
|
|
123
|
+
--measure-record: 66ch;
|
|
124
|
+
/* How far below the viewport top an anchored heading comes to rest — a fixed
|
|
125
|
+
masthead plus a line of air. */
|
|
126
|
+
--scroll-offset: 88px;
|
|
127
|
+
}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:var(--sans);--font-mono:var(--mono);--spacing:.25rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--tracking-wide:.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-lg:.5rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-heading:var(--serif)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--rule)}::file-selector-button{border-color:var(--rule)}:focus-visible{outline:var(--focus-w) solid var(--focus);outline-offset:var(--focus-off)}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.inset-y-0{inset-block:0}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.start-6{inset-inline-start:calc(var(--spacing) * 6)}.end-0{inset-inline-end:calc(var(--spacing) * 0)}.end-2{inset-inline-end:calc(var(--spacing) * 2)}.end-3{inset-inline-end:calc(var(--spacing) * 3)}.end-6{inset-inline-end:calc(var(--spacing) * 6)}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-\[12vh\]{top:12vh}.bottom-0{bottom:0}.bottom-6{bottom:calc(var(--spacing) * 6)}.bottom-20{bottom:calc(var(--spacing) * 20)}.left-1\/2{left:50%}.z-\(--z-drawer\){z-index:var(--z-drawer)}.z-\(--z-dropdown\){z-index:var(--z-dropdown)}.z-\(--z-modal\){z-index:var(--z-modal)}.z-\(--z-overlay\){z-index:var(--z-overlay)}.z-\(--z-scrim\){z-index:var(--z-scrim)}.z-\(--z-sticky\){z-index:var(--z-sticky)}.z-\(--z-toast\){z-index:var(--z-toast)}.z-1{z-index:1}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:900px){.container{max-width:900px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.m-0{margin:0}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.-ms-2\.5{margin-inline-start:calc(var(--spacing) * -2.5)}.ms-\[0\.22em\]{margin-inline-start:.22em}.ms-auto{margin-inline-start:auto}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-px{margin-top:1px}.-mb-px{margin-bottom:-1px}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.scroll-hairline{scrollbar-width:thin;scrollbar-color:var(--rule-2) transparent}.scroll-hairline::-webkit-scrollbar{width:6px;height:6px}.scroll-hairline::-webkit-scrollbar-track{background:0 0}.scroll-hairline::-webkit-scrollbar-thumb{background:var(--rule-2);border-radius:var(--radius-pill)}.size-\(--control-h-lg\){width:var(--control-h-lg);height:var(--control-h-lg)}.size-\(--control-h-md\){width:var(--control-h-md);height:var(--control-h-md)}.size-\(--control-h-sm\){width:var(--control-h-sm);height:var(--control-h-sm)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6\.5{width:calc(var(--spacing) * 6.5);height:calc(var(--spacing) * 6.5)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[7px\]{width:7px;height:7px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-1{height:var(--spacing)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-11{height:calc(var(--spacing) * 11)}.h-14{height:calc(var(--spacing) * 14)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-full{height:100%}.h-px{height:1px}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[10rem\]{max-height:10rem}.max-h-\[85vh\]{max-height:85vh}.min-h-\(--control-h-lg\){min-height:var(--control-h-lg)}.min-h-\(--control-h-md\){min-height:var(--control-h-md)}.min-h-\(--control-h-sm\){min-height:var(--control-h-sm)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-svh{min-height:100svh}.w-\(--radix-popover-trigger-width\){width:var(--radix-popover-trigger-width)}.w-1\/4{width:25%}.w-2{width:calc(var(--spacing) * 2)}.w-9{width:calc(var(--spacing) * 9)}.w-28{width:calc(var(--spacing) * 28)}.w-40{width:calc(var(--spacing) * 40)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[62\%\]{width:62%}.w-\[min\(24rem\,92vw\)\]{width:min(24rem,92vw)}.w-\[min\(92vw\,32rem\)\]{width:min(92vw,32rem)}.w-\[min\(92vw\,40rem\)\]{width:min(92vw,40rem)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\(--measure-record\){max-width:var(--measure-record)}.max-w-\(--w-page\){max-width:var(--w-page)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-sm{max-width:var(--container-sm)}.min-w-\(--radix-select-trigger-width\){min-width:var(--radix-select-trigger-width)}.min-w-0{min-width:0}.min-w-24{min-width:calc(var(--spacing) * 24)}.min-w-44{min-width:calc(var(--spacing) * 44)}.min-w-\[1\.6em\]{min-width:1.6em}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-\(--radix-popper-transform-origin\){transform-origin:var(--radix-popper-transform-origin)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-y{resize:vertical}.scroll-slim{scrollbar-width:thin;scrollbar-color:var(--rule-2) transparent;scrollbar-gutter:stable}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-\(--control-gap\){gap:var(--control-gap)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\(--radius\){border-radius:var(--radius)}.rounded-\(--radius-lg\){border-radius:var(--radius-lg)}.rounded-\(--radius-pill\){border-radius:var(--radius-pill)}.rounded-\(--radius-sm\){border-radius:var(--radius-sm)}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-none{border-radius:0}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-s-\(--radius-pill\){border-start-start-radius:var(--radius-pill);border-end-start-radius:var(--radius-pill)}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-e-\(--radius-pill\){border-start-end-radius:var(--radius-pill);border-end-end-radius:var(--radius-pill)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-solid{--tw-border-style:solid;border-style:solid}.border-\(--accent\){border-color:var(--accent)}.border-\(--danger\){border-color:var(--danger)}.border-\(--feature-surface\){border-color:var(--feature-surface)}.border-\(--rule\){border-color:var(--rule)}.border-\(--rule-2\){border-color:var(--rule-2)}.border-current,.border-current\/25{border-color:currentColor}@supports (color:color-mix(in lab, red, red)){.border-current\/25{border-color:color-mix(in oklab, currentcolor 25%, transparent)}}.border-transparent{border-color:#0000}.border-t-\(--ink\){border-top-color:var(--ink)}.border-t-current{border-top-color:currentColor}.bg-\(--accent\){background-color:var(--accent)}.bg-\(--accent-muted\){background-color:var(--accent-muted)}.bg-\(--danger\){background-color:var(--danger)}.bg-\(--danger-soft\){background-color:var(--danger-soft)}.bg-\(--feature-surface\){background-color:var(--feature-surface)}.bg-\(--ink-3-aa\){background-color:var(--ink-3-aa)}.bg-\(--ok\){background-color:var(--ok)}.bg-\(--ok-soft\){background-color:var(--ok-soft)}.bg-\(--paper\),.bg-\(--paper\)\/85{background-color:var(--paper)}@supports (color:color-mix(in lab, red, red)){.bg-\(--paper\)\/85{background-color:color-mix(in oklab, var(--paper) 85%, transparent)}}.bg-\(--paper\)\/90{background-color:var(--paper)}@supports (color:color-mix(in lab, red, red)){.bg-\(--paper\)\/90{background-color:color-mix(in oklab, var(--paper) 90%, transparent)}}.bg-\(--paper-2\){background-color:var(--paper-2)}.bg-\(--rule\){background-color:var(--rule)}.bg-\(--rule-2\){background-color:var(--rule-2)}.bg-\(--rule-hard\){background-color:var(--rule-hard)}.bg-\(--scrim\){background-color:var(--scrim)}.bg-\(--stone\){background-color:var(--stone)}.bg-\(--warn\){background-color:var(--warn)}.bg-\(--warn-soft\){background-color:var(--warn-soft)}.bg-transparent{background-color:#0000}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-\(--control-px-lg\){padding-inline:var(--control-px-lg)}.px-\(--control-px-md\){padding-inline:var(--control-px-md)}.px-\(--control-px-sm\){padding-inline:var(--control-px-sm)}.px-\(--field-px\){padding-inline:var(--field-px)}.px-\(--page-pad\){padding-inline:var(--page-pad)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-\[0\.4em\]{padding-inline:.4em}.px-\[clamp\(1rem\,calc\(3\*var\(--fluid\)\)\,1\.625rem\)\]{padding-inline:clamp(1rem, calc(3 * var(--fluid)), 1.625rem)}.px-\[var\(--table-pad-x\,0\)\]{padding-inline:var(--table-pad-x,0)}.py-\(--control-py-lg\){padding-block:var(--control-py-lg)}.py-\(--control-py-md\){padding-block:var(--control-py-md)}.py-\(--control-py-sm\){padding-block:var(--control-py-sm)}.py-\(--field-py\){padding-block:var(--field-py)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[0\.1em\]{padding-block:.1em}.py-\[clamp\(1\.5rem\,calc\(4\*var\(--fluid\)\)\,2\.25rem\)\]{padding-block:clamp(1.5rem, calc(4 * var(--fluid)), 2.25rem)}.py-\[var\(--table-pad-y\)\]{padding-block:var(--table-pad-y)}.ps-2\.5{padding-inline-start:calc(var(--spacing) * 2.5)}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pe-6{padding-inline-end:calc(var(--spacing) * 6)}.pe-8{padding-inline-end:calc(var(--spacing) * 8)}.pe-9{padding-inline-end:calc(var(--spacing) * 9)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-end{text-align:end}.text-start{text-align:start}.align-\[0\.28em\]{vertical-align:.28em}.align-bottom{vertical-align:bottom}.align-top{vertical-align:top}.eyebrow{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.2em;font-size:11px}.mono-meta{font-family:var(--font-mono);letter-spacing:.08em;font-size:11px}.font-heading{font-family:var(--font-heading)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8em\]{font-size:.8em}.text-\[0\.68em\]{font-size:.68em}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[length\:var\(--fs-heading\)\]{font-size:var(--fs-heading)}.text-\[length\:var\(--fs-item\)\]{font-size:var(--fs-item)}.text-\[length\:var\(--fs-lead\)\]{font-size:var(--fs-lead)}.text-\[length\:var\(--fs-sub\)\]{font-size:var(--fs-sub)}.text-\[length\:var\(--fs-title\)\]{font-size:var(--fs-title)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-\(--accent-foreground\){color:var(--accent-foreground)}.text-\(--danger\){color:var(--danger)}.text-\(--ink\){color:var(--ink)}.text-\(--ink-2\){color:var(--ink-2)}.text-\(--ink-3-aa\){color:var(--ink-3-aa)}.text-\(--ok\){color:var(--ok)}.text-\(--on-feature\){color:var(--on-feature)}.text-\(--paper\){color:var(--paper)}.text-\(--rule-2\){color:var(--rule-2)}.text-\(--warn\){color:var(--warn)}.text-\[var\(--card-title\,var\(--ink\)\)\]{color:var(--card-title,var(--ink))}.text-current{color:currentColor}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-\(--rule-2\){-webkit-text-decoration-color:var(--rule-2);-webkit-text-decoration-color:var(--rule-2);text-decoration-color:var(--rule-2)}.decoration-transparent{text-decoration-color:#0000}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-55{opacity:.55}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,color\,border-color\,background-color\]{transition-property:opacity,color,border-color,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,background-color\]{transition-property:transform,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,width\]{transition-property:transform,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-\(--duration-base\){--tw-duration:var(--duration-base);transition-duration:var(--duration-base)}.duration-\(--duration-fast\){--tw-duration:var(--duration-fast);transition-duration:var(--duration-fast)}.duration-\(--duration-slow\){--tw-duration:var(--duration-slow);transition-duration:var(--duration-slow)}.ease-\(--ease-out-expo\){--tw-ease:var(--ease-out-expo);transition-timing-function:var(--ease-out-expo)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--card-title\:var\(--on-feature\)\]{--card-title:var(--on-feature)}.\[--table-pad-x\:0\.75rem\]{--table-pad-x:.75rem}@media (hover:hover){.group-hover\:h-1\.5:is(:where(.group):hover *){height:calc(var(--spacing) * 1.5)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-active\:w-5:is(:where(.group):active *){width:calc(var(--spacing) * 5)}.group-data-\[state\=open\]\:rotate-45:is(:where(.group)[data-state=open] *){rotate:45deg}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.placeholder\:text-\(--ink-3-aa\)::placeholder{color:var(--ink-3-aa)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-y-1:before{content:var(--tw-content);inset-block:var(--spacing)}.before\:start-0:before{content:var(--tw-content);inset-inline-start:calc(var(--spacing) * 0)}.before\:top-1\/2:before{content:var(--tw-content);top:50%}.before\:left-1\/2:before{content:var(--tw-content);left:50%}.before\:size-11:before{content:var(--tw-content);width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.before\:w-0\.5:before{content:var(--tw-content);width:calc(var(--spacing) * .5)}.before\:-translate-x-1\/2:before{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.before\:-translate-y-1\/2:before{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.before\:rounded-\(--radius-pill\):before{content:var(--tw-content);border-radius:var(--radius-pill)}.before\:bg-transparent:before{content:var(--tw-content);background-color:#0000}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}@media (hover:hover){.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-\(--ink\):hover{border-color:var(--ink)}.hover\:border-\(--rule-2\):hover{border-color:var(--rule-2)}.hover\:border-\(--rule-hard\):hover{border-color:var(--rule-hard)}.hover\:bg-\(--stone\):hover{background-color:var(--stone)}.hover\:text-\(--ink\):hover{color:var(--ink)}.hover\:text-\(--ink-2\):hover{color:var(--ink-2)}.hover\:decoration-\(--ink\):hover{-webkit-text-decoration-color:var(--ink);-webkit-text-decoration-color:var(--ink);text-decoration-color:var(--ink)}.hover\:decoration-\(--rule-2\):hover{-webkit-text-decoration-color:var(--rule-2);-webkit-text-decoration-color:var(--rule-2);text-decoration-color:var(--rule-2)}.hover\:opacity-85:hover{opacity:.85}}.focus\:border-\(--ink\):focus{border-color:var(--ink)}.active\:scale-125:active{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-\(--disabled-opacity\):disabled{opacity:var(--disabled-opacity)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-\(--disabled-opacity\)[aria-disabled=true]{opacity:var(--disabled-opacity)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-\(--disabled-opacity\)[data-disabled]{opacity:var(--disabled-opacity)}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-\(--disabled-opacity\)[data-disabled=true]{opacity:var(--disabled-opacity)}.data-\[highlighted\]\:bg-\(--stone\)[data-highlighted]{background-color:var(--stone)}.data-\[highlighted\]\:text-\(--ink\)[data-highlighted]{color:var(--ink)}.data-\[on\=true\]\:border-\(--accent\)[data-on=true]{border-color:var(--accent)}.data-\[on\=true\]\:bg-\(--accent\)[data-on=true]{background-color:var(--accent)}.data-\[placeholder\]\:text-\(--ink-3-aa\)[data-placeholder]{color:var(--ink-3-aa)}.data-\[selected\=true\]\:bg-\(--accent-muted\)[data-selected=true]{background-color:var(--accent-muted)}.data-\[selected\=true\]\:text-\(--ink\)[data-selected=true]{color:var(--ink)}.data-\[selected\=true\]\:before\:bg-\(--accent\)[data-selected=true]:before{content:var(--tw-content);background-color:var(--accent)}.data-\[state\=active\]\:scale-125[data-state=active]{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.data-\[state\=active\]\:animate-\[m22-panel-in_var\(--duration-fast\)_var\(--ease\)\][data-state=active]{animation:m22-panel-in var(--duration-fast) var(--ease)}.data-\[state\=active\]\:border-\(--accent\)[data-state=active]{border-color:var(--accent)}.data-\[state\=active\]\:text-\(--accent-on-muted\)[data-state=active]{color:var(--accent-on-muted)}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:border-\(--accent\)[data-state=checked]{border-color:var(--accent)}.data-\[state\=checked\]\:bg-\(--accent\)[data-state=checked]{background-color:var(--accent)}.data-\[state\=closed\]\:-translate-x-full[data-state=closed]{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:translate-x-full[data-state=closed]{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:-translate-y-full[data-state=closed]{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:translate-y-full[data-state=closed]{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:animate-\[m22-accordion-up_var\(--duration-base\)_var\(--ease\)\][data-state=closed]{animation:m22-accordion-up var(--duration-base) var(--ease)}.data-\[state\=closed\]\:animate-\[m22-collapsible-up_var\(--duration-base\)_var\(--ease\)\][data-state=closed]{animation:m22-collapsible-up var(--duration-base) var(--ease)}.data-\[state\=closed\]\:animate-\[m22-pop-out_var\(--duration-fast\)_var\(--ease\)\][data-state=closed]{animation:m22-pop-out var(--duration-fast) var(--ease)}.data-\[state\=delayed-open\]\:animate-\[m22-fade-in_var\(--duration-fast\)_var\(--ease\)\][data-state=delayed-open]{animation:m22-fade-in var(--duration-fast) var(--ease)}.data-\[state\=indeterminate\]\:border-\(--accent\)[data-state=indeterminate]{border-color:var(--accent)}.data-\[state\=indeterminate\]\:bg-\(--accent\)[data-state=indeterminate],.data-\[state\=on\]\:bg-\(--accent\)[data-state=on]{background-color:var(--accent)}.data-\[state\=on\]\:text-\(--accent-foreground\)[data-state=on]{color:var(--accent-foreground)}.data-\[state\=open\]\:animate-\[m22-accordion-down_var\(--duration-base\)_var\(--ease\)\][data-state=open]{animation:m22-accordion-down var(--duration-base) var(--ease)}.data-\[state\=open\]\:animate-\[m22-collapsible-down_var\(--duration-base\)_var\(--ease\)\][data-state=open]{animation:m22-collapsible-down var(--duration-base) var(--ease)}.data-\[state\=open\]\:animate-\[m22-fade-in_var\(--duration-fast\)_var\(--ease\)\][data-state=open]{animation:m22-fade-in var(--duration-fast) var(--ease)}.data-\[state\=open\]\:animate-\[m22-panel-in_var\(--duration-base\)_var\(--ease\)\][data-state=open]{animation:m22-panel-in var(--duration-base) var(--ease)}.data-\[state\=open\]\:animate-\[m22-pop-in_var\(--duration-fast\)_var\(--ease-out-expo\)\][data-state=open]{animation:m22-pop-in var(--duration-fast) var(--ease-out-expo)}@media (prefers-reduced-motion:no-preference){.motion-safe\:animate-\[m22-halo_2\.4s_ease-out_infinite\]{animation:2.4s ease-out infinite m22-halo}.motion-safe\:animate-\[m22-spin_0\.7s_linear_infinite\]{animation:.7s linear infinite m22-spin}.motion-safe\:animate-\[m22-sweep_1\.4s_var\(--ease\)_infinite\]{animation:m22-sweep 1.4s var(--ease) infinite}}@media (prefers-reduced-motion:reduce){.motion-reduce\:w-full{width:100%}.motion-reduce\:animate-none{animation:none}.motion-reduce\:opacity-40{opacity:.4}.motion-reduce\:transition-none{transition-property:none}}@media not all and (min-width:640px){.max-sm\:flex-row{flex-direction:row}.max-sm\:flex-wrap{flex-wrap:wrap}}@media (min-width:640px){.sm\:flex-row{flex-direction:row}.sm\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.sm\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}@media (min-width:768px){.md\:static{position:static}.md\:z-auto{z-index:auto}.md\:grid{display:grid}.md\:hidden{display:none}.md\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:grid-cols-\[15rem_1fr\]{grid-template-columns:15rem 1fr}}@container (min-width:64rem){.\@5xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.rtl\:translate-x-full:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:-scale-x-100:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.rtl\:data-\[state\=checked\]\:-translate-x-4:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-state=checked]{--tw-translate-x:calc(var(--spacing) * -4);translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:data-\[state\=closed\]\:-translate-x-full:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-state=closed]{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:data-\[state\=closed\]\:translate-x-full:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-state=closed]{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&_\[cmdk-group-heading\]\]\:px-2\.5 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2.5)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:eyebrow [cmdk-group-heading]{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.2em;font-size:11px}.\[\&_\[cmdk-group-heading\]\]\:text-\(--ink-3-aa\) [cmdk-group-heading]{color:var(--ink-3-aa)}.\[\&_\[cmdk-list\]\]\:scroll-hairline [cmdk-list]{scrollbar-width:thin;scrollbar-color:var(--rule-2) transparent}.\[\&_\[cmdk-list\]\]\:scroll-hairline [cmdk-list]::-webkit-scrollbar{width:6px;height:6px}.\[\&_\[cmdk-list\]\]\:scroll-hairline [cmdk-list]::-webkit-scrollbar-track{background:0 0}.\[\&_\[cmdk-list\]\]\:scroll-hairline [cmdk-list]::-webkit-scrollbar-thumb{background:var(--rule-2);border-radius:var(--radius-pill)}.\[\&_\[cmdk-list\]\]\:max-h-\[22rem\] [cmdk-list]{max-height:22rem}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_tbody_tr\]\:border-b tbody tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tbody_tr\]\:border-\(--rule\) tbody tr{border-color:var(--rule)}.\[\&_tbody_tr\:last-child\]\:border-b-0 tbody tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&_td\]\:border-e td{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.\[\&_td\]\:border-\(--rule\) td{border-color:var(--rule)}.\[\&_td\:last-child\]\:border-e-0 td:last-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&_th\]\:border-e th{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.\[\&_th\]\:border-\(--rule\) th{border-color:var(--rule)}.\[\&_th\:last-child\]\:border-e-0 th:last-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&_thead\]\:sticky thead{position:sticky}.\[\&_thead\]\:top-0 thead{top:0}.\[\&_thead\]\:z-\(--z-rule\) thead{z-index:var(--z-rule)}.\[\&_thead\]\:border-b thead{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_thead\]\:border-\(--rule-2\) thead{border-color:var(--rule-2)}.\[\&_thead\]\:border-\(--rule-hard\) thead{border-color:var(--rule-hard)}.\[\&_thead\]\:bg-\(--paper\) thead{background-color:var(--paper)}.\[\&\:not\(\:last-child\)\]\:pe-\[calc\(var\(--table-pad-x\,0px\)\+1\.5rem\)\]:not(:last-child){padding-inline-end:calc(var(--table-pad-x,0px) + 1.5rem)}.\[\&\>button\]\:pointer-events-none>button{pointer-events:none}.\[\&\>button\]\:bg-\(--accent\)>button{background-color:var(--accent)}.\[\&\>button\]\:text-\(--accent-foreground\)>button{color:var(--accent-foreground)}.\[\&\>button\]\:text-\(--ink\)>button{color:var(--ink)}.\[\&\>button\]\:text-\(--ink-3-aa\)>button{color:var(--ink-3-aa)}.\[\&\>button\]\:opacity-\(--disabled-opacity\)>button{opacity:var(--disabled-opacity)}.\[\&\>button\]\:ring-1>button{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.\[\&\>button\]\:ring-\(--rule-hard\)>button{--tw-ring-color:var(--rule-hard)}.\[\&\>button\]\:ring-inset>button{--tw-ring-inset:inset}.\[\&\>button\:hover\]\:bg-\(--accent\)>button:hover{background-color:var(--accent)}.\[\&\>button\:hover\]\:bg-\(--stone\)>button:hover{background-color:var(--stone)}.\[\&\>button\:hover\]\:text-\(--accent-foreground\)>button:hover{color:var(--accent-foreground)}.\[\&\>div\]\:border-\(--rule\)>div{border-color:var(--rule)}@container (min-width:64rem){.\@5xl\:\[\&\>div\:not\(\:first-child\)\]\:border-s>div:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}}@container not (min-width:64rem){.\@max-5xl\:\[\&\>div\:nth-child\(even\)\]\:border-s>div:nth-child(2n){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.\@max-5xl\:\[\&\>div\:nth-child\(n\+3\)\]\:border-t>div:nth-child(n+3){border-top-style:var(--tw-border-style);border-top-width:1px}}}:root,[data-mode=light]{--paper:#fff;--paper-2:#f7f7f5;--bar:var(--stone);--bar-2:var(--stone);--ink:#101010;--ink-2:#4a4a4a;--ink-3:#1010108c;--ink-3-aa:#5c5c5c;--forest:#3a3a3a;--mist:var(--stone);--stone:#f2f1ee;--clay:var(--ink);--clay-ink:var(--clay);--feature-surface:#262626;--on-feature:var(--paper);--focus-on-feature:var(--on-feature);--on-photo:var(--paper);--photo-caption-surface:var(--ink);--photo-shadow:0 1px 6px #000000b8;--rule:#edebe6;--rule-2:#dbdbd6;--rule-hard:var(--ink);--red:var(--clay);--red-ink:var(--clay);--red-soft:#10101012;--on-red:var(--paper);--shadow-offset:var(--clay);color-scheme:light}[data-mode=dark]{--paper:#0d0d0d;--paper-2:#161616;--bar:var(--stone);--bar-2:var(--stone);--ink:#f4f4f2;--ink-2:#b4b4b0;--ink-3:#f4f4f28c;--ink-3-aa:#9a9a96;--forest:#c9c9c5;--mist:var(--stone);--stone:#1f1f1f;--clay:var(--ink);--clay-ink:var(--clay);--feature-surface:#1a1a1a;--on-feature:var(--ink);--focus-on-feature:var(--on-feature);--on-photo:#fbfbfa;--photo-caption-surface:var(--paper);--photo-shadow:0 1px 6px #000000b8;--rule:#f4f4f224;--rule-2:#f4f4f242;--rule-hard:var(--ink);--red:var(--clay);--red-ink:var(--clay);--red-soft:#f4f4f21f;--on-red:var(--paper);--shadow-offset:var(--clay);color-scheme:dark}:root{--sans:var(--font-hanken,"Hanken Grotesk"), var(--cjk-sans), "Helvetica Neue", Arial, sans-serif;--serif:var(--font-newsreader,"Newsreader"), var(--cjk-serif), Georgia, serif;--mono:var(--font-plex-mono,"IBM Plex Mono"), var(--cjk-sans), ui-monospace, SFMono-Regular, Menlo, monospace;--cjk-serif:var(--font-noto-serif-sc,"Noto Serif SC"), "Source Han Serif SC", "Songti SC", STSong, SimSun;--cjk-sans:var(--font-noto-sans-sc,"Noto Sans SC"), "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei";--lh-cjk:1.8;--ls-cjk:0;--fluid:1vw;--maxw:1288px;--col:8.3333%;--row:52px}:root,[data-fluid-frame]{--fs-title:clamp(2.5rem, calc(4.6 * var(--fluid)), 3.375rem);--fs-lead:clamp(1.875rem, calc(3 * var(--fluid)), 2.625rem);--fs-heading:clamp(1.5rem, calc(2.1 * var(--fluid)), 1.8125rem);--fs-sub:clamp(1.3125rem, calc(1.7 * var(--fluid)), 1.5625rem);--fs-item:clamp(1.125rem, calc(1.35 * var(--fluid)), 1.25rem);--pad:clamp(18px, calc(4.4 * var(--fluid)), 64px);--sec:clamp(54px, calc(7 * var(--fluid)), 96px);--sec-tight:clamp(40px, calc(5 * var(--fluid)), 68px)}:root{--radius-sm:6px;--radius:8px;--radius-lg:14px;--radius-pill:999px;--control-h-sm:2.25rem;--control-h-md:2.75rem;--control-h-lg:3rem;--control-px-sm:1rem;--control-px-md:1.5rem;--control-px-lg:1.75rem;--control-py-sm:.5rem;--control-py-md:.75rem;--control-py-lg:.75rem;--control-gap:.625rem;--field-px:.875rem;--field-py:.625rem;--table-pad-y:.875rem;--table-pad-x:0px;--ease:cubic-bezier(.2, .7, .3, 1);--fast:.13s;--mid:.22s;--slow:.34s;--z-rule:1;--z-sticky:10;--z-drawer:100;--z-scrim:200;--z-modal:210;--z-palette:220;--z-toast:300;--focus:var(--red);--focus-w:2px;--focus-off:3px;--ico-s:14px;--ico-m:16px;--ico-l:20px;--ico-stroke:1.5;--ok:#3d6b34;--ok-soft:#3d6b3421;--warn:#8a5a00;--warn-soft:#8a5a0021;--danger:#a83214;--danger-soft:#a8321424;--scrim:var(--ink)}@supports (color:color-mix(in lab, red, red)){:root{--scrim:color-mix(in srgb, var(--ink) 62%, transparent)}}[data-mode=dark]{--ok:#84b47b;--ok-soft:#84b47b29;--warn:#d9a55d;--warn-soft:#d9a55d29;--danger:#ee8b68;--danger-soft:#ee8b6829;--scrim:#000000b8}[data-density=compact]{--control-h-sm:1.875rem;--control-h-md:2.25rem;--control-h-lg:2.5rem;--control-px-sm:.75rem;--control-px-md:1rem;--control-px-lg:1.25rem;--control-py-sm:.25rem;--control-py-md:.375rem;--control-py-lg:.5rem;--control-gap:.5rem;--field-px:.625rem;--field-py:.375rem;--table-pad-y:.5rem}[data-table-density=compact]{--table-pad-y:.5rem}:root{--background:var(--paper);--background-elevated:var(--paper-2);--code-background:var(--bar);--nav-background:var(--paper);--card-background:var(--paper);--foreground:var(--ink);--foreground-muted:var(--ink-2);--secondary-text:var(--ink-3-aa);--on-dark:#fbfbfa;--brand-plate:#fff;--border-color:var(--rule-2);--border-subtle:var(--rule);--accent:var(--red);--accent-hover:var(--red-ink);--accent-muted:var(--red-soft);--accent-wash:var(--red-soft);--accent-foreground:var(--on-red);--accent-on-dark:var(--red);--accent-on-muted:var(--red-ink);--success:var(--ok);--success-wash:var(--ok-soft);--warning:var(--warn);--warning-wash:var(--warn-soft);--danger-wash:var(--danger-soft);--info:var(--ink-2);--info-wash:var(--red-soft);--photo-scrim:#101010;--shadow-color:transparent;--shadow-sm:none;--shadow:none;--shadow-lg:none;--lift:3px 3px 0 0 var(--shadow-offset);--lift-sm:2px 2px 0 0 var(--shadow-offset);--ring:var(--focus);--ring-offset:var(--focus-off);--ease-out-expo:var(--ease);--duration-fast:var(--fast);--duration-base:var(--mid);--duration-slow:var(--slow);--overlay:var(--scrim);--disabled-opacity:.5;--z-dropdown:var(--z-drawer);--z-overlay:var(--z-scrim);--page-pad:var(--pad);--w-page:var(--maxw);--w-reading:46rem;--measure-record:66ch;--scroll-offset:88px}[data-surface=warm]{--paper:#fdfcf9;--paper-2:#f6f4ee;--stone:#efece4;--rule:#e8e4da;--rule-2:#d8d3c6}[data-mode=dark][data-surface=warm],[data-mode=dark] [data-surface=warm]{--paper:#12110f;--paper-2:#1a1814;--stone:#221f1a}[data-surface=cool]{--paper:#fcfdfe;--paper-2:#f2f5f8;--stone:#eceff3;--rule:#e4e9ee;--rule-2:#d2d9e1}[data-mode=dark][data-surface=cool],[data-mode=dark] [data-surface=cool]{--paper:#0c0e11;--paper-2:#14171b;--stone:#1c2026}[data-radius=sharp]{--radius-sm:0px;--radius:0px;--radius-lg:0px}[data-radius=round]{--radius-sm:10px;--radius:14px;--radius-lg:22px}[data-rules=firm]{--rule:#cfccc4;--rule-2:#a8a49a}[data-mode=dark][data-rules=firm],[data-mode=dark] [data-rules=firm]{--rule:#f4f4f247;--rule-2:#f4f4f275}[data-rules=quiet]{--rule:#f4f2ee;--rule-2:#e8e5df}[data-mode=dark][data-rules=quiet],[data-mode=dark] [data-rules=quiet]{--rule:#f4f4f214;--rule-2:#f4f4f226}[data-type=grotesk]{--font-heading:var(--sans)}[data-type=bookish]{--font-sans:var(--serif);--font-heading:var(--serif)}[data-motion=snappy]{--fast:90ms;--mid:.14s;--slow:.22s}[data-motion=still]{--fast:1ms;--mid:1ms;--slow:1ms}@keyframes m22-panel-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@keyframes m22-pop-in{0%{opacity:0;transform:scale(.96)translateY(-2px)}to{opacity:1;transform:none}}@keyframes m22-pop-out{0%{opacity:1;transform:none}to{opacity:0;transform:scale(.97)translateY(-2px)}}@keyframes m22-route-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}@keyframes m22-fade-in{0%{opacity:0}to{opacity:1}}@keyframes m22-fade-out{0%{opacity:1}to{opacity:0}}@keyframes m22-slide-in-right{0%{opacity:0;transform:translate(12px)}to{opacity:1;transform:none}}@keyframes m22-pulse{0%{opacity:.6}50%{opacity:1}to{opacity:.6}}@keyframes m22-sweep{0%{transform:translate(-100%)}to{transform:translate(400%)}}@keyframes m22-spin{to{transform:rotate(360deg)}}@keyframes m22-bounce-dot{0%,80%,to{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}@keyframes m22-halo{0%{opacity:.55;transform:scale(1)}70%{opacity:0;transform:scale(2.6)}to{opacity:0}}@keyframes m22-accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}@keyframes m22-accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}@keyframes m22-collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height)}}@keyframes m22-collapsible-up{0%{height:var(--radix-collapsible-content-height)}to{height:0}}@media (prefers-reduced-motion:reduce){[class*=m22-anim],[data-m22-animated]{animation:none!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes pulse{50%{opacity:.5}}
|
|
3
|
+
/* GENERATED by scripts/vendor-fonts.mjs — do not edit by hand.
|
|
4
|
+
Vendored Latin webfaces for @misoto22/design, declared under the literal
|
|
5
|
+
family names the token layer falls back to. A host that loads these itself
|
|
6
|
+
(next/font, a CDN) sets --font-* and never reaches these rules.
|
|
7
|
+
Re-run: pnpm --filter @misoto22/design build:fonts */
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
/* ─── Hanken Grotesk — 5 weights ─── */
|
|
11
|
+
@font-face {
|
|
12
|
+
font-family: 'Hanken Grotesk';
|
|
13
|
+
font-style: normal;
|
|
14
|
+
font-weight: 300;
|
|
15
|
+
font-display: swap;
|
|
16
|
+
src: url('./fonts/hanken-grotesk-300.woff2') format('woff2');
|
|
17
|
+
}
|
|
18
|
+
@font-face {
|
|
19
|
+
font-family: 'Hanken Grotesk';
|
|
20
|
+
font-style: normal;
|
|
21
|
+
font-weight: 400;
|
|
22
|
+
font-display: swap;
|
|
23
|
+
src: url('./fonts/hanken-grotesk-400.woff2') format('woff2');
|
|
24
|
+
}
|
|
25
|
+
@font-face {
|
|
26
|
+
font-family: 'Hanken Grotesk';
|
|
27
|
+
font-style: normal;
|
|
28
|
+
font-weight: 500;
|
|
29
|
+
font-display: swap;
|
|
30
|
+
src: url('./fonts/hanken-grotesk-500.woff2') format('woff2');
|
|
31
|
+
}
|
|
32
|
+
@font-face {
|
|
33
|
+
font-family: 'Hanken Grotesk';
|
|
34
|
+
font-style: normal;
|
|
35
|
+
font-weight: 600;
|
|
36
|
+
font-display: swap;
|
|
37
|
+
src: url('./fonts/hanken-grotesk-600.woff2') format('woff2');
|
|
38
|
+
}
|
|
39
|
+
@font-face {
|
|
40
|
+
font-family: 'Hanken Grotesk';
|
|
41
|
+
font-style: normal;
|
|
42
|
+
font-weight: 700;
|
|
43
|
+
font-display: swap;
|
|
44
|
+
src: url('./fonts/hanken-grotesk-700.woff2') format('woff2');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* ─── Newsreader — 4 weights ─── */
|
|
48
|
+
@font-face {
|
|
49
|
+
font-family: 'Newsreader';
|
|
50
|
+
font-style: normal;
|
|
51
|
+
font-weight: 300;
|
|
52
|
+
font-display: swap;
|
|
53
|
+
src: url('./fonts/newsreader-300.woff2') format('woff2');
|
|
54
|
+
}
|
|
55
|
+
@font-face {
|
|
56
|
+
font-family: 'Newsreader';
|
|
57
|
+
font-style: normal;
|
|
58
|
+
font-weight: 400;
|
|
59
|
+
font-display: swap;
|
|
60
|
+
src: url('./fonts/newsreader-400.woff2') format('woff2');
|
|
61
|
+
}
|
|
62
|
+
@font-face {
|
|
63
|
+
font-family: 'Newsreader';
|
|
64
|
+
font-style: normal;
|
|
65
|
+
font-weight: 500;
|
|
66
|
+
font-display: swap;
|
|
67
|
+
src: url('./fonts/newsreader-500.woff2') format('woff2');
|
|
68
|
+
}
|
|
69
|
+
@font-face {
|
|
70
|
+
font-family: 'Newsreader';
|
|
71
|
+
font-style: normal;
|
|
72
|
+
font-weight: 600;
|
|
73
|
+
font-display: swap;
|
|
74
|
+
src: url('./fonts/newsreader-600.woff2') format('woff2');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* ─── IBM Plex Mono — 3 weights ─── */
|
|
78
|
+
@font-face {
|
|
79
|
+
font-family: 'IBM Plex Mono';
|
|
80
|
+
font-style: normal;
|
|
81
|
+
font-weight: 400;
|
|
82
|
+
font-display: swap;
|
|
83
|
+
src: url('./fonts/ibm-plex-mono-400.woff2') format('woff2');
|
|
84
|
+
}
|
|
85
|
+
@font-face {
|
|
86
|
+
font-family: 'IBM Plex Mono';
|
|
87
|
+
font-style: normal;
|
|
88
|
+
font-weight: 500;
|
|
89
|
+
font-display: swap;
|
|
90
|
+
src: url('./fonts/ibm-plex-mono-500.woff2') format('woff2');
|
|
91
|
+
}
|
|
92
|
+
@font-face {
|
|
93
|
+
font-family: 'IBM Plex Mono';
|
|
94
|
+
font-style: normal;
|
|
95
|
+
font-weight: 600;
|
|
96
|
+
font-display: swap;
|
|
97
|
+
src: url('./fonts/ibm-plex-mono-600.woff2') format('woff2');
|
|
98
|
+
}
|
package/dist/themes.css
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Theming beyond the accent.
|
|
3
|
+
*
|
|
4
|
+
* The accent proves one token can be re-pointed. This proves the rest can:
|
|
5
|
+
* five independent axes, each an attribute on the root, each re-pointing
|
|
6
|
+
* tokens that already exist. No component is touched by any of it, and nothing
|
|
7
|
+
* here introduces a token — a theme that needed a new token would be a second
|
|
8
|
+
* design system wearing the first one's name.
|
|
9
|
+
*
|
|
10
|
+
* The axes are independent on purpose. A named preset is a combination, not a
|
|
11
|
+
* block of its own, so "warm surface with sharp corners" is reachable even
|
|
12
|
+
* though nobody shipped it as a preset.
|
|
13
|
+
*
|
|
14
|
+
* Every axis has an unset default: the White Reset is what you get by writing
|
|
15
|
+
* no attribute at all.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/* ─── Surface ──────────────────────────────────────────────────────────────
|
|
19
|
+
The ground and its two steps. Law 8 still holds — dark is a value swap, so
|
|
20
|
+
each surface defines both and neither is a separate palette. */
|
|
21
|
+
|
|
22
|
+
[data-surface='warm'] {
|
|
23
|
+
--paper: #fdfcf9;
|
|
24
|
+
--paper-2: #f6f4ee;
|
|
25
|
+
--stone: #efece4;
|
|
26
|
+
--rule: #e8e4da;
|
|
27
|
+
--rule-2: #d8d3c6;
|
|
28
|
+
}
|
|
29
|
+
[data-mode='dark'][data-surface='warm'],
|
|
30
|
+
[data-mode='dark'] [data-surface='warm'] {
|
|
31
|
+
--paper: #12110f;
|
|
32
|
+
--paper-2: #1a1814;
|
|
33
|
+
--stone: #221f1a;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
[data-surface='cool'] {
|
|
37
|
+
--paper: #fcfdfe;
|
|
38
|
+
--paper-2: #f2f5f8;
|
|
39
|
+
--stone: #eceff3;
|
|
40
|
+
--rule: #e4e9ee;
|
|
41
|
+
--rule-2: #d2d9e1;
|
|
42
|
+
}
|
|
43
|
+
[data-mode='dark'][data-surface='cool'],
|
|
44
|
+
[data-mode='dark'] [data-surface='cool'] {
|
|
45
|
+
--paper: #0c0e11;
|
|
46
|
+
--paper-2: #14171b;
|
|
47
|
+
--stone: #1c2026;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* ─── Radius ───────────────────────────────────────────────────────────────
|
|
51
|
+
The pill is exempt in every case: a pill is a shape, not a corner. */
|
|
52
|
+
|
|
53
|
+
[data-radius='sharp'] {
|
|
54
|
+
--radius-sm: 0px;
|
|
55
|
+
--radius: 0px;
|
|
56
|
+
--radius-lg: 0px;
|
|
57
|
+
}
|
|
58
|
+
[data-radius='round'] {
|
|
59
|
+
--radius-sm: 10px;
|
|
60
|
+
--radius: 14px;
|
|
61
|
+
--radius-lg: 22px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ─── Rules ────────────────────────────────────────────────────────────────
|
|
65
|
+
How much the system draws its own edges. `firm` is the setting for a dense
|
|
66
|
+
console; `quiet` leans on the surface steps and is what a reading page
|
|
67
|
+
wants. */
|
|
68
|
+
|
|
69
|
+
[data-rules='firm'] {
|
|
70
|
+
--rule: #cfccc4;
|
|
71
|
+
--rule-2: #a8a49a;
|
|
72
|
+
}
|
|
73
|
+
[data-mode='dark'][data-rules='firm'],
|
|
74
|
+
[data-mode='dark'] [data-rules='firm'] {
|
|
75
|
+
--rule: rgba(244, 244, 242, 0.28);
|
|
76
|
+
--rule-2: rgba(244, 244, 242, 0.46);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
[data-rules='quiet'] {
|
|
80
|
+
--rule: #f4f2ee;
|
|
81
|
+
--rule-2: #e8e5df;
|
|
82
|
+
}
|
|
83
|
+
[data-mode='dark'][data-rules='quiet'],
|
|
84
|
+
[data-mode='dark'] [data-rules='quiet'] {
|
|
85
|
+
--rule: rgba(244, 244, 242, 0.08);
|
|
86
|
+
--rule-2: rgba(244, 244, 242, 0.15);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ─── Type ─────────────────────────────────────────────────────────────────
|
|
90
|
+
Which face carries a heading. The ramp itself does not move: the steps are a
|
|
91
|
+
hierarchy, and a theme that re-sized them would be re-deciding the
|
|
92
|
+
hierarchy rather than re-dressing it. */
|
|
93
|
+
|
|
94
|
+
[data-type='grotesk'] {
|
|
95
|
+
--font-heading: var(--sans);
|
|
96
|
+
}
|
|
97
|
+
[data-type='bookish'] {
|
|
98
|
+
--font-sans: var(--serif);
|
|
99
|
+
--font-heading: var(--serif);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ─── Motion ───────────────────────────────────────────────────────────────
|
|
103
|
+
`prefers-reduced-motion` is honoured separately and is not a theme: a
|
|
104
|
+
reader's stated need is not one of five looks. This axis is taste. */
|
|
105
|
+
|
|
106
|
+
[data-motion='snappy'] {
|
|
107
|
+
--fast: 90ms;
|
|
108
|
+
--mid: 140ms;
|
|
109
|
+
--slow: 220ms;
|
|
110
|
+
}
|
|
111
|
+
[data-motion='still'] {
|
|
112
|
+
--fast: 1ms;
|
|
113
|
+
--mid: 1ms;
|
|
114
|
+
--slow: 1ms;
|
|
115
|
+
}
|