# CubeCraft Creations display system — Home Assistant theme # # Source of truth for the tokens below is the production card's stylesheet: # custom_components/cubecraft_production/www/cubecraft-production-card.js # Keep the two in sync. The card reads HA theme variables for its surfaces, so # once this theme is active the CubeOps board and the rest of a dashboard end up # on the same surfaces, borders and text colours automatically. # # The theme carries `modes:`, so it follows HA's light/dark setting. The brand # gradient, type, radii and semantic colours are identical in both modes; only # the surface and text ramps flip. # # TUNED FOR WALL PANELS: `header-height: 0px` near the bottom collapses the HA # toolbar, matching what dakboard-dark did on these dashboards. If you ever want # CubeCraft on a phone or desktop where you still need the toolbar, copy this # file to themes/cubecraft-desktop.yaml, rename the top-level key, and delete # that one line. (HA themes cannot inherit from each other, and this repo's YAML # is loaded by HA's own loader, so a `<<:` merge anchor is not worth the risk of # taking the whole themes include down.) # # Hiding the sidebar as well needs the kiosk-mode frontend plugin (HACS), which # is not currently installed — see dashboards/views/cubeops-dashboard.yaml. cubecraft: # ───────────────────────────────────────────────────────────────────────── # Brand tokens — mirrors the `:host` block in cubecraft-production-card.js. # Exposed as --cc-* so dashboard card_mod blocks can reference them by name # instead of hard-coding hexes in a dozen places. # ───────────────────────────────────────────────────────────────────────── cc-blue: "#3B3AB8" cc-purple: "#A035CC" cc-gradient: "linear-gradient(135deg, #3B3AB8 0%, #A035CC 100%)" cc-primary-50: "#EBEBF8" cc-primary-500: "#3B3AB8" cc-primary-700: "#201F7A" cc-neutral-0: "#FFFFFF" cc-neutral-50: "#FAFAFA" cc-neutral-100: "#F4F4F6" cc-neutral-150: "#EDEDF1" cc-neutral-200: "#E4E4EA" cc-neutral-400: "#9898A8" cc-neutral-600: "#52525E" cc-neutral-900: "#18181D" cc-success: "#16A34A" cc-warning: "#D97706" cc-warning-bg: "#FEF3C7" cc-error: "#DC2626" cc-error-bg: "#FEE2E2" # 4px spacing scale cc-space-1: "4px" cc-space-2: "8px" cc-space-3: "12px" cc-space-4: "16px" cc-space-5: "20px" cc-space-6: "24px" cc-space-7: "28px" cc-radius-sm: "6px" cc-radius-md: "8px" cc-radius-lg: "12px" cc-radius-xl: "16px" cc-radius-brand: "20px" cc-radius-full: "9999px" cc-shadow-sm: "0 2px 6px 0 rgba(0,0,0,.08)" cc-shadow-md: "0 4px 12px 0 rgba(0,0,0,.10)" cc-shadow-brand: "0 4px 20px 0 rgba(59,58,184,.25)" cc-ease: "cubic-bezier(0,0,.2,1)" cc-dur: "200ms" # ───────────────────────────────────────────────────────────────────────── # Typography — Nunito 400..800. # The @font-face has to be declared in the document, not a shadow root; that # is what www/cubecraft/cubecraft-brand-font.js does (wired up via # frontend.extra_module_url in configuration.yaml). Without it everything # below falls back to system-ui and the rest of the theme still works. # ───────────────────────────────────────────────────────────────────────── cc-font: "'Nunito', 'Nunito Fallback', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" primary-font-family: "var(--cc-font)" ha-font-family-body: "var(--cc-font)" ha-font-family-heading: "var(--cc-font)" mdc-typography-font-family: "var(--cc-font)" paper-font-common-base_-_font-family: "var(--cc-font)" paper-font-common-nowrap_-_font-family: "var(--cc-font)" paper-font-body1_-_font-family: "var(--cc-font)" paper-font-subhead_-_font-family: "var(--cc-font)" paper-font-headline_-_font-family: "var(--cc-font)" paper-font-title_-_font-family: "var(--cc-font)" paper-font-caption_-_font-family: "var(--cc-font)" # ───────────────────────────────────────────────────────────────────────── # Shape — brand radius on cards, pills on controls. # ───────────────────────────────────────────────────────────────────────── ha-card-border-radius: "var(--cc-radius-brand)" ha-card-border-width: "0" ha-dialog-border-radius: "var(--cc-radius-brand)" ha-badge-border-radius: "var(--cc-radius-full)" mdc-shape-small: "var(--cc-radius-full)" mdc-shape-medium: "var(--cc-radius-lg)" mdc-shape-large: "var(--cc-radius-xl)" button-border-radius: "var(--cc-radius-full)" # ───────────────────────────────────────────────────────────────────────── # Colour — brand ramp. Surfaces/text live in the mode blocks below. # ───────────────────────────────────────────────────────────────────────── success-color: "var(--cc-success)" warning-color: "var(--cc-warning)" error-color: "var(--cc-error)" label-badge-green: "var(--cc-success)" label-badge-yellow: "var(--cc-warning)" label-badge-red: "var(--cc-error)" # Text sitting on top of primary-color (buttons, selected states). White # clears AA against both ends of the gradient (8.5:1 on the blue, 5.4:1 on # the purple), so it is safe wherever the gradient is used. text-primary-color: "#FFFFFF" app-header-text-color: "#FFFFFF" mdc-theme-on-primary: "#FFFFFF" # Wall-panel chrome: collapse the HA toolbar. Delete this line for a variant # you navigate by hand (see the header comment). header-height: "0px" modes: # ═══════════════════════════════════════════════════════════════════════ # Light — the design system as authored: white surfaces, neutral sunken # backgrounds, near-black text. # ═══════════════════════════════════════════════════════════════════════ light: cc-surface: "var(--cc-neutral-0)" cc-surface-sunken: "var(--cc-neutral-100)" cc-text: "var(--cc-neutral-900)" cc-text-muted: "var(--cc-neutral-600)" cc-border: "var(--cc-neutral-150)" cc-accent: "var(--cc-primary-500)" cc-accent-soft: "var(--cc-primary-50)" primary-color: "#3B3AB8" accent-color: "#A035CC" dark-primary-color: "#201F7A" light-primary-color: "#EBEBF8" info-color: "#3B3AB8" primary-text-color: "#18181D" secondary-text-color: "#52525E" disabled-text-color: "#9898A8" primary-background-color: "#F4F4F6" secondary-background-color: "#EDEDF1" card-background-color: "#FFFFFF" ha-card-background: "#FFFFFF" divider-color: "#EDEDF1" ha-card-box-shadow: "0 4px 12px 0 rgba(0,0,0,.10)" app-header-background-color: "#3B3AB8" more-info-header-background: "#F4F4F6" sidebar-background-color: "#FFFFFF" sidebar-text-color: "#52525E" sidebar-icon-color: "#9898A8" sidebar-selected-text-color: "#3B3AB8" sidebar-selected-icon-color: "#3B3AB8" state-icon-color: "#3B3AB8" state-icon-active-color: "#A035CC" state-unavailable-color: "#9898A8" paper-item-icon-color: "#9898A8" paper-item-icon-active-color: "#3B3AB8" switch-checked-color: "#3B3AB8" switch-checked-track-color: "#3B3AB8" switch-unchecked-color: "#9898A8" switch-unchecked-track-color: "#E4E4EA" slider-color: "#3B3AB8" slider-bar-color: "#E4E4EA" label-badge-blue: "#3B3AB8" label-badge-gray: "#9898A8" label-badge-text-color: "#18181D" ha-label-badge-background-color: "#FFFFFF" ha-label-badge-border-color: "#EDEDF1" table-row-background-color: "#FFFFFF" table-row-alternative-background-color: "#FAFAFA" markdown-code-background-color: "#F4F4F6" code-editor-background-color: "#FAFAFA" paper-card-background-color: "#FFFFFF" paper-card-header-color: "#18181D" paper-dialog-background-color: "#FFFFFF" paper-listbox-background-color: "#FFFFFF" input-fill-color: "#F4F4F6" input-ink-color: "#18181D" input-label-ink-color: "#52525E" iron-overlay-backdrop-background-color: "rgba(24,24,29,.32)" mdc-theme-primary: "#3B3AB8" mdc-theme-secondary: "#A035CC" mdc-theme-surface: "#FFFFFF" # Weather glyphs, kept in the brand family rather than default sky blue. weather-icon-sun-color: "#D97706" weather-icon-rain-color: "#3B3AB8" weather-icon-cloud-front-color: "#9898A8" weather-icon-cloud-back-color: "#E4E4EA" weather-icon-moon-color: "#52525E" # ═══════════════════════════════════════════════════════════════════════ # Dark — violet-tinted neutrals so the brand gradient sits in the same # family as the surfaces rather than floating on plain grey. The primary # is lightened to #8B8AF2 (5.6:1 on the card surface); #3B3AB8 itself is # too dark to read as an accent here, though it stays correct inside the # gradient, which is left untouched. # ═══════════════════════════════════════════════════════════════════════ dark: cc-surface: "#1C1C27" cc-surface-sunken: "#16161F" cc-text: "#EDEDF1" cc-text-muted: "#9898A8" cc-border: "#2A2A38" cc-accent: "#8B8AF2" cc-accent-soft: "#252438" primary-color: "#8B8AF2" accent-color: "#C77BEE" dark-primary-color: "#3B3AB8" light-primary-color: "#C9C8FA" info-color: "#8B8AF2" primary-text-color: "#EDEDF1" secondary-text-color: "#9898A8" disabled-text-color: "#6A6A7C" primary-background-color: "#0E0E14" secondary-background-color: "#16161F" card-background-color: "#1C1C27" ha-card-background: "#1C1C27" divider-color: "#2A2A38" ha-card-box-shadow: "0 4px 12px 0 rgba(0,0,0,.45)" app-header-background-color: "#16161F" more-info-header-background: "#16161F" sidebar-background-color: "#0E0E14" sidebar-text-color: "#9898A8" sidebar-icon-color: "#6A6A7C" sidebar-selected-text-color: "#8B8AF2" sidebar-selected-icon-color: "#8B8AF2" state-icon-color: "#8B8AF2" state-icon-active-color: "#C77BEE" state-unavailable-color: "#6A6A7C" paper-item-icon-color: "#6A6A7C" paper-item-icon-active-color: "#8B8AF2" switch-checked-color: "#8B8AF2" switch-checked-track-color: "#8B8AF2" switch-unchecked-color: "#6A6A7C" switch-unchecked-track-color: "#2A2A38" slider-color: "#8B8AF2" slider-bar-color: "#2A2A38" # Semantic colours lifted for dark surfaces; the light-mode values are # too dense to read at a distance on #1C1C27. success-color: "#4ADE80" warning-color: "#FBBF24" error-color: "#F87171" label-badge-green: "#4ADE80" label-badge-yellow: "#FBBF24" label-badge-red: "#F87171" label-badge-blue: "#8B8AF2" label-badge-gray: "#6A6A7C" label-badge-text-color: "#EDEDF1" ha-label-badge-background-color: "#1C1C27" ha-label-badge-border-color: "#2A2A38" table-row-background-color: "#1C1C27" table-row-alternative-background-color: "#20202C" markdown-code-background-color: "#252433" code-editor-background-color: "#16161F" paper-card-background-color: "#1C1C27" paper-card-header-color: "#EDEDF1" paper-dialog-background-color: "#1C1C27" paper-listbox-background-color: "#1C1C27" input-fill-color: "#252433" input-ink-color: "#EDEDF1" input-label-ink-color: "#9898A8" iron-overlay-backdrop-background-color: "rgba(0,0,0,.6)" mdc-theme-primary: "#8B8AF2" mdc-theme-secondary: "#C77BEE" mdc-theme-surface: "#1C1C27" weather-icon-sun-color: "#FBBF24" weather-icon-rain-color: "#8B8AF2" weather-icon-cloud-front-color: "#9898A8" weather-icon-cloud-back-color: "#3A3A4A" weather-icon-moon-color: "#C9C8FA"