@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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/dist/components/Accordion/Accordion.d.ts +34 -0
  3. package/dist/components/Accordion/Accordion.js +37 -0
  4. package/dist/components/Accordion/Accordion.js.map +1 -0
  5. package/dist/components/Alert/Alert.d.ts +32 -0
  6. package/dist/components/Alert/Alert.js +49 -0
  7. package/dist/components/Alert/Alert.js.map +1 -0
  8. package/dist/components/AppShell/AppShell.d.ts +38 -0
  9. package/dist/components/AppShell/AppShell.js +92 -0
  10. package/dist/components/AppShell/AppShell.js.map +1 -0
  11. package/dist/components/Avatar/Avatar.d.ts +29 -0
  12. package/dist/components/Avatar/Avatar.js +39 -0
  13. package/dist/components/Avatar/Avatar.js.map +1 -0
  14. package/dist/components/Badge/Badge.d.ts +30 -0
  15. package/dist/components/Badge/Badge.js +29 -0
  16. package/dist/components/Badge/Badge.js.map +1 -0
  17. package/dist/components/Breadcrumb/Breadcrumb.d.ts +31 -0
  18. package/dist/components/Breadcrumb/Breadcrumb.js +31 -0
  19. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
  20. package/dist/components/Button/Button.d.ts +70 -0
  21. package/dist/components/Button/Button.js +81 -0
  22. package/dist/components/Button/Button.js.map +1 -0
  23. package/dist/components/Calendar/Calendar.d.ts +28 -0
  24. package/dist/components/Calendar/Calendar.js +87 -0
  25. package/dist/components/Calendar/Calendar.js.map +1 -0
  26. package/dist/components/Card/Card.d.ts +49 -0
  27. package/dist/components/Card/Card.js +64 -0
  28. package/dist/components/Card/Card.js.map +1 -0
  29. package/dist/components/Checkbox/Checkbox.d.ts +23 -0
  30. package/dist/components/Checkbox/Checkbox.js +24 -0
  31. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  32. package/dist/components/Collapsible/Collapsible.d.ts +31 -0
  33. package/dist/components/Collapsible/Collapsible.js +35 -0
  34. package/dist/components/Collapsible/Collapsible.js.map +1 -0
  35. package/dist/components/Combobox/Combobox.d.ts +63 -0
  36. package/dist/components/Combobox/Combobox.js +151 -0
  37. package/dist/components/Combobox/Combobox.js.map +1 -0
  38. package/dist/components/Command/Command.d.ts +98 -0
  39. package/dist/components/Command/Command.js +166 -0
  40. package/dist/components/Command/Command.js.map +1 -0
  41. package/dist/components/ContextMenu/ContextMenu.d.ts +38 -0
  42. package/dist/components/ContextMenu/ContextMenu.js +79 -0
  43. package/dist/components/ContextMenu/ContextMenu.js.map +1 -0
  44. package/dist/components/DatePicker/DatePicker.d.ts +98 -0
  45. package/dist/components/DatePicker/DatePicker.js +214 -0
  46. package/dist/components/DatePicker/DatePicker.js.map +1 -0
  47. package/dist/components/Dialog/Dialog.d.ts +48 -0
  48. package/dist/components/Dialog/Dialog.js +72 -0
  49. package/dist/components/Dialog/Dialog.js.map +1 -0
  50. package/dist/components/DropdownMenu/DropdownMenu.d.ts +49 -0
  51. package/dist/components/DropdownMenu/DropdownMenu.js +89 -0
  52. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  53. package/dist/components/EmptyState/EmptyState.d.ts +31 -0
  54. package/dist/components/EmptyState/EmptyState.js +30 -0
  55. package/dist/components/EmptyState/EmptyState.js.map +1 -0
  56. package/dist/components/ErrorState/ErrorState.d.ts +34 -0
  57. package/dist/components/ErrorState/ErrorState.js +32 -0
  58. package/dist/components/ErrorState/ErrorState.js.map +1 -0
  59. package/dist/components/Field/Field.d.ts +44 -0
  60. package/dist/components/Field/Field.js +54 -0
  61. package/dist/components/Field/Field.js.map +1 -0
  62. package/dist/components/FigureBand/FigureBand.d.ts +51 -0
  63. package/dist/components/FigureBand/FigureBand.js +52 -0
  64. package/dist/components/FigureBand/FigureBand.js.map +1 -0
  65. package/dist/components/FloatingIconButton/FloatingIconButton.d.ts +29 -0
  66. package/dist/components/FloatingIconButton/FloatingIconButton.js +32 -0
  67. package/dist/components/FloatingIconButton/FloatingIconButton.js.map +1 -0
  68. package/dist/components/Input/Input.d.ts +22 -0
  69. package/dist/components/Input/Input.js +21 -0
  70. package/dist/components/Input/Input.js.map +1 -0
  71. package/dist/components/Kbd/Kbd.d.ts +20 -0
  72. package/dist/components/Kbd/Kbd.js +21 -0
  73. package/dist/components/Kbd/Kbd.js.map +1 -0
  74. package/dist/components/LinkArrow/LinkArrow.d.ts +24 -0
  75. package/dist/components/LinkArrow/LinkArrow.js +24 -0
  76. package/dist/components/LinkArrow/LinkArrow.js.map +1 -0
  77. package/dist/components/NativeSelect/NativeSelect.d.ts +27 -0
  78. package/dist/components/NativeSelect/NativeSelect.js +46 -0
  79. package/dist/components/NativeSelect/NativeSelect.js.map +1 -0
  80. package/dist/components/NavItem/NavItem.d.ts +39 -0
  81. package/dist/components/NavItem/NavItem.js +31 -0
  82. package/dist/components/NavItem/NavItem.js.map +1 -0
  83. package/dist/components/Pagination/Pagination.d.ts +44 -0
  84. package/dist/components/Pagination/Pagination.js +109 -0
  85. package/dist/components/Pagination/Pagination.js.map +1 -0
  86. package/dist/components/Popover/Popover.d.ts +39 -0
  87. package/dist/components/Popover/Popover.js +57 -0
  88. package/dist/components/Popover/Popover.js.map +1 -0
  89. package/dist/components/Progress/Progress.d.ts +31 -0
  90. package/dist/components/Progress/Progress.js +45 -0
  91. package/dist/components/Progress/Progress.js.map +1 -0
  92. package/dist/components/RadioGroup/RadioGroup.d.ts +43 -0
  93. package/dist/components/RadioGroup/RadioGroup.js +43 -0
  94. package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
  95. package/dist/components/ScrollArea/ScrollArea.d.ts +31 -0
  96. package/dist/components/ScrollArea/ScrollArea.js +54 -0
  97. package/dist/components/ScrollArea/ScrollArea.js.map +1 -0
  98. package/dist/components/SearchableMenu/SearchableMenu.d.ts +59 -0
  99. package/dist/components/SearchableMenu/SearchableMenu.js +79 -0
  100. package/dist/components/SearchableMenu/SearchableMenu.js.map +1 -0
  101. package/dist/components/Select/Select.d.ts +71 -0
  102. package/dist/components/Select/Select.js +114 -0
  103. package/dist/components/Select/Select.js.map +1 -0
  104. package/dist/components/Separator/Separator.d.ts +30 -0
  105. package/dist/components/Separator/Separator.js +35 -0
  106. package/dist/components/Separator/Separator.js.map +1 -0
  107. package/dist/components/Sheet/Sheet.d.ts +38 -0
  108. package/dist/components/Sheet/Sheet.js +68 -0
  109. package/dist/components/Sheet/Sheet.js.map +1 -0
  110. package/dist/components/Skeleton/Skeleton.d.ts +63 -0
  111. package/dist/components/Skeleton/Skeleton.js +44 -0
  112. package/dist/components/Skeleton/Skeleton.js.map +1 -0
  113. package/dist/components/Slider/Slider.d.ts +35 -0
  114. package/dist/components/Slider/Slider.js +52 -0
  115. package/dist/components/Slider/Slider.js.map +1 -0
  116. package/dist/components/Spinner/Spinner.d.ts +50 -0
  117. package/dist/components/Spinner/Spinner.js +48 -0
  118. package/dist/components/Spinner/Spinner.js.map +1 -0
  119. package/dist/components/StatusDot/StatusDot.d.ts +29 -0
  120. package/dist/components/StatusDot/StatusDot.js +44 -0
  121. package/dist/components/StatusDot/StatusDot.js.map +1 -0
  122. package/dist/components/StatusPill/StatusPill.d.ts +25 -0
  123. package/dist/components/StatusPill/StatusPill.js +31 -0
  124. package/dist/components/StatusPill/StatusPill.js.map +1 -0
  125. package/dist/components/Switch/Switch.d.ts +23 -0
  126. package/dist/components/Switch/Switch.js +23 -0
  127. package/dist/components/Switch/Switch.js.map +1 -0
  128. package/dist/components/Table/Table.d.ts +96 -0
  129. package/dist/components/Table/Table.js +136 -0
  130. package/dist/components/Table/Table.js.map +1 -0
  131. package/dist/components/Tabs/Tabs.d.ts +35 -0
  132. package/dist/components/Tabs/Tabs.js +48 -0
  133. package/dist/components/Tabs/Tabs.js.map +1 -0
  134. package/dist/components/Tag/Tag.d.ts +28 -0
  135. package/dist/components/Tag/Tag.js +22 -0
  136. package/dist/components/Tag/Tag.js.map +1 -0
  137. package/dist/components/Textarea/Textarea.d.ts +20 -0
  138. package/dist/components/Textarea/Textarea.js +32 -0
  139. package/dist/components/Textarea/Textarea.js.map +1 -0
  140. package/dist/components/Toast/Toast.d.ts +24 -0
  141. package/dist/components/Toast/Toast.js +41 -0
  142. package/dist/components/Toast/Toast.js.map +1 -0
  143. package/dist/components/ToggleGroup/ToggleGroup.d.ts +41 -0
  144. package/dist/components/ToggleGroup/ToggleGroup.js +78 -0
  145. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -0
  146. package/dist/components/Tooltip/Tooltip.d.ts +43 -0
  147. package/dist/components/Tooltip/Tooltip.js +40 -0
  148. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  149. package/dist/fonts/hanken-grotesk-300.woff2 +0 -0
  150. package/dist/fonts/hanken-grotesk-400.woff2 +0 -0
  151. package/dist/fonts/hanken-grotesk-500.woff2 +0 -0
  152. package/dist/fonts/hanken-grotesk-600.woff2 +0 -0
  153. package/dist/fonts/hanken-grotesk-700.woff2 +0 -0
  154. package/dist/fonts/ibm-plex-mono-400.woff2 +0 -0
  155. package/dist/fonts/ibm-plex-mono-500.woff2 +0 -0
  156. package/dist/fonts/ibm-plex-mono-600.woff2 +0 -0
  157. package/dist/fonts/newsreader-300.woff2 +0 -0
  158. package/dist/fonts/newsreader-400.woff2 +0 -0
  159. package/dist/fonts/newsreader-500.woff2 +0 -0
  160. package/dist/fonts/newsreader-600.woff2 +0 -0
  161. package/dist/fonts.css +96 -0
  162. package/dist/index.d.ts +77 -0
  163. package/dist/index.js +63 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/keyframes.css +212 -0
  166. package/dist/lib/cn.d.ts +21 -0
  167. package/dist/lib/cn.js +9 -0
  168. package/dist/lib/cn.js.map +1 -0
  169. package/dist/lib/control.d.ts +31 -0
  170. package/dist/lib/control.js +14 -0
  171. package/dist/lib/control.js.map +1 -0
  172. package/dist/lib/index.d.ts +4 -0
  173. package/dist/lib/index.js +11 -0
  174. package/dist/lib/index.js.map +1 -0
  175. package/dist/lib/overlay-container.d.ts +38 -0
  176. package/dist/lib/overlay-container.js +15 -0
  177. package/dist/lib/overlay-container.js.map +1 -0
  178. package/dist/lib/useSelectionIndicator.d.ts +29 -0
  179. package/dist/lib/useSelectionIndicator.js +45 -0
  180. package/dist/lib/useSelectionIndicator.js.map +1 -0
  181. package/dist/semantic.css +127 -0
  182. package/dist/styles.css +98 -0
  183. package/dist/themes.css +115 -0
  184. package/dist/tokens/brand.d.ts +47 -0
  185. package/dist/tokens/brand.js +38 -0
  186. package/dist/tokens/brand.js.map +1 -0
  187. package/dist/tokens.css +323 -0
  188. package/dist/tokens.d.ts +153 -0
  189. package/dist/tokens.js +766 -0
  190. package/dist/tokens.json +765 -0
  191. 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
+ }
@@ -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
+ }
@@ -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
+ }