{
  "schemaVersion": "1.0",
  "id": "understory-array",
  "version": "1.1.0",
  "name": "Understory Array",
  "tier": "free",
  "summary": "Dense, dark-first UI for climate data teams: 1px borders, tabular figures, 4px-grid spacing and one signal-green action color.",
  "tags": {
    "industries": [
      "climate",
      "environmental-monitoring",
      "energy-analytics"
    ],
    "moods": [
      "technical",
      "precise",
      "focused",
      "calm"
    ],
    "density": "compact",
    "contrast": "high"
  },
  "rationale": {
    "overview": "Understory Array is for analysts, researchers and operators who watch emissions, sensor networks and energy models for hours at a time. It is dark-first because dashboards stay open on secondary screens. It is compact because the job is comparing many numbers at once: 32px controls, 28–32px table rows, 16px card padding. The target feel is an instrument panel: exact, quiet, and legible at 12–14px.",
    "color": "One action color, Signal Green (OKLCH hue ≈150), carries primary, ring and selected states. Light mode uses brand.700 #0f7144 (6.1:1 with white primary-foreground, 5.5:1 on background) and dark mode uses brand.400 #3ecf82 with brand.950 text (8:1). Brand.400 is bright but not neon. Neutrals are blue-green slates at hue ≈195 with low, even chroma, so green accents and chart series sit on a related ground. Success is teal-green (hue ≈175), close in temperature to the brand but separate from primary. Warning is amber, and destructive is crimson (danger.600 light, danger.400 dark). Destructive sits at hue ≈15, far from primary green in both modes. Input borders use neutral.500 in both modes so field edges reach 3:1 against the page. Dark mode is the reference design: neutral.950 page, neutral.900 card, neutral.800 muted and secondary.",
    "typography": "Atkinson Hyperlegible is used for display and UI text. Its distinct 1/l/I and 0/O shapes stay clear in dense tables. Use only its shipped weights, 400 and 700. JetBrains Mono at 400/500 sets sensor IDs, coordinates, units and code. The scale steps by about 1.25 from a 14px body: 12, 13, 14, 16, 18, 22, 28, 36. Every line height lands on the 4px grid: body-md 14/20, body-lg 16/24, heading-md 18/24, heading-lg 22/28, display-md 28/32, display-lg 36/40. Letter spacing tightens as size grows, from -0.022em at 36px to 0 at 14px and below. Caption opens up to +0.01em. Enable tabular figures on every numeric column.",
    "layout": "Compact density on a 4px base grid. Controls are 32px tall and table rows are 28–32px. Cells use space.2 (8px) padding and cards use space.4 (16px). Divide regions with 1px border lines instead of extra whitespace. Page content can run full width with 12–16px gutters.",
    "elevation": "Almost flat. Surfaces step up in neutral value: 950 page, 900 card, 800 raised and muted. They are separated by 1px border. Cards use only shadow.sm. Use shadow.md for menus and popovers and shadow.lg for dialogs. All shadows are dark and tight.",
    "shapes": "Small radii keep edges crisp: radius.sm 2px for badges and chips, radius.md 4px for buttons and inputs, radius.lg 6px for cards. radius.xl 10px is for dialogs only. radius.full is only for status dots and count badges."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#edfcf2",
        "100": "#d3f8e0",
        "200": "#aaf0c5",
        "300": "#74e2a3",
        "400": "#3ecf82",
        "500": "#1fb368",
        "600": "#129054",
        "700": "#0f7144",
        "800": "#0e5937",
        "900": "#0d4630",
        "950": "#04271a"
      },
      "neutral": {
        "50": "#f2f6f6",
        "100": "#e5ecec",
        "200": "#cdd8d8",
        "300": "#aebcbc",
        "400": "#8a9b9c",
        "500": "#6a7c7d",
        "600": "#526364",
        "700": "#3d4c4d",
        "800": "#2a3738",
        "900": "#1a2425",
        "950": "#0d1415"
      },
      "success": {
        "50": "#e6fbf6",
        "100": "#c4f5ea",
        "200": "#8ce8d4",
        "300": "#4fd5ba",
        "400": "#22bb9f",
        "500": "#0f9d85",
        "600": "#0b7f6d",
        "700": "#0a6458",
        "800": "#094e45",
        "900": "#083c36",
        "950": "#03231f"
      },
      "warning": {
        "50": "#fff8e5",
        "100": "#ffedb8",
        "200": "#fcdb7f",
        "300": "#f3c244",
        "400": "#e0a617",
        "500": "#c28a00",
        "600": "#9d6f00",
        "700": "#7b5600",
        "800": "#5d4100",
        "900": "#432e00",
        "950": "#2a1c00"
      },
      "danger": {
        "50": "#fff1f2",
        "100": "#ffe1e3",
        "200": "#ffc3c9",
        "300": "#ff98a3",
        "400": "#f96a7c",
        "500": "#e63f59",
        "600": "#c7283f",
        "700": "#a31c32",
        "800": "#7f1226",
        "900": "#5e0a1a",
        "950": "#3d0310"
      }
    },
    "font": {
      "display": {
        "family": "Atkinson Hyperlegible",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          700
        ]
      },
      "sans": {
        "family": "Atkinson Hyperlegible",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          700
        ]
      },
      "mono": {
        "family": "JetBrains Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 2,
      "md": 4,
      "lg": 6,
      "xl": 10,
      "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(0, 0, 0, 0.30)",
      "md": "0 4px 10px -2px rgba(0, 0, 0, 0.40)",
      "lg": "0 12px 32px -6px rgba(0, 0, 0, 0.55)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 36,
      "lineHeight": 1.11,
      "weight": 700,
      "letterSpacing": -0.022
    },
    "display-md": {
      "font": "display",
      "size": 28,
      "lineHeight": 1.14,
      "weight": 700,
      "letterSpacing": -0.018
    },
    "heading-lg": {
      "font": "display",
      "size": 22,
      "lineHeight": 1.27,
      "weight": 700,
      "letterSpacing": -0.012
    },
    "heading-md": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.33,
      "weight": 700,
      "letterSpacing": -0.006
    },
    "heading-sm": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.43,
      "weight": 700,
      "letterSpacing": 0
    },
    "body-lg": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.5,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-md": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.43,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-sm": {
      "font": "sans",
      "size": 13,
      "lineHeight": 1.38,
      "weight": 400,
      "letterSpacing": 0
    },
    "label": {
      "font": "sans",
      "size": 13,
      "lineHeight": 1.23,
      "weight": 700,
      "letterSpacing": 0.005
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.33,
      "weight": 400,
      "letterSpacing": 0.01
    },
    "code": {
      "font": "mono",
      "size": 13,
      "lineHeight": 1.54,
      "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.300}",
      "input": "{color.neutral.500}",
      "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.400}",
      "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.500}",
      "ring": "{color.brand.400}"
    }
  },
  "components": {
    "button": {
      "height": 32,
      "paddingX": "{space.3}",
      "radius": "{radius.md}",
      "typography": "{typography.label}",
      "fontWeight": 700
    },
    "input": {
      "height": 32,
      "paddingX": "{space.2}",
      "radius": "{radius.md}",
      "typography": "{typography.body-md}",
      "borderWidth": 1
    },
    "card": {
      "padding": "{space.4}",
      "radius": "{radius.lg}",
      "shadow": "{shadow.sm}",
      "borderWidth": 1
    },
    "badge": {
      "height": 20,
      "paddingX": "{space.1.5}",
      "radius": "{radius.sm}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Design in dark mode first, then verify light. Use background (neutral.950) for the page, card (neutral.900) for cards and muted (neutral.800) for table header rows.",
      "Apply font-variant-numeric: tabular-nums to every number in tables, stat tiles and chart axis labels. Right-align numeric columns.",
      "Keep button and input at 32px height and table rows at 28–32px. Use space.2 (8px) horizontal padding inside cells.",
      "Separate regions with a 1px border token instead of extra padding or shadow.",
      "Use one primary button (brand.700 light, brand.400 dark) per view. Make other actions secondary or ghost.",
      "Show focus with a 2px ring token outline at 2px offset on every interactive element, including table rows that open detail panels.",
      "Set sensor IDs, coordinates and units in JetBrains Mono using the code style (13/20, weight 400). Use weight 500 only for the selected or active value.",
      "Use display-lg (36px) only for single headline KPIs. Page titles use heading-lg (22px) and card titles use heading-sm (14px, weight 700)."
    ],
    "dont": [
      "Don't use primary green to mean 'good' or 'low emissions'. Use the success token (teal-green) with a label.",
      "Don't put shadow.md or shadow.lg on cards. Use shadow.md for menus and popovers and shadow.lg for dialogs.",
      "Don't use radius above radius.lg (6px) on cards or controls. Only badges and status dots may use radius.full.",
      "Don't set body text below 13px (body-sm) or captions below 12px. Use Atkinson Hyperlegible at weights 400 and 700 only.",
      "Don't use pure black (#000) backgrounds. Use neutral.950 so neutral.800 borders and neutral.900 cards stay visible.",
      "Don't use destructive crimson for warnings. Warnings use warning tokens: warning.200 fill in light, warning.400 fill in dark.",
      "Don't use input borders lighter than neutral.500. Field edges must stay at 3:1 or more against background.",
      "Don't rely on proportional figures in data columns. They misalign digits across rows."
    ]
  }
}
