@knkcs/anker 0.0.5 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,74 @@
1
+ # anker Design System — AI Rules
2
+
3
+ This file is designed to be `@`-imported into a consumer project's `CLAUDE.md` so Claude Code instances working on that project automatically follow the anker design system. Add this line to your root `CLAUDE.md`:
4
+
5
+ ```
6
+ @node_modules/@knkcs/anker/CLAUDE-ANKER.md
7
+ ```
8
+
9
+ The full human-facing spec lives at the anker GitHub Pages docs site (linked from the `@knkcs/anker` README).
10
+
11
+ ---
12
+
13
+ ## Five design principles
14
+
15
+ 1. **Refined Minimalism.** Surfaces are calm. Brand colors are the crown, not the carpet — primary action only.
16
+ 2. **Density over air.** Power users spend hours here. Compact rows, tight spacing, small UI sizes — never cramped.
17
+ 3. **Consistency over creativity.** If a pattern exists (status pill, empty state, filter toolbar), use it as-is. No per-product variants.
18
+ 4. **Clear hierarchy.** Page title, primary action, content — answerable in under a second.
19
+ 5. **Keyboard-first where it matters.** Search (`/`), command palette (`⌘K`), navigation must be keyboard-operable. Show shortcuts in tooltips.
20
+
21
+ ---
22
+
23
+ ## Token quick reference
24
+
25
+ **Palette anchors** (the visually-load-bearing step in each scale):
26
+ - `primary.700` (`#134788`) — action color (buttons, links, focus rings, active states)
27
+ - `secondary.600` (`#e9580c`) — brand orange (use sparingly; not for standard CTAs)
28
+ - `gray.700` — body text
29
+ - `gray.900` — headings
30
+
31
+ **Brand colors** (`brand.*`) — exact knk Brand Guidelines values for logos, headers, about pages. Do **not** use for interactive UI.
32
+
33
+ **Semantic tokens** (prefer these over raw):
34
+ - `bg-canvas` (page frame), `bg-surface` (cards/modals), `bg-subtle` (toolbars), `bg-muted` (hover)
35
+ - `default` / `emphasized` / `muted` / `subtle` (text)
36
+ - `border` (standard 1px), `accent` (action), `success`, `error`
37
+
38
+ **Defaults:**
39
+ - Border radius: `md` = 6px (use this for buttons, inputs, small cards)
40
+ - Body font size: `md` = 14px
41
+ - Font stack assumes Inter Tight (UI) and JetBrains Mono (code) — consumer must load via Google Fonts
42
+ - Light + dark mode supported via `next-themes`
43
+
44
+ ---
45
+
46
+ ## Do
47
+
48
+ - **Use semantic tokens before raw tokens.** Reach for `accent` before `primary.700`. Why: semantic tokens are the contract, raw tokens are the implementation; raw use becomes a search-and-replace cost on the next visual update.
49
+ - **Use `<Button variant="solid">` (not `variant="primary"`).** The `primary` variant is deprecated in anker. Why: `solid` reads from `colorPalette` automatically, so the same component works for `colorPalette="primary"`, `colorPalette="secondary"`, `colorPalette="gray"`.
50
+ - **Use `brand.*` only for branding surfaces.** Logos, headers, about pages. Why: brand colors are print-aligned and not WCAG-tuned for interactive UI.
51
+ - **Use anker components instead of raw Chakra.** Import from `@knkcs/anker/{primitives,components,atoms,forms,feedback}`. Why: anker wraps Chakra with consistent defaults; consuming raw Chakra bypasses those defaults and creates visual drift.
52
+ - **Respect `prefers-reduced-motion`.** No per-component handling needed — anker's theme enforces this globally. Why: users who set this OS preference get a broken UI if components add their own motion.
53
+
54
+ ---
55
+
56
+ ## Don't
57
+
58
+ - **No hex codes inline in components.** Always use tokens. Why: hex codes don't update when the design system evolves; tokens do.
59
+ - **No Material-style large shadows.** Anker shadows are deliberately dezent. Why: heavy shadows read as Material/Bootstrap-4-era and clash with the refined direction.
60
+ - **No `secondary.500` for standard CTAs.** The brand orange now lives at `secondary.600`; `secondary.500` is a lighter shade. Why: standard CTAs use `primary.700`, not orange — orange is for branded moments only.
61
+ - **No mixing radii within one component group.** A card with `lg` can hold inputs with `md`, but not a mix of `md` and `lg` siblings. Why: visual rhythm breaks when adjacent elements have different roundness.
62
+ - **No animations over 300ms.** Outside marketing/onboarding. Why: long animations slow down power users; the design language values immediacy.
63
+ - **No Chakra v2 patterns.** No `extendTheme`, `colorScheme`, `useColorMode` from `@chakra-ui/react`. Use `createSystem`, `colorPalette`, `next-themes`. Why: anker is built on Chakra v3 throughout; v2 patterns either error at build time or silently no-op.
64
+ - **No new color introductions.** If a color isn't in `colors.ts`, it doesn't exist. Why: the palette is closed by design — adding ad-hoc colors fragments the system.
65
+
66
+ ---
67
+
68
+ ## Pointers
69
+
70
+ - Full spec: anker GitHub Pages docs site (`/design-system`)
71
+ - Components: `node_modules/@knkcs/anker/dist/{primitives,components,atoms,forms,feedback}`
72
+ - Theme entry: `import system from "@knkcs/anker/theme"`
73
+ - Provider entry: `import { Provider } from "@knkcs/anker/primitives"`
74
+ - Anker development rules (for working *on* anker, not consuming it): `node_modules/@knkcs/anker/CLAUDE.md` is **not** included in the package; see the anker GitHub repo
package/README.md CHANGED
@@ -54,22 +54,33 @@ import { InputField, ArrayField, FormField } from "@knkcs/anker/forms";
54
54
  import { ConfirmModalProvider, useConfirmModal } from "@knkcs/anker/feedback";
