@aircall/blocks
Version:
Aircall Blocks — higher-level UI compositions built on @aircall/ds
125 lines (110 loc) • 5.61 kB
CSS
/*
* Blocks theme definitions — no Preflight, no utility classes. Contains only the
* non-utility CSS that @source scanning cannot regenerate: blocks-specific design
* tokens, keyframes, @theme inline mappings, and raw component layout rules.
*
* This is the single non-utility artifact a single-compilation consumer needs for
* blocks, alongside @aircall/ds/theme.css and their own Tailwind compilation.
* Blocks tokens reference DS tokens (var(--background), var(--color-charcoal-*), …),
* so @aircall/ds/theme.css must be imported before this file.
*
* globals.css re-exposes this via its own `@import './theme.css'`, so the
* precompiled blocks delta bundle is unchanged.
*
* Usage (single-compilation consumer):
* @import 'tailwindcss'; // Preflight + the utility engine
* @import '@aircall/ds/theme.css'; // DS tokens + dark variant + base reset
* @import '@aircall/blocks/theme.css'; // blocks tokens + keyframes + layout
* @source '../node_modules/@aircall/ds';
* @source '../node_modules/@aircall/blocks';
*/
/* ---------------------------------------------------------------------------
DashboardSidebar design tokens
Follows the exact same pattern as ds sidebar-* tokens: CSS variables with
explicit light/dark values under [data-theme='dark'], mapped to Tailwind
utilities via @theme inline.
--------------------------------------------------------------------------- */
@layer theme {
:root,
:host {
/* Dashboard page canvas */
--page-background: var(--color-neutral-200);
/* Standalone-page content panel surface — one notch off `background`, sitting
between the page canvas and a white/neutral Card so header, panel body, and
Cards read as three distinct surfaces. Derived via color-mix of the DS
`background`/`muted` tokens, so it auto-adapts per theme (both flip): resolves
to #f7f8fb in light and #212327 in dark. Defined once — the inner var()s
resolve against the active theme at use-time, so no dark override is needed. */
--page-surface: color-mix(in srgb, var(--background), var(--muted));
/* Product & role badge overlay — white tint in light mode, dark tint in dark mode.
Combined with each badge's accent color via CSS background-image gradient. */
--badge-overlay: rgba(255, 255, 255, 0.7);
/* Add-on accents — one colour per paid add-on, mirroring Figma's `custom/add-on/*`
variables. Shared by LicenseBadge and LicenseAlert so an add-on's colour is
written down once. WhatsApp and AIVA are brand colours and hold across themes;
the others lighten below so they stay legible against a dark surface. */
--add-on-ai-assist-pro: var(--color-blue-700);
--add-on-analytics-plus: var(--color-blue-700);
--add-on-surveys: var(--color-purple-600);
--add-on-whatsapp: #25d366;
--add-on-aiva: var(--color-green-300);
/* DashboardSidebar — dark-navy design */
--navbar-foreground: var(--color-charcoal-800);
--navbar-accent: var(--color-charcoal-800);
--navbar-accent-foreground: #fff;
--navbar-icon-bg: #fff;
}
[data-theme='dark'],
[data-theme='dark'] * {
/* Dashboard page canvas — dark equivalent */
--page-background: var(--color-neutral-900);
/* Badge overlay flips to dark tint */
--badge-overlay: rgba(10, 10, 10, 0.7);
/* Add-on accents — only the palette-derived ones shift. WhatsApp and AIVA are
brand colours and are deliberately absent here. */
--add-on-ai-assist-pro: var(--color-blue-400);
--add-on-analytics-plus: var(--color-blue-400);
--add-on-surveys: var(--color-purple-300);
/* DashboardSidebar — keep the navy identity but ensure readability */
--navbar-foreground: var(--color-charcoal-100);
--navbar-accent: var(--color-charcoal-600);
--navbar-accent-foreground: #fff;
--navbar-icon-bg: var(--color-charcoal-700);
}
}
/* ---------------------------------------------------------------------------
ChatbotResponseLoading — shimmer sweep keyframe
--------------------------------------------------------------------------- */
@keyframes chatbot-shimmer {
0% { background-position: -200% center; }
100% { background-position: 200% center; }
}
@theme inline {
--animate-chatbot-shimmer: chatbot-shimmer 2s linear infinite;
--color-page-background: var(--page-background);
--color-page-surface: var(--page-surface);
--color-navbar-foreground: var(--navbar-foreground);
--color-navbar-accent: var(--navbar-accent);
--color-navbar-accent-foreground: var(--navbar-accent-foreground);
--color-navbar-icon-bg: var(--navbar-icon-bg);
--color-add-on-ai-assist-pro: var(--add-on-ai-assist-pro);
--color-add-on-analytics-plus: var(--add-on-analytics-plus);
--color-add-on-surveys: var(--add-on-surveys);
--color-add-on-whatsapp: var(--add-on-whatsapp);
--color-add-on-aiva: var(--add-on-aiva);
}
/* ---------------------------------------------------------------------------
DashboardPageHeader — CSS Grid areas
Two rows: nav (full-width) + prefix | info | actions (single row always).
Secondary icon buttons collapse into a "⋯" dropdown via JS (useActionsOverflow)
rather than wrapping to a new row. The title truncates as the container shrinks.
--------------------------------------------------------------------------- */
[data-slot="dph-grid"] {
display: grid;
grid-template-columns: auto 1fr auto;
grid-template-rows: auto auto;
grid-template-areas:
"nav nav nav"
"prefix info actions";
width: 100%;
}