{
  "schemaVersion": "1.0",
  "id": "petal-whisper",
  "version": "1.1.0",
  "name": "Petal Whisper",
  "tier": "free",
  "summary": "Rounded UI for AI assistants: rose actions on cool grey-blue neutrals, red-orange errors, and short bouncy motion that keeps text readable.",
  "tags": {
    "industries": [
      "ai-assistant",
      "productivity",
      "consumer-apps"
    ],
    "moods": [
      "playful",
      "friendly",
      "bouncy",
      "approachable"
    ],
    "density": "comfortable",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Petal Whisper is for conversational AI products where people should feel welcomed rather than tested. A saturated rose primary sits on cool grey-blue neutrals, so the interface feels lively while long chat threads stay calm. The system expresses playfulness through pill shapes, rounded surfaces and short motion. Every text pairing holds at least 4.5:1 contrast in both modes, and most hold at least 5:1.",
    "color": "Brand is a cool rose. brand.600 (#c92a5f) is the light-mode primary at 5.2:1 with white text, and brand.400 (#f76d99) is the dark-mode primary at 6.2:1 on neutral.950. Neutrals carry a deliberate blue tint (hue about 255), from neutral.50 #f6f8fb to neutral.950 #151a26, and each step darkens evenly with no grey dip in the middle. Danger moved further toward orange: danger.600 is #c2410c (5.2:1 with white) and danger.400 is #f97a4a in dark mode. This keeps primary and destructive more than 18 ΔE2000 apart in both modes, so an error never reads as a brand moment. Success is a minty green (success.700 #0c6748, 6.9:1 with white). Warning is a warm amber (warning.200 surface with warning.900 text). Both have chroma levels close to rose's, so they sit beside it without competing. The light ring is brand.500 (3.6:1 on background). The dark ring is brand.400.",
    "typography": "Geist is the only text family, from greeting to chat bubble. Geist Mono is used for code, tokens and identifiers. The scale follows a ratio of about 1.25 from the 16px body: 20, 24, 30, 38, 48. Letter spacing tightens as size grows, from -0.01em at heading-sm (20px) to -0.03em at display-lg (48px). Display sizes use weights 600 to 700, which Geist ships. Body text uses weight 400 with a line height of 1.6 at body-md and body-lg so long model responses read comfortably. label uses 500. caption uses 500 at 12px with +0.01em tracking.",
    "layout": "Comfortable density on a 4px base grid. Chat columns cap at 760px, which keeps body-md lines near 75 characters. Sidebars and settings panels use space.4 to space.6 (16px to 24px) of internal padding. Message groups are separated by space.6.",
    "elevation": "In light mode, cards and inputs sit on #ffffff with a 1px border (neutral.200) and shadow.sm. Popovers and command palettes use shadow.md. Dialogs use shadow.lg. All shadows are tinted with neutral.950 rather than black. Dark mode builds elevation from tone instead of shadow. The background is neutral.950, while cards and popovers are lifted one step to neutral.900 with a neutral.800 border.",
    "shapes": "Rounding is generous. Inputs use radius.md (12px). Cards and message bubbles use radius.lg (16px). Hero and empty-state surfaces use radius.xl (24px). Small chips and tooltips use radius.sm (6px). Buttons and badges use radius.full so interactive elements read as tactile pills."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#fff1f5",
        "100": "#ffe3ec",
        "200": "#ffc8da",
        "300": "#ff9dbc",
        "400": "#f76d99",
        "500": "#e6457a",
        "600": "#c92a5f",
        "700": "#a71f4f",
        "800": "#851a42",
        "900": "#631433",
        "950": "#400a20"
      },
      "neutral": {
        "50": "#f6f8fb",
        "100": "#edf0f5",
        "200": "#dde2eb",
        "300": "#c3cad7",
        "400": "#9ea8b9",
        "500": "#7c879a",
        "600": "#616c7f",
        "700": "#4b5568",
        "800": "#353e4f",
        "900": "#242b3a",
        "950": "#151a26"
      },
      "success": {
        "50": "#e9fbf3",
        "100": "#cff5e3",
        "200": "#a6e9c8",
        "300": "#72d8a8",
        "400": "#3fbf88",
        "500": "#1fa26f",
        "600": "#138258",
        "700": "#0c6748",
        "800": "#094f37",
        "900": "#06392a",
        "950": "#021f17"
      },
      "warning": {
        "50": "#fff9e8",
        "100": "#fff0c7",
        "200": "#ffe08a",
        "300": "#f5c94f",
        "400": "#e0ad26",
        "500": "#c28f0c",
        "600": "#9f7204",
        "700": "#7f5a04",
        "800": "#5f4303",
        "900": "#422e02",
        "950": "#2a1c01"
      },
      "danger": {
        "50": "#fff4ee",
        "100": "#ffe6d9",
        "200": "#ffcab2",
        "300": "#ffa47f",
        "400": "#f97a4a",
        "500": "#e85a24",
        "600": "#c2410c",
        "700": "#9c3410",
        "800": "#7b2a12",
        "900": "#5c2010",
        "950": "#3a1308"
      }
    },
    "font": {
      "display": {
        "family": "Geist",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          500,
          600,
          700
        ]
      },
      "sans": {
        "family": "Geist",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      },
      "mono": {
        "family": "Geist Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 6,
      "md": 12,
      "lg": 16,
      "xl": 24,
      "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(21, 26, 38, 0.06), 0 1px 1px rgba(21, 26, 38, 0.04)",
      "md": "0 6px 16px -4px rgba(21, 26, 38, 0.14)",
      "lg": "0 18px 44px -10px rgba(21, 26, 38, 0.24)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 48,
      "lineHeight": 1.08,
      "weight": 700,
      "letterSpacing": -0.03
    },
    "display-md": {
      "font": "display",
      "size": 38,
      "lineHeight": 1.12,
      "weight": 700,
      "letterSpacing": -0.025
    },
    "heading-lg": {
      "font": "display",
      "size": 30,
      "lineHeight": 1.2,
      "weight": 600,
      "letterSpacing": -0.02
    },
    "heading-md": {
      "font": "sans",
      "size": 24,
      "lineHeight": 1.25,
      "weight": 600,
      "letterSpacing": -0.015
    },
    "heading-sm": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.35,
      "weight": 600,
      "letterSpacing": -0.01
    },
    "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.55,
      "weight": 400,
      "letterSpacing": 0
    },
    "label": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.3,
      "weight": 500,
      "letterSpacing": 0.005
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.45,
      "weight": 500,
      "letterSpacing": 0.01
    },
    "code": {
      "font": "mono",
      "size": 14,
      "lineHeight": 1.6,
      "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.600}",
      "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.500}"
    },
    "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.700}",
      "ring": "{color.brand.400}"
    }
  },
  "components": {
    "button": {
      "height": 40,
      "paddingX": "{space.5}",
      "radius": "{radius.full}",
      "typography": "{typography.label}",
      "fontWeight": 600
    },
    "input": {
      "height": 44,
      "paddingX": "{space.4}",
      "radius": "{radius.md}",
      "typography": "{typography.body-md}",
      "borderWidth": 1
    },
    "card": {
      "padding": "{space.6}",
      "radius": "{radius.lg}",
      "shadow": "{shadow.sm}",
      "borderWidth": 1
    },
    "badge": {
      "height": 24,
      "paddingX": "{space.2}",
      "radius": "{radius.full}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use primary (brand.600 light, brand.400 dark) for exactly one main action per view, such as Send or Start chat. Render other actions as secondary or ghost buttons.",
      "Build buttons at 40px height with radius.full, label typography and fontWeight 600. Keep inputs at 44px height with radius.md.",
      "Show focus with a 2px ring token and a 2px offset on every interactive element. This uses brand.500 in light mode and brand.400 in dark mode.",
      "Use display-lg (48px) and display-md (38px) only for greetings and empty-state headlines. Use heading-sm (20px) for message group titles.",
      "Render AI responses in body-md (16px, line height 1.6) within a 760px column. Set code blocks in Geist Mono with code typography on the muted surface.",
      "Pair every success, warning and destructive color with an icon or text label so status never relies on color alone."
    ],
    "dont": [
      "Don't use primary or any brand step for errors or destructive confirmations. Use destructive (danger.600 light, danger.400 dark).",
      "Don't put long body text on accent (brand.100 light, brand.900 dark). Reserve accent for selected conversations, highlights and active nav items.",
      "Don't put shadow.md or shadow.lg on cards or message bubbles. Use shadow.md for popovers and command palettes, and shadow.lg for dialogs. In dark mode, show elevation with the card token (neutral.900) instead of shadow.",
      "Don't use neutral.600 or lighter for text on the light muted surface (it drops below 4.5:1). Use muted-foreground (neutral.700).",
      "Don't use pure black for text or for dark-mode surfaces. Use neutral.950 for both.",
      "Don't apply bounce or overshoot to text. Keep motion under 300ms, and disable overshoot when prefers-reduced-motion is set."
    ]
  }
}
