{"$comment":"Auto-generated from src/cards/schemas/*.js by scripts/generate-llm-schema.js — do not hand-edit.","lcards_version":"2026.09.1-dev0","generated_at":"2026-09-10T01:47:49.998Z","usage":"Each key under \"cards\" is a JSON Schema (draft-07) for one LCARdS custom card type, stripped of editor-only metadata. Shared building blocks are hoisted into \"$defs\" and referenced via {\"$ref\": \"#/$defs/<name>\"} to keep this file a reasonable size. When generating LCARdS YAML, only use properties that appear in the relevant card's schema (resolving any $ref against $defs) — do not invent keys. MSD (custom:lcards-msd) is not included here; see the MSD docs instead.","$defs":{"dataSourcesSchema":{"type":"object","description":"Data sources for real-time entity tracking, historical data, and processing pipelines. Each key defines a named data source accessible in templates.","$comment":"Data sources enable entity subscriptions, history preload, and unified processing pipeline","examples":{"$ref":"#/$defs/sharedSchema1"},"additionalProperties":{"$ref":"#/$defs/sharedSchema3"}},"sharedSchema1":[{"$ref":"#/$defs/sharedSchema2"}],"sharedSchema2":{"temp":{"entity":"sensor.temperature","history":{"hours":6},"processing":{"fahrenheit":{"type":"convert_unit","from":"c","to":"f"},"smoothed":{"type":"smooth","from":"fahrenheit","method":"exponential","alpha":0.3},"rounded":{"type":"round","from":"smoothed","precision":1}}},"power":{"entity":"sensor.power","update_interval":1000,"processing":{"kilowatts":{"type":"scale","input_range":[0,1000],"output_range":[0,1]}}}},"sharedSchema3":{"type":"object","properties":{"$ref":"#/$defs/sharedSchema4"},"required":["entity"]},"sharedSchema4":{"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Entity ID to track (format: domain.object_id)","examples":["sensor.temperature"]},"attribute":{"type":"string","description":"Entity attribute to track instead of state","examples":["temperature"]},"update_interval":{"type":"number","minimum":0,"maximum":10000,"description":"Minimum milliseconds between updates (throttling, default: 100)","examples":[100]},"history":{"$ref":"#/$defs/sharedSchema5"},"processing":{"$ref":"#/$defs/sharedSchema7"}},"sharedSchema5":{"type":"object","description":"Historical data preload configuration","properties":{"$ref":"#/$defs/sharedSchema6"}},"sharedSchema6":{"enabled":{"type":"boolean","description":"Enable historical data preload (default: true)"},"hours":{"type":"number","minimum":1,"maximum":168,"description":"Hours of history to preload (1-168, default: 6)"},"days":{"type":"number","minimum":1,"maximum":7,"description":"Days of history to preload (1-7)"}},"sharedSchema7":{"type":"object","description":"Processing pipeline with named processors. Each processor transforms data and stores results in a buffer accessible via templates.","additionalProperties":{"$ref":"#/$defs/sharedSchema8"}},"sharedSchema8":{"type":"object","properties":{"$ref":"#/$defs/sharedSchema9"},"required":["type"]},"sharedSchema9":{"type":{"type":"string","enum":["convert_unit","scale","smooth","expression","statistics","rate","trend","duration","threshold","clamp","round","delta"],"description":"Processor type","examples":["convert_unit"]},"from":{"type":"string","description":"Source processor name to depend on (creates dependency chain). If omitted, uses raw entity value.","examples":["fahrenheit"]}},"triggersUpdateSchema":{"type":"array","items":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Entity ID whose state change should trigger a re-render","examples":["sensor.temperature"]},"description":"Extra entity IDs to watch for state changes. When any listed entity changes, all templates on this card are re-evaluated. Use this for JavaScript templates ([[[...]]]) that reference entities LCARdS cannot detect automatically via static analysis.","examples":[["sensor.outdoor_temperature"]]},"cardHeightSchema":{"oneOf":[{"type":"number","minimum":1,"description":"Card height in pixels (bare integer, e.g. 56 = 56px)"},{"type":"string","pattern":"^[\\d.]+(\\s*(px|vh|vw|%|em|rem|vmin|vmax))?$","description":"Card height with CSS unit (e.g. 200px, 50vh, 10em)"}],"description":"Card height override. Bare integer = px (e.g. 200 = 200px). CSS units accepted: 200px, 50vh, 10em."},"cardWidthSchema":{"oneOf":[{"type":"number","minimum":1,"description":"Card width in pixels (bare integer, e.g. 300 = 300px)"},{"type":"string","pattern":"^[\\d.]+(\\s*(px|vh|vw|%|em|rem|vmin|vmax))?$","description":"Card width with CSS unit (e.g. 400px, 50vw, 10em)"}],"description":"Card width override. Bare integer = px (e.g. 400 = 400px). CSS units accepted: 400px, 50vw, 10em."},"cardMinHeightSchema":{"oneOf":[{"type":"number","minimum":0,"description":"Minimum card height in pixels (bare integer, e.g. 40 = 40px)"},{"type":"string","pattern":"^[\\d.]+(\\s*(px|vh|vw|%|em|rem|vmin|vmax))?$","description":"Minimum card height with CSS unit (e.g. 40px, 10vh)"}],"description":"Minimum card height floor. Overrides the --lcards-button-min-height CSS token. Bare integer = px."},"cardMinWidthSchema":{"oneOf":[{"type":"number","minimum":0,"description":"Minimum card width in pixels (bare integer, e.g. 80 = 80px)"},{"type":"string","pattern":"^[\\d.]+(\\s*(px|vh|vw|%|em|rem|vmin|vmax))?$","description":"Minimum card width with CSS unit (e.g. 80px, 10vw)"}],"description":"Minimum card width floor. Bare integer = px."},"cardMaxHeightSchema":{"oneOf":[{"type":"number","minimum":1,"description":"Maximum card height in pixels (bare integer, e.g. 400 = 400px)"},{"type":"string","pattern":"^[\\d.]+(\\s*(px|vh|vw|%|em|rem|vmin|vmax))?$","description":"Maximum card height with CSS unit (e.g. 400px, 80vh, 20em)"}],"description":"Maximum card height ceiling. Bare integer = px (e.g. 400 = 400px). CSS units accepted: 400px, 80vh, 10em."},"cardMaxWidthSchema":{"oneOf":[{"type":"number","minimum":1,"description":"Maximum card width in pixels (bare integer, e.g. 600 = 600px)"},{"type":"string","pattern":"^[\\d.]+(\\s*(px|vh|vw|%|em|rem|vmin|vmax))?$","description":"Maximum card width with CSS unit (e.g. 600px, 80vw, 20em)"}],"description":"Maximum card width ceiling. Bare integer = px (e.g. 600 = 600px). CSS units accepted: 600px, 80vw, 10em."},"paddingSchema":{"oneOf":{"$ref":"#/$defs/sharedSchema10"}},"sharedSchema10":[{"type":"number","title":"Uniform Padding","minimum":0,"maximum":200,"description":"Same padding on all sides (in pixels)","examples":[8]},{"$ref":"#/$defs/sharedSchema11"}],"sharedSchema11":{"type":"object","title":"Per-Side Padding","description":"Different padding for each side","examples":[{"top":8,"right":16,"bottom":8,"left":16}],"properties":{"$ref":"#/$defs/sharedSchema12"}},"sharedSchema12":{"top":{"type":"number","minimum":0,"maximum":200,"description":"Top padding in pixels"},"right":{"type":"number","minimum":0,"maximum":200,"description":"Right padding in pixels"},"bottom":{"type":"number","minimum":0,"maximum":200,"description":"Bottom padding in pixels"},"left":{"type":"number","minimum":0,"maximum":200,"description":"Left padding in pixels"}},"stateColorSchema":{"oneOf":{"$ref":"#/$defs/sharedSchema13"}},"sharedSchema13":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Single colour value applied to all entity states","examples":["#FF9900"],"title":"Simple Colour"},{"$ref":"#/$defs/sharedSchema14"}],"sharedSchema14":{"type":"object","title":"State-Dependent Colours","description":"Map of entity state names to colour values. Well-known keys: default, active, inactive, unavailable, zero, non_zero, hover, pressed. Any custom state name (e.g. \"heating\", \"above:90\") is also accepted.","examples":[{"default":"#888888","active":"alpha(var(--lcards-orange), 0.08)","inactive":"#444444"}],"properties":{"$ref":"#/$defs/sharedSchema15"},"additionalProperties":{"$ref":"#/$defs/sharedSchema16"}},"sharedSchema15":{"default":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Fallback colour when no other state key matches","examples":["#FF9900"]},"active":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Colour when entity is on/active","examples":["#FF9900"]},"inactive":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Colour when entity is off/inactive","examples":["#FF9900"]},"unavailable":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Colour when entity is unavailable","examples":["#FF9900"]},"zero":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Colour when entity state is numeric 0","examples":["#FF9900"]},"non_zero":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Colour when entity state is a non-zero number","examples":["#FF9900"]},"hover":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Colour on hover interaction","examples":["#FF9900"]},"pressed":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Colour on press/tap interaction","examples":["#FF9900"]}},"sharedSchema16":{"type":"string","pattern":"^(#[0-9A-Fa-f]{3,8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|hsla\\(|var\\(--|alpha\\(|darken\\(|lighten\\(|saturate\\(|desaturate\\(|base\\()","description":"Colour for a custom state key (e.g. \"heating\", \"cooling\", \"above:90\", \"below:20\")","examples":["#FF9900"]},"actionSchema":{"type":"object","description":"Action to perform on interaction (tap, hold, or double-tap). Supports toggle, service calls, navigation, more-info dialog, or no action.","examples":[{"action":"toggle","entity":"light.living_room"}],"properties":{"$ref":"#/$defs/sharedSchema17"}},"sharedSchema17":{"action":{"$ref":"#/$defs/sharedSchema18"},"service":{"type":"string","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Service to call (format: domain.service)","examples":["light.turn_on"]},"service_data":{"type":"object","description":"Data to pass to the service","examples":[{"brightness":255,"color_name":"red"}]},"data":{"type":"object","description":"Alias for service_data","examples":[{"brightness":255}]},"navigation_path":{"type":"string","pattern":"^/","description":"Path to navigate to (must start with /)","examples":["/lovelace/dashboard"]},"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Entity ID (format: domain.object_id)","examples":["light.living_room"]},"target":{"type":"object","description":"Service target selector","examples":[{"entity_id":"light.living_room"}]}},"sharedSchema18":{"type":"string","enum":["toggle","call-service","perform-action","navigate","url","more-info","assist","none"],"default":"toggle","description":"Type of action to perform","enumDescriptions":["Toggle entity on/off","Call a Home Assistant service","Navigate to another view/dashboard","Show entity more-info dialog","No action (disabled)"]},"animationSchema":{"type":"object","description":"Visual animation triggered by user interactions or entity state changes","examples":[{"trigger":"on_tap","preset":"pulse","duration":500,"color":"#FF9900"}],"properties":{"$ref":"#/$defs/sharedSchema19"},"additionalProperties":"warn","required":["trigger","preset"]},"sharedSchema19":{"trigger":{"$ref":"#/$defs/sharedSchema20"},"preset":{"type":"string","description":"Animation preset name","examples":["pulse"]},"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"default":500,"description":"Animation duration in milliseconds (0-10000). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Easing function (string name or object with type and params)","examples":["inOutQuad"]},"loop":{"oneOf":[{"type":"boolean","description":"true = loop infinitely, false = play once"},{"type":"integer","minimum":1,"description":"Number of additional times to loop (1 = play twice total)"}],"default":false,"description":"Loop the animation. true = infinite, false = play once, N = loop N times"},"alternate":{"type":"boolean","default":false,"description":"Whether animation should alternate direction on each loop"},"delay":{"type":["number","object"],"minimum":0,"maximum":10000,"default":0,"description":"Delay before animation starts (milliseconds). Also accepts a map_range descriptor, matching rulesSchema's equivalent field."},"entity":{"type":"string","description":"Entity ID to monitor (required for on_entity_change trigger)","pattern":"^[a-zA-Z_]+\\.[a-zA-Z0-9_]+$","examples":["light.bedroom"]},"attribute":{"type":"string","description":"Attribute to read instead of entity state. Applies uniformly to to_state, from_state, and the while condition. Use \"brightness_pct\" for a computed 0–100 light brightness percentage (avoids converting raw 0–255 values).","examples":["brightness"]},"from_state":{"type":"string","description":"Fire-and-forget gate: Only trigger when the entity (or attribute) transitions FROM this value. The animation runs until completion and does not auto-stop a looping animation. For auto-stop on loops, use while.","examples":["on"]},"to_state":{"type":"string","description":"Fire-and-forget gate: Only trigger when the entity (or attribute) transitions TO this value. The animation runs until completion and does not auto-stop a looping animation. For auto-stop on loops, use while.","examples":["on"]},"check_on_load":{"$ref":"#/$defs/sharedSchema21"},"while":{"$ref":"#/$defs/sharedSchema22"},"id":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"Optional identifier for this animation entry (referenced by system animations, debugging)."},"enabled":{"type":"boolean","default":true,"description":"Set false to disable this animation entry without deleting it."},"target":{"type":"string","description":"CSS selector for a single animation target element."},"targets":{"type":["string","array"],"items":{"type":"string"},"description":"CSS selector(s) for multiple animation target elements."},"params":{"$ref":"#/$defs/sharedSchema24"}},"sharedSchema20":{"type":"string","enum":["on_load","on_tap","on_hold","on_hover","on_leave","on_entity_change"],"description":"When to trigger the animation","enumDescriptions":["When card is loaded/rendered","When card is tapped/clicked","When card is held (long press)","When mouse enters card","When mouse leaves card","When associated entity state changes"]},"sharedSchema21":{"type":"boolean","default":true,"description":"Evaluate the condition when the card first loads (default: true). For while conditions, starts a looping animation immediately if the condition is already met. For to_state/from_state, plays the animation if the entity is already in to_state. Set to false to suppress the initial evaluation and only react to state transitions. (on_entity_change only)"},"sharedSchema22":{"type":"object","description":"Lifecycle condition for looping animations (requires the top-level loop: true field). The animation plays while the condition is true and stops automatically when it becomes false. Note: to_state/from_state are fire-and-forget gates — they control when the animation starts but will not stop it. Use while to auto-stop a looping animation. The 4 numeric bound keys (above/at_least/below/at_most) AND-combine when more than one is present, so a range can be expressed by combining two of them — e.g. { at_least: 20, at_most: 80 } for an inclusive range, or { above: 20, below: 80 } for an exclusive one.","properties":{"$ref":"#/$defs/sharedSchema23"},"examples":[{"state":"on"}]},"sharedSchema23":{"state":{"type":"string","description":"Play while entity value equals this string"},"not_state":{"type":"string","description":"Play while entity value does NOT equal this string"},"above":{"type":"number","description":"Play while numeric entity value is strictly above this threshold"},"at_least":{"type":"number","description":"Play while numeric entity value is greater than or equal to this threshold"},"below":{"type":"number","description":"Play while numeric entity value is strictly below this threshold"},"at_most":{"type":"number","description":"Play while numeric entity value is less than or equal to this threshold"}},"sharedSchema24":{"type":"object","discriminatedBy":{"$ref":"#/$defs/sharedSchema25"},"description":"Preset-specific parameters. Shape depends on the sibling `preset` field."},"sharedSchema25":{"field":"preset","schemas":{"$ref":"#/$defs/sharedSchema26"},"default":{"type":"object","additionalProperties":true}},"sharedSchema26":{"pulse":{"$ref":"#/$defs/sharedSchema27"},"fade":{"$ref":"#/$defs/sharedSchema29"},"glow":{"$ref":"#/$defs/sharedSchema31"},"draw":{"$ref":"#/$defs/sharedSchema33"},"march":{"$ref":"#/$defs/sharedSchema35"},"blink":{"$ref":"#/$defs/sharedSchema37"},"shimmer":{"$ref":"#/$defs/sharedSchema39"},"strobe":{"$ref":"#/$defs/sharedSchema41"},"flicker":{"$ref":"#/$defs/sharedSchema43"},"cascade":{"$ref":"#/$defs/sharedSchema45"},"cascade-color":{"$ref":"#/$defs/sharedSchema47"},"ripple":{"$ref":"#/$defs/sharedSchema51"},"scale":{"$ref":"#/$defs/sharedSchema53"},"scale-reset":{"$ref":"#/$defs/sharedSchema55"},"slide":{"$ref":"#/$defs/sharedSchema57"},"rotate":{"$ref":"#/$defs/sharedSchema59"},"shake":{"$ref":"#/$defs/sharedSchema61"},"bounce":{"$ref":"#/$defs/sharedSchema63"},"color-shift":{"$ref":"#/$defs/sharedSchema65"},"skew":{"$ref":"#/$defs/sharedSchema67"},"glitch":{"$ref":"#/$defs/sharedSchema69"},"set":{"$ref":"#/$defs/sharedSchema71"},"motionpath":{"$ref":"#/$defs/sharedSchema72"},"sequence":{"$ref":"#/$defs/sharedSchema76"},"chaos":{"$ref":"#/$defs/sharedSchema78"},"physics-spring":{"$ref":"#/$defs/sharedSchema82"},"stagger-grid":{"$ref":"#/$defs/sharedSchema84"},"stagger-wave":{"$ref":"#/$defs/sharedSchema86"},"stagger-radial":{"$ref":"#/$defs/sharedSchema88"},"stagger-flash":{"$ref":"#/$defs/sharedSchema90"},"text-reveal":{"$ref":"#/$defs/sharedSchema92"},"text-scramble":{"$ref":"#/$defs/sharedSchema94"},"text-glitch":{"$ref":"#/$defs/sharedSchema96"},"text-typewriter":{"$ref":"#/$defs/sharedSchema98"},"timeline-cascade":{"$ref":"#/$defs/sharedSchema99"},"timeline-attention":{"$ref":"#/$defs/sharedSchema104"}},"sharedSchema27":{"type":"object","description":"Params for the \"pulse\" preset — breathing scale/brightness effect.","properties":{"$ref":"#/$defs/sharedSchema28"},"additionalProperties":"warn"},"sharedSchema28":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"max_scale":{"type":"number","minimum":0.5,"maximum":3,"default":1.15,"description":"How much to grow. Falls back to `scale` if set, else 1.15."},"scale":{"type":"number","minimum":0.5,"maximum":3,"description":"Legacy alias for max_scale (max_scale wins if both set)."},"max_brightness":{"type":"number","minimum":1,"maximum":3,"default":1.4,"description":"How much to brighten (1.0 = normal)."}},"sharedSchema29":{"type":"object","description":"Params for the \"fade\" preset — simple opacity transition.","properties":{"$ref":"#/$defs/sharedSchema30"},"additionalProperties":"warn"},"sharedSchema30":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"from":{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Starting opacity."},"to":{"type":"number","minimum":0,"maximum":1,"default":0.3,"description":"Target opacity."}},"sharedSchema31":{"type":"object","description":"Params for the \"glow\" preset.","properties":{"$ref":"#/$defs/sharedSchema32"},"additionalProperties":"warn"},"sharedSchema32":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"color":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Glow colour. Falls back to `glow_color` if set.","default":"var(--lcars-blue, #66ccff)"},"glow_color":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Legacy alias for color, lower precedence."},"blur_min":{"type":"number","minimum":0,"maximum":50,"default":0},"blur_max":{"type":"number","minimum":0,"maximum":50,"default":10}},"sharedSchema33":{"type":"object","description":"Params for the \"draw\" preset — SVG stroke reveal via anime.js createDrawable.","properties":{"$ref":"#/$defs/sharedSchema34"},"additionalProperties":"warn"},"sharedSchema34":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"reverse":{"type":"boolean","default":false,"description":"If true, draws from end to start. Only affects the default `draw` value — ignored if `draw` is explicitly supplied."},"draw":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"e.g. ['0 0', '0 1']"},{"type":"object","properties":{"values":{"type":"array","items":{"type":"string"},"required":true}}}],"description":"Draw values or {values: [...]}. Defaults to ['0 0','0 1'] (or reversed) based on `reverse`."}},"sharedSchema35":{"type":"object","description":"Params for the \"march\" preset — CSS-based marching dashed line (bypasses anime.js).","properties":{"$ref":"#/$defs/sharedSchema36"},"additionalProperties":"warn"},"sharedSchema36":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Used only if `speed` is absent (converted to seconds for a CSS animation-duration). `speed` takes precedence if both are set."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Maps to CSS animation-iteration-count: true→infinite, false/0→1, N→N. Uses CSS keyframes, not the generic anime.js loop mechanism.","default":true},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"speed":{"type":"number","minimum":0,"description":"Seconds per cycle. Takes precedence over `duration` if present."},"direction":{"type":"string","enum":["forward","reverse"],"default":"forward"},"dash_length":{"type":"number","minimum":0,"description":"Auto-detected from the element's stroke-dasharray if absent; fallback 10."},"gap_length":{"type":"number","minimum":0,"description":"Auto-detected from the element's stroke-dasharray if absent; fallback 5."}},"sharedSchema37":{"type":"object","description":"Params for the \"blink\" preset.","properties":{"$ref":"#/$defs/sharedSchema38"},"additionalProperties":"warn"},"sharedSchema38":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"max_opacity":{"type":"number","minimum":0,"maximum":1,"default":1},"min_opacity":{"type":"number","minimum":0,"maximum":1,"default":0.3}},"sharedSchema39":{"type":"object","description":"Params for the \"shimmer\" preset.","properties":{"$ref":"#/$defs/sharedSchema40"},"additionalProperties":"warn"},"sharedSchema40":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"color_from":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Must be paired with color_to, else color animation is skipped (opacity still animates)."},"color_to":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Falls back to `shimmer_color`. Must be paired with color_from."},"shimmer_color":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Legacy alias for color_to, lower precedence."},"opacity_from":{"type":"number","minimum":0,"maximum":1,"default":1},"opacity_to":{"type":"number","minimum":0,"maximum":1,"default":0.5}},"sharedSchema41":{"type":"object","description":"Params for the \"strobe\" preset.","properties":{"$ref":"#/$defs/sharedSchema42"},"additionalProperties":"warn"},"sharedSchema42":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Unusually short vs. most presets — strobe is fast by design.","default":100},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"max_opacity":{"type":"number","minimum":0,"maximum":1,"default":1},"min_opacity":{"type":"number","minimum":0,"maximum":1,"default":0}},"sharedSchema43":{"type":"object","description":"Params for the \"flicker\" preset. Randomized keyframes are generated once at setup time (not re-randomized per loop cycle). `alternate` has no effect.","properties":{"$ref":"#/$defs/sharedSchema44"},"additionalProperties":"warn"},"sharedSchema44":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"max_opacity":{"type":"number","minimum":0,"maximum":1,"default":1},"min_opacity":{"type":"number","minimum":0,"maximum":1,"default":0.3}},"sharedSchema45":{"type":"object","description":"Params for the \"cascade\" preset — staggered fade/property tween across multiple targets.","properties":{"$ref":"#/$defs/sharedSchema46"},"additionalProperties":"warn"},"sharedSchema46":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set).","default":false},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"stagger":{"type":"number","minimum":0,"default":100,"description":"Per-element delay (ms). NOT the canonical `delay` field, which is unused here."},"property":{"type":"string","default":"opacity","description":"Arbitrary anime/CSS property name — unvalidated passthrough."},"from":{"type":"number","default":0},"to":{"type":"number","default":1}},"sharedSchema47":{"type":"object","description":"Params for the \"cascade-color\" preset — staggered color cascade across a grid/row of targets. NOTE: the default `property` (\"color\") is correct for its primary intended use (data-grid cells, plain HTML/CSS-rendered) but won't visibly work on an SVG-shape target (LCARdS's own button/elbow/slider/MSD cards) — set `property` to `fill` or `stroke` for those.","properties":{"$ref":"#/$defs/sharedSchema48"},"additionalProperties":"warn"},"sharedSchema48":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":"number","minimum":0,"default":0,"description":"Row-level start delay — a legitimate use of the canonical start-offset meaning (unlike the stagger-* presets)."},"colors":{"$ref":"#/$defs/sharedSchema49"},"property":{"type":"string","default":"color","description":"Passthrough key used inside keyframe objects. 'fill'/'stroke' for SVG shapes, 'color'/'background-color' only for plain HTML/CSS-rendered targets."},"mode":{"$ref":"#/$defs/sharedSchema50"},"interactive":{"type":"boolean","default":false,"description":"Only wired up (mouseenter/mouseleave pause/play) when mode==='animejs'."},"stagger_from":{"type":"string","enum":["first","last","center","random"],"description":"Not validated in code today — documented values only."},"stagger_delay":{"type":"number","minimum":0,"default":100,"description":"Only relevant in animejs mode."},"axis":{"type":"string","enum":["row","column"],"default":"row","description":"Not validated in code today — documented values only."}},"sharedSchema49":{"type":"array","minItems":3,"items":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)"},"description":"Only indices [0],[1],[2] are used; defaults to 3 theme tokens if omitted."},"sharedSchema50":{"type":"string","enum":["css","animejs"],"description":"Both modes actually run through anime.js — despite the naming, this isn't a CSS-vs-anime.js engine choice. 'animejs' mode adds per-cell stagger (interactive/stagger_from/axis) on top of the base cascade; 'css' mode is the plain synchronized version. Auto-computed from interactive/stagger_from/axis when unset, and force-upgraded to 'animejs' whenever any of those are set even if `mode` was also set explicitly — those fields have no effect at all in 'css' mode, so silently ignoring them would be more surprising than the override."},"sharedSchema51":{"type":"object","description":"Params for the \"ripple\" preset.","properties":{"$ref":"#/$defs/sharedSchema52"},"additionalProperties":"warn"},"sharedSchema52":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"scale_max":{"type":"number","minimum":1,"maximum":5,"default":1.5},"opacity_min":{"type":"number","minimum":0,"maximum":1,"default":0}},"sharedSchema53":{"type":"object","description":"Params for the \"scale\" preset.","properties":{"$ref":"#/$defs/sharedSchema54"},"additionalProperties":"warn"},"sharedSchema54":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"scale":{"type":"number","minimum":0.1,"maximum":10,"default":1.1,"description":"Target scale."},"from":{"type":"number","minimum":0.1,"maximum":10,"default":1,"description":"Starting scale."}},"sharedSchema55":{"type":"object","description":"Params for the \"scale-reset\" preset. `loop`/`alternate` are hardcoded false in code today and have no effect even if set — see Phase 13.6.","properties":{"$ref":"#/$defs/sharedSchema56"},"additionalProperties":"warn"},"sharedSchema56":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."}},"sharedSchema57":{"type":"object","description":"Params for the \"slide\" preset.","properties":{"$ref":"#/$defs/sharedSchema58"},"additionalProperties":"warn"},"sharedSchema58":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"from":{"type":"string","enum":["right","left","top","bottom","up","down"],"default":"right","description":"Falls back to `direction`. Actual code default is 'right' (doc previously said 'up' — corrected here, see Phase 13.6)."},"direction":{"type":"string","enum":["right","left","top","bottom","up","down"],"description":"Legacy alias for `from`, lower precedence."},"distance":{"oneOf":[{"type":"number"},{"type":"string"}],"default":100,"description":"Number → px. String containing '%' → treated as a percentage."}},"sharedSchema59":{"type":"object","description":"Params for the \"rotate\" preset.","properties":{"$ref":"#/$defs/sharedSchema60"},"additionalProperties":"warn"},"sharedSchema60":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"direction":{"type":"string","enum":["clockwise","counterclockwise"],"description":"If present, entirely overrides from/to: clockwise → [0,360], counterclockwise → [0,-360]."},"from":{"type":"number","default":0,"description":"Only used if `direction` is absent."},"to":{"type":"number","default":360,"description":"Only used if `direction` is absent."}},"sharedSchema61":{"type":"object","description":"Params for the \"shake\" preset. `alternate` has no effect — keyframes always return to 0 regardless.","properties":{"$ref":"#/$defs/sharedSchema62"},"additionalProperties":"warn"},"sharedSchema62":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"intensity":{"type":"number","minimum":0,"default":10,"description":"Max px displacement."},"frequency":{"type":"number","minimum":1,"default":4,"description":"Number of alternating keyframes generated."}},"sharedSchema63":{"type":"object","description":"Params for the \"bounce\" preset.","properties":{"$ref":"#/$defs/sharedSchema64"},"additionalProperties":"warn"},"sharedSchema64":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"scale_max":{"type":"number","minimum":1,"maximum":3,"default":1.2},"bounces":{"type":"number","minimum":1,"default":3,"description":"If > 1, `ease` is force-overridden to 'outQuad' and `duration` is multiplied by `bounces` (see Phase 13.6 re: whether ease should stay overridable here). If <= 1, the user's ease/duration are used unmodified."}},"sharedSchema65":{"type":"object","description":"Params for the \"color-shift\" preset. NOTE: the default `property` (\"color\") only visibly works on plain HTML/CSS-rendered targets — LCARdS's own cards (button/elbow/slider/MSD) draw their shapes as SVG paths, which don't respond to the CSS `color` property at all. Set `property` to `fill` or `stroke` when targeting an SVG shape.","properties":{"$ref":"#/$defs/sharedSchema66"},"additionalProperties":"warn"},"sharedSchema66":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"color_from":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Required — omitting either color_from or color_to makes the preset a no-op with a warning."},"color_to":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Required, see color_from."},"property":{"type":"string","default":"color","description":"'fill'/'stroke' for SVG shapes (LCARdS's own cards), 'color'/'background-color' only for plain HTML/CSS-rendered targets."}},"sharedSchema67":{"type":"object","description":"Params for the \"skew\" preset. Presence of EITHER from_skewX or from_skewY switches skewX/skewY into \"to\" targets instead of direct targets from 0 — a genuine conditional shape (kept as hardcoded editor UI, not schema-driven form, per Phase 13.5).","properties":{"$ref":"#/$defs/sharedSchema68"},"additionalProperties":"warn"},"sharedSchema68":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"skewX":{"type":"number","default":0,"description":"Degrees."},"skewY":{"type":"number","default":0,"description":"Degrees."},"from_skewX":{"type":"number","default":0},"from_skewY":{"type":"number","default":0}},"sharedSchema69":{"type":"object","description":"Params for the \"glitch\" preset. `ease` is hardcoded to 'linear' — ignored. `alternate` has no effect.","properties":{"$ref":"#/$defs/sharedSchema70"},"additionalProperties":"warn"},"sharedSchema70":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"intensity":{"type":"number","minimum":0,"default":5,"description":"Max px displacement, symmetric around 0."},"frequency":{"type":"number","minimum":1,"default":10,"description":"Number of random keyframes generated."}},"sharedSchema71":{"type":"object","description":"Params for the \"set\" preset — direct property assignment (duration/ease/loop/alternate/delay are all ignored; duration is hardcoded 0).","properties":{"properties":{"type":"object","additionalProperties":true,"default":{},"description":"Free-form key→value map spread directly into anime params, e.g. {opacity: 0.5, fill: 'red'}. Completely unvalidated shape."}},"additionalProperties":"warn"},"sharedSchema72":{"type":"object","description":"Params for the \"motionpath\" preset — animates an element (or, with `shape` set, a self-created tracer shape) along an SVG path.","properties":{"$ref":"#/$defs/sharedSchema73"},"additionalProperties":"warn"},"sharedSchema73":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"path":{"type":"string","description":"Required. CSS selector (#id or .class) for the motion-path SVG element."},"rotate":{"type":"boolean","default":true,"description":"Auto-rotate along path (different meaning from the top-level \"rotate\" preset's numeric from/to). A sibling of `shape` below, not a field inside it — controls the motion itself, applies whether or not `shape` is set."},"anchor":{"type":"string","default":"50% 50%","description":"CSS transform-origin syntax, unvalidated. A sibling of `shape` below, not a field inside it."},"shape":{"$ref":"#/$defs/sharedSchema74"}},"sharedSchema74":{"type":"object","description":"Opt-in: motionpath creates and animates its own shape (a \"tracer\") instead of moving target/targets — e.g. a traveling dot suggesting energy flow along a line. Mutually exclusive with target/targets (shape wins, with a console warning, if both are set). Field names deliberately mirror line markers' (marker_start/marker_end) styling options. Appearance only — `rotate`/`anchor` (motion behavior) are separate, sibling `params` fields, not part of this object.","properties":{"$ref":"#/$defs/sharedSchema75"},"additionalProperties":"warn"},"sharedSchema75":{"type":{"type":"string","enum":["circle","rect","diamond"],"default":"circle"},"size":{"type":"number","minimum":1,"default":10,"description":"Diameter (circle/diamond) or width/height fallback (rect) in px."},"width":{"type":"number","minimum":1,"description":"rect only — overrides size for width."},"height":{"type":"number","minimum":1,"description":"rect only — overrides size for height."},"fill":{"type":"string","default":"currentColor"},"stroke":{"type":"string","default":"none"},"stroke_width":{"type":"number","minimum":0,"default":0}},"sharedSchema76":{"type":"object","description":"Params for the \"sequence\" preset — timeline of steps. Each step may set its own duration/ease (falling back to this preset's own duration/ease as per-step defaults). Step positioning uses `offset`; the preset factory also accepts the older `at` name as a fallback (translated to `offset` internally) — `offset` wins if a step sets both.","properties":{"$ref":"#/$defs/sharedSchema77"},"additionalProperties":"warn"},"sharedSchema77":{"duration":{"type":"number","minimum":0,"maximum":10000,"default":2000,"description":"Fallback duration for steps missing their own duration."},"ease":{"type":["string","object"],"description":"Fallback easing for steps missing their own ease. Default 'outQuad'."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set).","default":false},"steps":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":true,"description":"Arbitrary anime.js tween properties at the top level, plus optional duration/ease/offset (or legacy at) overrides."},"description":"Required, at least one step."}},"sharedSchema78":{"type":"object","description":"Params for the \"chaos\" preset — randomized multi-property glitch motion. Does not use the top-level `duration` field at all.","properties":{"$ref":"#/$defs/sharedSchema79"},"additionalProperties":"warn"},"sharedSchema79":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set).","default":true},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"properties":{"$ref":"#/$defs/sharedSchema80"},"range":{"$ref":"#/$defs/sharedSchema81"},"duration_min":{"type":"number","minimum":0,"default":200,"description":"Replaces the canonical `duration` entirely for this preset."},"duration_max":{"type":"number","minimum":0,"default":800},"composition":{"type":"string","enum":["blend","replace"],"default":"blend","description":"Not validated in code today — documented values only."}},"sharedSchema80":{"type":"array","items":{"type":"string"},"default":["x","y","rotate"],"description":"'x'/'y' tokens are remapped to translateX/translateY; other tokens (e.g. 'rotate','opacity') used verbatim as the anime property name. Not validated as an array in code today — a non-array truthy value will throw."},"sharedSchema81":{"type":"object","additionalProperties":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"default":{"x":[-50,50],"y":[-50,50],"rotate":[-15,15]},"description":"Min/max range per property. Keys should match `properties`. Each value must be a 2-element array or that property's animation is silently skipped."},"sharedSchema82":{"type":"object","description":"Params for the \"physics-spring\" preset. `ease`, `duration`, and `alternate` (canonical) are entirely bypassed — spring dynamics determine the effective duration internally. `loop`, however, genuinely is read and respected. Has its own parallel spring-config system separate from the generic `ease: {type:\"spring\", params:{...}}` path — see Phase 13.6.","properties":{"$ref":"#/$defs/sharedSchema83"},"additionalProperties":"warn"},"sharedSchema83":{"property":{"type":"string","default":"scale","description":"Passthrough anime property name."},"from":{"type":["number","string"],"description":"Required (typically a number; a color string is also valid for color-like properties)."},"to":{"type":["number","string"],"description":"Required, see from."},"stiffness":{"type":"number","minimum":0,"default":100},"damping":{"type":"number","minimum":0,"default":10},"mass":{"type":"number","minimum":0,"default":1},"velocity":{"type":"number","default":0},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set).","default":false}},"sharedSchema84":{"type":"object","description":"Params for the \"stagger-grid\" preset — stagger across a [cols, rows] grid of targets.","properties":{"$ref":"#/$defs/sharedSchema85"},"additionalProperties":"warn"},"sharedSchema85":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Default 'outQuad'."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set).","default":false},"delay":{"type":["number","object"],"minimum":0,"description":"Repurposed as per-element stagger step (ms), NOT the canonical single start-offset.","default":100},"grid":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"},"default":[1,1],"description":"Validated in code — warns and no-ops if provided with the wrong shape."},"from":{"oneOf":[{"type":"string","enum":["start","end","center","edges"]},{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}}],"default":"start","description":"Not validated in code today."},"property":{"type":"string","default":"scale"},"from_value":{"type":"number","default":0.8},"to_value":{"type":"number","default":1}},"sharedSchema86":{"type":"object","description":"Params for the \"stagger-wave\" preset — wave effect across a linear sequence of targets. Actual code default for `alternate` is false (doc previously said true — corrected here, see Phase 13.6).","properties":{"$ref":"#/$defs/sharedSchema87"},"additionalProperties":"warn"},"sharedSchema87":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set).","default":false},"delay":{"type":["number","object"],"minimum":0,"description":"Repurposed as per-element stagger step (ms), NOT the canonical single start-offset.","default":100},"direction":{"type":"string","enum":["normal","reverse"],"default":"normal","description":"Any value other than 'reverse' collapses to 'normal' in code."},"property":{"type":"string","default":"translateY"},"amplitude":{"type":"number","default":-20,"description":"Used in a 3-point path [0, amplitude, 0]."}},"sharedSchema88":{"type":"object","description":"Params for the \"stagger-radial\" preset — stagger radiating from a point. `alternate` is not read at all by this preset.","properties":{"$ref":"#/$defs/sharedSchema89"},"additionalProperties":"warn"},"sharedSchema89":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Repurposed as per-element stagger step (ms), NOT the canonical single start-offset.","default":50},"from":{"oneOf":[{"type":"string","enum":["center"]},{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}}],"default":"center","description":"'center' or an [x,y] pixel position. Unvalidated."},"property":{"type":"string","default":"scale"},"from_value":{"type":"number","default":0},"to_value":{"type":"number","default":1}},"sharedSchema90":{"type":"object","description":"Params for the \"stagger-flash\" preset — WAAPI-driven flash sweep, bypassing anime.js entirely for the real visual effect.","properties":{"$ref":"#/$defs/sharedSchema91"},"additionalProperties":"warn"},"sharedSchema91":{"lead_color":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","default":"var(--primary-color)"},"trail_color":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","default":"#444444"},"lead_pct":{"type":"number","minimum":1,"maximum":50,"default":20,"description":"Clamped in code to [1, 50]."},"duration":{"type":"number","minimum":0,"default":2000,"description":"Total WAAPI cycle duration."},"delay":{"type":"number","minimum":0,"description":"Per-element stagger step (ms). Dynamic default: round(duration / 12). NOT the canonical single start-offset."},"grid":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"},"description":"No length validation. Only forwarded into the (mostly inert) anime stagger config."},"from":{"type":"string","enum":["first","last","center"],"default":"first"},"property":{"type":"string","default":"stroke","description":"Used as a Web Animations API keyframe property name — must be WAAPI-animatable."},"with_opacity":{"type":"boolean","default":true},"trail_opacity":{"type":"number","minimum":0,"maximum":1,"default":0.25},"loop":{"type":"boolean","default":true,"description":"Maps to WAAPI iterations: Infinity vs 1 — not the generic anime.js loop mechanism."}},"sharedSchema92":{"type":"object","description":"Params for the \"text-reveal\" preset — character/word/line reveal.","properties":{"$ref":"#/$defs/sharedSchema93"},"additionalProperties":"warn"},"sharedSchema93":{"duration":{"type":["number","object"],"minimum":0,"maximum":10000,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor for entity-driven, live-adjusting duration on looping animations."},"ease":{"type":["string","object"],"description":"Also accepted nested here (top-level wins if both set)."},"loop":{"oneOf":[{"type":"boolean"},{"type":"integer","minimum":1}],"description":"Also accepted nested here (top-level wins if both set)."},"alternate":{"type":"boolean","description":"Also accepted nested here (top-level wins if both set)."},"delay":{"type":["number","object"],"minimum":0,"description":"Also accepted nested here (top-level wins if both set). Also accepts a map_range descriptor."},"split":{"type":"string","enum":["chars","words","lines"],"default":"chars","description":"Not a strict whitelist in code — anything not exactly \"lines\"/\"words\" falls back to chars."},"direction":{"type":"string","default":"first","description":"Stagger origin (same family as anime's stagger() `from`: first/last/center/random/numeric index). Unvalidated."},"stagger":{"type":"number","minimum":0,"default":50,"description":"Per-unit delay step. Canonical `delay` is unused here."},"from_opacity":{"type":"number","minimum":0,"maximum":1,"default":0},"from_y":{"type":"number","default":20,"description":"px, used in translateY."}},"sharedSchema94":{"type":"object","description":"Params for the \"text-scramble\" preset — self-managed per-character scramble, bypassing the normal preset-level anime dispatch. `ease`/`alternate` (canonical) are accepted but ignored.","properties":{"$ref":"#/$defs/sharedSchema95"},"additionalProperties":"warn"},"sharedSchema95":{"duration":{"type":"number","minimum":0,"default":800,"description":"ms each character spends scrambling before settling."},"stagger":{"type":"number","minimum":0,"default":40,"description":"ms between each character starting."},"delay":{"type":"number","minimum":0,"default":0,"description":"A legitimate use of the canonical meaning: ms before the first character begins."},"loop":{"type":"boolean","default":false},"settle_at":{"type":"number","minimum":0,"maximum":1,"default":0.85,"description":"Fraction of duration. Not clamped in code today — values outside 0-1 produce nonsensical results."},"characters":{"type":"string","default":"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*","description":"Character pool. An empty string is an unguarded edge case in code today."}},"sharedSchema96":{"type":"object","description":"Params for the \"text-glitch\" preset. `ease` (canonical) is hardcoded to 'inOutQuad' — ignored.","properties":{"$ref":"#/$defs/sharedSchema97"},"additionalProperties":"warn"},"sharedSchema97":{"intensity":{"type":"number","minimum":0,"default":5,"description":"Max px/SVG-unit displacement."},"duration":{"type":"number","minimum":0,"default":300,"description":"ms per glitch cycle."},"stagger":{"type":"number","minimum":0,"default":50,"description":"ms offset between characters. Canonical `delay` is unused here."},"color_shift":{"type":"boolean","default":false,"description":"HTML target path only — silently ignored for SVG elements."},"loop":{"type":"boolean","default":false}},"sharedSchema98":{"type":"object","description":"Params for the \"text-typewriter\" preset. `duration` (canonical) is hardcoded to 1 — ignored. `ease` hardcoded 'linear'. `alternate`/`delay` (canonical) never read.","properties":{"speed":{"type":"number","minimum":0,"default":100,"description":"ms per character."},"loop":{"type":"boolean","default":false}},"additionalProperties":"warn"},"sharedSchema99":{"type":"object","description":"Params for the \"timeline-cascade\" preset — multi-step timeline. Timing/easing for each step lives in that step's own config; the top-level canonical `duration`/`ease` are genuinely inert (confirmed against anime.js's own source: Timeline recomputes its own duration from its children regardless, and `ease` isn't read by the underlying Timer class at all — only a separate `playbackEase` is). `loop`/`alternate`/`delay`, however, do still apply — they govern the whole timeline's repeat/reverse/start-delay behavior, since Timeline extends Timer and inherits those from the same top-level params.","properties":{"$ref":"#/$defs/sharedSchema100"},"additionalProperties":"warn"},"sharedSchema100":{"loop":{"type":"boolean","default":false},"steps":{"$ref":"#/$defs/sharedSchema101"}},"sharedSchema101":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/sharedSchema102"}},"sharedSchema102":{"type":"object","properties":{"$ref":"#/$defs/sharedSchema103"},"additionalProperties":true},"sharedSchema103":{"targets":{"type":"string","description":"CSS selector. Falls back to the element being animated if absent."},"params":{"type":"object","additionalProperties":true,"description":"Arbitrary anime.js props, e.g. scale/opacity."},"duration":{"type":"number","minimum":0},"offset":{"oneOf":[{"type":"number"},{"type":"string"}],"description":"'+=' relative, '<' overlap-with-previous, or an absolute ms number."}},"sharedSchema104":{"type":"object","description":"Params for the \"timeline-attention\" preset — 3-phase scale/shake/settle sequence. The top-level canonical `duration`/`ease` are genuinely inert (durations are hardcoded to the duration_* fields below, and each phase's easing is hardcoded in source with no override — confirmed via anime.js's own source that Timeline discards a top-level duration and never reads `ease` at all). Of the remaining canonical fields, only `loop` is actually forwarded by the preset factory (repeats the whole 3-phase sequence) — `alternate`/`delay` are never read by this preset's code despite being generically available on the Timeline class, so they were deliberately left out of this schema.","properties":{"$ref":"#/$defs/sharedSchema105"},"additionalProperties":"warn"},"sharedSchema105":{"loop":{"type":"boolean","default":false,"description":"Repeats the whole 3-phase sequence."},"scale_max":{"type":"number","minimum":1,"default":1.15},"shake_intensity":{"type":"number","minimum":0,"default":5,"description":"Used to build a fixed 5-point translateX keyframe array."},"duration_scale":{"type":"number","minimum":0,"default":200,"description":"Duration of phase 1 (scale up)."},"duration_shake":{"type":"number","minimum":0,"default":300,"description":"Duration of phase 2 (shake)."},"duration_settle":{"type":"number","minimum":0,"default":400,"description":"Duration of phase 3 (settle back)."}},"backgroundAnimationSchema":{"oneOf":{"$ref":"#/$defs/sharedSchema106"}},"sharedSchema106":[{"$ref":"#/$defs/sharedSchema107"},{"$ref":"#/$defs/sharedSchema424"}],"sharedSchema107":{"type":"array","description":"Background animation effects (bare array, no canvas inset)","items":{"$ref":"#/$defs/sharedSchema108"}},"sharedSchema108":{"type":"object","required":["preset"],"properties":{"$ref":"#/$defs/sharedSchema109"},"additionalProperties":false},"sharedSchema109":{"preset":{"type":"string","description":"Background animation preset name (e.g. grid, starfield, cascade)"},"config":{"$ref":"#/$defs/sharedSchema110"},"enabled":{"type":"boolean","description":"Set to false to disable this effect without removing it","default":true},"zoom":{"$ref":"#/$defs/sharedSchema423"}},"sharedSchema110":{"type":"object","discriminatedBy":{"$ref":"#/$defs/sharedSchema111"},"description":"Preset-specific configuration options. Shape depends on the sibling `preset` field. Supports entity-reactive values via map_range descriptor ({ map_range: { attribute, input, output } }) or template strings ([[[...]]]). entity_id defaults to the card-bound entity."},"sharedSchema111":{"field":"preset","schemas":{"$ref":"#/$defs/sharedSchema112"},"default":{"type":"object","additionalProperties":true}},"sharedSchema112":{"grid":{"$ref":"#/$defs/sharedSchema113"},"grid-diagonal":{"$ref":"#/$defs/sharedSchema149"},"grid-hexagonal":{"$ref":"#/$defs/sharedSchema165"},"starfield":{"$ref":"#/$defs/sharedSchema189"},"nebula":{"$ref":"#/$defs/sharedSchema216"},"contour-field":{"$ref":"#/$defs/sharedSchema243"},"cascade":{"$ref":"#/$defs/sharedSchema271"},"level":{"$ref":"#/$defs/sharedSchema299"},"fluid":{"$ref":"#/$defs/sharedSchema335"},"plasma":{"$ref":"#/$defs/sharedSchema349"},"flow":{"$ref":"#/$defs/sharedSchema363"},"shimmer":{"$ref":"#/$defs/sharedSchema377"},"scanlines":{"$ref":"#/$defs/sharedSchema389"},"image":{"$ref":"#/$defs/sharedSchema405"},"solid":{"$ref":"#/$defs/sharedSchema417"}},"sharedSchema113":{"type":"object","description":"Params for the \"grid\" preset — orthogonal scrolling grid with optional major/minor divisions.","properties":{"$ref":"#/$defs/sharedSchema114"},"additionalProperties":"warn"},"sharedSchema114":{"line_spacing":{"$ref":"#/$defs/sharedSchema115"},"num_rows":{"$ref":"#/$defs/sharedSchema117"},"num_cols":{"$ref":"#/$defs/sharedSchema119"},"line_width_minor":{"$ref":"#/$defs/sharedSchema121"},"line_width_major":{"$ref":"#/$defs/sharedSchema123"},"color":{"$ref":"#/$defs/sharedSchema125"},"color_major":{"$ref":"#/$defs/sharedSchema127"},"major_row_interval":{"$ref":"#/$defs/sharedSchema129"},"major_col_interval":{"$ref":"#/$defs/sharedSchema131"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema133"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema135"},"pattern":{"$ref":"#/$defs/sharedSchema137"},"dot_radius":{"$ref":"#/$defs/sharedSchema139"},"hex_radius":{"$ref":"#/$defs/sharedSchema141"},"show_border_lines":{"$ref":"#/$defs/sharedSchema143"},"fill_color":{"$ref":"#/$defs/sharedSchema145"},"opacity":{"$ref":"#/$defs/sharedSchema147"}},"sharedSchema115":{"oneOf":{"$ref":"#/$defs/sharedSchema116"}},"sharedSchema116":[{"type":"number","minimum":1,"default":40,"description":"Pixel spacing between minor lines. Confirmed unclamped in code — 0 or unset-with-falsy hangs the tile loop (Infinity tiles), hence the minimum."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema117":{"oneOf":{"$ref":"#/$defs/sharedSchema118"}},"sharedSchema118":[{"type":"integer","minimum":1,"maximum":100,"description":"Cell-based sizing alternative to line_spacing — exact row count."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema119":{"oneOf":{"$ref":"#/$defs/sharedSchema120"}},"sharedSchema120":[{"type":"integer","minimum":1,"maximum":100,"description":"Cell-based sizing alternative to line_spacing — exact column count."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema121":{"oneOf":{"$ref":"#/$defs/sharedSchema122"}},"sharedSchema122":[{"type":"number","minimum":0,"default":1,"description":"Minor line thickness in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema123":{"oneOf":{"$ref":"#/$defs/sharedSchema124"}},"sharedSchema124":[{"type":"number","minimum":0,"default":2,"description":"Major (emphasised) line thickness in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema125":{"oneOf":{"$ref":"#/$defs/sharedSchema126"}},"sharedSchema126":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Minor line color.","default":"rgba(255, 153, 102, 0.3)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema127":{"oneOf":{"$ref":"#/$defs/sharedSchema128"}},"sharedSchema128":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Major line color — falls back to color if unset."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema129":{"oneOf":{"$ref":"#/$defs/sharedSchema130"}},"sharedSchema130":[{"type":"integer","minimum":0,"default":0,"description":"Draw a major line every N rows (0 = disabled)."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema131":{"oneOf":{"$ref":"#/$defs/sharedSchema132"}},"sharedSchema132":[{"type":"integer","minimum":0,"default":0,"description":"Draw a major line every N columns (0 = disabled)."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema133":{"oneOf":{"$ref":"#/$defs/sharedSchema134"}},"sharedSchema134":[{"type":"number","default":20,"description":"Horizontal scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema135":{"oneOf":{"$ref":"#/$defs/sharedSchema136"}},"sharedSchema136":[{"type":"number","default":20,"description":"Vertical scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema137":{"oneOf":{"$ref":"#/$defs/sharedSchema138"}},"sharedSchema138":[{"type":"string","enum":["both","horizontal","vertical","diagonal","hexagonal","dots"],"default":"both","description":"Grid line pattern — all 6 values are fully working (GridEffect.js's _drawDotsPattern etc.), and all 6 are exposed in the editor's Pattern dropdown."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema139":{"oneOf":{"$ref":"#/$defs/sharedSchema140"}},"sharedSchema140":[{"type":"number","minimum":0,"default":2,"description":"Dot radius in px — only used when pattern is \"dots\"."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema141":{"oneOf":{"$ref":"#/$defs/sharedSchema142"}},"sharedSchema142":[{"type":"number","minimum":1,"default":40,"description":"Hexagon size in px — only used when pattern is \"hexagonal\". Unclamped in code — 0 collapses the hex tiling, hence the minimum."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema143":{"oneOf":{"$ref":"#/$defs/sharedSchema144"}},"sharedSchema144":[{"type":"boolean","default":true,"description":"Draw lines at canvas edges."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema145":{"oneOf":{"$ref":"#/$defs/sharedSchema146"}},"sharedSchema146":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Solid fill painted behind each cell.","default":"transparent"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema147":{"oneOf":{"$ref":"#/$defs/sharedSchema148"}},"sharedSchema148":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema149":{"type":"object","description":"Params for the \"grid-diagonal\" preset — 45° hatched variant of grid. Pattern is hardcoded to diagonal, not user-overridable.","properties":{"$ref":"#/$defs/sharedSchema150"},"additionalProperties":"warn"},"sharedSchema150":{"line_spacing":{"$ref":"#/$defs/sharedSchema151"},"line_width":{"$ref":"#/$defs/sharedSchema153"},"color":{"$ref":"#/$defs/sharedSchema155"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema157"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema159"},"fill_color":{"$ref":"#/$defs/sharedSchema161"},"opacity":{"$ref":"#/$defs/sharedSchema163"}},"sharedSchema151":{"oneOf":{"$ref":"#/$defs/sharedSchema152"}},"sharedSchema152":[{"type":"number","minimum":1,"default":30,"description":"Pixel spacing between lines. Unclamped in code — 0 hangs the tile loop, hence the minimum."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema153":{"oneOf":{"$ref":"#/$defs/sharedSchema154"}},"sharedSchema154":[{"type":"number","minimum":0,"default":1,"description":"Line thickness in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema155":{"oneOf":{"$ref":"#/$defs/sharedSchema156"}},"sharedSchema156":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Line color.","default":"rgba(255, 153, 102, 0.25)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema157":{"oneOf":{"$ref":"#/$defs/sharedSchema158"}},"sharedSchema158":[{"type":"number","default":15,"description":"Horizontal scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema159":{"oneOf":{"$ref":"#/$defs/sharedSchema160"}},"sharedSchema160":[{"type":"number","default":15,"description":"Vertical scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema161":{"oneOf":{"$ref":"#/$defs/sharedSchema162"}},"sharedSchema162":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Solid fill painted behind each cell.","default":"transparent"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema163":{"oneOf":{"$ref":"#/$defs/sharedSchema164"}},"sharedSchema164":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema165":{"type":"object","description":"Params for the \"grid-hexagonal\" preset — honeycomb hex-grid variant of grid. Pattern is hardcoded to hexagonal, not user-overridable.","properties":{"$ref":"#/$defs/sharedSchema166"},"additionalProperties":"warn"},"sharedSchema166":{"hex_radius":{"$ref":"#/$defs/sharedSchema167"},"line_width_minor":{"$ref":"#/$defs/sharedSchema169"},"line_width_major":{"$ref":"#/$defs/sharedSchema171"},"color":{"$ref":"#/$defs/sharedSchema173"},"color_major":{"$ref":"#/$defs/sharedSchema175"},"major_row_interval":{"$ref":"#/$defs/sharedSchema177"},"major_col_interval":{"$ref":"#/$defs/sharedSchema179"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema181"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema183"},"fill_color":{"$ref":"#/$defs/sharedSchema185"},"opacity":{"$ref":"#/$defs/sharedSchema187"}},"sharedSchema167":{"oneOf":{"$ref":"#/$defs/sharedSchema168"}},"sharedSchema168":[{"type":"number","minimum":1,"default":40,"description":"Hexagon size in px. Unclamped in code — 0 hangs the tile loop (patternWidth=0), hence the minimum."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema169":{"oneOf":{"$ref":"#/$defs/sharedSchema170"}},"sharedSchema170":[{"type":"number","minimum":0,"default":1,"description":"Minor line thickness in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema171":{"oneOf":{"$ref":"#/$defs/sharedSchema172"}},"sharedSchema172":[{"type":"number","minimum":0,"default":2,"description":"Major line thickness in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema173":{"oneOf":{"$ref":"#/$defs/sharedSchema174"}},"sharedSchema174":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Minor line color.","default":"rgba(255, 153, 102, 0.3)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema175":{"oneOf":{"$ref":"#/$defs/sharedSchema176"}},"sharedSchema176":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Major line color.","default":"rgba(255, 153, 102, 0.6)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema177":{"oneOf":{"$ref":"#/$defs/sharedSchema178"}},"sharedSchema178":[{"type":"integer","minimum":0,"default":3,"description":"Draw a major line every N rows."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema179":{"oneOf":{"$ref":"#/$defs/sharedSchema180"}},"sharedSchema180":[{"type":"integer","minimum":0,"default":3,"description":"Draw a major line every N columns."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema181":{"oneOf":{"$ref":"#/$defs/sharedSchema182"}},"sharedSchema182":[{"type":"number","default":20,"description":"Horizontal scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema183":{"oneOf":{"$ref":"#/$defs/sharedSchema184"}},"sharedSchema184":[{"type":"number","default":20,"description":"Vertical scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema185":{"oneOf":{"$ref":"#/$defs/sharedSchema186"}},"sharedSchema186":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Solid fill painted behind each cell.","default":"transparent"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema187":{"oneOf":{"$ref":"#/$defs/sharedSchema188"}},"sharedSchema188":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema189":{"type":"object","description":"Params for the \"starfield\" preset — scrolling parallax star field.","properties":{"$ref":"#/$defs/sharedSchema190"},"additionalProperties":"warn"},"sharedSchema190":{"seed":{"$ref":"#/$defs/sharedSchema191"},"count":{"$ref":"#/$defs/sharedSchema193"},"min_radius":{"$ref":"#/$defs/sharedSchema195"},"max_radius":{"$ref":"#/$defs/sharedSchema197"},"min_opacity":{"$ref":"#/$defs/sharedSchema199"},"max_opacity":{"$ref":"#/$defs/sharedSchema201"},"colors":{"$ref":"#/$defs/sharedSchema203"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema206"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema208"},"parallax_layers":{"$ref":"#/$defs/sharedSchema210"},"depth_factor":{"$ref":"#/$defs/sharedSchema212"},"opacity":{"$ref":"#/$defs/sharedSchema214"}},"sharedSchema191":{"oneOf":{"$ref":"#/$defs/sharedSchema192"}},"sharedSchema192":[{"type":"integer","description":"Random seed — same seed always generates the same star layout. Random by default when unset."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema193":{"oneOf":{"$ref":"#/$defs/sharedSchema194"}},"sharedSchema194":[{"type":"integer","minimum":0,"default":150,"description":"Number of stars."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema195":{"oneOf":{"$ref":"#/$defs/sharedSchema196"}},"sharedSchema196":[{"type":"number","minimum":0,"default":0.5,"description":"Smallest star radius in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema197":{"oneOf":{"$ref":"#/$defs/sharedSchema198"}},"sharedSchema198":[{"type":"number","minimum":0,"default":2,"description":"Largest star radius in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema199":{"oneOf":{"$ref":"#/$defs/sharedSchema200"}},"sharedSchema200":[{"type":"number","minimum":0,"maximum":1,"default":0.3,"description":"Dimmest star opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema201":{"oneOf":{"$ref":"#/$defs/sharedSchema202"}},"sharedSchema202":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Brightest star opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema203":{"oneOf":{"$ref":"#/$defs/sharedSchema204"}},"sharedSchema204":[{"$ref":"#/$defs/sharedSchema205"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema205":{"type":"array","items":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Colour value (hex, rgb, theme token, CSS variable, or a computed alpha()/lighten()/darken() expression)."},"default":["#ffffff"],"description":"Star color(s) — also accepts a single color via the legacy `color` field."},"sharedSchema206":{"oneOf":{"$ref":"#/$defs/sharedSchema207"}},"sharedSchema207":[{"type":"number","default":30,"description":"Horizontal scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema208":{"oneOf":{"$ref":"#/$defs/sharedSchema209"}},"sharedSchema209":[{"type":"number","default":0,"description":"Vertical scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema210":{"oneOf":{"$ref":"#/$defs/sharedSchema211"}},"sharedSchema211":[{"type":"integer","minimum":1,"maximum":5,"default":3,"description":"Number of depth layers — more layers = more depth. Clamped in code to 1-5."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema212":{"oneOf":{"$ref":"#/$defs/sharedSchema213"}},"sharedSchema213":[{"type":"number","minimum":0,"maximum":1,"default":0.5,"description":"Speed variation between layers. Clamped in code to 0-1."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema214":{"oneOf":{"$ref":"#/$defs/sharedSchema215"}},"sharedSchema215":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema216":{"type":"object","description":"Params for the \"nebula\" preset — layered Perlin-noise cloud blobs.","properties":{"$ref":"#/$defs/sharedSchema217"},"additionalProperties":"warn"},"sharedSchema217":{"seed":{"$ref":"#/$defs/sharedSchema218"},"cloud_count":{"$ref":"#/$defs/sharedSchema220"},"min_radius":{"$ref":"#/$defs/sharedSchema222"},"max_radius":{"$ref":"#/$defs/sharedSchema224"},"min_opacity":{"$ref":"#/$defs/sharedSchema226"},"max_opacity":{"$ref":"#/$defs/sharedSchema228"},"colors":{"$ref":"#/$defs/sharedSchema230"},"turbulence":{"$ref":"#/$defs/sharedSchema233"},"noise_scale":{"$ref":"#/$defs/sharedSchema235"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema237"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema239"},"opacity":{"$ref":"#/$defs/sharedSchema241"}},"sharedSchema218":{"oneOf":{"$ref":"#/$defs/sharedSchema219"}},"sharedSchema219":[{"type":"integer","description":"Random seed — same seed always generates the same cloud layout. Random by default when unset."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema220":{"oneOf":{"$ref":"#/$defs/sharedSchema221"}},"sharedSchema221":[{"type":"integer","minimum":1,"maximum":10,"default":4,"description":"Number of cloud blobs. Clamped in code to 1-10."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema222":{"oneOf":{"$ref":"#/$defs/sharedSchema223"}},"sharedSchema223":[{"type":"number","minimum":0,"maximum":1,"default":0.15,"description":"Smallest cloud radius, as a fraction of canvas size. Clamped in code to 0-1."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema224":{"oneOf":{"$ref":"#/$defs/sharedSchema225"}},"sharedSchema225":[{"type":"number","minimum":0,"maximum":1,"default":0.4,"description":"Largest cloud radius, as a fraction of canvas size. Clamped in code to 0-1."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema226":{"oneOf":{"$ref":"#/$defs/sharedSchema227"}},"sharedSchema227":[{"type":"number","minimum":0,"maximum":1,"default":0.3,"description":"Dimmest cloud opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema228":{"oneOf":{"$ref":"#/$defs/sharedSchema229"}},"sharedSchema229":[{"type":"number","minimum":0,"maximum":1,"default":0.8,"description":"Brightest cloud opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema230":{"oneOf":{"$ref":"#/$defs/sharedSchema231"}},"sharedSchema231":[{"$ref":"#/$defs/sharedSchema232"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema232":{"type":"array","items":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Colour value (hex, rgb, theme token, CSS variable, or a computed alpha()/lighten()/darken() expression)."},"default":["#FF00FF"],"description":"Cloud color(s) — also accepts a single color via the legacy `color` field."},"sharedSchema233":{"oneOf":{"$ref":"#/$defs/sharedSchema234"}},"sharedSchema234":[{"type":"number","minimum":0,"maximum":1,"default":0.5,"description":"How ragged/organic the cloud edges are. Clamped in code to 0-1."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema235":{"oneOf":{"$ref":"#/$defs/sharedSchema236"}},"sharedSchema236":[{"type":"number","minimum":0.0001,"default":0.003,"description":"Noise detail — lower = larger, smoother features."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema237":{"oneOf":{"$ref":"#/$defs/sharedSchema238"}},"sharedSchema238":[{"type":"number","default":5,"description":"Horizontal scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema239":{"oneOf":{"$ref":"#/$defs/sharedSchema240"}},"sharedSchema240":[{"type":"number","default":5,"description":"Vertical scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema241":{"oneOf":{"$ref":"#/$defs/sharedSchema242"}},"sharedSchema242":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema243":{"type":"object","description":"Params for the \"contour-field\" preset — topographic-style banded noise field. Defaults below are the REAL zero-config resolved values (verified against ContourFieldEffect.js/presets/index.js), not the sparser set previously shown in guide.params — the shipped default is a visible tinted fill with a 5-stop gradient, not transparent/single-color.","properties":{"$ref":"#/$defs/sharedSchema244"},"additionalProperties":"warn"},"sharedSchema244":{"seed":{"$ref":"#/$defs/sharedSchema245"},"noise_scale":{"$ref":"#/$defs/sharedSchema247"},"num_octaves":{"$ref":"#/$defs/sharedSchema249"},"num_bands":{"$ref":"#/$defs/sharedSchema251"},"cell_size":{"$ref":"#/$defs/sharedSchema253"},"fill_level":{"$ref":"#/$defs/sharedSchema255"},"fill_color":{"$ref":"#/$defs/sharedSchema257"},"blend_colors":{"$ref":"#/$defs/sharedSchema260"},"colors":{"$ref":"#/$defs/sharedSchema262"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema265"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema267"},"opacity":{"$ref":"#/$defs/sharedSchema269"}},"sharedSchema245":{"oneOf":{"$ref":"#/$defs/sharedSchema246"}},"sharedSchema246":[{"type":"integer","description":"Random seed — same seed + settings always generates the same field. Random by default when unset."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema247":{"oneOf":{"$ref":"#/$defs/sharedSchema248"}},"sharedSchema248":[{"type":"number","minimum":0.0001,"default":0.005,"description":"Smaller = a few large drifting blobs; larger = many small, busy ripples."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema249":{"oneOf":{"$ref":"#/$defs/sharedSchema250"}},"sharedSchema250":[{"type":"integer","minimum":1,"maximum":8,"default":2,"description":"Layers of fine detail — 1 = smooth blobs, 8 = rough, cloud-like fuzz. Clamped in code to 1-8."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema251":{"oneOf":{"$ref":"#/$defs/sharedSchema252"}},"sharedSchema252":[{"type":"integer","minimum":2,"maximum":64,"default":5,"description":"Low = bold stepped contour rings; high = a smooth, near-continuous gradient. Clamped in code to 2-64 — this floor is load-bearing (num_bands=1 divides by zero internally)."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema253":{"oneOf":{"$ref":"#/$defs/sharedSchema254"}},"sharedSchema254":[{"type":"integer","minimum":1,"maximum":16,"default":1,"description":"Sample resolution — larger is blockier/cheaper, smaller is crisper/costlier. Clamped in code to 1-16."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema255":{"oneOf":{"$ref":"#/$defs/sharedSchema256"}},"sharedSchema256":[{"type":"number","minimum":0,"maximum":0.95,"default":0.45,"description":"0 = no water, full terrain visible; raise it to flood the lowest rings. Clamped in code to 0-0.95."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema257":{"oneOf":{"$ref":"#/$defs/sharedSchema258"}},"sharedSchema258":[{"$ref":"#/$defs/sharedSchema259"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema259":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Color painted over flooded rings. Real zero-config default resolves to this (the var()-token fallback's literal hex/alpha equivalent) — leave unset only if you actually want it, \"leave empty for transparency\" in older docs was misleading since fill_level defaults to a non-zero 0.45.","default":"rgba(19, 11, 129, 0.3)"},"sharedSchema260":{"oneOf":{"$ref":"#/$defs/sharedSchema261"}},"sharedSchema261":[{"type":"boolean","default":true,"description":"On = colors fade smoothly between rings; off = hard-cutoff flat rings."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema262":{"oneOf":{"$ref":"#/$defs/sharedSchema263"}},"sharedSchema263":[{"$ref":"#/$defs/sharedSchema264"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema264":{"type":"array","items":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Colour value (hex, rgb, theme token, CSS variable, or a computed alpha()/lighten()/darken() expression)."},"default":["alpha(#130b81, 0.08)","alpha(#130b81, 0.25)","alpha(#130b81, 0.42)","alpha(#130b81, 0.62)","alpha(#130b81, 0.80)"],"description":"One color, or several stops spread across the full contour range. Default shown here is the exact shipped default (5 alpha-graded stops of the same base hue)."},"sharedSchema265":{"oneOf":{"$ref":"#/$defs/sharedSchema266"}},"sharedSchema266":[{"type":"number","default":-3,"description":"Horizontal scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema267":{"oneOf":{"$ref":"#/$defs/sharedSchema268"}},"sharedSchema268":[{"type":"number","default":0.45,"description":"Vertical scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema269":{"oneOf":{"$ref":"#/$defs/sharedSchema270"}},"sharedSchema270":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema271":{"type":"object","description":"Params for the \"cascade\" preset — LCARS waterfall colour-cycling data grid. A single instance changes every matched cell in sync (mode: css's delay is one flat value) — the row-by-row \"waterfall\" look (including the niagara timing pattern) requires declaring multiple separate instances, one per row; see lcards-data-grid's animation.pattern option, which automates that.","properties":{"$ref":"#/$defs/sharedSchema272"},"additionalProperties":"warn"},"sharedSchema272":{"num_rows":{"$ref":"#/$defs/sharedSchema273"},"num_cols":{"$ref":"#/$defs/sharedSchema275"},"format":{"$ref":"#/$defs/sharedSchema277"},"pattern":{"$ref":"#/$defs/sharedSchema279"},"speed_multiplier":{"$ref":"#/$defs/sharedSchema282"},"colors":{"$ref":"#/$defs/sharedSchema284"},"font_size":{"$ref":"#/$defs/sharedSchema289"},"gap":{"$ref":"#/$defs/sharedSchema291"},"refresh_interval":{"$ref":"#/$defs/sharedSchema293"},"duration":{"$ref":"#/$defs/sharedSchema295"},"opacity":{"$ref":"#/$defs/sharedSchema297"}},"sharedSchema273":{"oneOf":{"$ref":"#/$defs/sharedSchema274"}},"sharedSchema274":[{"type":"integer","minimum":1,"description":"Explicit row count. Unclamped in code — 0 or negative throws a RangeError, hence the minimum."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema275":{"oneOf":{"$ref":"#/$defs/sharedSchema276"}},"sharedSchema276":[{"type":"integer","minimum":1,"description":"Explicit column count. Unclamped in code — 0 or negative throws a RangeError, hence the minimum."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema277":{"oneOf":{"$ref":"#/$defs/sharedSchema278"}},"sharedSchema278":[{"type":"string","enum":["digit","float","alpha","hex","mixed"],"default":"hex","description":"Character set. Confirmed real enum from code — guide.params only vaguely said \"hex digits\" without enumerating the other 4."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema279":{"oneOf":{"$ref":"#/$defs/sharedSchema280"}},"sharedSchema280":[{"$ref":"#/$defs/sharedSchema281"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema281":{"type":"string","enum":["default","niagara","fast","custom"],"default":"default","description":"\"default\" = authentic LCARS rhythm, \"niagara\" = uniform waterfall, \"fast\", or \"custom\" (requires a hand-authored `timing` array, YAML only). Unrecognized values silently fall back to \"default\"."},"sharedSchema282":{"oneOf":{"$ref":"#/$defs/sharedSchema283"}},"sharedSchema283":[{"type":"number","minimum":0.1,"default":1,"description":"Overall cycling speed multiplier. Unclamped in code — 0 makes the cycle duration Infinity (frozen), hence the practical floor."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema284":{"oneOf":{"$ref":"#/$defs/sharedSchema285"}},"sharedSchema285":[{"$ref":"#/$defs/sharedSchema286"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema286":{"type":"object","description":"The three-stop color cycle. Real runtime shape is a genuinely nested object (config.colors.start/text/end), not flattened keys.","properties":{"$ref":"#/$defs/sharedSchema287"},"additionalProperties":false},"sharedSchema287":{"start":{"$ref":"#/$defs/sharedSchema288"},"text":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Color a cell settles at mid-cycle. Concrete equivalent of var(--lcards-blue-darkest, #002241).","default":"#002241"},"end":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Color a cell ends at. Concrete equivalent of var(--lcards-moonlight, #dfe1e8).","default":"#dfe1e8"}},"sharedSchema288":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Color a cell starts at. Shown here as the concrete hex equivalent of the real fallback (var(--lcards-blue-light, #93e1ff)).","default":"#93e1ff"},"sharedSchema289":{"oneOf":{"$ref":"#/$defs/sharedSchema290"}},"sharedSchema290":[{"type":"number","minimum":1,"default":10,"description":"Character font size in px. Unclamped — 0 combined with gap:0 throws a RangeError, hence the minimum."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema291":{"oneOf":{"$ref":"#/$defs/sharedSchema292"}},"sharedSchema292":[{"type":"number","minimum":0,"default":4,"description":"Spacing between cells in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema293":{"oneOf":{"$ref":"#/$defs/sharedSchema294"}},"sharedSchema294":[{"type":"integer","minimum":0,"default":0,"description":"How often cells re-randomize, in ms (0 = continuous)."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema295":{"oneOf":{"$ref":"#/$defs/sharedSchema296"}},"sharedSchema296":[{"type":"integer","minimum":1,"description":"Explicit cycle duration override in ms."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema297":{"oneOf":{"$ref":"#/$defs/sharedSchema298"}},"sharedSchema298":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema299":{"type":"object","description":"Params for the \"level\" preset — animated tank/gauge fill bar.","properties":{"$ref":"#/$defs/sharedSchema300"},"additionalProperties":"warn"},"sharedSchema300":{"color_a":{"$ref":"#/$defs/sharedSchema301"},"color_b":{"$ref":"#/$defs/sharedSchema303"},"gradient_crossover":{"$ref":"#/$defs/sharedSchema305"},"fill_pct":{"$ref":"#/$defs/sharedSchema307"},"direction":{"$ref":"#/$defs/sharedSchema309"},"edge_glow":{"$ref":"#/$defs/sharedSchema311"},"edge_glow_color":{"$ref":"#/$defs/sharedSchema313"},"edge_glow_width":{"$ref":"#/$defs/sharedSchema315"},"wave_height":{"$ref":"#/$defs/sharedSchema317"},"wave_speed":{"$ref":"#/$defs/sharedSchema319"},"wave_count":{"$ref":"#/$defs/sharedSchema321"},"wave2_height":{"$ref":"#/$defs/sharedSchema323"},"wave2_count":{"$ref":"#/$defs/sharedSchema325"},"wave2_speed":{"$ref":"#/$defs/sharedSchema327"},"slosh_amount":{"$ref":"#/$defs/sharedSchema329"},"slosh_period":{"$ref":"#/$defs/sharedSchema331"},"opacity":{"$ref":"#/$defs/sharedSchema333"}},"sharedSchema301":{"oneOf":{"$ref":"#/$defs/sharedSchema302"}},"sharedSchema302":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Primary fill color (or gradient start).","default":"rgba(0,200,100,0.7)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema303":{"oneOf":{"$ref":"#/$defs/sharedSchema304"}},"sharedSchema304":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Gradient end color — omit for a flat fill."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema305":{"oneOf":{"$ref":"#/$defs/sharedSchema306"}},"sharedSchema306":[{"type":"number","minimum":0,"maximum":100,"default":80,"description":"Percent of fill height where the gradient crosses over. Clamped in code to 0-100."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema307":{"oneOf":{"$ref":"#/$defs/sharedSchema308"}},"sharedSchema308":[{"type":"number","minimum":0,"maximum":100,"default":50,"description":"Fill level, 0-100. Clamped in code."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema309":{"oneOf":{"$ref":"#/$defs/sharedSchema310"}},"sharedSchema310":[{"type":"string","enum":["up","down","left","right"],"default":"up","description":"Fill direction — all 4 values render correctly ('down'/'left' are implemented as a Canvas2D mirror of the 'up'/'right' geometry)."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema311":{"oneOf":{"$ref":"#/$defs/sharedSchema312"}},"sharedSchema312":[{"type":"boolean","default":true,"description":"Whether to draw a glow along the fill edge."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema313":{"oneOf":{"$ref":"#/$defs/sharedSchema314"}},"sharedSchema314":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Edge glow color.","default":"rgba(255,255,255,0.7)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema315":{"oneOf":{"$ref":"#/$defs/sharedSchema316"}},"sharedSchema316":[{"type":"number","minimum":0,"default":6,"description":"Edge glow width in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema317":{"oneOf":{"$ref":"#/$defs/sharedSchema318"}},"sharedSchema318":[{"type":"number","minimum":0,"default":4,"description":"Primary wave amplitude in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema319":{"oneOf":{"$ref":"#/$defs/sharedSchema320"}},"sharedSchema320":[{"type":"number","default":20,"description":"Primary wave speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema321":{"oneOf":{"$ref":"#/$defs/sharedSchema322"}},"sharedSchema322":[{"type":"integer","minimum":1,"default":4,"description":"Primary wave count across the width. Not rounded in code if fractional — a non-integer produces a visible seam at the wrap edge, hence typed integer here."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema323":{"oneOf":{"$ref":"#/$defs/sharedSchema324"}},"sharedSchema324":[{"type":"number","minimum":0,"default":0,"description":"Secondary wave amplitude in px (0 = disabled)."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema325":{"oneOf":{"$ref":"#/$defs/sharedSchema326"}},"sharedSchema326":[{"type":"integer","minimum":1,"default":5,"description":"Secondary wave count. Same integer-only reasoning as wave_count."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema327":{"oneOf":{"$ref":"#/$defs/sharedSchema328"}},"sharedSchema328":[{"type":"number","default":-15,"description":"Secondary wave speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema329":{"oneOf":{"$ref":"#/$defs/sharedSchema330"}},"sharedSchema330":[{"type":"number","minimum":0,"maximum":1,"default":0,"description":"Sloshing displacement amount (0 = disabled). Clamped in code to 0-1."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema331":{"oneOf":{"$ref":"#/$defs/sharedSchema332"}},"sharedSchema332":[{"type":"number","minimum":0.5,"default":3,"description":"Sloshing cycle period in seconds. Code enforces an effective 0.5 floor (Math.max(0.5, ...))."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema333":{"oneOf":{"$ref":"#/$defs/sharedSchema334"}},"sharedSchema334":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema335":{"type":"object","description":"Params for the \"fluid\" preset — swirling single-colour noise wash.","properties":{"$ref":"#/$defs/sharedSchema336"},"additionalProperties":"warn"},"sharedSchema336":{"color":{"$ref":"#/$defs/sharedSchema337"},"base_frequency":{"$ref":"#/$defs/sharedSchema339"},"num_octaves":{"$ref":"#/$defs/sharedSchema341"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema343"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema345"},"opacity":{"$ref":"#/$defs/sharedSchema347"}},"sharedSchema337":{"oneOf":{"$ref":"#/$defs/sharedSchema338"}},"sharedSchema338":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Wash color.","default":"rgba(100,180,255,0.8)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema339":{"oneOf":{"$ref":"#/$defs/sharedSchema340"}},"sharedSchema340":[{"type":"number","minimum":0.0001,"default":0.01,"description":"Noise detail — lower = larger features."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema341":{"oneOf":{"$ref":"#/$defs/sharedSchema342"}},"sharedSchema342":[{"type":"integer","minimum":1,"maximum":8,"default":4,"description":"Layers of noise detail — perf cost scales with this, practical max ~8."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema343":{"oneOf":{"$ref":"#/$defs/sharedSchema344"}},"sharedSchema344":[{"type":"number","default":7,"description":"Horizontal drift speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema345":{"oneOf":{"$ref":"#/$defs/sharedSchema346"}},"sharedSchema346":[{"type":"number","default":10,"description":"Vertical drift speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema347":{"oneOf":{"$ref":"#/$defs/sharedSchema348"}},"sharedSchema348":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema349":{"type":"object","description":"Params for the \"plasma\" preset — two-colour plasma noise bands.","properties":{"$ref":"#/$defs/sharedSchema350"},"additionalProperties":"warn"},"sharedSchema350":{"color_a":{"$ref":"#/$defs/sharedSchema351"},"color_b":{"$ref":"#/$defs/sharedSchema353"},"base_frequency":{"$ref":"#/$defs/sharedSchema355"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema357"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema359"},"opacity":{"$ref":"#/$defs/sharedSchema361"}},"sharedSchema351":{"oneOf":{"$ref":"#/$defs/sharedSchema352"}},"sharedSchema352":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"First plasma color.","default":"rgba(80,0,255,0.9)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema353":{"oneOf":{"$ref":"#/$defs/sharedSchema354"}},"sharedSchema354":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Second plasma color.","default":"rgba(255,40,120,0.9)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema355":{"oneOf":{"$ref":"#/$defs/sharedSchema356"}},"sharedSchema356":[{"type":"number","minimum":0.0001,"default":0.012,"description":"Noise detail — lower = larger features."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema357":{"oneOf":{"$ref":"#/$defs/sharedSchema358"}},"sharedSchema358":[{"type":"number","default":8,"description":"Horizontal drift speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema359":{"oneOf":{"$ref":"#/$defs/sharedSchema360"}},"sharedSchema360":[{"type":"number","default":5,"description":"Vertical drift speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema361":{"oneOf":{"$ref":"#/$defs/sharedSchema362"}},"sharedSchema362":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema363":{"type":"object","description":"Params for the \"flow\" preset — directional streaming noise streaks.","properties":{"$ref":"#/$defs/sharedSchema364"},"additionalProperties":"warn"},"sharedSchema364":{"color":{"$ref":"#/$defs/sharedSchema365"},"base_frequency":{"$ref":"#/$defs/sharedSchema367"},"wave_scale":{"$ref":"#/$defs/sharedSchema369"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema371"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema373"},"opacity":{"$ref":"#/$defs/sharedSchema375"}},"sharedSchema365":{"oneOf":{"$ref":"#/$defs/sharedSchema366"}},"sharedSchema366":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Streak color.","default":"rgba(0,200,255,0.7)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema367":{"oneOf":{"$ref":"#/$defs/sharedSchema368"}},"sharedSchema368":[{"type":"number","minimum":0.0001,"default":0.012,"description":"Noise detail — lower = larger features."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema369":{"oneOf":{"$ref":"#/$defs/sharedSchema370"}},"sharedSchema370":[{"type":"number","minimum":0,"default":8,"description":"Streak waviness."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema371":{"oneOf":{"$ref":"#/$defs/sharedSchema372"}},"sharedSchema372":[{"type":"number","default":50,"description":"Horizontal stream speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema373":{"oneOf":{"$ref":"#/$defs/sharedSchema374"}},"sharedSchema374":[{"type":"number","default":0,"description":"Vertical stream speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema375":{"oneOf":{"$ref":"#/$defs/sharedSchema376"}},"sharedSchema376":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema377":{"type":"object","description":"Params for the \"shimmer\" preset — sweeping highlight band.","properties":{"$ref":"#/$defs/sharedSchema378"},"additionalProperties":"warn"},"sharedSchema378":{"color":{"$ref":"#/$defs/sharedSchema379"},"highlight_width":{"$ref":"#/$defs/sharedSchema381"},"speed":{"$ref":"#/$defs/sharedSchema383"},"angle":{"$ref":"#/$defs/sharedSchema385"},"opacity":{"$ref":"#/$defs/sharedSchema387"}},"sharedSchema379":{"oneOf":{"$ref":"#/$defs/sharedSchema380"}},"sharedSchema380":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Highlight color.","default":"rgba(255,255,255,0.55)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema381":{"oneOf":{"$ref":"#/$defs/sharedSchema382"}},"sharedSchema382":[{"type":"number","minimum":0,"default":0.35,"description":"Band width as a fraction of canvas size."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema383":{"oneOf":{"$ref":"#/$defs/sharedSchema384"}},"sharedSchema384":[{"type":"number","default":2.5,"description":"Sweep speed."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema385":{"oneOf":{"$ref":"#/$defs/sharedSchema386"}},"sharedSchema386":[{"type":"number","minimum":0,"maximum":360,"default":30,"description":"Sweep angle in degrees. Unbounded in code (raw sin/cos of the angle) but periodic, so 0-360 is the sensible UI range."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema387":{"oneOf":{"$ref":"#/$defs/sharedSchema388"}},"sharedSchema388":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema389":{"type":"object","description":"Params for the \"scanlines\" preset — static CRT-style scanline overlay.","properties":{"$ref":"#/$defs/sharedSchema390"},"additionalProperties":"warn"},"sharedSchema390":{"color":{"$ref":"#/$defs/sharedSchema391"},"line_spacing":{"$ref":"#/$defs/sharedSchema393"},"line_width":{"$ref":"#/$defs/sharedSchema395"},"direction":{"$ref":"#/$defs/sharedSchema397"},"scroll_speed_x":{"$ref":"#/$defs/sharedSchema399"},"scroll_speed_y":{"$ref":"#/$defs/sharedSchema401"},"opacity":{"$ref":"#/$defs/sharedSchema403"}},"sharedSchema391":{"oneOf":{"$ref":"#/$defs/sharedSchema392"}},"sharedSchema392":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Scanline color.","default":"rgba(0,0,0,0.25)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema393":{"oneOf":{"$ref":"#/$defs/sharedSchema394"}},"sharedSchema394":[{"type":"number","minimum":1,"default":4,"description":"Pixel spacing between lines."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema395":{"oneOf":{"$ref":"#/$defs/sharedSchema396"}},"sharedSchema396":[{"type":"number","minimum":0,"default":1.5,"description":"Line thickness in px."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema397":{"oneOf":{"$ref":"#/$defs/sharedSchema398"}},"sharedSchema398":[{"type":"string","enum":["horizontal","vertical"],"default":"horizontal","description":"Both values confirmed correctly implemented in code."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema399":{"oneOf":{"$ref":"#/$defs/sharedSchema400"}},"sharedSchema400":[{"type":"number","default":0,"description":"Horizontal scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema401":{"oneOf":{"$ref":"#/$defs/sharedSchema402"}},"sharedSchema402":[{"type":"number","default":0,"description":"Vertical scroll speed in px/s."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema403":{"oneOf":{"$ref":"#/$defs/sharedSchema404"}},"sharedSchema404":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema405":{"type":"object","description":"Params for the \"image\" preset — user-supplied image rendered behind the full card area. Field is `source` (not `url` — a page of docs previously used `url` throughout, which never worked; fixed).","properties":{"$ref":"#/$defs/sharedSchema406"},"additionalProperties":"warn"},"sharedSchema406":{"source":{"$ref":"#/$defs/sharedSchema407"},"size":{"$ref":"#/$defs/sharedSchema409"},"position":{"$ref":"#/$defs/sharedSchema411"},"repeat":{"$ref":"#/$defs/sharedSchema413"},"opacity":{"$ref":"#/$defs/sharedSchema415"}},"sharedSchema407":{"oneOf":{"$ref":"#/$defs/sharedSchema408"}},"sharedSchema408":[{"type":"string","default":"","description":"/local/ path, https:// URL, builtin:<key> reference, media-source://… content ID, or a template string (e.g. entity_picture)."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema409":{"oneOf":{"$ref":"#/$defs/sharedSchema410"}},"sharedSchema410":[{"oneOf":[{"type":"string","enum":["cover","contain","fill"]},{"type":"string","pattern":"^\\d+px$"}],"default":"cover","description":"\"cover\"/\"contain\"/\"fill\", or an explicit \"<n>px\" size for the shorter axis. Any other string silently falls back to \"cover\"."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema411":{"oneOf":{"$ref":"#/$defs/sharedSchema412"}},"sharedSchema412":[{"type":"string","default":"center","description":"CSS background-position string. Not enum-validated in code — free-form."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema413":{"oneOf":{"$ref":"#/$defs/sharedSchema414"}},"sharedSchema414":[{"type":"boolean","default":false,"description":"Tile the image instead of scaling it."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema415":{"oneOf":{"$ref":"#/$defs/sharedSchema416"}},"sharedSchema416":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Overall effect opacity."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema417":{"type":"object","description":"Params for the \"solid\" preset — flat single-colour fill, the cheapest background preset (no procedural noise).","properties":{"$ref":"#/$defs/sharedSchema418"},"additionalProperties":"warn"},"sharedSchema418":{"color":{"$ref":"#/$defs/sharedSchema419"},"opacity":{"$ref":"#/$defs/sharedSchema421"}},"sharedSchema419":{"oneOf":{"$ref":"#/$defs/sharedSchema420"}},"sharedSchema420":[{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--|alpha\\(|lighten\\(|darken\\()","description":"Fill color — the alpha channel controls how much shows through base_svg.","default":"rgba(0, 0, 0, 0.4)"},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema421":{"oneOf":{"$ref":"#/$defs/sharedSchema422"}},"sharedSchema422":[{"type":"number","minimum":0,"maximum":1,"default":1,"description":"Multiplies with any alpha already present in color."},{"type":"string","description":"Template string, evaluated on every HASS update."},{"type":"object","properties":{"template":{"type":"string","required":true},"default":{}},"additionalProperties":false},{"type":"object","properties":{"map_range":{"type":"object","additionalProperties":true,"required":true}},"additionalProperties":false}],"sharedSchema423":{"type":"object","description":"Optional zoom wrapper — creates layered depth effect","properties":{"layers":{"type":"number","minimum":1,"default":4},"scale_from":{"type":"number","default":0.5},"scale_to":{"type":"number","default":2},"duration":{"type":"number","default":15},"opacity_fade_in":{"type":"number","default":15},"opacity_fade_out":{"type":"number","default":75}}},"sharedSchema424":{"type":"object","description":"Background animation with canvas-level inset","required":["effects"],"properties":{"$ref":"#/$defs/sharedSchema425"},"additionalProperties":false},"sharedSchema425":{"inset":{"$ref":"#/$defs/sharedSchema426"},"effects":{"$ref":"#/$defs/sharedSchema429"}},"sharedSchema426":{"oneOf":{"$ref":"#/$defs/sharedSchema427"}},"sharedSchema427":[{"type":"string","enum":["auto"],"description":"Auto-compute inset from card geometry (elbow cards only)"},{"$ref":"#/$defs/sharedSchema428"}],"sharedSchema428":{"type":"object","description":"Per-side pixel inset for the animation canvas","properties":{"top":{"type":"number","minimum":0,"default":0},"right":{"type":"number","minimum":0,"default":0},"bottom":{"type":"number","minimum":0,"default":0},"left":{"type":"number","minimum":0,"default":0}},"additionalProperties":false},"sharedSchema429":{"type":"array","description":"Stack of background effects rendered in order (bottom → top)","items":{"$ref":"#/$defs/sharedSchema108"}},"filterSchema":{"type":"object","description":"Filter configuration (CSS or SVG filter primitives)","examples":[{"mode":"css","type":"blur","value":{"blur":2}}],"properties":{"$ref":"#/$defs/sharedSchema430"},"required":["type"]},"sharedSchema430":{"mode":{"$ref":"#/$defs/sharedSchema431"},"type":{"type":"string","description":"Filter type - depends on mode (CSS: blur, brightness, etc. / SVG: feGaussianBlur, feColorMatrix, etc.)"},"value":{"$ref":"#/$defs/sharedSchema432"}},"sharedSchema431":{"type":"string","enum":["css","svg"],"default":"css","description":"Filter mode - CSS filters or SVG filter primitives","enumDescriptions":["CSS filters (blur, brightness, contrast, etc.) - simpler, good performance","SVG filter primitives (feGaussianBlur, feColorMatrix, etc.) - more powerful, complex effects"]},"sharedSchema432":{"discriminatedBy":{"$ref":"#/$defs/sharedSchema433"},"description":"Filter parameters - shape depends on the sibling `type` field. Simple value for CSS filters, object for SVG filters."},"sharedSchema433":{"field":"type","schemas":{"$ref":"#/$defs/sharedSchema434"},"default":{"oneOf":[{"type":"string","description":"Simple value for CSS filters (e.g., \"5px\", \"1.5\", \"180deg\")"},{"type":"number","description":"Numeric value for CSS filters (e.g., 1.5, 0.8)"},{"type":"object","description":"Object parameters for SVG filters","additionalProperties":true}]}},"sharedSchema434":{"blur":{"type":"string","default":"0px","pattern":"^\\d+(\\.\\d+)?px$","description":"Gaussian blur radius, a CSS length in px."},"brightness":{"type":"number","minimum":0,"default":1,"description":"0 = black, 1 = normal, 2+ = brighter. No hard ceiling in code — 3 is a practical UI limit."},"contrast":{"type":"number","minimum":0,"default":1,"description":"0 = gray, 1 = normal, 2+ = higher contrast. No hard ceiling in code — 3 is a practical UI limit."},"saturate":{"type":"number","minimum":0,"default":1,"description":"0 = grayscale, 1 = normal, 2+ = oversaturated. No hard ceiling in code — 3 is a practical UI limit."},"hue-rotate":{"type":"string","default":"0deg","pattern":"^-?\\d+(\\.\\d+)?deg$","description":"Angle to rotate hue by, a CSS angle in deg (0-360 is the meaningful range; it wraps beyond that)."},"grayscale":{"type":"number","minimum":0,"maximum":1,"default":0,"description":"0 = full color, 1 = complete grayscale. CSS-spec-clamped to 0-1."},"sepia":{"type":"number","minimum":0,"maximum":1,"default":0,"description":"0 = normal, 1 = full sepia tone. CSS-spec-clamped to 0-1."},"invert":{"type":"number","minimum":0,"maximum":1,"default":0,"description":"0 = normal, 1 = fully inverted. CSS-spec-clamped to 0-1."},"opacity":{"type":"number","minimum":0,"maximum":1,"default":1,"description":"0 = fully transparent, 1 = fully opaque. CSS-spec-clamped to 0-1 — values above 1 have no additional effect."},"drop-shadow":{"$ref":"#/$defs/sharedSchema435"},"feGaussianBlur":{"type":"object","description":"SVG Gaussian blur — smoother than CSS blur, chains with other SVG filters.","properties":{"stdDeviation":{"type":"number","minimum":0,"default":0,"description":"Amount of blur — 0 = none, higher = more blur."}},"additionalProperties":false},"feColorMatrix":{"$ref":"#/$defs/sharedSchema437"},"feOffset":{"$ref":"#/$defs/sharedSchema441"},"feBlend":{"$ref":"#/$defs/sharedSchema442"},"feComposite":{"$ref":"#/$defs/sharedSchema445"},"feMorphology":{"$ref":"#/$defs/sharedSchema447"},"feTurbulence":{"$ref":"#/$defs/sharedSchema448"},"feDisplacementMap":{"$ref":"#/$defs/sharedSchema450"},"tint":{"$ref":"#/$defs/sharedSchema452"}},"sharedSchema435":{"type":"object","description":"Drop shadow behind the element.","properties":{"$ref":"#/$defs/sharedSchema436"},"additionalProperties":false},"sharedSchema436":{"x":{"type":"number","default":0,"description":"Horizontal offset in px."},"y":{"type":"number","default":0,"description":"Vertical offset in px."},"blur":{"type":"string","default":"0px","pattern":"^\\d+(\\.\\d+)?px$","description":"Shadow blur radius, a CSS length in px."},"color":{"type":"string","default":"#000000","description":"Shadow color."}},"sharedSchema437":{"type":"object","description":"Color transformation via matrix operations — hue rotation, saturation, luminance-to-alpha, or a custom 4x5 matrix.","properties":{"$ref":"#/$defs/sharedSchema438"},"additionalProperties":false},"sharedSchema438":{"type":{"type":"string","default":"saturate","enum":["matrix","saturate","hueRotate","luminanceToAlpha"],"description":"Matrix operation type."},"values":{"$ref":"#/$defs/sharedSchema439"}},"sharedSchema439":{"default":1,"oneOf":{"$ref":"#/$defs/sharedSchema440"},"description":"Meaning depends on `type`. Not used when type is luminanceToAlpha."},"sharedSchema440":[{"type":"number","description":"Saturation multiplier (type: saturate) or hue-rotate angle in degrees (type: hueRotate)."},{"type":"string","description":"Space-separated 4x5 matrix — 20 numbers (type: matrix)."},{"type":"array","items":{"type":"number"},"description":"4x5 matrix as an array — 20 numbers (type: matrix)."}],"sharedSchema441":{"type":"object","description":"Shifts the filter result by dx/dy pixels — combine with blur for shadow effects.","properties":{"dx":{"type":"number","default":0,"description":"Horizontal offset — positive = right, negative = left."},"dy":{"type":"number","default":0,"description":"Vertical offset — positive = down, negative = up."}},"additionalProperties":false},"sharedSchema442":{"type":"object","description":"Blends the current filter result with SourceGraphic using a standard CSS blend mode.","properties":{"$ref":"#/$defs/sharedSchema443"},"additionalProperties":false},"sharedSchema443":{"mode":{"$ref":"#/$defs/sharedSchema444"}},"sharedSchema444":{"type":"string","default":"normal","enum":["normal","multiply","screen","darken","lighten","overlay","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],"description":"Blend mode — try screen/lighten after a blur for glow effects."},"sharedSchema445":{"type":"object","description":"Combines the previous filter result and SourceGraphic using a Porter-Duff operator, or a custom arithmetic formula.","properties":{"$ref":"#/$defs/sharedSchema446"},"additionalProperties":false},"sharedSchema446":{"operator":{"type":"string","default":"over","enum":["over","in","out","atop","xor","arithmetic"],"description":"Compositing operator."},"k1":{"type":"number","default":0,"description":"Arithmetic coefficient — only used when operator is arithmetic. result = k1*i1*i2 + k2*i1 + k3*i2 + k4."},"k2":{"type":"number","default":0,"description":"Arithmetic coefficient — only used when operator is arithmetic."},"k3":{"type":"number","default":0,"description":"Arithmetic coefficient — only used when operator is arithmetic."},"k4":{"type":"number","default":0,"description":"Arithmetic coefficient — only used when operator is arithmetic."}},"sharedSchema447":{"type":"object","description":"Erodes (thins) or dilates (fattens) shapes — useful for outlines or edge-thickness adjustment.","properties":{"operator":{"type":"string","default":"erode","enum":["erode","dilate"],"description":"'erode' thins shapes, 'dilate' fattens them."},"radius":{"type":"number","minimum":0,"default":1,"description":"How far to erode/dilate, in filter units."}},"additionalProperties":false},"sharedSchema448":{"type":"object","description":"Generates Perlin noise for organic textures — commonly paired with feDisplacementMap.","properties":{"$ref":"#/$defs/sharedSchema449"},"additionalProperties":false},"sharedSchema449":{"type":{"type":"string","default":"turbulence","enum":["turbulence","fractalNoise"],"description":"'turbulence' (cloudy) | 'fractalNoise' (softer)."},"baseFrequency":{"type":"number","minimum":0,"maximum":1,"default":0.05,"description":"Noise detail — lower = larger features."},"numOctaves":{"type":"integer","minimum":1,"maximum":10,"default":1,"description":"Layers of noise detail."},"seed":{"type":"number","default":0,"description":"Randomization seed — change for a different pattern."}},"sharedSchema450":{"type":"object","description":"Warps the image based on color values from a preceding source (typically feTurbulence) — wavy/liquid/turbulent distortion.","properties":{"$ref":"#/$defs/sharedSchema451"},"additionalProperties":false},"sharedSchema451":{"scale":{"type":"number","minimum":0,"default":10,"description":"Displacement strength — higher = more distortion."},"xChannelSelector":{"type":"string","default":"R","enum":["R","G","B","A"],"description":"Color channel driving horizontal displacement."},"yChannelSelector":{"type":"string","default":"G","enum":["R","G","B","A"],"description":"Color channel driving vertical displacement."}},"sharedSchema452":{"type":"object","description":"Composites a flat color wash over the content — a cheap alert/status tint. Requires an SVG root (not supported on data-grid).","properties":{"color":{"type":"string","default":"rgba(0,0,0,0.4)","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Tint color — the alpha channel controls how much content shows through."}},"additionalProperties":false},"stateClassificationSchema":{"type":"object","description":"Override how raw entity states are mapped to style buckets. Use built-in buckets (active/inactive/default) or define your own named buckets. Explicit state keys in style config always take priority over this.","properties":{"$ref":"#/$defs/sharedSchema453"},"additionalProperties":{"type":"array","items":{"type":"string"},"description":"Custom bucket: an array of raw entity states that map to this bucket name."}},"sharedSchema453":{"active":{"type":"array","items":{"type":"string"},"description":"Additional states to classify as \"active\" (augments the built-in active list).","examples":[["home","work","gym"]]},"inactive":{"type":"array","items":{"type":"string"},"description":"States to explicitly classify as \"inactive\".","examples":[["not_home","away"]]},"else":{"type":"string","description":"Bucket for states not matched by any list (built-in or custom). Accepts built-in bucket names (active/inactive/default) or a custom bucket name. Defaults to \"inactive\" when omitted."}},"gridOptionsSchema":{"type":"object","description":"Home Assistant grid layout options. Controls how many rows and columns this card occupies in the dashboard grid.","properties":{"$ref":"#/$defs/sharedSchema454"}},"sharedSchema454":{"columns":{"oneOf":[{"type":"string","enum":["full"],"description":"Set to \"full\" to span all available columns"},{"type":"number","minimum":1,"maximum":24,"description":"Number of columns this card spans (1-24)"}],"description":"Number of columns (1-24) or \"full\" to span all columns"},"rows":{"type":"number","minimum":1,"maximum":100,"description":"Number of rows this card spans (1-100)"}},"soundsSchema":{"type":"object","description":"Per-card sound configuration. Overrides global sound settings for this card.","properties":{"$ref":"#/$defs/sharedSchema455"},"additionalProperties":false},"sharedSchema455":{"enabled":{"type":"boolean","description":"Whether this card fires sounds. Set to false to completely silence this card. Default: true (omit to keep default)."},"card_tap":{"type":["string","null"],"description":"Asset key for card tap, or null to mute. Omit to use global scheme."},"card_hold":{"type":["string","null"],"description":"Asset key for card hold, or null to mute. Omit to use global scheme."},"card_double_tap":{"type":["string","null"],"description":"Asset key for card double-tap, or null to mute. Omit to use global scheme."},"card_hover":{"type":["string","null"],"description":"Asset key for card hover (desktop), or null to mute. Omit to use global scheme."},"slider_drag_start":{"type":["string","null"],"description":"Asset key for slider grab, or null to mute. Omit to use global scheme."},"slider_change":{"type":["string","null"],"description":"Asset key for slider value change, or null to mute. Omit to use global scheme."},"slider_drag_end":{"type":["string","null"],"description":"Asset key for slider release, or null to mute. Omit to use global scheme."},"toggle_on":{"type":["string","null"],"description":"Asset key for toggle-on, or null to mute. Omit to use global scheme."},"toggle_off":{"type":["string","null"],"description":"Asset key for toggle-off, or null to mute. Omit to use global scheme."}},"sharedSchema456":{"type":"array","items":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"description":"Array of colour values for multiple series","examples":[["#FF9900","#99CCFF","#FFCC00"]]},"sharedSchema457":{"value":{"type":"string","description":"Option value (required in array form, must match entity option)"},"label":{"type":"string","description":"Display label override (default: option value)"},"icon":{"type":"string","description":"MDI icon (e.g. mdi:home) or Simple Icons (si:github)","examples":["mdi:home"]},"style":{"type":"object","description":"Style overrides for this option (same shape as card-level style)","properties":{"card":{"type":"object","properties":{"color":{"type":"object"}}},"text":{"type":"object","properties":{"default":{"type":"object"}}}},"additionalProperties":true},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"}},"sharedSchema458":{"type":"object","additionalProperties":true,"properties":{"grid-area":{"type":"string"},"grid-column":{"type":"string"},"grid-row":{"type":"string"},"place-self":{"type":"string"},"align-self":{"type":"string"},"justify-self":{"type":"string"},"margin":{"type":"string"},"overflow":{"type":"string"},"z-index":{"type":["string","number"]}}}},"cards":{"lcards-button":{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://github.com/snootched/lcards/schemas/button-schema","title":"LCARdS Button Card Configuration","description":"Complete configuration schema for lcards-button custom card","type":"object","properties":{"type":{"type":"string","const":"custom:lcards-button","description":"Home Assistant card type identifier (required)"},"data_sources":{"$ref":"#/$defs/dataSourcesSchema"},"triggers_update":{"$ref":"#/$defs/triggersUpdateSchema"},"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Home Assistant entity ID to control or monitor (format: domain.object_id)","examples":["light.living_room"]},"id":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"Unique card identifier for rule targeting, animations, and debugging (alphanumeric, underscore, hyphen)","examples":["main-button"]},"tags":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$"},"description":"Tags for bulk rule targeting and grouping. Allows applying rules to multiple cards at once using tag selectors.","examples":[["navigation","primary"]]},"height":{"$ref":"#/$defs/cardHeightSchema"},"width":{"$ref":"#/$defs/cardWidthSchema"},"min_height":{"$ref":"#/$defs/cardMinHeightSchema"},"min_width":{"$ref":"#/$defs/cardMinWidthSchema"},"max_height":{"$ref":"#/$defs/cardMaxHeightSchema"},"max_width":{"$ref":"#/$defs/cardMaxWidthSchema"},"overflow":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow shorthand on the card host element (sets both axes unless overridden per-axis)."},"overflow_x":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-x on the card host element. Overrides the overflow shorthand for the horizontal axis."},"overflow_y":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-y on the card host element. Overrides the overflow shorthand for the vertical axis."},"z_index":{"type":"integer","description":"CSS z-index stacking order on the card host element."},"interactive":{"type":"boolean","default":true,"description":"When false, hover colour changes and hover animations are suppressed. The cursor defaults to the arrow unless overridden via style.cursor. Tap/hold actions still fire if configured."},"control":{"type":"object","description":"Control behavior configuration","properties":{"attribute":{"type":"string","description":"Entity attribute to control (leave blank to control entity state)","examples":["brightness"]}},"additionalProperties":true},"preset":{"type":"string","description":"Style preset name (button preset when used alone; component preset name when component is set)","examples":[]},"component":{"type":"string","enum":["dpad","dpad_voyager","alert"],"description":"Component type (mutually exclusive with preset)","enumDescriptions":["D-pad directional control (up/down/left/right/center)","D-pad directional control, Voyager LCARS ring styling (up/down/left/right/center)","Alert symbol with animated bar segments (red/blue/green/yellow/grey/black)"]},"text":{"type":"object","description":"Multi-text label system","$comment":"Text fields use arbitrary keys. \"default\" provides styling inherited by all other text fields. All other keys create actual rendered text elements.","examples":[{"label1":{"content":"Temperature","position":"top-left","font_size":18,"color":"#FF9900"},"status":{"content":"{entity.state}","position":"center"}}],"properties":{"default":{"type":"object","description":"Default styling inherited by all text fields (does not render)","$comment":"This is NOT rendered as a text element - it only provides default styles","properties":{"position":{"type":"string","enum":[],"description":"Default text position (e.g., \"top-left\", \"center\")"},"rotation":{"type":"number","minimum":-360,"maximum":360,"default":0,"description":"Text rotation in degrees (-360 to 360)"},"padding":{"$ref":"#/$defs/paddingSchema"},"font_size":{"oneOf":[{"type":"number","minimum":1,"maximum":200,"default":14,"description":"Font size in pixels (1-200)"},{"type":"string","pattern":"^(\\d+px|\\d+\\.?\\d*rem|\\d+\\.?\\d*em|var\\(--[a-z-]+\\))$","description":"CSS value or theme token","examples":["14px"]}]},"color":{"$ref":"#/$defs/stateColorSchema"},"font_weight":{"type":["string","number"],"default":"normal","description":"Font weight — CSS keyword (normal, bold) or numeric value (100–900)","examples":["normal"]},"font_family":{"type":"string","format":"font-family","description":"CSS font-family (single font, comma-separated stack, or CSS variable)","examples":["Arial"]},"text_transform":{"type":"string","enum":["none","uppercase","lowercase","capitalize"],"default":"none","description":"Text transformation","enumDescriptions":["No transformation (original case)","ALL UPPERCASE","all lowercase","Capitalize First Letter"]},"anchor":{"type":"string","enum":["start","middle","end"],"default":"middle","description":"Horizontal text alignment","enumDescriptions":["Left-aligned","Center-aligned","Right-aligned"]},"baseline":{"type":"string","enum":["hanging","middle","central","alphabetic"],"default":"middle","description":"Vertical text alignment","enumDescriptions":["Top of text box","Center of text box","Mathematical center","Bottom of text (baseline)"]},"display_format":{"type":"string","enum":["friendly","raw","parts","unit"],"default":"friendly","description":"Default display format for entity state/attribute tokens. \"friendly\" uses HA's translated display string. \"raw\" returns the unmodified value. \"parts\" joins value and unit. \"unit\" returns only the unit."},"background":{"$ref":"#/$defs/stateColorSchema"},"background_padding":{"type":"number","minimum":0,"default":8,"description":"Horizontal padding between text glyphs and the background rect edges (px)."},"background_radius":{"type":"number","minimum":0,"default":4,"description":"Corner radius of the background rect (px)."},"background_width":{"type":["number","null"],"minimum":1,"description":"Fixed explicit width of the background rect (px). Overrides auto-sizing from text metrics. Text will overflow if content is wider than this value."},"background_min_width":{"type":["number","null"],"minimum":1,"description":"Minimum width of the background rect (px). Auto-sizes to text width but never smaller than this value. Safe for dynamic content."},"font_size_percent":{"type":"number","minimum":1,"maximum":100,"description":"Default font size as a percentage of the card height. All fields inherit this unless they set an explicit font_size. Useful for bar-label style presets that should auto-scale with the configured card height."},"cap_height_ratio":{"type":"number","minimum":0.1,"maximum":1,"description":"Ratio of the font cap-height to the em-square (font-size). Used to correct font_size_percent so visible glyph height matches the requested percentage of the container. Defaults to the theme token value (0.86 for Antonio). Override when using a different font family."}}}},"additionalProperties":{"type":"object","description":"Text field configuration (key becomes field name)","$comment":"Each key creates a separate SVG text element. Use descriptive names like \"label1\", \"status\", \"title\"","properties":{"content":{"type":"string","description":"Text content. Templates are evaluated by default (set template:false to disable)","examples":["Temperature"]},"show":{"type":"boolean","default":true,"description":"Whether to show this text field"},"position":{"type":"string","enum":[],"description":"Text position (overrides default)"},"x":{"type":"number","description":"Absolute X coordinate in pixels"},"y":{"type":"number","description":"Absolute Y coordinate in pixels"},"x_percent":{"type":"number","minimum":0,"maximum":100,"description":"X position as percentage of card width (0-100)"},"y_percent":{"type":"number","minimum":0,"maximum":100,"description":"Y position as percentage of card height (0-100)"},"rotation":{"type":"number","minimum":-360,"maximum":360,"default":0,"description":"Text rotation in degrees (-360 to 360)"},"padding":{"$ref":"#/$defs/paddingSchema"},"font_size":{"oneOf":[{"type":"number","minimum":1,"maximum":200,"description":"Font size in pixels (1-200)"},{"type":"string","pattern":"^(\\d+px|\\d+\\.?\\d*rem|\\d+\\.?\\d*em|var\\(--[a-z-]+\\))$","description":"CSS value or theme token","examples":["14px"]}]},"color":{"$ref":"#/$defs/stateColorSchema"},"font_weight":{"type":["string","number"],"default":"normal","description":"Font weight — CSS keyword (normal, bold) or numeric value (100–900)","examples":["normal"]},"font_family":{"type":"string","format":"font-family","description":"CSS font-family (single font, comma-separated stack, or CSS variable)","examples":["Arial"]},"text_transform":{"type":"string","enum":["none","uppercase","lowercase","capitalize"],"default":"none","description":"Text transformation","enumDescriptions":["No transformation (original case)","ALL UPPERCASE","all lowercase","Capitalize First Letter"]},"anchor":{"type":"string","enum":["start","middle","end"],"default":"middle","description":"Horizontal text alignment","enumDescriptions":["Left-aligned","Center-aligned","Right-aligned"]},"baseline":{"type":"string","enum":["hanging","middle","central","alphabetic"],"default":"middle","description":"Vertical text alignment","enumDescriptions":["Top of text box","Center of text box","Mathematical center","Bottom of text (baseline)"]},"template":{"type":"boolean","default":true,"description":"Template evaluation is enabled by default for this field’s content (e.g. {entity.state}, {{ states(...) }}, [[[ ... ]]]). Set to false to render {...} / [[[...]]] text literally without evaluating it."},"stretch":{"oneOf":[{"type":"boolean","description":"true = stretch text to fill 100% of the available width"},{"type":"number","minimum":0,"maximum":1,"description":"Fraction of available width to stretch text to (0–1)"}],"description":"Stretch text to fill a fraction of the available width using SVG textLength / lengthAdjust=\"spacingAndGlyphs\". true = 100%, 0.8 = 80%."},"font_size_percent":{"type":"number","minimum":1,"maximum":100,"description":"Font size as a percentage of the text area height (component mode). Overrides font_size when set."},"cap_height_ratio":{"type":"number","minimum":0.1,"maximum":1,"description":"Ratio of the font cap-height to the em-square. Used to correct font_size_percent so visible glyph height matches the requested percentage. Defaults to the theme token value (0.86 for Antonio). Override when using a different font."},"zone":{"type":"string","description":"Named zone key to route this text field to. For component cards this matches a key in the component's zones map. For slider/elbow cards this matches a named layout zone (e.g. left, track, vertical_bar). Defaults to the first zone if not set."},"display_format":{"type":"string","enum":["friendly","raw","parts","unit"],"default":"friendly","description":"How to format entity state or attribute values in this text field. \"friendly\" (default) uses HA's translated display string matching native cards. \"raw\" returns the unmodified state/attribute value. \"parts\" joins value and unit from HA's ToParts API. \"unit\" returns only the unit portion.","examples":["friendly"]},"background":{"$ref":"#/$defs/stateColorSchema"},"background_padding":{"type":"number","minimum":0,"default":8,"description":"Horizontal padding between text glyphs and the background rect edges (px)."},"background_radius":{"type":"number","minimum":0,"default":4,"description":"Corner radius of the background rect (px)."},"background_width":{"type":["number","null"],"minimum":1,"description":"Fixed explicit width of the background rect (px). Overrides auto-sizing from text metrics. Text will overflow if content is wider than this value."},"background_min_width":{"type":["number","null"],"minimum":1,"description":"Minimum width of the background rect (px). Auto-sizes to text width but never smaller than this value. Safe for dynamic content."}}}},"show_icon":{"type":"boolean","default":true,"description":"Whether to show the icon"},"icon_area":{"type":"string","enum":["left","right","top","bottom","none"],"default":"left","description":"Icon area position relative to main area","enumDescriptions":["Vertical bar on left side","Vertical bar on right side","Horizontal bar at top","Horizontal bar at bottom","No separate icon area (icon in main area)"]},"icon":{"type":"string","examples":["mdi:lightbulb"]},"icon_area_background":{"title":"Icon Area Background Colour","description":"Background colour for the icon area (supports state-based colours)","default":"transparent","$comment":"Icon area background is independent of main card background. Useful for creating visual separation.","oneOf":{"$ref":"#/$defs/sharedSchema13"}},"icon_area_size":{"type":"number","minimum":20,"maximum":500,"default":60,"description":"Fixed size for icon area in pixels (width for left/right, height for top/bottom, default: 60)"},"divider":{"type":"object","description":"Divider line between icon area and main area","examples":[{"width":2,"color":"#FF9900"}],"properties":{"width":{"type":"number","minimum":0,"maximum":200,"default":0,"description":"Divider width in pixels (0 = no divider, default: 0)"},"color":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|rgb\\(|rgba\\(|var\\(--)","description":"Divider colour","examples":["#FF9900"]}}},"icon_style":{"type":"object","description":"Advanced icon styling configuration","examples":[{"type":"mdi","color":"#FF9900","size":32,"position":"center"}],"properties":{"type":{"type":"string","enum":["mdi","si","entity"],"default":"mdi","description":"Icon type","enumDescriptions":["Material Design Icons","Simple Icons","Entity state icon"]},"color":{"$ref":"#/$defs/stateColorSchema"},"icon":{"title":"State-Dependent Icons","description":"Override icon per entity state. Falls back to the top-level \"icon\" field when no state matches.","oneOf":[{"type":"string","title":"Single Icon","description":"One icon for all states","examples":["mdi:lightbulb"]},{"type":"object","title":"State-Dependent Icons","description":"Different icons for different entity states","examples":[{"active":"mdi:lightbulb","inactive":"mdi:lightbulb-off"}],"properties":{"default":{"type":"string","description":"Default icon (fallback when no other state matches)","examples":["mdi:lightbulb"]},"active":{"type":"string","description":"Icon when entity is on/active","examples":["mdi:lightbulb"]},"inactive":{"type":"string","description":"Icon when entity is off/inactive","examples":["mdi:lightbulb-off"]},"unavailable":{"type":"string","description":"Icon when entity is unavailable or unknown","examples":["mdi:help-circle-outline"]},"zero":{"type":"string","description":"Icon when entity state is numeric 0","examples":["mdi:numeric-0-circle"]},"non_zero":{"type":"string","description":"Icon when entity state is a non-zero number","examples":["mdi:numeric-positive-1"]}},"additionalProperties":{"type":"string","description":"Custom state icon (e.g., \"on\", \"off\", \"heat\", \"cool\")"}}]},"size":{"type":"number","minimum":8,"maximum":200,"default":24,"description":"Icon size in pixels (8-200, default: 24)"},"rotation":{"type":"number","minimum":-360,"maximum":360,"default":0,"description":"Icon rotation in degrees (-360 to 360)"},"position":{"type":"string","enum":[],"default":"center","description":"Icon position within icon area"},"x":{"type":"number","description":"Absolute X coordinate in pixels"},"y":{"type":"number","description":"Absolute Y coordinate in pixels"},"x_percent":{"type":"number","minimum":0,"maximum":100,"description":"X position as percentage (0-100)"},"y_percent":{"type":"number","minimum":0,"maximum":100,"description":"Y position as percentage (0-100)"},"spacing":{"type":"number","minimum":0,"maximum":100,"default":8,"description":"Spacing between icon and text in pixels (default: 8)"},"padding":{"$ref":"#/$defs/paddingSchema"},"padding_left":{"type":"number","minimum":0,"maximum":200,"description":"Left padding in pixels (overrides padding)"},"padding_right":{"type":"number","minimum":0,"maximum":200,"description":"Right padding in pixels (overrides padding)"},"padding_top":{"type":"number","minimum":0,"maximum":200,"description":"Top padding in pixels (overrides padding)"},"padding_bottom":{"type":"number","minimum":0,"maximum":200,"description":"Bottom padding in pixels (overrides padding)"}}},"style":{"type":"object","properties":{"cursor":{"type":"string","description":"CSS cursor style shown when hovering over the button. Overrides the automatic cursor derived from the interactive flag.","examples":["pointer"]},"card":{"type":"object","properties":{"color":{"type":"object","properties":{"background":{"$ref":"#/$defs/stateColorSchema"}}}}},"border":{"type":"object","properties":{"width":{"oneOf":[{"type":"number"},{"type":"string","description":"Theme token reference"},{"type":"object","properties":{"top":{"oneOf":[{"type":"number"},{"type":"string"}]},"right":{"oneOf":[{"type":"number"},{"type":"string"}]},"bottom":{"oneOf":[{"type":"number"},{"type":"string"}]},"left":{"oneOf":[{"type":"number"},{"type":"string"}]}}}]},"color":{"$ref":"#/$defs/stateColorSchema"},"radius":{"oneOf":[{"type":"number","minimum":0,"maximum":100,"default":12},{"type":"string","pattern":"^(\\{theme:.*\\}|var\\(--.*\\))$","description":"Theme token reference"},{"type":"object","properties":{"top_left":{"oneOf":[{"type":"number"},{"type":"string"}]},"top_right":{"oneOf":[{"type":"number"},{"type":"string"}]},"bottom_right":{"oneOf":[{"type":"number"},{"type":"string"}]},"bottom_left":{"oneOf":[{"type":"number"},{"type":"string"}]}}}]}}},"text":{"type":"object","properties":{"default":{"type":"object","properties":{"color":{"$ref":"#/$defs/stateColorSchema"},"font_size":{"oneOf":[{"type":"number"},{"type":"string","description":"CSS value or theme token (e.g., \"14px\", \"var(--lcars-text-size)\")"}]},"font_weight":{"type":["string","number"]},"font_family":{"type":"string","format":"font-family"}}}}}}},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"},"animations":{"type":"array","items":{"$ref":"#/$defs/animationSchema"}},"background_animation":{"$ref":"#/$defs/backgroundAnimationSchema"},"shape_texture":{"type":"object","description":"SVG-native texture/animation rendered inside the button shape boundary","properties":{"preset":{"type":"string","description":"Texture preset name","enum":["grid","diagonal","hexagonal","dots","fluid","shimmer","plasma","flow","level","pulse","scanlines","image"]},"opacity":{"description":"Texture opacity (0-1). Supports state-based object.","oneOf":[{"type":"number","minimum":0,"maximum":1},{"$ref":"#/$defs/stateColorSchema"}]},"speed":{"description":"Animation speed multiplier. Supports state-based object.","oneOf":[{"type":"number","minimum":0},{"type":"object"}]},"mix_blend_mode":{"type":"string","description":"CSS mix-blend-mode for texture blending","enum":["normal","multiply","screen","overlay","hard-light","soft-light","color-burn","color-dodge"]},"config":{"type":"object","description":"Preset-specific configuration. Supports entity-reactive values: map_range descriptor ({ map_range: { attribute, input, output } }) or template strings ([[[...]]]), including { template, default } form for numeric params like fill_pct.","additionalProperties":true}},"additionalProperties":false},"filters":{"type":"array","description":"Visual filters applied to entire button (CSS and SVG filter primitives)","items":{"$ref":"#/$defs/filterSchema"}},"svg":{"type":"object","properties":{"content":{"type":"string"},"src":{"type":"string"},"viewBox":{"type":"string"},"preserveAspectRatio":{"type":"string"},"enable_tokens":{"type":"boolean"},"allow_scripts":{"type":"boolean"},"segments":{"type":"object","description":"Segment configurations keyed by ID. Use \"default\" for shared config.","properties":{"default":{"type":"object","description":"Default configuration inherited by all segments","properties":{"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Entity ID (format: domain.object_id)","examples":["light.living_room"]},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"},"style":{"type":"object","properties":{"fill":{"$ref":"#/$defs/stateColorSchema"},"stroke":{"$ref":"#/$defs/stateColorSchema"},"stroke-width":{"title":"Stroke Width","description":"SVG stroke width (number in pixels or CSS string)","oneOf":[{"type":"number","minimum":0,"maximum":50,"description":"Uniform stroke width in pixels (0-50)"},{"type":"string","pattern":"^\\d+(\\.\\d+)?(px|em|rem)?$","description":"CSS stroke width value","examples":["2px"]},{"type":"object","description":"State-based stroke width","properties":{"default":{"oneOf":[{"type":"number","minimum":0,"maximum":50},{"type":"string"}]},"active":{"oneOf":[{"type":"number","minimum":0,"maximum":50},{"type":"string"}]},"inactive":{"oneOf":[{"type":"number","minimum":0,"maximum":50},{"type":"string"}]}}}]},"opacity":{"oneOf":[{"type":"number","minimum":0,"maximum":1,"description":"Opacity value (0.0 = transparent, 1.0 = opaque)"},{"type":"object","description":"State-based opacity","properties":{"default":{"type":"number","minimum":0,"maximum":1},"active":{"type":"number","minimum":0,"maximum":1},"inactive":{"type":"number","minimum":0,"maximum":1}}}]}}},"animations":{"type":"array","items":{"$ref":"#/$defs/animationSchema"}}}}},"additionalProperties":{"type":"object","description":"Per-segment configuration (overrides default)","properties":{"selector":{"type":"string","description":"CSS selector override (defaults to \"#<segment-id>\")"},"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Entity ID (format: domain.object_id)","examples":["light.living_room"]},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"},"style":{"type":"object","properties":{"fill":{"$ref":"#/$defs/stateColorSchema"},"stroke":{"$ref":"#/$defs/stateColorSchema"},"stroke-width":{"title":"Stroke Width","description":"SVG stroke width (number in pixels or CSS string)","oneOf":[{"type":"number","minimum":0,"maximum":50,"description":"Uniform stroke width in pixels (0-50)"},{"type":"string","pattern":"^\\d+(\\.\\d+)?(px|em|rem)?$","description":"CSS stroke width value","examples":["2px"]},{"type":"object","description":"State-based stroke width","properties":{"default":{"oneOf":[{"type":"number","minimum":0,"maximum":50},{"type":"string"}]},"active":{"oneOf":[{"type":"number","minimum":0,"maximum":50},{"type":"string"}]},"inactive":{"oneOf":[{"type":"number","minimum":0,"maximum":50},{"type":"string"}]}}}]},"opacity":{"oneOf":[{"type":"number","minimum":0,"maximum":1,"description":"Opacity value (0.0 = transparent, 1.0 = opaque)"},{"type":"object","description":"State-based opacity","properties":{"default":{"type":"number","minimum":0,"maximum":1},"active":{"type":"number","minimum":0,"maximum":1},"inactive":{"type":"number","minimum":0,"maximum":1}}}]}}},"animations":{"type":"array","items":{"$ref":"#/$defs/animationSchema"}}}}}}},"alert":{"type":"object","description":"Alert component configuration","properties":{"color":{"type":"object","description":"Colour shorthand — overrides the active preset's colours","properties":{"shape":{"type":"string","description":"Fill colour for the shield shape","examples":["var(--lcards-orange)"]},"bars":{"type":"string","description":"Stroke colour for the bar lines","examples":["var(--lcards-orange)"]}}},"custom_presets":{"type":"object","description":"Custom or override presets (merged over built-ins)","additionalProperties":{"type":"object","properties":{"segments":{"type":"object","properties":{"shape":{"type":"object","properties":{"style":{"type":"object","properties":{"fill":{"type":"string"}}}}},"bars":{"type":"object","properties":{"style":{"type":"object","properties":{"stroke":{"type":"string"}}}}}}},"text":{"type":"object","additionalProperties":{"type":"object","properties":{"content":{"type":"string"},"color":{"type":"string"}}}}}}},"segments":{"type":"object","description":"Per-segment fine-grained overrides (managed by Segments tab)","additionalProperties":{"type":"object","properties":{"style":{"type":"object","properties":{"fill":{"type":"string"},"stroke":{"type":"string"}}}}}}}},"dpad":{"type":"object","properties":{"segments":{"type":"object","description":"Segment configurations. Use \"default\" key for common properties applied to all segments. Other keys are segment IDs (up, down, left, right, up-left, up-right, down-left, down-right, center).","additionalProperties":{"type":"object","properties":{"selector":{"type":"string","description":"CSS selector for SVG element (defaults to #{segment-id} if not specified)"},"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Entity ID for this segment (format: domain.object_id, overrides card entity)","examples":["light.living_room"]},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"},"style":{"type":"object","description":"SVG styling for the segment","properties":{"fill":{"$ref":"#/$defs/stateColorSchema"},"stroke":{"$ref":"#/$defs/stateColorSchema"},"stroke-width":{"title":"Stroke Width","description":"SVG stroke width (number in pixels, CSS string, or state-based)","oneOf":[{"type":"number","minimum":0,"maximum":50,"description":"Stroke width in pixels (0-50)"},{"type":"string","pattern":"^\\d+(\\.\\d+)?(px|em|rem)?$","description":"CSS stroke width value","examples":["2px"]},{"$ref":"#/$defs/stateColorSchema"}]}}},"animations":{"type":"array","items":{"$ref":"#/$defs/animationSchema"}}}}}}},"ranges_attribute":{"type":"string","description":"Entity attribute to use as the numeric value for ALL state-based range conditions (above:/below:/between: keys) across the entire card — icon_style.icon, icon_style.color, text color, background, border, and config.ranges preset switching. Use \"brightness_pct\" for a computed 0-100 light brightness value. Defaults to evaluating the raw entity state string.","examples":["brightness_pct"]},"state_attribute":{"type":"string","description":"Entity attribute whose String() value is used as the highest-priority key for ALL exact-match state-color lookups across the card. Booleans become \"true\"/\"false\"; null becomes \"null\"; strings are used as-is. Classified state (active/inactive) is always derived from entity.state and is unaffected. Can be used alongside ranges_attribute.","examples":["effect"]},"state_classification":{"$ref":"#/$defs/stateClassificationSchema"},"ranges":{"type":"array","description":"State-driven preset switching: evaluates entity value against thresholds and applies matching preset","items":{"type":"object","required":["preset"],"properties":{"preset":{"type":"string","description":"Component preset name to apply when this range matches"},"attribute":{"type":"string","description":"Override ranges_attribute for this entry only"},"above":{"type":"number","description":"Match when value is > this threshold (strictly greater)"},"at_least":{"type":"number","description":"Match when value is >= this threshold (inclusive)"},"below":{"type":"number","description":"Match when value is < this threshold (strictly less)"},"at_most":{"type":"number","description":"Match when value is <= this threshold (inclusive)"},"equals":{"description":"Match when value equals this (string comparison)","type":["string","number","boolean"]},"color":{"type":"object","description":"Transient segment colour overrides applied while this range is active","properties":{"shape":{"type":"string","description":"Override fill for the shape segment"},"bars":{"type":"string","description":"Override stroke for the bars segment"}}}},"additionalProperties":false}},"grid_options":{"$ref":"#/$defs/gridOptionsSchema"}}},"lcards-slider":{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://github.com/snootched/lcards/schemas/slider-schema","title":"LCARdS Slider Card Configuration","description":"Complete configuration schema for lcards-slider custom card","type":"object","properties":{"type":{"type":"string","const":"custom:lcards-slider","description":"Home Assistant card type identifier (required)"},"data_sources":{"$ref":"#/$defs/dataSourcesSchema"},"triggers_update":{"$ref":"#/$defs/triggersUpdateSchema"},"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Home Assistant entity ID to control or monitor (format: domain.object_id)","examples":["light.living_room"]},"ranges_attribute":{"type":"string","description":"Entity attribute to use as the numeric value for all range conditions (above:/below:/between: keys) in any state-based style config. Use \"brightness_pct\" for a computed 0–100 light brightness value. Defaults to evaluating the raw entity state string.","examples":["brightness_pct"]},"state_attribute":{"type":"string","description":"Entity attribute whose String() value is used as the highest-priority key for ALL exact-match state-color lookups across the card. Booleans become \"true\"/\"false\"; null becomes \"null\"; strings are used as-is. Classified state (active/inactive) is always derived from entity.state and is unaffected. Can be used alongside ranges_attribute.","examples":["effect"]},"state_classification":{"$ref":"#/$defs/stateClassificationSchema"},"id":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"Unique card identifier for rule targeting, animations, and debugging (alphanumeric, underscore, hyphen)","examples":["main-button"]},"tags":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$"},"description":"Tags for bulk rule targeting and grouping. Allows applying rules to multiple cards at once using tag selectors.","examples":[["navigation","primary"]]},"height":{"$ref":"#/$defs/cardHeightSchema"},"width":{"$ref":"#/$defs/cardWidthSchema"},"min_height":{"$ref":"#/$defs/cardMinHeightSchema"},"min_width":{"$ref":"#/$defs/cardMinWidthSchema"},"max_height":{"$ref":"#/$defs/cardMaxHeightSchema"},"max_width":{"$ref":"#/$defs/cardMaxWidthSchema"},"overflow":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow shorthand on the card host element (sets both axes unless overridden per-axis)."},"overflow_x":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-x on the card host element. Overrides the overflow shorthand for the horizontal axis."},"overflow_y":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-y on the card host element. Overrides the overflow shorthand for the vertical axis."},"z_index":{"type":"integer","description":"CSS z-index stacking order on the card host element."},"preset":{"type":"string","enum":[],"description":"Style preset name (mutually exclusive with advanced component)","examples":["pills-basic"]},"component":{"type":"string","description":"Advanced SVG component name (provides the SVG shell)","examples":["default"]},"control":{"type":"object","description":"Control behavior configuration","properties":{"min":{"type":"number","description":"Minimum value","examples":[0]},"max":{"type":"number","description":"Maximum value","examples":[100]},"step":{"type":"number","minimum":0.01,"description":"Step increment","examples":[1]},"attribute":{"type":"string","description":"Entity attribute to control (default varies by domain)","examples":["brightness"]},"locked":{"type":"boolean","description":"Whether slider is read-only (auto-determined by domain)","examples":[true]},"invert_value":{"type":"boolean","default":false,"description":"Invert value mapping (flip min↔max). When true, slider at min position sends max value to entity.","examples":[false]}}},"text":{"type":"object","description":"Multi-text label system","$comment":"Text fields use arbitrary keys. \"default\" provides styling inherited by all other text fields. All other keys create actual rendered text elements.","examples":[{"label1":{"content":"Temperature","position":"top-left","font_size":18,"color":"#FF9900"},"status":{"content":"{entity.state}","position":"center"}}],"properties":{"default":{"type":"object","description":"Default styling inherited by all text fields (does not render)","$comment":"This is NOT rendered as a text element - it only provides default styles","properties":{"position":{"type":"string","enum":[],"description":"Default text position (e.g., \"top-left\", \"center\")"},"rotation":{"type":"number","minimum":-360,"maximum":360,"default":0,"description":"Text rotation in degrees (-360 to 360)"},"padding":{"$ref":"#/$defs/paddingSchema"},"font_size":{"oneOf":[{"type":"number","minimum":1,"maximum":200,"default":14,"description":"Font size in pixels (1-200)"},{"type":"string","pattern":"^(\\d+px|\\d+\\.?\\d*rem|\\d+\\.?\\d*em|var\\(--[a-z-]+\\))$","description":"CSS value or theme token","examples":["14px"]}]},"color":{"$ref":"#/$defs/stateColorSchema"},"font_weight":{"type":["string","number"],"default":"normal","description":"Font weight — CSS keyword (normal, bold) or numeric value (100–900)","examples":["normal"]},"font_family":{"type":"string","format":"font-family","description":"CSS font-family (single font, comma-separated stack, or CSS variable)","examples":["Arial"]},"text_transform":{"type":"string","enum":["none","uppercase","lowercase","capitalize"],"default":"none","description":"Text transformation","enumDescriptions":["No transformation (original case)","ALL UPPERCASE","all lowercase","Capitalize First Letter"]},"anchor":{"type":"string","enum":["start","middle","end"],"default":"middle","description":"Horizontal text alignment","enumDescriptions":["Left-aligned","Center-aligned","Right-aligned"]},"baseline":{"type":"string","enum":["hanging","middle","central","alphabetic"],"default":"middle","description":"Vertical text alignment","enumDescriptions":["Top of text box","Center of text box","Mathematical center","Bottom of text (baseline)"]},"display_format":{"type":"string","enum":["friendly","raw","parts","unit"],"default":"friendly","description":"Default display format for entity state/attribute tokens. \"friendly\" uses HA's translated display string. \"raw\" returns the unmodified value. \"parts\" joins value and unit. \"unit\" returns only the unit."},"background":{"$ref":"#/$defs/stateColorSchema"},"background_padding":{"type":"number","minimum":0,"default":8,"description":"Horizontal padding between text glyphs and the background rect edges (px)."},"background_radius":{"type":"number","minimum":0,"default":4,"description":"Corner radius of the background rect (px)."},"background_width":{"type":["number","null"],"minimum":1,"description":"Fixed explicit width of the background rect (px). Overrides auto-sizing from text metrics. Text will overflow if content is wider than this value."},"background_min_width":{"type":["number","null"],"minimum":1,"description":"Minimum width of the background rect (px). Auto-sizes to text width but never smaller than this value. Safe for dynamic content."},"font_size_percent":{"type":"number","minimum":1,"maximum":100,"description":"Default font size as a percentage of the card height. All fields inherit this unless they set an explicit font_size. Useful for bar-label style presets that should auto-scale with the configured card height."},"cap_height_ratio":{"type":"number","minimum":0.1,"maximum":1,"description":"Ratio of the font cap-height to the em-square (font-size). Used to correct font_size_percent so visible glyph height matches the requested percentage of the container. Defaults to the theme token value (0.86 for Antonio). Override when using a different font family."}}}},"additionalProperties":{"type":"object","description":"Text field configuration (key becomes field name)","$comment":"Each key creates a separate SVG text element. Use descriptive names like \"label1\", \"status\", \"title\"","properties":{"content":{"type":"string","description":"Text content. Templates are evaluated by default (set template:false to disable)","examples":["Temperature"]},"show":{"type":"boolean","default":true,"description":"Whether to show this text field"},"position":{"type":"string","enum":[],"description":"Text position (overrides default)"},"x":{"type":"number","description":"Absolute X coordinate in pixels"},"y":{"type":"number","description":"Absolute Y coordinate in pixels"},"x_percent":{"type":"number","minimum":0,"maximum":100,"description":"X position as percentage of card width (0-100)"},"y_percent":{"type":"number","minimum":0,"maximum":100,"description":"Y position as percentage of card height (0-100)"},"rotation":{"type":"number","minimum":-360,"maximum":360,"default":0,"description":"Text rotation in degrees (-360 to 360)"},"padding":{"$ref":"#/$defs/paddingSchema"},"font_size":{"oneOf":[{"type":"number","minimum":1,"maximum":200,"description":"Font size in pixels (1-200)"},{"type":"string","pattern":"^(\\d+px|\\d+\\.?\\d*rem|\\d+\\.?\\d*em|var\\(--[a-z-]+\\))$","description":"CSS value or theme token","examples":["14px"]}]},"color":{"$ref":"#/$defs/stateColorSchema"},"font_weight":{"type":["string","number"],"default":"normal","description":"Font weight — CSS keyword (normal, bold) or numeric value (100–900)","examples":["normal"]},"font_family":{"type":"string","format":"font-family","description":"CSS font-family (single font, comma-separated stack, or CSS variable)","examples":["Arial"]},"text_transform":{"type":"string","enum":["none","uppercase","lowercase","capitalize"],"default":"none","description":"Text transformation","enumDescriptions":["No transformation (original case)","ALL UPPERCASE","all lowercase","Capitalize First Letter"]},"anchor":{"type":"string","enum":["start","middle","end"],"default":"middle","description":"Horizontal text alignment","enumDescriptions":["Left-aligned","Center-aligned","Right-aligned"]},"baseline":{"type":"string","enum":["hanging","middle","central","alphabetic"],"default":"middle","description":"Vertical text alignment","enumDescriptions":["Top of text box","Center of text box","Mathematical center","Bottom of text (baseline)"]},"template":{"type":"boolean","default":true,"description":"Template evaluation is enabled by default for this field’s content (e.g. {entity.state}, {{ states(...) }}, [[[ ... ]]]). Set to false to render {...} / [[[...]]] text literally without evaluating it."},"stretch":{"oneOf":[{"type":"boolean","description":"true = stretch text to fill 100% of the available width"},{"type":"number","minimum":0,"maximum":1,"description":"Fraction of available width to stretch text to (0–1)"}],"description":"Stretch text to fill a fraction of the available width using SVG textLength / lengthAdjust=\"spacingAndGlyphs\". true = 100%, 0.8 = 80%."},"font_size_percent":{"type":"number","minimum":1,"maximum":100,"description":"Font size as a percentage of the text area height (component mode). Overrides font_size when set."},"cap_height_ratio":{"type":"number","minimum":0.1,"maximum":1,"description":"Ratio of the font cap-height to the em-square. Used to correct font_size_percent so visible glyph height matches the requested percentage. Defaults to the theme token value (0.86 for Antonio). Override when using a different font."},"zone":{"type":"string","description":"Named zone key to route this text field to. For component cards this matches a key in the component's zones map. For slider/elbow cards this matches a named layout zone (e.g. left, track, vertical_bar). Defaults to the first zone if not set."},"display_format":{"type":"string","enum":["friendly","raw","parts","unit"],"default":"friendly","description":"How to format entity state or attribute values in this text field. \"friendly\" (default) uses HA's translated display string matching native cards. \"raw\" returns the unmodified state/attribute value. \"parts\" joins value and unit from HA's ToParts API. \"unit\" returns only the unit portion.","examples":["friendly"]},"background":{"$ref":"#/$defs/stateColorSchema"},"background_padding":{"type":"number","minimum":0,"default":8,"description":"Horizontal padding between text glyphs and the background rect edges (px)."},"background_radius":{"type":"number","minimum":0,"default":4,"description":"Corner radius of the background rect (px)."},"background_width":{"type":["number","null"],"minimum":1,"description":"Fixed explicit width of the background rect (px). Overrides auto-sizing from text metrics. Text will overflow if content is wider than this value."},"background_min_width":{"type":["number","null"],"minimum":1,"description":"Minimum width of the background rect (px). Auto-sizes to text width but never smaller than this value. Safe for dynamic content."}}}},"style":{"type":"object","description":"Visual style configuration","properties":{"track":{"type":"object","description":"Track appearance configuration","properties":{"display":{"type":"object","description":"Visual display range configuration (what pills/gauge render). Defaults to control range if not specified.","properties":{"min":{"type":"number","description":"Minimum value shown on visual scale (default: control.min)","examples":[0]},"max":{"type":"number","description":"Maximum value shown on visual scale (default: control.max)","examples":[100]},"unit":{"type":"string","description":"Display unit for labels (overrides entity unit_of_measurement)","examples":["°C"]}}},"type":{"type":"string","enum":["pills","gauge","shaped"],"description":"Track visual style (pills = segmented, gauge = ruler, shaped = solid fill inside a clip-path shape)","enumDescriptions":["Segmented pill style (interactive sliders)","Ruler gauge style (typically for display)","Solid fill clipped to a shape boundary (use with component: shaped)"]},"height":{"oneOf":[{"type":"number","minimum":10,"maximum":200,"description":"Track height in pixels"},{"type":"string","pattern":"^(\\d+px|\\d+\\.?\\d*rem|theme:)","description":"CSS value or theme token","examples":["40px"]}]},"margin":{"oneOf":[{"type":"number","minimum":0,"maximum":100,"description":"Track margin in pixels (applies to all sides)","examples":[10]},{"type":"object","description":"Per-side margin configuration","properties":{"top":{"type":"number","minimum":0,"maximum":100,"description":"Top margin in pixels"},"right":{"type":"number","minimum":0,"maximum":100,"description":"Right margin in pixels"},"bottom":{"type":"number","minimum":0,"maximum":100,"description":"Bottom margin in pixels"},"left":{"type":"number","minimum":0,"maximum":100,"description":"Left margin in pixels"}},"examples":[{"top":10,"right":5,"bottom":10,"left":5}]}]},"orientation":{"type":"string","enum":["horizontal","vertical"],"default":"horizontal","description":"Slider orientation - affects track rendering direction","enumDescriptions":["Horizontal slider (left to right)","Vertical slider (bottom to top)"]},"invert_fill":{"type":"boolean","default":false,"description":"Invert visual fill direction. When true, fills from opposite end (right/top instead of left/bottom).","examples":[false]},"segments":{"type":"object","description":"Pills/segments configuration (for type: pills)","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable segmented pills"},"count":{"type":"number","minimum":2,"maximum":200,"default":15,"description":"Number of pill segments (or \"auto\" to calculate based on size)"},"gap":{"oneOf":[{"type":"number","minimum":0,"maximum":50,"default":4,"description":"Gap between pills in pixels"},{"type":"string","pattern":"^(\\d+px|theme:|\\{theme:)","description":"CSS value or theme token"}]},"shape":{"type":"object","properties":{"radius":{"oneOf":[{"type":"number","minimum":0,"maximum":50,"default":4,"description":"Border radius in pixels"},{"type":"string","pattern":"^(\\d+px|theme:)","description":"CSS value or theme token"}]}}},"size":{"type":"object","description":"Pill dimensions (width for horizontal, height for vertical)","properties":{"width":{"type":"number","minimum":1,"maximum":200,"default":12,"description":"Fixed width of each pill in horizontal mode (pixels)"},"height":{"type":"number","minimum":1,"maximum":200,"default":12,"description":"Fixed height of each pill in vertical mode (pixels)"}}},"gradient":{"type":"object","description":"Colour gradient configuration","properties":{"start":{"$ref":"#/$defs/stateColorSchema"},"end":{"$ref":"#/$defs/stateColorSchema"}}},"appearance":{"type":"object","properties":{"unfilled":{"type":"object","properties":{"opacity":{"type":"number","minimum":0,"maximum":1}}},"filled":{"type":"object","properties":{"opacity":{"type":"number","minimum":0,"maximum":1}}}}}}}}},"gauge":{"type":"object","description":"Gauge-specific configuration (for type: gauge)","properties":{"progress_bar":{"type":"object","description":"Progress indicator bar","properties":{"color":{"$ref":"#/$defs/stateColorSchema"},"layer":{"type":"string","enum":["background","foreground"],"default":"background"},"height":{"oneOf":[{"type":"number","minimum":1,"maximum":100},{"type":"string"}]},"align":{"type":"string","enum":["start","middle","end"],"default":"middle"},"padding":{"type":"object","description":"Padding to offset from aligned position","properties":{"top":{"type":"number","minimum":0},"right":{"type":"number","minimum":0},"bottom":{"type":"number","minimum":0},"left":{"type":"number","minimum":0}}},"background":{"type":"object","description":"Background track drawn behind the progress bar fill, clamped to control range. Leave unset for no background.","properties":{"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Background track colour. Supports state-based maps."},"height":{"oneOf":[{"type":"number","minimum":1,"maximum":100},{"type":"string"}]},"radius":{"oneOf":[{"type":"number","minimum":0},{"type":"object","properties":{"start":{"type":"number","minimum":0},"end":{"type":"number","minimum":0}}}]},"min":{"type":"number"},"max":{"type":"number"}}},"radius":{"oneOf":[{"type":"number","minimum":0},{"type":"object","properties":{"start":{"type":"number","minimum":0,"description":"Radius on start end (left for horizontal, bottom for vertical)"},"end":{"type":"number","minimum":0,"description":"Radius on end (right for horizontal, top for vertical)"}}}]}}},"scale":{"type":"object","description":"Gauge scale configuration","properties":{"tick_marks":{"type":"object","properties":{"major":{"type":"object","properties":{"enabled":{"type":"boolean"},"interval":{"type":"number","minimum":1,"description":"Interval for major tick marks"},"color":{"$ref":"#/$defs/stateColorSchema"},"height":{"type":"number"},"width":{"type":"number"}}},"minor":{"type":"object","properties":{"enabled":{"type":"boolean"},"interval":{"type":"number","minimum":1,"description":"Interval for minor tick marks"},"color":{"$ref":"#/$defs/stateColorSchema"},"height":{"type":"number"},"width":{"type":"number"}}}}},"labels":{"type":"object","properties":{"enabled":{"type":"boolean"},"show_unit":{"type":"boolean","description":"Show unit suffix on scale labels. Set false to hide even when entity has unit_of_measurement.","examples":[true]},"unit":{"type":"string","description":"Unit suffix for labels. Takes priority over entity unit_of_measurement.","examples":["°C"]},"color":{"$ref":"#/$defs/stateColorSchema"},"font_size":{"type":"number"},"padding":{"type":"number"}}}}},"indicator":{"type":"object","description":"Current value indicator configuration","properties":{"enabled":{"type":["boolean","string"],"description":"Show/hide current value indicator. Also accepts a Jinja2/JS template string resolving to a boolean (e.g. \"{{ not is_state('sensor.x', 'unavailable') }}\") for state-driven visibility."},"type":{"type":"string","enum":["line","round","triangle"],"description":"Indicator shape type"},"size":{"type":"object","description":"Indicator dimensions","properties":{"width":{"type":"number","minimum":0,"description":"Indicator width in pixels (or rx for round type)"},"height":{"type":"number","minimum":0,"description":"Indicator height in pixels (or ry for round type)"}}},"rotation":{"type":"number","minimum":-180,"maximum":180,"default":0,"description":"Rotation angle in degrees (for triangle type)"},"offset":{"type":"object","description":"Position offset relative to progress bar end","properties":{"x":{"type":"number","description":"Horizontal offset in pixels"},"y":{"type":"number","description":"Vertical offset in pixels"}}},"color":{"$ref":"#/$defs/stateColorSchema"},"border":{"type":"object","description":"Indicator border configuration","properties":{"enabled":{"type":"boolean","description":"Enable indicator border"},"width":{"type":"number","minimum":0,"description":"Border width in pixels"},"color":{"$ref":"#/$defs/stateColorSchema"}}}}},"marker_indicator":{"type":"object","description":"Default shape for value-marker indicators (ranges with a \"value\" key). Overrides global defaults for this preset/component. Can still be overridden per-range via the range's own \"indicator\" block. Defaults: type=triangle, size=20×20, rotation=180.","properties":{"type":{"type":"string","enum":["line","round","triangle"],"description":"Marker indicator shape type (default: triangle)"},"align":{"type":"string","enum":["start","center","end"],"default":"center","description":"Cross-axis alignment within the track zone. start=left edge (vertical)/top (horizontal), center=middle, end=right/bottom. Use start on Picard to pin the marker to the tick column regardless of card width."},"size":{"type":"object","properties":{"width":{"type":"number","minimum":0,"description":"Width in pixels"},"height":{"type":"number","minimum":0,"description":"Height in pixels"}}},"rotation":{"type":"number","minimum":-180,"maximum":180,"default":180,"description":"Rotation in degrees (default: 180 — triangle points toward ticks)"},"offset":{"type":"object","description":"Fine-tune position within the track zone after align is applied. offset.x=minorHeight+trimWidth (default 20) places the triangle tip at the outer edge of minor ticks when align=start.","properties":{"x":{"type":"number","description":"Horizontal offset in pixels"},"y":{"type":"number","description":"Vertical offset in pixels"}}},"color":{"$ref":"#/$defs/stateColorSchema"},"border":{"type":"object","properties":{"enabled":{"type":"boolean"},"width":{"type":"number","minimum":0},"color":{"$ref":"#/$defs/stateColorSchema"}}}}}}},"border":{"type":"object","description":"Per-side border configuration with optional corner radius","properties":{"radius":{"oneOf":[{"type":"number","minimum":0,"description":"Uniform corner radius in pixels applied to all four card corners","examples":[12]},{"type":"string","description":"CSS variable or px/rem value for uniform corner radius — resolved at render time","examples":["var(--ha-card-border-radius)"]},{"type":"object","description":"Per-corner radius — use to round only specific corners (e.g. only the free end on a bordered LCARS slider). Each corner also accepts a CSS variable string.","properties":{"top_left":{"oneOf":[{"type":"number","minimum":0},{"type":"string"}]},"top_right":{"oneOf":[{"type":"number","minimum":0},{"type":"string"}]},"bottom_right":{"oneOf":[{"type":"number","minimum":0},{"type":"string"}]},"bottom_left":{"oneOf":[{"type":"number","minimum":0},{"type":"string"}]}}}],"description":"Corner radius — number or CSS variable string for uniform rounding, or per-corner object. Supports var(--ha-card-border-radius), px values, and rem values.","examples":[12]},"left":{"type":"object","description":"Left border cap configuration","properties":{"enabled":{"type":"boolean","description":"Enable left border"},"size":{"type":"number","minimum":0,"description":"Border width in pixels"},"color":{"$ref":"#/$defs/stateColorSchema"}}},"top":{"type":"object","description":"Top border cap configuration","properties":{"enabled":{"type":"boolean","description":"Enable top border"},"size":{"type":"number","minimum":0,"description":"Border height in pixels"},"color":{"$ref":"#/$defs/stateColorSchema"}}},"right":{"type":"object","description":"Right border cap configuration","properties":{"enabled":{"type":"boolean","description":"Enable right border"},"size":{"type":"number","minimum":0,"description":"Border width in pixels"},"color":{"$ref":"#/$defs/stateColorSchema"}}},"bottom":{"type":"object","description":"Bottom border cap configuration","properties":{"enabled":{"type":"boolean","description":"Enable bottom border"},"size":{"type":"number","minimum":0,"description":"Border height in pixels"},"color":{"$ref":"#/$defs/stateColorSchema"}}}}},"range":{"type":"object","description":"Visual styling for range-band frame/border elements (used by components like Picard that render a decorative frame around the ranges track).","properties":{"border":{"type":"object","description":"Range track border styling","properties":{"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Range border colour (default: theme:components.slider.range.border.color)"}}},"frame":{"type":"object","description":"Range track frame styling (decorative outline, e.g. Picard component)","properties":{"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Range frame colour. Falls back to the top border colour if unset."}}}}},"solid_bar":{"type":"object","description":"Solid value-bar styling (used by components with a dedicated solid-bar zone, e.g. Picard).","properties":{"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Solid bar colour. Falls back to the top border colour if unset."}}},"animation":{"type":"object","description":"Styling for the built-in scanning/activity animation indicator (used by components like Picard/Demo).","properties":{"indicator":{"type":"object","properties":{"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Animation indicator colour (default: theme:components.slider.animation.indicator.color)"}}}}},"ranges":{"type":"array","description":"Colour-coded value ranges and point markers.\n\nTwo item types:\n• Band range (min+max): coloured background zone — rect in gauge mode, segment overrides in pills mode.\n• Value marker (value): live point indicator — triangle on gauge ticks, highlighted pill in pills mode.\n\nmin/max/value resolve static numbers, {entity.state}/{entity.attributes.x}/{states.domain.object_id.state} tokens, {datasource:name}, {config.x}/{variables.x} tokens, theme token references, and [[[JS]]] — evaluated synchronously (no Jinja2; see range.label.text for full Jinja2/DataSource async support on the label caption).","items":{"type":"object","properties":{"min":{"type":["number","string"],"description":"Range start value (in display space). Supports static numbers or templates: {entity.state}, {entity.attributes.xxx}, {states.domain.object_id.state}, {datasource:name}, {config.x}, {variables.x}, [[[JS return expr]]]. (Synchronous only — no Jinja2.)","examples":[0]},"max":{"type":["number","string"],"description":"Range end value (in display space). Supports static numbers or templates: {entity.state}, {entity.attributes.xxx}, {states.domain.object_id.state}, {datasource:name}, {config.x}, {variables.x}, [[[JS return expr]]]. (Synchronous only — no Jinja2.)","examples":[20]},"color":{"$ref":"#/$defs/stateColorSchema"},"opacity":{"type":"number","minimum":0,"maximum":1,"default":0.3,"description":"Background opacity (0=transparent, 1=solid, default: 0.3)"},"value":{"type":["string","number"],"description":"Numeric value or template resolving to a position on the track. When present (instead of min/max), renders a point marker rather than a coloured band. Supports {entity.state}, {entity.attributes.xxx}, {states.domain.object_id.state}, {datasource:name}, {config.x}, {variables.x}, and [[[JS]]] templates. (Synchronous only — no Jinja2.)"},"indicator":{"type":"object","description":"Gauge mode: per-marker indicator shape override. Fallback chain: this block → style.gauge.marker_indicator (preset default) → hardcoded defaults (triangle 20×20, rotation 180, no border). Values not specified here inherit from the next level in the chain.","properties":{"type":{"type":"string","enum":["line","round","triangle"],"description":"Indicator shape type (default: triangle)"},"align":{"type":"string","enum":["start","center","end"],"default":"center","description":"Cross-axis alignment: start=left/top edge, center=middle, end=right/bottom. Overrides the preset marker_indicator.align for this range only."},"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Indicator fill color (defaults to range color). Supports state-object syntax ({ active, inactive, above:N, … }) and theme:/var()/computed colour tokens."},"size":{"type":"object","properties":{"width":{"type":"number","description":"Width in pixels"},"height":{"type":"number","description":"Height in pixels"}}},"offset":{"type":"object","properties":{"x":{"type":"number","description":"Horizontal offset in pixels"},"y":{"type":"number","description":"Vertical offset in pixels"}}},"rotation":{"type":"number","description":"Rotation angle in degrees"},"border":{"type":"object","properties":{"enabled":{"type":"boolean","default":true},"color":{"$ref":"#/$defs/stateColorSchema"},"width":{"type":"number"}}}}},"pill_style":{"type":"object","description":"Pills mode: visual appearance of the marker pill.","properties":{"stroke":{"type":"boolean","default":true,"description":"Show an outline border on the marker pill to distinguish it from neighbours"},"stroke_width":{"type":"number","default":2,"description":"Border thickness in pixels"},"stroke_color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Outline border colour. Falls back to the pill fill colour (range.color) if unset."}}},"label":{"type":"object","description":"Optional text caption shown next to the marker (gauge mode) or highlighted pill (pills mode).","properties":{"text":{"type":"string","description":"Label text. Supports the full template system: {entity.attributes.xxx} / {states.entity_id.state} tokens, {{ Jinja2 }}, [[[ JS ]]], and {datasource:name} references — or a plain static string."},"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"State-based colour of the label text. Falls back to theme:components.slider.indicator.label.color."},"font_size":{"type":"number","description":"Label font size in pixels. Defaults to the gauge tick-label size."},"offset":{"type":"object","description":"Pixel offset from the marker’s default label position (above the marker in horizontal orientation, beside it in vertical).","properties":{"x":{"type":"number","description":"Horizontal offset in pixels"},"y":{"type":"number","description":"Vertical offset in pixels"}}}}}}},"examples":[[{"min":0,"max":20,"color":"var(--error-color)","opacity":0.3},{"min":20,"max":80,"color":"var(--success-color)","opacity":0.3},{"min":80,"max":100,"color":"var(--warning-color)","opacity":0.3}]]},"shaped":{"type":"object","description":"Shaped component configuration (used with component: shaped)","properties":{"type":{"type":"string","enum":["lozenge","rect","rounded","diamond","hexagon","polygon","path"],"default":"lozenge","description":"Shape boundary for the clip path"},"radius":{"type":"number","description":"Corner radius in pixels — lozenge auto = min(w,h)/2, rounded default = 8","examples":[8]},"fill":{"type":"object","description":"Value fill appearance (the “filled” portion of the shape)","properties":{"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Fill colour. Supports state-object syntax ({ active, inactive, above:N, … }) and theme:/var()/computed colour tokens."}}},"text_bands":{"type":"object","description":"Band sizes (pixels reserved outside the shape body for text fields)","properties":{"top":{"type":"object","description":"Top band (vertical mode only)","properties":{"size":{"type":"number","default":36}}},"bottom":{"type":"object","description":"Bottom band (vertical mode only)","properties":{"size":{"type":"number","default":36}}},"left":{"type":"object","description":"Left band (horizontal mode only)","properties":{"size":{"type":"number","default":60}}},"right":{"type":"object","description":"Right band (horizontal mode only)","properties":{"size":{"type":"number","default":60}}}}},"track":{"type":"object","description":"Shape track appearance","properties":{"background":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Shape interior background colour (the “empty” portion). Supports state-object syntax and theme:/var()/computed colour tokens."}}},"polygon":{"type":"object","description":"Polygon shape options (shape type: polygon)","properties":{"points":{"type":"array","description":"Array of [xPct, yPct] pairs (0–1) defining polygon vertices relative to shape bounds","items":{"type":"array","items":{"type":"number","minimum":0,"maximum":1},"minItems":2,"maxItems":2}}}},"path":{"type":"object","description":"Raw SVG path options (shape type: path)","properties":{"d":{"type":"string","description":"SVG path d-attribute (absolute coordinates)"},"translate":{"type":"boolean","default":false,"description":"Wrap path in translate(bodyX, bodyY) so coordinates are relative to the shape body origin"}}}}}}},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"},"animations":{"type":"array","description":"Visual animations triggered by user interactions or entity state changes","items":{"$ref":"#/$defs/animationSchema"}},"background_animation":{"$ref":"#/$defs/backgroundAnimationSchema"},"value_tween":{"type":"object","description":"Eases the gauge/pills track and markers between old and new positions on entity-driven state changes (does not affect direct drag interaction). Distinct from the animations array, which is trigger/preset based.","examples":[{"enabled":true,"duration":500,"ease":"outQuad"}],"properties":{"enabled":{"type":"boolean","default":true,"description":"Enable value tweening. Automatically forced off when the OS-level prefers-reduced-motion setting is active, regardless of this value."},"duration":{"type":"number","minimum":0,"maximum":5000,"default":500,"description":"Tween duration in milliseconds (0-5000)"},"ease":{"type":"string","enum":["linear","in","out","inOut","outIn","inQuad","outQuad","inOutQuad","outInQuad","inCubic","outCubic","inOutCubic","outInCubic","inQuart","outQuart","inOutQuart","outInQuart","inQuint","outQuint","inOutQuint","outInQuint","inSine","outSine","inOutSine","outInSine","inExpo","outExpo","inOutExpo","outInExpo","inCirc","outCirc","inOutCirc","outInCirc","inBack","outBack","inOutBack","outInBack","inElastic","outElastic","inOutElastic","outInElastic","inBounce","outBounce","inOutBounce","outInBounce","spring"],"default":"outQuad","description":"anime.js v4 easing function used for the tween"},"targets":{"type":"object","description":"Which elements the tween applies to. All default to true.","properties":{"track":{"type":"boolean","default":true,"description":"Tween the gauge/shaped fill or the pills opacity sweep, whichever the card's track type uses."},"markers":{"type":"boolean","default":true,"description":"Tween threshold/range marker position (and, in pills mode, which pill is highlighted). Applies to `gauge` and `pills` track types — `shaped` never renders markers at all."}}}}},"drag_badge":{"type":"object","description":"Live value badge that follows the drag position while the slider is being actively dragged by the user (never shown for entity-driven/external state changes). Mirrors HA's native slider drag badge.","examples":[{"enabled":true}],"properties":{"enabled":{"type":"boolean","default":false,"description":"Show a live value badge that tracks the drag position while dragging"},"format":{"type":"object","description":"Number formatting for the badge text","properties":{"decimals":{"type":"number","minimum":0,"maximum":4,"description":"Fixed number of decimal places. Leave blank to use locale-default formatting."},"show_unit":{"type":"boolean","default":true,"description":"Show the unit suffix on the badge"},"unit":{"type":"string","description":"Unit suffix override. Leave blank to use the track's display unit (style.track.display.unit / entity unit_of_measurement).","examples":["°C"]}}},"font_size":{"type":"number","minimum":8,"maximum":48,"default":14,"description":"Badge text size in pixels"},"offset":{"type":"object","description":"Pixel offset from the default anchor point (above the track in horizontal orientation, beside it in vertical).","properties":{"x":{"type":"number","description":"Horizontal offset in pixels"},"y":{"type":"number","description":"Vertical offset in pixels"}}},"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Badge text colour. Falls back to theme:components.slider.drag_badge.text.color."},"background":{"type":"object","description":"Badge background chip","properties":{"enabled":{"type":"boolean","default":true,"description":"Show a background chip behind the badge text"},"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Badge background colour. Falls back to a theme-aware translucent surface colour."}}},"border":{"type":"object","description":"Badge border","properties":{"enabled":{"type":"boolean","default":true,"description":"Show a border around the badge"},"width":{"type":"number","minimum":0,"maximum":10,"default":1,"description":"Border width in pixels"},"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Badge border colour. Falls back to theme:components.slider.border.color.default."}}},"release":{"type":"object","description":"What happens to the badge when the drag is released (pointer-up), before the entity commit.","properties":{"behavior":{"type":"string","enum":["fade","instant"],"default":"fade","description":"fade = linger briefly then fade out; instant = hide immediately on release. Automatically forced to instant when prefers-reduced-motion is active."},"duration":{"type":"number","minimum":0,"maximum":2000,"default":500,"description":"Fade-out duration in milliseconds (only used when behavior = fade)"}}}}},"sounds":{"$ref":"#/$defs/soundsSchema"},"grid_options":{"$ref":"#/$defs/gridOptionsSchema"}}},"lcards-elbow":{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://github.com/snootched/lcards/schemas/elbow-schema","title":"LCARdS Elbow Card Configuration","description":"Complete configuration schema for lcards-elbow custom card with LCARS corner treatments. Supports dynamic theme integration via HA-LCARS input_number helpers (input_number.lcars_horizontal, input_number.lcars_vertical).","type":"object","required":["type"],"examples":[{"type":"custom:lcards-elbow","elbow":{"type":"header-left","style":"simple","segment":{"bar_width":"theme","bar_height":"theme","outer_curve":"auto","color":{"default":"#FF9900"}}},"text":{"name":{"show":true,"value":"Navigation"}}}],"properties":{"type":{"type":"string","const":"custom:lcards-elbow","description":"Home Assistant card type identifier (required)"},"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Home Assistant entity ID to control or monitor (format: domain.object_id)","examples":["light.living_room"]},"ranges_attribute":{"type":"string","description":"Entity attribute to use as the numeric value for all range conditions (above:/below:/between: keys) in any state-based style config. Use \"brightness_pct\" for a computed 0–100 light brightness value. Defaults to evaluating the raw entity state string.","examples":["brightness_pct"]},"state_attribute":{"type":"string","description":"Entity attribute whose String() value is used as the highest-priority key for ALL exact-match state-color lookups across the card. Booleans become \"true\"/\"false\"; null becomes \"null\"; strings are used as-is. Classified state (active/inactive) is always derived from entity.state and is unaffected. Can be used alongside ranges_attribute.","examples":["effect"]},"interactive":{"type":"boolean","default":true,"description":"When false, hover colour changes and hover animations are suppressed. The cursor defaults to the arrow unless overridden via style.cursor. Tap/hold actions still fire if configured."},"state_classification":{"$ref":"#/$defs/stateClassificationSchema"},"id":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"Unique card identifier for rule targeting, animations, and debugging (alphanumeric, underscore, hyphen)","examples":["main-button"]},"tags":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$"},"description":"Tags for bulk rule targeting and grouping. Allows applying rules to multiple cards at once using tag selectors.","examples":[["navigation","primary"]]},"height":{"$ref":"#/$defs/cardHeightSchema"},"width":{"$ref":"#/$defs/cardWidthSchema"},"min_height":{"$ref":"#/$defs/cardMinHeightSchema"},"min_width":{"$ref":"#/$defs/cardMinWidthSchema"},"max_height":{"$ref":"#/$defs/cardMaxHeightSchema"},"max_width":{"$ref":"#/$defs/cardMaxWidthSchema"},"overflow":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow shorthand on the card host element (sets both axes unless overridden per-axis)."},"overflow_x":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-x on the card host element. Overrides the overflow shorthand for the horizontal axis."},"overflow_y":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-y on the card host element. Overrides the overflow shorthand for the vertical axis."},"z_index":{"type":"integer","description":"CSS z-index stacking order on the card host element."},"preset":{"type":"string","enum":[],"description":"Style preset name (inherits from button presets)","examples":["lozenge"]},"elbow":{"type":"object","required":["type"],"description":"Elbow geometry and styling configuration","properties":{"type":{"type":"string","enum":["header-left","header-right","footer-left","footer-right","header-contained","footer-contained","header-open","footer-open","diagonal-cap-left","diagonal-cap-right","diagonal-cap-footer-left","diagonal-cap-footer-right","frame"],"description":"Position of the elbow corner on the card","enumDescriptions":["Top-left corner: vertical bar on left, horizontal bar on top","Top-right corner: vertical bar on right, horizontal bar on top","Bottom-left corner: vertical bar on left, horizontal bar on bottom","Bottom-right corner: vertical bar on right, horizontal bar on bottom"],"examples":["header-left"]},"style":{"type":"string","enum":["simple","segmented"],"default":"simple","description":"Elbow rendering style","enumDescriptions":["Simple: Single elbow with one curved corner","Segmented: Double concentric elbows with gap (TNG Picard aesthetic)"],"examples":["simple"]},"segment":{"type":"object","description":"Configuration for simple style (single elbow)","default":{"bar_width":120,"bar_height":20,"outer_curve":"auto"},"examples":[{"bar_width":90,"bar_height":20,"outer_curve":"auto","color":{"default":"#888888","active":"#FF9900","inactive":"#444444"}}],"properties":{"bar_width":{"oneOf":[{"type":"number","minimum":10,"maximum":500,"default":90,"description":"Width of vertical sidebar (pixels)","examples":[90]},{"type":"string","description":"Use 'theme' to bind to input_number.lcars_vertical, or a CSS length expression (e.g. 'clamp(60px, 8vw, 120px)')","examples":["theme"]}],"default":90,"description":"Width of vertical sidebar. Use number for static value or \"theme\" for dynamic binding to HA-LCARS input_number.lcars_vertical","examples":[90]},"bar_height":{"oneOf":[{"type":"number","minimum":10,"maximum":500,"default":20,"description":"Height of horizontal bar (pixels)","examples":[20]},{"type":"string","description":"Use 'theme' to bind to input_number.lcars_horizontal, or a CSS length expression (e.g. 'clamp(20px, 4vh, 60px)')","examples":["theme"]}],"description":"Height of horizontal bar. Use number for static value or \"theme\" for dynamic binding to HA-LCARS input_number.lcars_horizontal. Defaults to bar_width if not specified.","examples":[20]},"outer_curve":{"oneOf":[{"type":"number","minimum":0,"maximum":500,"description":"Outer corner radius in pixels","examples":[45]},{"type":"string","description":"Keyword or CSS expression. Keywords: 'auto'/'arm_width' = bar_width/2, 'arm_height' = bar_height/2, 'arm_max' = max(bar_width,bar_height)/2 (recommended), 'arm_min' = min(bar_width,bar_height)/2, 'arm_fill' = max(bar_width,bar_height). CSS: e.g. 'clamp(30px, 4vw, 60px)'","examples":["auto"]}],"default":"auto","description":"Outer corner radius. Keywords: 'auto'/'arm_width' = bar_width/2 (LCARS classic), 'arm_height' = bar_height/2, 'arm_max' = max(bar_width,bar_height)/2 (recommended for paired elbows — same as auto for typical configs), 'arm_min' = min(bar_width,bar_height)/2, 'arm_fill' = max(bar_width,bar_height) (fills dominant arm). Or set explicit pixels.","$comment":"Arc tangent points always arrive at 0° to their edges. Render-time clamp: outerRadius ≤ min(card_w, card_h) keeps tangent points within card viewport. Use arm_max for consistent paired elbows — equals auto (bar_width/2) when bar_width >= bar_height."},"inner_curve":{"oneOf":[{"type":"number","minimum":0,"maximum":500,"description":"Inner corner radius in pixels","examples":[22.5]},{"type":"string","description":"Keyword or CSS expression. Keywords: 'auto' = outer_curve/2 (LCARS formula), 'arm_width' = bar_width/2, 'arm_height' = bar_height/2, 'arm_max' = max(w,h)/2, 'arm_min' = min(w,h)/2, 'arm_fill' = max(w,h). CSS: e.g. 'clamp(10px, 2vw, 30px)'","examples":["auto"]}],"$comment":"LCARS formula default: inner_curve = outer_curve / 2. Keywords use the same bar dimension formulas as outer_curve, independently of the outer value."},"outer_curve_clamp":{"oneOf":[{"type":"string","enum":["card","none"],"description":"'card' (default) clamps outer_curve to min(card_w, card_h) — keeps arc within viewport. 'none' disables clamping — arc is exactly the computed value; SVG overflow:hidden clips any overflow. Use 'none' for consistent paired elbows regardless of card height."},{"type":"number","minimum":0,"maximum":500,"description":"Explicit px ceiling for outer radius — hard cap independent of card or arm dimensions"}],"default":"card","$comment":"Issue #361: two same-config elbows in differently-sized cards get different radii because 'card' clamp uses the card height. Set 'none' to decouple radius from card height."},"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Segment colour (string or state-based object)","examples":["#FF9900"]}}},"segments":{"type":"object","description":"Configuration for segmented style (double concentric elbows with gap)","default":{"gap":4,"outer_segment":{"bar_width":88,"bar_height":10},"inner_segment":{"bar_width":28,"bar_height":10}},"examples":[{"gap":4,"outer_segment":{"bar_width":90,"bar_height":90,"outer_curve":45,"inner_curve":22.5,"color":"#FF9900"},"inner_segment":{"bar_width":60,"bar_height":60,"color":"#FFCC99"}}],"properties":{"gap":{"type":"number","minimum":0,"maximum":50,"default":4,"description":"Gap between outer and inner segments (pixels)","examples":[2]},"outer_segment":{"type":"object","required":["bar_width"],"description":"Outer segment (frame) configuration","examples":[{"bar_width":90,"bar_height":90,"outer_curve":45,"inner_curve":22.5,"color":"#FF9900","entity_id":"light.outer"}],"properties":{"entity_id":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Entity ID for state-based colour (format: domain.object_id)","examples":["light.outer_frame"]},"bar_width":{"oneOf":[{"type":"number","minimum":1,"maximum":500},{"type":"string","description":"CSS length expression (e.g. 'clamp(60px, 8vw, 120px)')"}],"description":"Vertical bar thickness (pixels or CSS length) - REQUIRED","examples":[90]},"bar_height":{"oneOf":[{"type":"number","minimum":1,"maximum":500},{"type":"string","description":"CSS length expression (e.g. 'clamp(20px, 4vh, 60px)')"}],"description":"Horizontal bar thickness (pixels or CSS length, defaults to bar_width)","examples":[20]},"outer_curve":{"oneOf":[{"type":"number","minimum":0,"maximum":500},{"type":"string","description":"Keyword: 'auto'/'arm_width', 'arm_height', 'arm_max' (recommended), 'arm_min', 'arm_fill', or CSS expression"}],"description":"Outer corner radius. Keywords: 'auto'/'arm_width'=bar_width/2, 'arm_height'=bar_height/2, 'arm_max'=max(w,h)/2 (recommended), 'arm_min'=min(w,h)/2, 'arm_fill'=max(w,h). Or explicit pixels.","examples":[45]},"inner_curve":{"oneOf":[{"type":"number","minimum":0,"maximum":500},{"type":"string","description":"CSS length expression (e.g. 'clamp(15px, 2vw, 30px)')"}],"description":"Inner corner radius (pixels or CSS length, defaults to outer_curve / 2)","examples":[22.5]},"color":{"$ref":"#/$defs/stateColorSchema"},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"}}},"inner_segment":{"type":"object","required":["bar_width"],"description":"Inner segment (content area) configuration","examples":[{"bar_width":60,"bar_height":60,"outer_curve":18,"inner_curve":9,"color":"#FFCC99","entity_id":"light.inner"}],"properties":{"entity_id":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"Entity ID for state-based colour (format: domain.object_id)","examples":["light.inner_zone"]},"bar_width":{"oneOf":[{"type":"number","minimum":1,"maximum":500},{"type":"string","description":"CSS length expression (e.g. 'clamp(40px, 6vw, 80px)')"}],"description":"Vertical bar thickness (pixels or CSS length) - REQUIRED","examples":[60]},"bar_height":{"oneOf":[{"type":"number","minimum":1,"maximum":500},{"type":"string","description":"CSS length expression (e.g. 'clamp(20px, 4vh, 60px)')"}],"description":"Horizontal bar thickness (pixels or CSS length, defaults to bar_width)","examples":[20]},"outer_curve":{"oneOf":[{"type":"number","minimum":0,"maximum":500},{"type":"string","description":"Keyword: 'auto'/'arm_width', 'arm_height', 'arm_max' (recommended), 'arm_min', 'arm_fill', or CSS expression"}],"description":"Outer corner radius. Omit for auto concentric (outer_segment.inner_curve - gap). Keywords: 'auto'/'arm_width'=bar_width/2, 'arm_height'=bar_height/2, 'arm_max'=max(w,h)/2 (recommended), 'arm_min'=min(w,h)/2, 'arm_fill'=max(w,h).","examples":[18],"$comment":"Auto-calculation (when omitted): outer_segment.inner_curve - gap. Keyword modes use bar dimensions of inner_segment."},"inner_curve":{"oneOf":[{"type":"number","minimum":0,"maximum":500},{"type":"string","description":"CSS length expression for inner corner radius"}],"description":"Inner corner radius (pixels or CSS length, defaults to outer_curve / 2)","examples":[9]},"color":{"$ref":"#/$defs/stateColorSchema"},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"}}}}},"colors":{"type":"object","description":"Legacy colour override (use segment.color or segments.*.color instead)","deprecated":true,"properties":{"background":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Background colour override (deprecated - use segment.color instead)"}}}}},"style":{"type":"object","properties":{"cursor":{"type":"string","description":"CSS cursor style shown when hovering over the elbow. Overrides the automatic cursor derived from the interactive flag.","examples":["pointer"]}}},"text":{"type":"object","description":"Multi-text label system","$comment":"Text fields use arbitrary keys. \"default\" provides styling inherited by all other text fields. All other keys create actual rendered text elements.","examples":[{"label1":{"content":"Temperature","position":"top-left","font_size":18,"color":"#FF9900"},"status":{"content":"{entity.state}","position":"center"}}],"properties":{"default":{"type":"object","description":"Default styling inherited by all text fields (does not render)","$comment":"This is NOT rendered as a text element - it only provides default styles","properties":{"position":{"type":"string","enum":[],"description":"Default text position (e.g., \"top-left\", \"center\")"},"rotation":{"type":"number","minimum":-360,"maximum":360,"default":0,"description":"Text rotation in degrees (-360 to 360)"},"padding":{"$ref":"#/$defs/paddingSchema"},"font_size":{"oneOf":[{"type":"number","minimum":1,"maximum":200,"default":14,"description":"Font size in pixels (1-200)"},{"type":"string","pattern":"^(\\d+px|\\d+\\.?\\d*rem|\\d+\\.?\\d*em|var\\(--[a-z-]+\\))$","description":"CSS value or theme token","examples":["14px"]}]},"color":{"$ref":"#/$defs/stateColorSchema"},"font_weight":{"type":["string","number"],"default":"normal","description":"Font weight — CSS keyword (normal, bold) or numeric value (100–900)","examples":["normal"]},"font_family":{"type":"string","format":"font-family","description":"CSS font-family (single font, comma-separated stack, or CSS variable)","examples":["Arial"]},"text_transform":{"type":"string","enum":["none","uppercase","lowercase","capitalize"],"default":"none","description":"Text transformation","enumDescriptions":["No transformation (original case)","ALL UPPERCASE","all lowercase","Capitalize First Letter"]},"anchor":{"type":"string","enum":["start","middle","end"],"default":"middle","description":"Horizontal text alignment","enumDescriptions":["Left-aligned","Center-aligned","Right-aligned"]},"baseline":{"type":"string","enum":["hanging","middle","central","alphabetic"],"default":"middle","description":"Vertical text alignment","enumDescriptions":["Top of text box","Center of text box","Mathematical center","Bottom of text (baseline)"]},"display_format":{"type":"string","enum":["friendly","raw","parts","unit"],"default":"friendly","description":"Default display format for entity state/attribute tokens. \"friendly\" uses HA's translated display string. \"raw\" returns the unmodified value. \"parts\" joins value and unit. \"unit\" returns only the unit."},"background":{"$ref":"#/$defs/stateColorSchema"},"background_padding":{"type":"number","minimum":0,"default":8,"description":"Horizontal padding between text glyphs and the background rect edges (px)."},"background_radius":{"type":"number","minimum":0,"default":4,"description":"Corner radius of the background rect (px)."},"background_width":{"type":["number","null"],"minimum":1,"description":"Fixed explicit width of the background rect (px). Overrides auto-sizing from text metrics. Text will overflow if content is wider than this value."},"background_min_width":{"type":["number","null"],"minimum":1,"description":"Minimum width of the background rect (px). Auto-sizes to text width but never smaller than this value. Safe for dynamic content."},"font_size_percent":{"type":"number","minimum":1,"maximum":100,"description":"Default font size as a percentage of the card height. All fields inherit this unless they set an explicit font_size. Useful for bar-label style presets that should auto-scale with the configured card height."},"cap_height_ratio":{"type":"number","minimum":0.1,"maximum":1,"description":"Ratio of the font cap-height to the em-square (font-size). Used to correct font_size_percent so visible glyph height matches the requested percentage of the container. Defaults to the theme token value (0.86 for Antonio). Override when using a different font family."}}}},"additionalProperties":{"type":"object","description":"Text field configuration (key becomes field name)","$comment":"Each key creates a separate SVG text element. Use descriptive names like \"label1\", \"status\", \"title\"","properties":{"content":{"type":"string","description":"Text content. Templates are evaluated by default (set template:false to disable)","examples":["Temperature"]},"show":{"type":"boolean","default":true,"description":"Whether to show this text field"},"position":{"type":"string","enum":[],"description":"Text position (overrides default)"},"x":{"type":"number","description":"Absolute X coordinate in pixels"},"y":{"type":"number","description":"Absolute Y coordinate in pixels"},"x_percent":{"type":"number","minimum":0,"maximum":100,"description":"X position as percentage of card width (0-100)"},"y_percent":{"type":"number","minimum":0,"maximum":100,"description":"Y position as percentage of card height (0-100)"},"rotation":{"type":"number","minimum":-360,"maximum":360,"default":0,"description":"Text rotation in degrees (-360 to 360)"},"padding":{"$ref":"#/$defs/paddingSchema"},"font_size":{"oneOf":[{"type":"number","minimum":1,"maximum":200,"description":"Font size in pixels (1-200)"},{"type":"string","pattern":"^(\\d+px|\\d+\\.?\\d*rem|\\d+\\.?\\d*em|var\\(--[a-z-]+\\))$","description":"CSS value or theme token","examples":["14px"]}]},"color":{"$ref":"#/$defs/stateColorSchema"},"font_weight":{"type":["string","number"],"default":"normal","description":"Font weight — CSS keyword (normal, bold) or numeric value (100–900)","examples":["normal"]},"font_family":{"type":"string","format":"font-family","description":"CSS font-family (single font, comma-separated stack, or CSS variable)","examples":["Arial"]},"text_transform":{"type":"string","enum":["none","uppercase","lowercase","capitalize"],"default":"none","description":"Text transformation","enumDescriptions":["No transformation (original case)","ALL UPPERCASE","all lowercase","Capitalize First Letter"]},"anchor":{"type":"string","enum":["start","middle","end"],"default":"middle","description":"Horizontal text alignment","enumDescriptions":["Left-aligned","Center-aligned","Right-aligned"]},"baseline":{"type":"string","enum":["hanging","middle","central","alphabetic"],"default":"middle","description":"Vertical text alignment","enumDescriptions":["Top of text box","Center of text box","Mathematical center","Bottom of text (baseline)"]},"template":{"type":"boolean","default":true,"description":"Template evaluation is enabled by default for this field’s content (e.g. {entity.state}, {{ states(...) }}, [[[ ... ]]]). Set to false to render {...} / [[[...]]] text literally without evaluating it."},"stretch":{"oneOf":[{"type":"boolean","description":"true = stretch text to fill 100% of the available width"},{"type":"number","minimum":0,"maximum":1,"description":"Fraction of available width to stretch text to (0–1)"}],"description":"Stretch text to fill a fraction of the available width using SVG textLength / lengthAdjust=\"spacingAndGlyphs\". true = 100%, 0.8 = 80%."},"font_size_percent":{"type":"number","minimum":1,"maximum":100,"description":"Font size as a percentage of the text area height (component mode). Overrides font_size when set."},"cap_height_ratio":{"type":"number","minimum":0.1,"maximum":1,"description":"Ratio of the font cap-height to the em-square. Used to correct font_size_percent so visible glyph height matches the requested percentage. Defaults to the theme token value (0.86 for Antonio). Override when using a different font."},"zone":{"type":"string","description":"Named zone key to route this text field to. For component cards this matches a key in the component's zones map. For slider/elbow cards this matches a named layout zone (e.g. left, track, vertical_bar). Defaults to the first zone if not set."},"display_format":{"type":"string","enum":["friendly","raw","parts","unit"],"default":"friendly","description":"How to format entity state or attribute values in this text field. \"friendly\" (default) uses HA's translated display string matching native cards. \"raw\" returns the unmodified state/attribute value. \"parts\" joins value and unit from HA's ToParts API. \"unit\" returns only the unit portion.","examples":["friendly"]},"background":{"$ref":"#/$defs/stateColorSchema"},"background_padding":{"type":"number","minimum":0,"default":8,"description":"Horizontal padding between text glyphs and the background rect edges (px)."},"background_radius":{"type":"number","minimum":0,"default":4,"description":"Corner radius of the background rect (px)."},"background_width":{"type":["number","null"],"minimum":1,"description":"Fixed explicit width of the background rect (px). Overrides auto-sizing from text metrics. Text will overflow if content is wider than this value."},"background_min_width":{"type":["number","null"],"minimum":1,"description":"Minimum width of the background rect (px). Auto-sizes to text width but never smaller than this value. Safe for dynamic content."}}}},"tap_action":{"$ref":"#/$defs/actionSchema"},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"},"data_sources":{"$ref":"#/$defs/dataSourcesSchema"},"triggers_update":{"$ref":"#/$defs/triggersUpdateSchema"},"animations":{"type":"array","description":"Visual animations triggered by user interactions or entity state changes","items":{"$ref":"#/$defs/animationSchema"}},"background_animation":{"$ref":"#/$defs/backgroundAnimationSchema"},"sounds":{"$ref":"#/$defs/soundsSchema"},"shape_texture":{"type":"object","description":"Canvas texture/animation rendered inside the elbow shape boundary","properties":{"preset":{"type":"string","description":"Texture preset name","enum":["grid","diagonal","hexagonal","dots","fluid","shimmer","plasma","flow","level","pulse","scanlines","image"]},"opacity":{"description":"Texture opacity (0-1). Supports state-based object.","oneOf":[{"type":"number","minimum":0,"maximum":1},{"$ref":"#/$defs/stateColorSchema"}]},"speed":{"description":"Animation speed multiplier. Supports state-based object.","oneOf":[{"type":"number","minimum":0},{"type":"object"}]},"mix_blend_mode":{"type":"string","description":"CSS mix-blend-mode for texture blending","enum":["normal","multiply","screen","overlay","hard-light","soft-light","color-burn","color-dodge"]},"config":{"type":"object","description":"Preset-specific configuration. Supports entity-reactive values: map_range descriptor or template strings.","additionalProperties":true}},"additionalProperties":false},"filters":{"type":"array","description":"Visual filters applied to entire elbow (CSS and SVG filter primitives)","items":{"$ref":"#/$defs/filterSchema"}},"grid_options":{"$ref":"#/$defs/gridOptionsSchema"},"symbiont":{"type":"object","description":"Embed another HA card inside the elbow content area with optional style imprinting","properties":{"enabled":{"type":"boolean","default":false,"description":"Enable symbiont card embedding"},"overflow":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow for both axes of the symbiont container. Overridden per-axis by overflow_x / overflow_y. Default: hidden."},"overflow_x":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-x for the symbiont container (horizontal axis). Overrides overflow shorthand."},"overflow_y":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-y for the symbiont container (vertical axis). Overrides overflow shorthand."},"position":{"type":"object","description":"Padding within the elbow content area (px)","properties":{"top":{"type":"number","default":10},"left":{"type":"number","default":10},"right":{"type":"number","default":10},"bottom":{"type":"number","default":0}}},"imprint":{"type":"object","description":"Style imprinting — injects resolved styles into the embedded card shadow root","properties":{"enabled":{"type":"boolean","default":true},"background":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Background colour to inject into embedded card. Null = do not imprint."},"text":{"type":"object","properties":{"color":{"oneOf":{"$ref":"#/$defs/sharedSchema13"},"description":"Text colour to inject into embedded card. Null = do not imprint."},"font_size":{"type":"string","description":"Font size to inject (e.g. \"14px\"). Null = do not imprint."},"font_family":{"type":"string","description":"Font family string to inject. Null = do not imprint."}}},"border_radius":{"type":"object","properties":{"match_host":{"type":"boolean","default":true,"description":"Derive border radius from elbow inner arc geometry"},"top_left":{"oneOf":[{"type":"number","description":"Top-left border radius (px)"},{"type":"string","enum":["match"],"description":"Use 'match' to mirror the elbow's inner arc radius"}],"description":"Top-left border radius — number (px) or 'match' to mirror elbow inner arc"},"top_right":{"oneOf":[{"type":"number","description":"Top-right border radius (px)"},{"type":"string","enum":["match"],"description":"Use 'match' to mirror the elbow's inner arc radius"}],"description":"Top-right border radius — number (px) or 'match' to mirror elbow inner arc"},"bottom_left":{"oneOf":[{"type":"number","description":"Bottom-left border radius (px)"},{"type":"string","enum":["match"],"description":"Use 'match' to mirror the elbow's inner arc radius"}],"description":"Bottom-left border radius — number (px) or 'match' to mirror elbow inner arc"},"bottom_right":{"oneOf":[{"type":"number","description":"Bottom-right border radius (px)"},{"type":"string","enum":["match"],"description":"Use 'match' to mirror the elbow's inner arc radius"}],"description":"Bottom-right border radius — number (px) or 'match' to mirror elbow inner arc"}}}}},"custom_style":{"type":"string","description":"Raw CSS injected into child card shadowRoot after imprint styles. Does not require card-mod."},"card":{"type":"object","description":"Any valid HA card configuration (type + properties). card_mod blocks are passed through as-is."}}}}},"lcards-chart":{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://github.com/snootched/lcards/schemas/chart-schema","title":"LCARdS Chart Card Configuration","description":"Complete configuration schema for lcards-chart custom card (v1.18.0+ nested structure)","type":"object","properties":{"type":{"type":"string","const":"custom:lcards-chart","description":"Home Assistant card type identifier (required)"},"id":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"Custom card ID for rule targeting (optional - auto-generated if omitted)","examples":["main-button"]},"tags":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$"},"description":"Tags for bulk rule targeting and grouping. Allows applying rules to multiple cards at once using tag selectors.","examples":[["navigation","primary"]]},"source":{"type":"string","description":"Single entity ID (auto-creates DataSource with defaults)"},"attribute":{"type":"string","description":"Entity attribute to track (optional - works with source)"},"sources":{"anyOf":[{"type":"array","items":{"type":"string"},"title":"Simple String Array","description":"Array of entity IDs or DataSource names (simple format)"},{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"object","properties":{"datasource":{"type":"string","description":"DataSource name or entity ID"},"buffer":{"type":"string","description":"Buffer selector (e.g., \"main\", \"processor_name\")"},"name":{"type":"string","description":"Series name for legend"},"type":{"type":"string","enum":["line","area","bar","scatter"],"description":"Series-specific chart type override"},"yaxis":{"type":"number","minimum":0,"description":"Y-axis index (0-based) for multi-axis charts"}},"required":["datasource"]}]},"title":"Mixed Array (Strings and Objects)","description":"Array with mix of simple strings and advanced source objects"}]},"series_names":{"type":"array","items":{"type":"string"},"description":"Custom legend names for series (matches sources order)"},"data_sources":{"$ref":"#/$defs/dataSourcesSchema"},"chart_type":{"type":"string","enum":["line","area","bar","column","scatter","pie","donut","heatmap","radialBar","radar","polarArea","treemap","rangeBar","rangeArea","candlestick","boxPlot"],"default":"line","description":"ApexCharts chart type"},"height":{"$ref":"#/$defs/cardHeightSchema"},"width":{"$ref":"#/$defs/cardWidthSchema"},"min_height":{"$ref":"#/$defs/cardMinHeightSchema"},"min_width":{"$ref":"#/$defs/cardMinWidthSchema"},"max_height":{"$ref":"#/$defs/cardMaxHeightSchema"},"max_width":{"$ref":"#/$defs/cardMaxWidthSchema"},"overflow":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow shorthand on the card host element (sets both axes unless overridden per-axis)."},"overflow_x":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-x on the card host element. Overrides the overflow shorthand for the horizontal axis."},"overflow_y":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-y on the card host element. Overrides the overflow shorthand for the vertical axis."},"z_index":{"type":"integer","description":"CSS z-index stacking order on the card host element."},"show_legend":{"type":"boolean","default":false,"description":"Show/hide chart legend (deprecated - use style.legend.show)"},"xaxis_type":{"type":"string","enum":["datetime","category","numeric"],"default":"datetime","description":"X-axis type"},"max_points":{"type":"number","minimum":0,"maximum":10000,"default":0,"description":"Maximum data points to display (0 = unlimited)"},"style":{"type":"object","description":"Nested style configuration for chart appearance","properties":{"colors":{"type":"object","description":"Complete colour configuration for all chart elements","properties":{"series":{"$ref":"#/$defs/sharedSchema456"},"stroke":{"$ref":"#/$defs/sharedSchema456"},"fill":{"$ref":"#/$defs/sharedSchema456"},"background":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"foreground":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"grid":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"marker":{"type":"object","description":"Marker colours","properties":{"fill":{"$ref":"#/$defs/sharedSchema456"},"stroke":{"$ref":"#/$defs/sharedSchema456"}}},"axis":{"type":"object","description":"Axis colours","properties":{"x":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"y":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"border":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"ticks":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]}}},"legend":{"type":"object","description":"Legend colours","properties":{"default":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"items":{"$ref":"#/$defs/sharedSchema456"}}},"data_labels":{"$ref":"#/$defs/sharedSchema456"}}},"stroke":{"type":"object","description":"Line stroke configuration","properties":{"width":{"type":"number","minimum":0,"maximum":10,"default":2,"description":"Stroke width in pixels"},"curve":{"type":"string","enum":["smooth","straight","stepline","monotoneCubic"],"default":"smooth","description":"Line curve type"},"dash_array":{"type":"number","minimum":0,"maximum":20,"default":0,"description":"Dashed line pattern (0 = solid)"}}},"fill":{"type":"object","description":"Fill configuration for area and bar charts","properties":{"type":{"type":"string","enum":["solid","gradient","pattern","image"],"default":"solid","description":"Fill type"},"opacity":{"type":"number","minimum":0,"maximum":1,"default":0.7,"description":"Fill opacity (0-1)"},"gradient":{"type":"object","description":"Gradient fill configuration","properties":{"shade":{"type":"string","enum":["light","dark"],"description":"Gradient shade direction"},"type":{"type":"string","enum":["horizontal","vertical","diagonal1","diagonal2"],"description":"Gradient direction"},"shadeIntensity":{"type":"number","minimum":0,"maximum":1,"description":"Intensity of shading"},"opacityFrom":{"type":"number","minimum":0,"maximum":1,"description":"Starting opacity"},"opacityTo":{"type":"number","minimum":0,"maximum":1,"description":"Ending opacity"}}}}},"markers":{"type":"object","description":"Data point marker configuration","properties":{"size":{"type":"number","minimum":0,"maximum":20,"default":4,"description":"Marker size in pixels"},"shape":{"type":"string","enum":["circle","square","rect","rhombus"],"default":"circle","description":"Marker shape"},"stroke":{"type":"object","description":"Marker stroke configuration","properties":{"width":{"type":"number","minimum":0,"maximum":10,"default":2,"description":"Marker stroke width"}}}}},"grid":{"type":"object","description":"Grid line configuration","properties":{"show":{"type":"boolean","default":true,"description":"Show/hide grid lines"},"opacity":{"type":"number","minimum":0,"maximum":1,"default":0.3,"description":"Grid line opacity"},"stroke_dash_array":{"type":"number","minimum":0,"maximum":20,"default":4,"description":"Grid line dash pattern"},"row_colors":{"$ref":"#/$defs/sharedSchema456"},"column_colors":{"$ref":"#/$defs/sharedSchema456"}}},"legend":{"type":"object","description":"Legend configuration","properties":{"show":{"type":"boolean","default":false,"description":"Show/hide legend"},"position":{"type":"string","enum":["top","right","bottom","left"],"default":"bottom","description":"Legend position"},"horizontalAlign":{"type":"string","enum":["left","center","right"],"default":"center","description":"Legend horizontal alignment"},"font_size":{"type":"number","minimum":8,"maximum":24,"default":14,"description":"Legend font size"}}},"data_labels":{"type":"object","description":"Data label configuration","properties":{"show":{"type":"boolean","default":false,"description":"Show/hide data labels"},"offsetY":{"type":"number","minimum":-50,"maximum":50,"default":0,"description":"Vertical offset for data labels"},"font_size":{"type":"number","minimum":8,"maximum":24,"default":12,"description":"Data label font size"}}},"xaxis":{"type":"object","description":"X-axis configuration","properties":{"labels":{"type":"object","description":"X-axis label configuration","properties":{"show":{"type":"boolean","default":true,"description":"Show/hide x-axis labels"},"rotate":{"type":"number","minimum":-90,"maximum":90,"default":0,"description":"Label rotation in degrees"}}},"border":{"type":"object","description":"X-axis border configuration","properties":{"show":{"type":"boolean","default":false,"description":"Show/hide x-axis border"}}},"ticks":{"type":"object","description":"X-axis tick marks configuration","properties":{"show":{"type":"boolean","default":false,"description":"Show/hide x-axis tick marks"}}}}},"yaxis":{"type":"object","description":"Y-axis configuration","properties":{"labels":{"type":"object","description":"Y-axis label configuration","properties":{"show":{"type":"boolean","default":true,"description":"Show/hide y-axis labels"}}},"border":{"type":"object","description":"Y-axis border configuration","properties":{"show":{"type":"boolean","default":false,"description":"Show/hide y-axis border"}}},"ticks":{"type":"object","description":"Y-axis tick marks configuration","properties":{"show":{"type":"boolean","default":false,"description":"Show/hide y-axis tick marks"}}},"decimals":{"type":"number","minimum":0,"maximum":10,"description":"Round displayed values to N decimal places (axis labels, tooltips, and data labels)"}}},"typography":{"type":"object","description":"Typography configuration","properties":{"font_family":{"type":"string","default":"Antonio, Helvetica Neue, sans-serif","description":"Font family"},"font_size":{"type":"number","minimum":8,"maximum":24,"default":12,"description":"Base font size"}}},"display":{"type":"object","description":"Display options","properties":{"toolbar":{"type":"boolean","default":false,"description":"Show/hide toolbar"},"tooltip":{"type":"object","description":"Tooltip configuration","properties":{"show":{"type":"boolean","default":true,"description":"Show/hide tooltip"},"theme":{"type":"string","enum":["light","dark"],"default":"dark","description":"Tooltip theme"}}}}},"animation":{"type":"object","description":"Animation configuration","properties":{"preset":{"type":"string","enum":["lcars_standard","lcars_dramatic","lcars_minimal","lcars_realtime","lcars_alert","none"],"description":"Animation preset name"}}},"theme":{"type":"object","description":"Theme configuration","properties":{"mode":{"type":"string","enum":["light","dark"],"default":"dark","description":"Theme mode"},"palette":{"type":"string","description":"Theme palette name"},"monochrome":{"type":"object","description":"Monochrome theme configuration","properties":{"enabled":{"type":"boolean","default":false,"description":"Enable monochrome theme"},"color":{"type":"string","pattern":"^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent|match-light|theme:|rgb\\(|rgba\\(|hsl\\(|var\\(--)","description":"Colour value (hex, rgb, theme token, or CSS variable)","examples":["#FF9900"]},"shade_to":{"type":"string","enum":["light","dark"],"default":"dark","description":"Shade direction"},"shade_intensity":{"type":"number","minimum":0,"maximum":1,"default":0.65,"description":"Shade intensity"}}}}},"formatters":{"type":"object","description":"Label and tooltip formatters","properties":{"xaxis_label":{"type":"string","description":"X-axis label format template"},"yaxis_label":{"type":"string","description":"Y-axis label format template"},"tooltip":{"type":"string","description":"Tooltip format template"}}},"chart_options":{"type":"object","description":"Raw ApexCharts options (highest precedence - overrides all other settings)"}}}},"required":["type"]},"lcards-data-grid":{"type":"object","required":["type","data_mode"],"properties":{"type":{"type":"string","const":"custom:lcards-data-grid"},"data_mode":{"type":"string","enum":["decorative","data","random","template","datasource"],"default":"decorative"},"format":{"type":"string","enum":["digit","float","alpha","hex","mixed"],"default":"mixed"},"refresh_interval":{"type":"number","minimum":0,"default":0},"rows":{"type":"array","items":{"oneOf":[{"type":"array","title":"Simple Row","description":"Array of cell values (auto-detects static text, entity IDs, or templates)","items":{"type":["string","number"]}},{"type":"object","title":"Styled Row","description":"Row with values and optional style overrides","properties":{"values":{"type":"array","items":{"type":["string","number"]}},"style":{"type":"object","description":"Row-level style overrides"}},"required":["values"]}]}},"grid":{"type":"object","properties":{"grid-template-columns":{"type":"string"},"grid-template-rows":{"type":"string"},"gap":{"type":"string"},"row-gap":{"type":"string"},"column-gap":{"type":"string"},"grid-auto-flow":{"type":"string","enum":["row","column","dense","row dense","column dense"],"default":"row"},"justify-items":{"type":"string","enum":["stretch","start","end","center"],"default":"stretch"},"align-items":{"type":"string","enum":["stretch","start","end","center"],"default":"stretch"},"grid-auto-columns":{"type":"string"},"grid-auto-rows":{"type":"string"},"justify-content":{"type":"string","enum":["start","end","center","space-between","space-around","space-evenly"]},"align-content":{"type":"string","enum":["start","end","center","space-between","space-around","space-evenly"]},"rows":{"type":"number","minimum":1},"columns":{"type":"number","minimum":1},"cell_width":{"oneOf":[{"type":"string","const":"auto","title":"Auto"},{"type":"number","title":"Fixed Width","minimum":0}]}}},"style":{"type":"object","properties":{"font_size":{"type":["number","string"]},"font_family":{"type":"string","format":"font-family"},"font_weight":{"type":["number","string"]},"color":{"type":"string","format":"color"},"background":{"type":"string","format":"color"},"align":{"type":"string","enum":["left","center","right"],"default":"right"},"padding":{"type":["number","string"]},"border_width":{"type":"number","minimum":0},"border_color":{"type":"string","format":"color"},"border_style":{"type":"string","enum":["solid","dashed","dotted","double","groove","ridge","inset","outset"],"default":"solid"}}},"animations":{"type":"array","items":{"$ref":"#/$defs/animationSchema"}},"filters":{"type":"array","items":{"$ref":"#/$defs/filterSchema"}},"id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"height":{"$ref":"#/$defs/cardHeightSchema"},"width":{"$ref":"#/$defs/cardWidthSchema"},"min_height":{"$ref":"#/$defs/cardMinHeightSchema"},"min_width":{"$ref":"#/$defs/cardMinWidthSchema"},"max_height":{"$ref":"#/$defs/cardMaxHeightSchema"},"max_width":{"$ref":"#/$defs/cardMaxWidthSchema"},"overflow":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow shorthand on the card host element (sets both axes unless overridden per-axis)."},"overflow_x":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-x on the card host element. Overrides the overflow shorthand for the horizontal axis."},"overflow_y":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-y on the card host element. Overrides the overflow shorthand for the vertical axis."},"z_index":{"type":"integer","description":"CSS z-index stacking order on the card host element."}}},"lcards-alert-overlay":{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://github.com/snootched/lcards/schemas/alert-overlay-schema","title":"LCARdS Alert Overlay","description":"Full-screen alert overlay card that reacts to the lcards_alert_mode input_select","type":"object","properties":{"type":{"type":"string","const":"custom:lcards-alert-overlay"},"dismiss_mode":{"type":"string","enum":["dismiss","reset","auto-dismiss","auto-reset"],"description":"dismiss = hide overlay only; reset = hide + set alert_mode back to green_alert; auto-dismiss = automatically hide after auto_dismiss_seconds; auto-reset = automatically hide and reset alert_mode after auto_dismiss_seconds","default":"dismiss"},"auto_dismiss_seconds":{"type":"number","minimum":1,"description":"Seconds before the overlay auto-dismisses. Required when dismiss_mode is auto-dismiss or auto-reset. Can be overridden per condition under conditions.<key>.auto_dismiss_seconds.","examples":[10]},"backdrop":{"type":"object","description":"[DEPRECATED] Migrated at runtime to layers.backdrop + layers.color. Still accepted for backward compatibility.","properties":{"blur":{"type":"string","description":"CSS backdrop-filter blur value","default":"8px"},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Backdrop opacity (0–1)","default":0.6},"color":{"type":"string","description":"Backdrop background colour (CSS colour value)","default":"rgba(0,0,0,0.5)"}},"additionalProperties":false},"layers":{"oneOf":[{"type":"null","description":"null — explicitly disables all screen effect layers (useful as a per-condition override)."},{"type":"object","description":"Screen effect layers applied independently behind the overlay. Absent slot = disabled; null slot = explicitly cleared.","properties":{"backdrop":{"oneOf":[{"type":"null","description":"Explicitly disable this layer for a condition override"},{"type":"object","description":"CSS backdrop-filter layer. Preset: blur | grayscale | saturate | contrast | hue-rotate","properties":{"preset":{"type":"string","examples":["blur"]}},"required":["preset"],"additionalProperties":true}]},"color":{"oneOf":[{"type":"null","description":"Explicitly disable this layer for a condition override"},{"type":"object","description":"Colour overlay layer. Preset: color-tint | vignette","properties":{"preset":{"type":"string","examples":["color-tint"]}},"required":["preset"],"additionalProperties":true}]},"canvas":{"oneOf":[{"type":"null","description":"Explicitly disable this layer for a condition override"},{"type":"object","description":"Canvas animation layer. Preset: static | pixelate | glitch | scanlines","properties":{"preset":{"type":"string","examples":["static"]}},"required":["preset"],"additionalProperties":true}]}},"additionalProperties":false}]},"position":{"type":"string","enum":["top-left","top","top-center","top-right","left","center-left","left-center","center","right","center-right","right-center","bottom-left","bottom","bottom-center","bottom-right"],"default":"center"},"width":{"type":"string","description":"Global content card width (CSS value)","default":"auto","examples":["auto"]},"height":{"type":"string","description":"Global content card height (CSS value)","default":"auto","examples":["auto"]},"conditions":{"type":"object","description":"Per-condition overrides. Keys match alert mode values (red_alert, yellow_alert, etc.)","additionalProperties":{"type":"object","properties":{"content":{"type":"object","description":"HA card config to render inside the overlay for this condition","properties":{"type":{"type":"string","description":"Card type (e.g. custom:lcards-button)"}},"required":["type"],"additionalProperties":true},"alert_button":{"type":"object","description":"Patch merged on top of the default lcards-button alert card for this condition. Only specify fields to override — type, component, and preset are inherited from the built-in default. Supports all lcards-button text and alert config keys. Ignored when `content` is also specified (content takes full precedence).","properties":{"text":{"type":"object","description":"Text field overrides — e.g. text.sub_text.content or text.alert_text.content","additionalProperties":true},"alert":{"type":"object","description":"Alert component config overrides — e.g. alert.color.shape, alert.color.bars","additionalProperties":true}},"additionalProperties":true},"backdrop":{"type":"object","description":"[DEPRECATED] Migrated at runtime to layers. Still accepted for backward compatibility.","properties":{"blur":{"type":"string"},"opacity":{"type":"number","minimum":0,"maximum":1},"color":{"type":"string"}},"additionalProperties":false},"layers":{"type":"object","description":"Per-condition screen effect layer overrides. Unset slots inherit from the global layers config. null = explicitly disable that slot.","properties":{"backdrop":{"oneOf":[{"type":"null"},{"type":"object","properties":{"preset":{"type":"string"}},"required":["preset"],"additionalProperties":true}]},"color":{"oneOf":[{"type":"null"},{"type":"object","properties":{"preset":{"type":"string"}},"required":["preset"],"additionalProperties":true}]},"canvas":{"oneOf":[{"type":"null"},{"type":"object","properties":{"preset":{"type":"string"}},"required":["preset"],"additionalProperties":true}]}},"additionalProperties":false},"position":{"type":"string","enum":["top-left","top","top-center","top-right","left","center-left","left-center","center","right","center-right","right-center","bottom-left","bottom","bottom-center","bottom-right"]},"width":{"type":"string","description":"Per-condition content card width"},"height":{"type":"string","description":"Per-condition content card height"},"auto_dismiss_seconds":{"type":"number","minimum":1,"description":"Override auto-dismiss duration for this specific condition. Only relevant when the global dismiss_mode is auto-dismiss or auto-reset.","examples":[10]}},"additionalProperties":false}}},"required":["type"],"additionalProperties":false},"lcards-select-menu":{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://github.com/snootched/lcards/schemas/select-menu-schema","title":"LCARdS Select Menu Card Configuration","description":"Renders an input_select entity as a grid of LCARS-styled option buttons. Each button calls input_select.select_option when tapped. The selected option is styled as \"active\", all others as \"inactive\".","type":"object","required":["type"],"examples":[{"type":"custom:lcards-select-menu","entity":"input_select.view_selector","preset":"lozenge","grid":{"columns":1,"gap":"4px"}}],"properties":{"type":{"type":"string","const":"custom:lcards-select-menu","description":"Home Assistant card type identifier (required)"},"data_sources":{"$ref":"#/$defs/dataSourcesSchema"},"entity":{"type":"string","format":"entity","pattern":"^[a-z_]+\\.[a-z0-9_]+$","description":"input_select (or select) entity whose options become buttons","examples":["light.living_room"]},"id":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"Unique card identifier for rule targeting, animations, and debugging (alphanumeric, underscore, hyphen)","examples":["main-button"]},"tags":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$"},"description":"Tags for bulk rule targeting and grouping. Allows applying rules to multiple cards at once using tag selectors.","examples":[["navigation","primary"]]},"height":{"$ref":"#/$defs/cardHeightSchema"},"width":{"$ref":"#/$defs/cardWidthSchema"},"min_height":{"$ref":"#/$defs/cardMinHeightSchema"},"min_width":{"$ref":"#/$defs/cardMinWidthSchema"},"max_height":{"$ref":"#/$defs/cardMaxHeightSchema"},"max_width":{"$ref":"#/$defs/cardMaxWidthSchema"},"overflow":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow shorthand on the card host element (sets both axes unless overridden per-axis)."},"overflow_x":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-x on the card host element. Overrides the overflow shorthand for the horizontal axis."},"overflow_y":{"type":"string","enum":["visible","hidden","clip","scroll","auto"],"description":"CSS overflow-y on the card host element. Overrides the overflow shorthand for the vertical axis."},"z_index":{"type":"integer","description":"CSS z-index stacking order on the card host element."},"preset":{"type":"string","description":"Button style preset applied to all option buttons (e.g. lozenge, filled, outline)","examples":[]},"grid":{"type":"object","description":"Grid layout config for option buttons. Supports CSS Grid shorthand or full properties.","properties":{"columns":{"oneOf":[{"type":"number","minimum":1,"maximum":24},{"type":"string","description":"CSS grid-template-columns value, e.g. \"repeat(4, 1fr)\""}],"description":"Number of columns (shorthand → repeat(N, 1fr)) or full CSS grid-template-columns value"},"rows":{"type":["number","string"],"description":"Number of rows or CSS grid-template-rows value"},"gap":{"type":"string","description":"CSS gap shorthand (applies to both row and column gap)","examples":["4px"]},"row-gap":{"type":"string","description":"Override row gap","examples":["4px"]},"column-gap":{"type":"string","description":"Override column gap","examples":["4px"]},"grid-auto-flow":{"type":"string","enum":["row","column","dense","row dense","column dense"],"description":"CSS grid-auto-flow direction"},"grid-template-columns":{"type":"string","description":"Full CSS grid-template-columns (overrides columns shorthand)","examples":["repeat(4, 1fr)"]},"grid-auto-rows":{"type":"string","description":"CSS grid-auto-rows for implicit row height","examples":["auto"]},"justify-items":{"type":"string","enum":["stretch","start","end","center"],"description":"CSS justify-items for cell alignment"},"align-items":{"type":"string","enum":["stretch","start","end","center"],"description":"CSS align-items for cell alignment"},"height":{"type":"string","enum":["fit","100%"],"description":"\"fit\": sizes the card host to the exact height of all buttons (useful for outer grid track sizing). \"100%\": proportionally fills a bounded parent row, resizing buttons to fit without overflow. For a fixed card height with scrolling, use the top-level height + overflow_y config instead."}},"additionalProperties":true},"options":{"oneOf":[{"type":"object","description":"Object form: per-option overrides keyed by option value. Entity order is preserved.","additionalProperties":{"type":"object","description":"Per-option visual overrides","properties":{"$ref":"#/$defs/sharedSchema457"},"additionalProperties":false}},{"type":"array","description":"Array form: explicit ordered list (also filters which options are shown). Each item must have a \"value\" key.","items":{"type":"object","description":"Per-option visual overrides","properties":{"$ref":"#/$defs/sharedSchema457"},"additionalProperties":false,"required":["value"]}}],"description":"Per-option configuration. Object: override by name (entity order preserved). Array: explicit order + filter."},"style":{"type":"object","description":"Style applied to all option buttons. Uses the same stateColor schema as lcards-button. active = selected, inactive = unselected.","properties":{"card":{"type":"object","properties":{"color":{"type":"object","properties":{"background":{"oneOf":[{"type":"string"},{"type":"object","properties":{"active":{"type":"string","description":"Selected option background"},"inactive":{"type":"string","description":"Unselected option background"},"hover":{"type":"string","description":"Hovered option background"},"pressed":{"type":"string","description":"Pressed option background"},"unavailable":{"type":"string","description":"Background when entity unavailable"},"default":{"type":"string","description":"Fallback background color"}},"additionalProperties":true}],"description":"Option button background color (state-based or static)"}},"additionalProperties":true}},"additionalProperties":true},"text":{"type":"object","properties":{"default":{"type":"object","properties":{"color":{"$ref":"#/$defs/stateColorSchema"},"font_size":{"type":["number","string"]},"font_weight":{"type":["number","string"]},"text_transform":{"type":"string","enum":["uppercase","lowercase","capitalize","none"]},"letter_spacing":{"type":"string"}},"additionalProperties":true}},"additionalProperties":true},"border":{"type":"object","properties":{"radius":{"oneOf":[{"type":"number"},{"type":"string"},{"type":"object","properties":{"top_left":{"type":"number"},"top_right":{"type":"number"},"bottom_right":{"type":"number"},"bottom_left":{"type":"number"}}}],"description":"Border radius (px or CSS string). Object form for per-corner control."},"width":{"oneOf":[{"type":"number"},{"type":"string"}],"description":"Border width (px)"},"color":{"oneOf":[{"type":"string"},{"type":"object"}],"description":"Border color (static or state-based)"}},"additionalProperties":true},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Base opacity for unselected options (0-1). Defaults to 0.88 if not specified."}},"additionalProperties":true},"tap_action":{"type":"object","description":"Override the default select_option tap action for ALL option buttons (per-option tap_action takes priority).","examples":[{"action":"toggle","entity":"light.living_room"}],"properties":{"$ref":"#/$defs/sharedSchema17"}},"hold_action":{"$ref":"#/$defs/actionSchema"},"double_tap_action":{"$ref":"#/$defs/actionSchema"},"grid_options":{"$ref":"#/$defs/gridOptionsSchema"}},"additionalProperties":true},"lcards-layout-card":{"type":"object","required":["type"],"additionalProperties":true,"properties":{"type":{"type":"string","const":"custom:lcards-layout-card"},"layout":{"type":"object","additionalProperties":true,"properties":{"grid-template-columns":{"type":"string"},"grid-template-rows":{"type":"string"},"grid-template-areas":{"type":"string"},"grid-gap":{"type":"string"},"gap":{"type":"string"},"height":{"type":"string"},"margin":{"type":"string"},"padding":{"type":"string"},"card_margin":{"type":"string"},"card_overflow":{"type":"string"},"place-items":{"type":"string"},"place-content":{"type":"string"},"grid-auto-flow":{"type":"string"},"grid-auto-rows":{"type":"string"},"grid-auto-columns":{"type":"string"},"mediaquery":{"type":"object","additionalProperties":true},"areas":{"type":"object","additionalProperties":{"type":"object","additionalProperties":true,"properties":{"background":{"type":"string"},"background-image":{"type":"string"},"background-size":{"type":"string"},"background-position":{"type":"string"},"background-repeat":{"type":"string"},"border-width":{"type":"string"},"border-style":{"type":"string"},"border-color":{"type":"string"},"border-radius":{"type":"string"},"place-self":{"type":"string"},"margin":{"type":"string"},"overflow":{"type":"string"},"z-index":{"type":["string","number"]}}}}}},"view_layout":{"$ref":"#/$defs/sharedSchema458"},"cards":{"type":"array","items":{"type":"object","required":["type"],"additionalProperties":true,"properties":{"type":{"type":"string"},"view_layout":{"$ref":"#/$defs/sharedSchema458"}}}}}}}}