55
55
  ```
56
56
 
57
+ ## Using with Claude Code
58
+
59
+ If your consumer project uses Claude Code, add this line to your root `CLAUDE.md` to import anker's design-system rules automatically:
60
+
61
+ ```
62
+ @node_modules/@knkcs/anker/CLAUDE-ANKER.md
63
+ ```
64
+
65
+ Claude will then follow anker's design principles, token rules, and component conventions when assisting with your code.
66
+
57
67
  ## Brand Colors
58
68
 
59
69
  The theme includes both **UI-optimized color scales** (primary, secondary, gray) and **exact brand guideline colors** from the knk Brand Guidelines (October 2021).
60
70
 
61
71
  | Token | HEX | Use |
62
72
  |-------|-----|-----|
63
- | `primary.500` | `#2087d7` | UI blue — buttons, links, focus rings |
64
- | `secondary.500` | `#e9580c` | UI orange matches brand orange |
65
- | `brand.blue` | `#004576` | Exact brand bluelogos, headers, branding |
66
- | `brand.navy` | `#0f395d` | Dark blue variant |
73
+ | `primary.700` | `#134788` | **Action anchor** — buttons, links, focus rings (via the `accent` semantic token) |
74
+ | `primary.800` | `#0f395d` | Hover on primary; equals `brand.navy` |
75
+ | `secondary.600` | `#e9580c` | Brand orange anchorreserved for branded moments, not standard CTAs |
76
+ | `brand.blue` | `#004576` | Exact brand-guideline blue logos, headers, branding |
77
+ | `brand.navy` | `#0f395d` | Dark blue variant — equals `primary.800` |
67
78
  | `brand.light-blue` | `#6fa7d1` | Light blue variant |
68
- | `brand.orange` | `#e9580c` | Brand orange (same as secondary.500) |
79
+ | `brand.orange` | `#e9580c` | Brand orange (same as `secondary.600`) |
69
80
  | `brand.gold` | `#f4b235` | Brand gold accent |
70
81
  | `brand.light-gray` | `#f2f2f2` | Brand neutral background |
71
82
 
72
- The UI primary blue intentionally differs from the brand guideline blue. The brand blue (`#004576`) is a deep navy designed for print materials; the UI blue (`#2087d7`) is brighter for web accessibility and matches the existing Core application.
83
+ The UI primary anchor (`primary.700` = `#134788`) is intentionally one step lighter than the brand-guideline blue (`brand.blue` = `#004576`), which reads as too heavy as a CTA on white surfaces. The brand-guideline navy (`#0f395d`, `brand.navy`) lives at `primary.800` and is used for hover states on primary actions. See `docs/design-system.md` for the full palette and semantic-token reference.
73
84
 
