{
  "schemaVersion": "1.0",
  "id": "pistachio-keystone",
  "version": "1.1.0",
  "name": "Pistachio Keystone",
  "tier": "free",
  "summary": "Calm, clinical web3 UI: blue-grey neutrals, one muted olive-lime action color and IBM Plex type for wallets, staking and on-chain tools.",
  "tags": {
    "industries": [
      "web3",
      "wallets",
      "defi",
      "infrastructure"
    ],
    "moods": [
      "calm",
      "clinical",
      "reassuring",
      "precise"
    ],
    "density": "comfortable",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Pistachio Keystone is for web3 screens where users fear irreversible actions: wallets, staking dashboards, transaction review and governance votes. It avoids neon gradients and dark drama. It uses pale cool surfaces, one olive accent (primary) and plain labels, so each confirmation step reads as checked and under control. Every text pair in both modes is at least 4.5:1, and most reach 6:1 or more.",
    "color": "Neutrals are blue-grey at OKLCH hue ≈235 with low chroma that peaks at 500–700, so surfaces recede and numbers stay in front. Brand is olive-lime at hue ≈100, nudged slightly greener than v1.0 so it reads as pistachio rather than mustard. Its chroma peaks at 400–500 and tapers evenly toward 50 and 950. Light mode: primary = brand.700 (#665f0a) with white text, about 6.6:1. ring = brand.600, about 4:1 on background. Dark mode: primary = brand.300 (#d6ca5c) with brand.950 text, about 10:1, on neutral.950 (#131a20). Danger is a cool crimson at hue ≈5, far from olive (ΔE2000 > 40 in both modes). Success sits at hue ≈155, cooler than brand so 'confirmed' never reads as 'click me'. Warning is shifted toward orange (hue ≈65) so amber banners stay distinct from the olive primary. Success and warning use the same chroma curve as brand.",
    "typography": "The size scale steps by about ×1.33 (perfect fourth) from 20px upward: heading-md 20 → heading-lg 27 → display-md 36 → display-lg 48. Below that, body sizes are 12/14/16/18. IBM Plex Serif (weight 500) is used only for heading-lg and the two display sizes, giving a statement-like voice. Letter spacing tightens with size: -0.012em at 27px, -0.018em at 36px, -0.022em at 48px. IBM Plex Sans covers all UI text, with body-md at 16px/1.6 for comfortable reading. IBM Plex Mono (400/500) sets addresses, hashes and transaction amounts at 13px. Only shipped weights are used: Serif and Sans 400/500/600, Mono 400/500.",
    "layout": "Comfortable density on a 4px grid. Content max width is 1120px. Cards use space.6 (24px) padding. Buttons and inputs are 40px high; large confirm buttons on transaction review are 44px. Keep at least space.8 (32px) between a transaction summary card and the confirm or cancel row.",
    "elevation": "Nearly flat. Surfaces are separated by a 1px border (neutral.200 in light, neutral.800 in dark) plus shadow.sm on cards. Use shadow.md only for dropdowns, popovers and toasts. Use shadow.lg only for modal dialogs such as transaction confirmation. In dark mode, depth comes from surface steps: background neutral.950 → card neutral.900 → secondary/muted neutral.800.",
    "shapes": "radius.md (6px) on buttons, inputs and selects. radius.lg (10px) on cards. radius.xl (14px) on modal dialogs. radius.full only for status badges and network chips. Buttons are never fully round."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#fbf9e6",
        "100": "#f4f0c6",
        "200": "#e7e092",
        "300": "#d6ca5c",
        "400": "#bfb337",
        "500": "#a29a1c",
        "600": "#827a10",
        "700": "#665f0a",
        "800": "#4d4805",
        "900": "#383402",
        "950": "#211f01"
      },
      "neutral": {
        "50": "#f5f8fa",
        "100": "#eaeff3",
        "200": "#d9e1e7",
        "300": "#bfcad2",
        "400": "#9aa9b4",
        "500": "#788893",
        "600": "#5f6e79",
        "700": "#4a5862",
        "800": "#35414a",
        "900": "#222c35",
        "950": "#131a20"
      },
      "success": {
        "50": "#eaf8ee",
        "100": "#d0f1da",
        "200": "#ade3bf",
        "300": "#86cfa1",
        "400": "#5fb682",
        "500": "#389c64",
        "600": "#23824f",
        "700": "#16683d",
        "800": "#0c502e",
        "900": "#03391e",
        "950": "#012211"
      },
      "warning": {
        "50": "#fff4e8",
        "100": "#ffe4c4",
        "200": "#f8cd98",
        "300": "#e8ad6a",
        "400": "#d18f3a",
        "500": "#b4730f",
        "600": "#955e05",
        "700": "#774a02",
        "800": "#5a3700",
        "900": "#3f2600",
        "950": "#271600"
      },
      "danger": {
        "50": "#fff4f5",
        "100": "#ffe3e6",
        "200": "#ffc6ce",
        "300": "#ff9dac",
        "400": "#f66e89",
        "500": "#e1436b",
        "600": "#c02d56",
        "700": "#9c2043",
        "800": "#791231",
        "900": "#580521",
        "950": "#390011"
      }
    },
    "font": {
      "display": {
        "family": "IBM Plex Serif",
        "fallback": "Georgia, serif",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      },
      "sans": {
        "family": "IBM Plex Sans",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      },
      "mono": {
        "family": "IBM Plex Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 4,
      "md": 6,
      "lg": 10,
      "xl": 14,
      "full": 9999
    },
    "space": {
      "0": 0,
      "1": 4,
      "2": 8,
      "3": 12,
      "4": 16,
      "5": 20,
      "6": 24,
      "8": 32,
      "10": 40,
      "12": 48,
      "16": 64,
      "20": 80,
      "24": 96,
      "0.5": 2,
      "1.5": 6
    },
    "shadow": {
      "sm": "0 1px 2px rgba(19, 26, 32, 0.05)",
      "md": "0 4px 14px -2px rgba(19, 26, 32, 0.10)",
      "lg": "0 18px 44px -10px rgba(19, 26, 32, 0.20)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 48,
      "lineHeight": 1.1,
      "weight": 500,
      "letterSpacing": -0.022
    },
    "display-md": {
      "font": "display",
      "size": 36,
      "lineHeight": 1.15,
      "weight": 500,
      "letterSpacing": -0.018
    },
    "heading-lg": {
      "font": "display",
      "size": 27,
      "lineHeight": 1.25,
      "weight": 500,
      "letterSpacing": -0.012
    },
    "heading-md": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.35,
      "weight": 600,
      "letterSpacing": -0.006
    },
    "heading-sm": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.4,
      "weight": 600,
      "letterSpacing": 0
    },
    "body-lg": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.6,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-md": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.6,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-sm": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.5,
      "weight": 400,
      "letterSpacing": 0
    },
    "label": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.3,
      "weight": 500,
      "letterSpacing": 0.005
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.4,
      "weight": 500,
      "letterSpacing": 0.01
    },
    "code": {
      "font": "mono",
      "size": 13,
      "lineHeight": 1.5,
      "weight": 400,
      "letterSpacing": 0
    }
  },
  "semantic": {
    "light": {
      "background": "{color.neutral.50}",
      "foreground": "{color.neutral.950}",
      "card": "#ffffff",
      "card-foreground": "{color.neutral.950}",
      "popover": "#ffffff",
      "popover-foreground": "{color.neutral.950}",
      "primary": "{color.brand.700}",
      "primary-foreground": "#ffffff",
      "secondary": "{color.neutral.100}",
      "secondary-foreground": "{color.neutral.900}",
      "muted": "{color.neutral.100}",
      "muted-foreground": "{color.neutral.700}",
      "accent": "{color.brand.100}",
      "accent-foreground": "{color.brand.900}",
      "destructive": "{color.danger.600}",
      "destructive-foreground": "#ffffff",
      "success": "{color.success.700}",
      "success-foreground": "#ffffff",
      "warning": "{color.warning.200}",
      "warning-foreground": "{color.warning.900}",
      "border": "{color.neutral.200}",
      "input": "{color.neutral.300}",
      "ring": "{color.brand.600}"
    },
    "dark": {
      "background": "{color.neutral.950}",
      "foreground": "{color.neutral.50}",
      "card": "{color.neutral.900}",
      "card-foreground": "{color.neutral.50}",
      "popover": "{color.neutral.900}",
      "popover-foreground": "{color.neutral.50}",
      "primary": "{color.brand.300}",
      "primary-foreground": "{color.brand.950}",
      "secondary": "{color.neutral.800}",
      "secondary-foreground": "{color.neutral.100}",
      "muted": "{color.neutral.800}",
      "muted-foreground": "{color.neutral.300}",
      "accent": "{color.brand.900}",
      "accent-foreground": "{color.brand.100}",
      "destructive": "{color.danger.400}",
      "destructive-foreground": "{color.danger.950}",
      "success": "{color.success.400}",
      "success-foreground": "{color.success.950}",
      "warning": "{color.warning.400}",
      "warning-foreground": "{color.warning.950}",
      "border": "{color.neutral.800}",
      "input": "{color.neutral.700}",
      "ring": "{color.brand.400}"
    }
  },
  "components": {
    "button": {
      "height": 40,
      "paddingX": "{space.4}",
      "radius": "{radius.md}",
      "typography": "{typography.label}",
      "fontWeight": 500
    },
    "input": {
      "height": 40,
      "paddingX": "{space.3}",
      "radius": "{radius.md}",
      "typography": "{typography.body-sm}",
      "borderWidth": 1
    },
    "card": {
      "padding": "{space.6}",
      "radius": "{radius.lg}",
      "shadow": "{shadow.sm}",
      "borderWidth": 1
    },
    "badge": {
      "height": 22,
      "paddingX": "{space.2}",
      "radius": "{radius.full}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use one primary button per view (brand.700 in light, brand.300 in dark) for the main step, such as 'Review transaction' or 'Confirm'. Make all other actions secondary or ghost buttons.",
      "Set wallet addresses, hashes and IDs in typography.code (IBM Plex Mono, 13px). Truncate them in the middle (0x12ab…89ef) and add a copy icon button with a 'Copied' tooltip state.",
      "Use IBM Plex Serif only for heading-lg (27px), display-md (36px) and display-lg (48px). Use IBM Plex Sans for every button, input, table and paragraph.",
      "Before any irreversible action, show a card with amount, recipient and network fee. Place the confirm button bottom-right, at least space.8 (32px) below the summary.",
      "Show focus with a 2px outline in the ring token (brand.600 light, brand.400 dark) with a 2px offset on buttons, inputs and badges.",
      "Pair every success, warning and destructive color with an icon and a text label, such as 'Failed' or 'Pending', so meaning never depends on color alone.",
      "Separate surfaces with a 1px border token plus shadow.sm on cards. Use shadow.md for popovers and shadow.lg for modals only.",
      "Keep content text at body-md (16px/1.6) minimum. Use muted-foreground only for secondary text such as timestamps, never for amounts or warnings."
    ],
    "dont": [
      "Don't use neon gradients, glows or glassmorphism. Surfaces stay flat (card, muted, background) with 1px borders.",
      "Don't use olive (brand) for errors, failed transactions or destructive actions. Use the destructive token (danger.600 light, danger.400 dark).",
      "Don't use brand.400 or lighter as text or icon color on light backgrounds. It falls below 3:1 on neutral.50.",
      "Don't set IBM Plex Serif below 24px, in all caps, or in buttons and form labels.",
      "Don't use pure black or pure white page backgrounds. Use neutral.50 (light) or neutral.950 (dark). White is reserved for card and popover in light mode.",
      "Don't use radius.full on buttons or inputs. Keep radius.md (6px), and use pills only for badges and network chips.",
      "Don't place warning banners (warning.200 light / warning.400 dark) next to primary buttons without an icon. Show at most one warning banner per screen."
    ]
  }
}
