EMAK Theme System
Style guide
Composable utility classes built on the --kb-* token layer. Every page should consume from this system rather than re-declaring properties.
Foundations
Tokens that everything else is built on. Change a value here and the whole site shifts.
Color tokens
Radii
Typography
Display sizes for heroes, headings for sections and cards, body scale for everything else. Quo-baselined: medium weight, tight line-height, negative letter-spacing.
.t-display-xl
.t-display-lg
.t-display-md
.t-h-section
.t-h-card
.t-body-lg
.t-body
.t-body-sm
.t-eyebrow
.t-eyebrow.t-eyebrow--brand
.t-meta
Chips / pills
.bp-chip + modifier (--brand, --ghost, --soon). Used as category tags, feature labels, status indicators.
Cards
Base .bp-card for plain blocks. .bp-card--feature adds a mocked-product top area for marketing-page feature spotlights.
Basic — .bp-card
Connect faster
Multi-level smart menus get callers to the right destination without sitting through ten options first.
Route calls anywhere
Drag-and-drop builder. Hours, holidays, overflow — all visual, no scripts.
Always have an answer
Hand off to your AI agent for messages, lead qualification, and FAQs.
Feature variant with tone palette — .bp-card--feature + .bp-card-mock--{tone}
Eight tones for the mock area. Every demo shows realistic content so you can see how each tone reads under actual UI. Grid auto-wraps below 240px to protect the mock UI from getting squeezed.
Orange
.bp-card-mock--orange
Green
.bp-card-mock--green
Blue
.bp-card-mock--blue
Purple
.bp-card-mock--purple
Amber
.bp-card-mock--amber
Rose
.bp-card-mock--rose
Teal
.bp-card-mock--teal
Slate
.bp-card-mock--slate
Composed feature spotlights — fuller product mocks with body copy + footer chip
3-up grid gives the mocks more room — use this layout when each card needs a richer product moment.
Guide customers to the right teammate
Team-specific routing means callers reach Sales when they want to buy, Support when they need help.
Phone menusMultiple flows, zero rebuilding
Different routing configurations for holidays and campaigns — toggle between them without rebuilding.
Call flowsKeep business running when key people are out
Availability-based routing sends calls to whoever is actually working.
Ring orderSaturated showcase row — .bp-callout.bp-callout--showcase + .bp-card--showcase
Primary usage: a deep-saturated card with a floating UI screenshot, paired with copy in a 50/50 two-column layout. Use .bp-callout--reverse on alternating rows so the visual sits on opposite sides down the page. Reference: quo.com/phone-numbers porting / customizing / carrier-registration sections.
Existing numbers
Port your number for free.
Bring the numbers your customers already know. Our porting team handles the carrier paperwork, the cutover window, and keeps your old line live until the new one's ready.
Port a numberNumber porting
Track every step in real time — request, accept, schedule, switch.
New numbers
Pick a number that feels local.
Search by city or area code — every Canadian region available. Local numbers get answered 4× more often than toll-free.
Browse numbersNumber search
Thousands of local + toll-free numbers, activated the moment you pick.
The pattern: .bp-callout.bp-callout--showcase (50/50, no outer frame) wraps a .bp-callout-copy on one side and a .bp-card.bp-card--showcase.bp-card--showcase-{tone} on the other. Add .bp-callout--reverse on alternating rows so the visual zigzags down the page. Available tones: orange, green, blue, purple, amber, rose, teal, slate.
Showcase cards in 3-up grid (alternative layout)
Same primitive can stack in a 3-up grid for a feature-cluster section.
Number details
Configure each number's name, area, and routing in seconds — no IT ticket required.
Phone menu
Press-1, press-2, press-3 — build the menu callers hear, with a visual editor.
Integrations
Sync contacts with HubSpot, Zoho, and Slack — calls auto-log to the right record.
The pattern: .bp-card.bp-card--showcase.bp-card--showcase-{tone} wraps a .bp-card-showcase-mock (product UI floats inside, shadow-elevated) and a .bp-card-showcase-caption (h3 + p sit at the bottom on top of the color). Available tones: orange, green, blue, purple, amber, rose, teal, slate.
Showcase: gradient mock frame + product card
Top-tier pattern from /platform/menu-routing/: a warm-gradient frame lifts a high-fidelity product card off the page. Use as the "killer demo" inside an asymmetric callout — pair with .bp-callout for 2-column copy + mockup layouts.
★ Popular features
Powerful routing, made simple.
-
Ring order
Ring everyone at once, in sequence, or by team — answered by the first available person.
-
Kori AI fallback
If no one answers, Kori takes a message, qualifies the lead, and sends a clean summary.
The pattern: warm-gradient frame (linear-gradient(135deg, #2a1f10 → #6b4220)) + 1px white card inside with subtle drop shadow. Frame radius --kb-radius-2xl, card radius --kb-radius-xl. Inside the card: header (name + meta) + 5 user rows with avatar + name + tag chip + status indicator.
Layout primitives
Container + section padding tokens. Visual demos show actual spacing.
.bp-page-inner — content container (max 1280px)
.bp-section — standard vertical padding
.bp-section--lg — hero / testimonial / final-CTA
.bp-section--bleed — full viewport breakout
Combine with .bp-section--dark for full-width dark bands. Place .bp-page-inner inside to constrain content. See live demo in Full-bleed bands ↓.
Callout cards
Asymmetric two-column spotlight. Use for the killer-demo moments on a marketing page. .bp-callout + slot classes .bp-callout-copy & .bp-callout-media. Modifier --reverse flips the order.
Stop losing prospects to "let me transfer you… again."
Smart routing gets customers to the right person on the first try, so they don't reach a dead end or hang up out of frustration before you can help them.
Call flow builderFull-bleed bands
Compose .bp-section--bleed + .bp-section--dark for full-width dark bands. Add .bp-page-inner inside to keep band content aligned to the rest of the page.
Dark testimonial band
Lighter band variant — bleed only, no --dark
Why EMAK
Built for the way Canadian businesses actually work.
Marketing primitives
Nine shared blocks used by every marketing page. Each renders via a helper in inc/marketing-partials.php so copy lives in one place per page.
.bp-faq — accordion (zero-JS, native <details>)
What is EMAK Telecom?
EMAK is a Canadian VoIP business phone system trusted by 1,000+ businesses. We provide cloud calling, texting, recording, AI transcription, and 40+ features — all included in one plan with no add-ons or contracts.
Can I keep my existing phone number?
Yes. Our porting team transfers your numbers from any Canadian carrier, typically within 7–14 business days. Your service continues uninterrupted during the switch.
How is EMAK different from Bell, Telus, or Rogers?
EMAK includes features that legacy carriers charge extra for — call recording, AI transcription, analytics, business texting, CRM integration. No contracts, no per-feature fees, and a support team that actually answers the phone.
Is my data stored in Canada?
Yes. All call recordings, voicemails, faxes, transcripts, and contact data are stored on Canadian servers. EMAK is built around PIPEDA and Quebec's Loi 25 privacy frameworks.
.bp-steps-3 — "Get started in 3 steps" block
Choose your numbers
Pick local or toll-free numbers, or port your existing ones from any carrier.
Set up your routing
Build your call flow, IVR menus, and business hours in the visual builder. Takes minutes.
Start taking calls
From your desk phone, laptop, or mobile. Your business phone system is live.
.bp-cross-sell — "Part of your complete phone system"
.bp-compare-table — provider comparison (highlights "us" column)
| Feature | EMAK | Bell | Telus | Rogers |
|---|---|---|---|---|
| All features included | ✓ | ✕ | ✕ | ✕ |
| Month-to-month, no contract | ✓ | ✕ | ✕ | ✕ |
| Canadian data residency | ✓ | ✓ | ✓ | ✓ |
| AI transcription | ✓ | ✕ | ✕ | ✕ |
| Per-extension price (CAD) | $20 | $45 | $45 | $50 |
| Free trial | 30 days | ✕ | ✕ | ✕ |
.bp-logo-wall — marquee customer logo strip
.bp-price-anchor — inline plan/price reminder
.bp-rating-badge — Google rating inline badge (default + --lg)
.bp-stat-card — big metric tile
Default · --brand · SVG-star variant (compose with inline SVG). Use in 3-up grids on customer-stories & trust bands.
Support calls answered live by a human
Average wait time
135 Google reviews — perfect rating
--bare variant — drops card chrome for inline use in copy-led sections.
.bp-story-card — customer-story card (3-up grid)
From the moment we chose EMAK we witnessed a remarkable improvement in our communication systems. The quality is unparalleled.
Patients reach the right department on the first call. Our front desk used to spend half their day on the phone.
During the dinner rush Kori takes overflow calls automatically and books reservations through Libro.
Avatars
Two patterns: initials (default — auto-generated from any name) and photo (hand-picked CC0 portraits stored locally in themes/bplus/images/avatars/). Same primitive renders both — pass 'src' => 'w-03' for a photo, omit for initials. Use photos in product-UI mocks where realism matters; use initials in testimonial cards and other places where the name is the focal point.
Sizes
--xs--sm--md--lg--xlxs 22 · sm 28 · md 36 · lg 48 · xl 64 — all in px.
Initials avatars — default brand gradient + 8 tone variants
Default is a brand-orange gradient. Tonal variants are flat tints with darker text — softer, used for stacks of multiple avatars (e.g. ring groups) so the row reads as variety, not a wall of brand orange.
.bp-avatar + size modifier + optional .bp-avatar--tone-{warm|rose|amber|green|teal|blue|purple|slate}.
Photo avatars — local library (16 CC0 portraits)
Hand-picked Random User photos stored in themes/bplus/images/avatars/. Reference by key (w-01…w-08, m-01…m-08).
w-01w-02w-03w-04w-05w-06w-07w-08m-01m-02m-03m-04m-05m-06m-07m-08Add more by dropping a square JPG into the folder named avatar-{key}.jpg.
Stack — overlapping group of avatars
Wrap multiple .bp-avatar elements in a .bp-avatar-stack for overlap with consistent ring spacing. Use photo stacks for higher-fidelity mocks (e.g. inside saturated showcase cards); initials stacks for compact rows where names are the focus.
In context — story-card variant
The same .bp-story-card primitive accepts an avatar_src option. Compare the two patterns:
Dark CTA grid
Full-bleed dark band with three CTA cards — the page's penultimate "ready to get started?" moment. Each card has a top-half product-UI art (number picker, video player, pricing card) and a bottom body (heading + sub + arrow). Rendered via bplus_render_cta_grid(). Live demo breaks out of the grid below ↓
Ready to get started? Pick a number, see a live demo, or choose a plan that fits your team.
Final CTA
The page's closing statement. Confident heading + solid-brand primary + bare-text secondary. Arrow translates on hover (the unobtrusive micro-interaction); primary gets a soft brand halo. Rendered via bplus_render_finale(). Live demo breaks out of the grid below ↓
Never miss a call
or customer.
Forms
Hand-rolled form primitives. No plugin dependencies. Used by /request-a-callback/.