74
85
  ## Notable Component Props
75
86
 
@@ -104,16 +104,16 @@ var buttonTheme = defineRecipe({
104
104
  // colorPalette="primary". This variant will be removed in a future
105
105
  // major release.
106
106
  primary: {
107
- bg: "primary.500",
107
+ bg: "primary.700",
108
108
  color: "white",
109
109
  _hover: {
110
- bg: "primary.600",
110
+ bg: "primary.800",
111
111
  _disabled: {
112
- bg: "primary.500"
112
+ bg: "primary.700"
113
113
  }
114
114
  },
115
115
  _active: {
116
- bg: "primary.700"
116
+ bg: "primary.900"
117
117
  }
118
118
  },
119
119
  // Secondary: outline style using gray color palette
@@ -150,7 +150,7 @@ var buttonTheme = defineRecipe({
150
150
  ghost: {
151
151
  _hover: {
152
152
  bg: "transparent",
153
- color: "primary.500"
153
+ color: "primary.700"
154
154
  },
155
155
  _active: {
156
156
  bg: "gray.200"
@@ -399,8 +399,8 @@ var inputSlotRecipe = defineSlotRecipe({
399
399
  bg: { base: "white", _dark: "gray.800" },
400
400
  _hover: { borderColor: { base: "gray.300", _dark: "gray.600" } },
401
401
  _focus: {
402
- borderColor: { base: "primary.500", _dark: "primary.200" },
403
- boxShadow: "0px 0px 0px 1px var(--chakra-colors-primary-500)"
402
+ borderColor: { base: "primary.700", _dark: "primary.300" },
403
+ boxShadow: "0px 0px 0px 1px var(--chakra-colors-primary-700)"
404
404
  }
405
405
  },
406
406
  addon: {
@@ -447,16 +447,16 @@ var inputSlotRecipe = defineSlotRecipe({
447
447
  boxShadow: "none",
448
448
  padding: 0,
449
449
  minHeight: "auto",
450
- color: "primary.500",
450
+ color: "primary.700",
451
451
  textDecoration: "underline",
452
452
  cursor: "pointer",
453
453
  _hover: {
454
- color: "primary.600",
454
+ color: "primary.800",
455
455
  textDecoration: "underline"
456
456
  },
457
457
  _focus: {
458
458
  boxShadow: "none",
459
- color: "primary.600"
459
+ color: "primary.800"
460
460
  }
461
461
  }
462
462
  }
@@ -967,10 +967,10 @@ var radioCardTheme = defineRecipe({
967
967
  borderColor: { base: "gray.300", _dark: "gray.600" }
968
968
  },
969
969
  _checked: {
970
- borderColor: { base: "primary.500", _dark: "primary.200" },
970
+ borderColor: { base: "primary.700", _dark: "primary.300" },
971
971
  boxShadow: {
972
- base: "0px 0px 0px 1px var(--chakra-colors-primary-500)",
973
- _dark: "0px 0px 0px 1px var(--chakra-colors-primary-200)"
972
+ base: "0px 0px 0px 1px var(--chakra-colors-primary-700)",
973
+ _dark: "0px 0px 0px 1px var(--chakra-colors-primary-300)"
974
974
  }
975
975
  }
976
976
  }
@@ -1290,7 +1290,7 @@ var tagTheme = defineRecipe({
1290
1290
  outlineOffset: "2px",
1291
1291
  outlineWidth: "2px",
1292
1292
  outlineStyle: "solid",
1293
- outlineColor: "primary.600"
1293
+ outlineColor: "primary.700"
1294
1294
  },
1295
1295
  _disabled: {
1296
1296
  opacity: 0.4,
@@ -1333,7 +1333,7 @@ var tagTheme = defineRecipe({
1333
1333
  ghost: {
1334
1334
  _hover: {
1335
1335
  bg: "transparent",
1336
- color: "primary.500"
1336
+ color: "primary.700"
1337
1337
  },
1338
1338
  _active: {
1339
1339
  bg: "transparent"
@@ -1411,10 +1411,10 @@ var textarea_default = defineRecipe({
1411
1411
  bg: { base: "white", _dark: "gray.800" },
1412
1412
  _hover: { borderColor: { base: "gray.300", _dark: "gray.600" } },
1413
1413
  _focus: {
1414
- borderColor: { base: "primary.500", _dark: "primary.200" },
1414
+ borderColor: { base: "primary.700", _dark: "primary.300" },
1415
1415
  boxShadow: {
1416
- base: "0px 0px 0px 1px var(--chakra-colors-primary-500)",
1417
- _dark: "0px 0px 0px 1px var(--chakra-colors-primary-200)"
1416
+ base: "0px 0px 0px 1px var(--chakra-colors-primary-700)",
1417
+ _dark: "0px 0px 0px 1px var(--chakra-colors-primary-300)"
1418
1418
  }
1419
1419
  }
1420
1420
  }
@@ -1487,7 +1487,7 @@ var tree_item_default = defineSlotRecipe({
1487
1487
  treeItemIcon: {
1488
1488
  width: "45px",
1489
1489
  height: "22px",
1490
- color: "primary.600",
1490
+ color: "primary.700",
1491
1491
  "&[aria-leaf=true],&[data-leaf]": {
1492
1492
  color: "gray.400"
1493
1493
  }
@@ -1556,29 +1556,30 @@ var keyframes = {
1556
1556
  // src/theme/tokens/colors.ts
1557
1557
  var colors = {
1558
1558
  primary: {
1559
- "50": { value: "#f1f7fe" },
1560
- "100": { value: "#e2effc" },
1561
- "200": { value: "#bfddf8" },
1562
- "300": { value: "#87c1f2" },
1563
- "400": { value: "#48a3e8" },
1564
- "500": { value: "#2087d7" },
1565
- "600": { value: "#126ab7" },
1566
- "700": { value: "#105595" },
1567
- "800": { value: "#11497b" },
1568
- "900": { value: "#143e66" },
1569
- "950": { value: "#0d2744" }
1559
+ "50": { value: "#eff6fc" },
1560
+ "100": { value: "#d9eafa" },
1561
+ "200": { value: "#b8d6f5" },
1562
+ "300": { value: "#88baeb" },
1563
+ "400": { value: "#5995dc" },
1564
+ "500": { value: "#2f6fbf" },
1565
+ "600": { value: "#1c5aa8" },
1566
+ "700": { value: "#134788" },
1567
+ "800": { value: "#0f395d" },
1568
+ "900": { value: "#0a2740" },
1569
+ "950": { value: "#061a2c" }
1570
1570
  },
1571
1571
  secondary: {
1572
- "50": { value: "#FEF0E6" },
1573
- "100": { value: "#FCD9BF" },
1574
- "200": { value: "#F9B888" },
1575
- "300": { value: "#F59651" },
1576
- "400": { value: "#F27726" },
1577
- "500": { value: "#e9580c" },
1578
- "600": { value: "#C54A0A" },
1579
- "700": { value: "#9A3A08" },
1580
- "800": { value: "#6F2A06" },
1581
- "900": { value: "#441A03" }
1572
+ "50": { value: "#fff5ed" },
1573
+ "100": { value: "#ffe6d4" },
1574
+ "200": { value: "#ffc8a8" },
1575
+ "300": { value: "#ffa170" },
1576
+ "400": { value: "#ff7c41" },
1577
+ "500": { value: "#f25f1c" },
1578
+ "600": { value: "#e9580c" },
1579
+ "700": { value: "#b73806" },
1580
+ "800": { value: "#912e0d" },
1581
+ "900": { value: "#762a0e" },
1582
+ "950": { value: "#411208" }
1582
1583
  },
1583
1584
  // Exact brand guideline colors for branding elements (headers, logos, about pages).
1584
1585
  // See: knk Brand Guidelines, October 2021
@@ -1601,18 +1602,47 @@ var colors = {
1601
1602
  "600": { value: "#475569" },
1602
1603
  "700": { value: "#334155" },
1603
1604
  "800": { value: "#1e293b" },
1604
- "900": { value: "#0f172a" }
1605
+ "900": { value: "#0f172a" },
1606
+ "950": { value: "#020617" }
1607
+ },
1608
+ success: {
1609
+ "50": { value: "#ecfdf5" },
1610
+ "100": { value: "#d1fae5" },
1611
+ "500": { value: "#10b981" },
1612
+ "600": { value: "#059669" },
1613
+ "700": { value: "#047857" }
1614
+ },
1615
+ warning: {
1616
+ "50": { value: "#fffbeb" },
1617
+ "100": { value: "#fef3c7" },
1618
+ "500": { value: "#f59e0b" },
1619
+ "600": { value: "#d97706" },
1620
+ "700": { value: "#b45309" }
1621
+ },
1622
+ danger: {
1623
+ "50": { value: "#fef2f2" },
1624
+ "100": { value: "#fee2e2" },
1625
+ "500": { value: "#ef4444" },
1626
+ "600": { value: "#dc2626" },
1627
+ "700": { value: "#b91c1c" }
1628
+ },
1629
+ info: {
1630
+ "50": { value: "#eff6fc" },
1631
+ "100": { value: "#d9eafa" },
1632
+ "500": { value: "#2f6fbf" },
1633
+ "600": { value: "#1c5aa8" },
1634
+ "700": { value: "#134788" }
1605
1635
  }
1606
1636
  };
1607
1637
  var colors_default = colors;
1608
1638
 
1609
1639
  // src/theme/tokens/radii.ts
1610
1640
  var radii = {
1611
- sm: "0.375rem",
1612
- md: "0.5rem",
1613
- lg: "0.75rem",
1614
- xl: "1rem",
1615
- "2xl": "1.25rem"
1641
+ sm: "0.25rem",
1642
+ md: "0.375rem",
1643
+ lg: "0.5rem",
1644
+ xl: "0.75rem",
1645
+ "2xl": "1rem"
1616
1646
  };
1617
1647
  var radii_default = radii;
1618
1648
 
@@ -1650,7 +1680,7 @@ var semanticTokens = {
1650
1680
  value: { base: "gray.200", _dark: "gray.700" }
1651
1681
  },
1652
1682
  accent: {
1653
- value: { base: "primary.500", _dark: "primary.200" }
1683
+ value: { base: "primary.700", _dark: "primary.300" }
1654
1684
  },
1655
1685
  success: {
1656
1686
  value: { base: "green.600", _dark: "green.200" }
@@ -1686,21 +1716,25 @@ var semanticTokens = {
1686
1716
  _dark: "{colors.primary.700}"
1687
1717
  }
1688
1718
  },
1719
+ // solid + focusRing intentionally keep dark at step 500 (not 700)
1720
+ // so the action color stays visible on dark canvas. This breaks the
1721
+ // "same step both modes" pattern that held before the 1.0 anchor
1722
+ // shift. Do not "fix" the asymmetry — see design-system spec §5.2.
1689
1723
  solid: {
1690
1724
  value: {
1691
- base: "{colors.primary.500}",
1725
+ base: "{colors.primary.700}",
1692
1726
  _dark: "{colors.primary.500}"
1693
1727
  }
1694
1728
  },
1695
1729
  focusRing: {
1696
1730
  value: {
1697
- base: "{colors.primary.500}",
1731
+ base: "{colors.primary.700}",
1698
1732
  _dark: "{colors.primary.500}"
1699
1733
  }
1700
1734
  },
1701
1735
  border: {
1702
1736
  value: {
1703
- base: "{colors.primary.500}",
1737
+ base: "{colors.primary.700}",
1704
1738
  _dark: "{colors.primary.400}"
1705
1739
  }
1706
1740
  }
@@ -1734,30 +1768,30 @@ var semanticTokens = {
1734
1768
  },
1735
1769
  solid: {
1736
1770
  value: {
1737
- base: "{colors.secondary.500}",
1771
+ base: "{colors.secondary.600}",
1738
1772
  _dark: "{colors.secondary.500}"
1739
1773
  }
1740
1774
  },
1741
1775
  focusRing: {
1742
1776
  value: {
1743
- base: "{colors.secondary.500}",
1777
+ base: "{colors.secondary.600}",
1744
1778
  _dark: "{colors.secondary.500}"
1745
1779
  }
1746
1780
  },
1747
1781
  border: {
1748
1782
  value: {
1749
- base: "{colors.secondary.500}",
1783
+ base: "{colors.secondary.600}",
1750
1784
  _dark: "{colors.secondary.400}"
1751
1785
  }
1752
1786
  }
1753
1787
  },
1754
1788
  // Accent surface tokens
1755
- "bg-accent": { value: { base: "primary.600", _dark: "primary.400" } },
1789
+ "bg-accent": { value: { base: "primary.700", _dark: "primary.400" } },
1756
1790
  "bg-accent-subtle": {
1757
- value: { base: "primary.500", _dark: "primary.500" }
1791
+ value: { base: "primary.700", _dark: "primary.500" }
1758
1792
  },
1759
1793
  "bg-accent-muted": {
1760
- value: { base: "primary.400", _dark: "primary.600" }
1794
+ value: { base: "primary.500", _dark: "primary.600" }
1761
1795
  },
1762
1796
  "on-accent": { value: { base: "white", _dark: "white" } },
1763
1797
  "on-accent-muted": {
@@ -1770,44 +1804,44 @@ var semanticTokens = {
1770
1804
  shadows: {
1771
1805
  xs: {
1772
1806
  value: {
1773
- base: "0px 0px 1px rgba(45, 55, 72, 0.05), 0px 1px 2px rgba(45, 55, 72, 0.1)",
1774
- _dark: "0px 0px 1px rgba(13, 14, 20, 1), 0px 1px 2px rgba(13, 14, 20, 0.9)"
1807
+ base: "0 1px 2px rgba(0, 0, 0, 0.04)",
1808
+ _dark: "0 1px 2px rgba(0, 0, 0, 0.4)"
1775
1809
  }
1776
1810
  },
1777
1811
  sm: {
1778
1812
  value: {
1779
- base: "0px 0px 1px rgba(45, 55, 72, 0.05), 0px 2px 4px rgba(45, 55, 72, 0.1)",
1780
- _dark: "0px 0px 1px rgba(13, 14, 20, 1), 0px 2px 4px rgba(13, 14, 20, 0.9)"
1813
+ base: "0 1px 2px rgba(0, 0, 0, 0.06)",
1814
+ _dark: "0 1px 2px rgba(0, 0, 0, 0.5)"
1781
1815
  }
1782
1816
  },
1783
1817
  md: {
1784
1818
  value: {
1785
- base: "0px 0px 1px rgba(45, 55, 72, 0.05), 0px 4px 8px rgba(45, 55, 72, 0.1)",
1786
- _dark: "0px 0px 1px rgba(13, 14, 20, 1), 0px 4px 8px rgba(13, 14, 20, 0.9)"
1819
+ base: "0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.04)",
1820
+ _dark: "0 4px 6px -1px rgba(0, 0, 0, 0.5), 0 2px 4px -2px rgba(0, 0, 0, 0.3)"
1787
1821
  }
1788
1822
  },
1789
1823
  lg: {
1790
1824
  value: {
1791
- base: "0px 0px 1px rgba(45, 55, 72, 0.05), 0px 8px 16px rgba(45, 55, 72, 0.1)",
1792
- _dark: "0px 0px 1px rgba(13, 14, 20, 1), 0px 8px 16px rgba(13, 14, 20, 0.9)"
1825
+ base: "0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04)",
1826
+ _dark: "0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -4px rgba(0, 0, 0, 0.3)"
1793
1827
  }
1794
1828
  },
1795
1829
  xl: {
1796
1830
  value: {
1797
- base: "0px 0px 1px rgba(45, 55, 72, 0.05), 0px 16px 24px rgba(45, 55, 72, 0.1)",
1798
- _dark: "0px 0px 1px rgba(13, 14, 20, 1), 0px 16px 24px rgba(13, 14, 20, 0.9)"
1831
+ base: "0 20px 25px -5px rgba(0, 0, 0, 0.10), 0 8px 10px -6px rgba(0, 0, 0, 0.04)",
1832
+ _dark: "0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 8px 10px -6px rgba(0, 0, 0, 0.3)"
1799
1833
  }
1800
1834
  },
1801
1835
  "2xl": {
1802
1836
  value: {
1803
- base: "0px 0px 1px rgba(45, 55, 72, 0.04), 0px 24px 48px rgba(45, 55, 72, 0.12)",
1804
- _dark: "0px 0px 1px rgba(13, 14, 20, 1), 0px 24px 48px rgba(13, 14, 20, 0.9)"
1837
+ base: "0 25px 50px -12px rgba(0, 0, 0, 0.18)",
1838
+ _dark: "0 25px 50px -12px rgba(0, 0, 0, 0.7)"
1805
1839
  }
1806
1840
  },
1807
1841
  "focus-ring": {
1808
1842
  value: {
1809
- base: "0 0 0 3px rgba(32, 135, 215, 0.4)",
1810
- _dark: "0 0 0 3px rgba(32, 135, 215, 0.6)"
1843
+ base: "0 0 0 3px rgba(19, 71, 136, 0.18)",
1844
+ _dark: "0 0 0 3px rgba(47, 111, 191, 0.4)"
1811
1845
  }
1812
1846
  }
1813
1847
  },
@@ -1829,8 +1863,9 @@ var spacing_default = space;
1829
1863
 
1830
1864
  // src/theme/tokens/typography.ts
1831
1865
  var fonts = {
1832
- heading: "InterVariable, -apple-system, system-ui, sans-serif",
1833
- body: "InterVariable, -apple-system, system-ui, sans-serif"
1866
+ heading: "'Inter Tight', system-ui, -apple-system, 'Segoe UI', sans-serif",
1867
+ body: "'Inter Tight', system-ui, -apple-system, 'Segoe UI', sans-serif",
1868
+ mono: "'JetBrains Mono', ui-monospace, SFMono-Regular, monospace"
1834
1869
  };
1835
1870
  var textStyles = {
1836
1871
  "7xl": {
@@ -1911,6 +1946,32 @@ var textStyles = {
1911
1946
  letterSpacing: "0.08em",
1912
1947
  fontWeight: "semibold",
1913
1948
  textTransform: "uppercase"
1949
+ },
1950
+ bodyLg: {
1951
+ fontSize: "lg",
1952
+ fontWeight: "normal",
1953
+ lineHeight: "1.5"
1954
+ // unitless multiplier — scales with fontSize
1955
+ },
1956
+ body: {
1957
+ fontSize: "md",
1958
+ fontWeight: "normal",
1959
+ lineHeight: "1.5"
1960
+ },
1961
+ bodySm: {
1962
+ fontSize: "sm",
1963
+ fontWeight: "normal",
1964
+ lineHeight: "1.45"
1965
+ },
1966
+ mono: {
1967
+ fontFamily: "mono",
1968
+ fontSize: "md",
1969
+ lineHeight: "1.5"
1970
+ },
1971
+ monoSm: {
1972
+ fontFamily: "mono",
1973
+ fontSize: "xs",
1974
+ lineHeight: "1.45"
1914
1975
  }
1915
1976
  };
1916
1977
 
@@ -1929,7 +1990,8 @@ var z_index_default = zIndex;
1929
1990
  function createAnkerTheme(preset) {
1930
1991
  const fonts2 = {
1931
1992
  heading: preset?.fonts?.heading ?? fonts.heading,
1932
- body: preset?.fonts?.body ?? fonts.body
1993
+ body: preset?.fonts?.body ?? fonts.body,
1994
+ mono: preset?.fonts?.mono ?? fonts.mono
1933
1995
  };
1934
1996
  const colors2 = preset?.colors ? { ...colors_default, ...preset.colors } : colors_default;
1935
1997
  const durations2 = preset?.durations ? { ...durations, ...preset.durations } : durations;
@@ -1985,7 +2047,8 @@ function createAnkerTheme(preset) {
1985
2047
  easings: easings2,
1986
2048
  fonts: {
1987
2049
  heading: { value: fonts2.heading },
1988
- body: { value: fonts2.body }
2050
+ body: { value: fonts2.body },
2051
+ mono: { value: fonts2.mono }
1989
2052
  },
1990
2053
  spacing: Object.fromEntries(
1991
2054
  Object.entries(spacing_default).map(([k, v]) => [k, { value: v }])
@@ -2094,5 +2157,5 @@ var system = createAnkerTheme();
2094
2157
  var theme_default = system;
2095
2158
 
2096
2159
  export { colors_default, createAnkerTheme, defaultPreset, durations, easings, fonts, getColor, keyframes, radii_default, semantic_default, spacing_default, textStyles, theme_default, transparentize, z_index_default };
2097
- //# sourceMappingURL=chunk-7WPKYUHP.js.map
2098
- //# sourceMappingURL=chunk-7WPKYUHP.js.map
2160
+ //# sourceMappingURL=chunk-QOLM5PLP.js.map
2161
+ //# sourceMappingURL=chunk-QOLM5PLP.js.map