PageSourceSearch

https://talkify.nz/

html talkify.nz collected 2026-10-02 00:38:43 UTC 465,301 bytes, 10,847 lines download raw bytes

1<!doctype html>
2<html lang="en">
3<head>
4    <meta charset="utf-8">
5    <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
6    
6<script>
7        /*
8         * No-flash theme: a visitor's own choice wins, otherwise light.
9         *
10         * We deliberately do NOT follow prefers-color-scheme here. Most people
11         * run their OS in dark mode, so honouring it would mean the light site
12         * is the one almost nobody sees. The toggle in the nav still works and
13         * still persists, so anyone who prefers dark is one click away.
14         */
15        (function () {
16            try {
17                var stored = localStorage.getItem('talkify-theme');
18                document.documentElement.setAttribute('data-theme', stored === 'dark' ? 'dark' : 'light');
19            } catch (e) {
20                document.documentElement.setAttribute('data-theme', 'light');
21            }
22            /* Scripting is on, so .r may hide its block until the observer
23               reveals it. Without this class nothing is ever hidden, which is
24               what a visitor with no JS (or a crawler) sees. */
25            document.documentElement.classList.add('js');
26        })();
27    </script>
27
28    <title>AI Receptionist NZ | 24/7 AI Phone Answering From $129/month · Talkify</title>
29    <meta name="description"
30          content="NZ-built AI receptionist and voice assistant for business, answering your calls 24/7 in real NZ and Australian voices. AI reception, smart booking, lead qualification, instant SMS summaries. Integrates with Google Calendar, Outlook, GoHighLevel, HubSpot, Xero and Zenoti. Business plans from $129/month with up to 3 agents on your number, or pay as you go from $10/month plus $1/minute. No setup fee, no lock-in. Free live demo on a real NZ number.">
31
32    
33        <link rel="canonical" href="https://talkify.nz">
34                <link rel="alternate" hreflang="en-NZ" href="https://talkify.nz">
35    <link rel="alternate" hreflang="en-AU" href="https://talkify.nz/au">
36    <link rel="alternate" hreflang="x-default" href="https://talkify.nz">
37            <link rel="icon" type="image/x-icon" href="/favicon.ico">
38    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
39    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
40    <link rel="apple-touch-icon" sizes="180x180" href="/media/branding/brand/app-icon-180.png">
41    <link rel="manifest" href="/site.webmanifest">
42    
43    <meta name="theme-color" content="#318abe">
44
45    <meta property="og:type" content="website">
46    <meta property="og:url" content="https://talkify.nz">
47    <meta property="og:site_name" content="Talkify">
48    <meta property="og:title" content="AI Receptionist NZ | 24/7 AI Phone Answering From $129/month · Talkify">
49    <meta property="og:description"
50          content="NZ-built AI receptionist and voice assistant for business, answering your calls 24/7 in real NZ and Australian voices. AI reception, smart booking, lead qualification, instant SMS summaries. Integrates with Google Calendar, Outlook, GoHighLevel, HubSpot, Xero and Zenoti. Business plans from $129/month with up to 3 agents on your number, or pay as you go from $10/month plus $1/minute. No setup fee, no lock-in. Free live demo on a real NZ number.">
51        <meta property="og:image" content="https://talkify.nz/media/meta-image.jpg">
52    
53    <meta property="og:image:width" content="1200">
54    <meta property="og:image:height" content="630">
55    <meta property="og:image:type" content="image/jpeg">
56    <meta property="og:image:alt"
57          content="Talkify, AI Phone Agent for New Zealand businesses.">
58    
59    <meta property="og:locale" content="en_NZ">
60
61    <meta name="twitter:card" content="summary_large_image">
62    <meta name="twitter:title" content="AI Receptionist NZ | 24/7 AI Phone Answering From $129/month · Talkify">
63    <meta name="twitter:description"
64          content="NZ-built AI receptionist and voice assistant for business, answering your calls 24/7 in real NZ and Australian voices. AI reception, smart booking, lead qualification, instant SMS summaries. Integrates with Google Calendar, Outlook, GoHighLevel, HubSpot, Xero and Zenoti. Business plans from $129/month with up to 3 agents on your number, or pay as you go from $10/month plus $1/minute. No setup fee, no lock-in. Free live demo on a real NZ number.">
65    <meta name="twitter:image" content="https://talkify.nz/media/meta-image.jpg">
66    <meta name="facebook-domain-verification" content="ic2puw1bkz233rscxrhcl0qol7suu1"/>
67    
68        
68<script
69        type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":["Organization","LocalBusiness"],"@id":"https://talkify.nz#organization","name":"Talkify","url":"https://talkify.nz","logo":"https://talkify.nz/media/branding/talkify-face-gradient-512.png","image":"https://talkify.nz/media/meta-image.jpg","description":"AI Phone Agent for New Zealand and Australian businesses. 24/7 AI receptionist, smart booking, lead qualification, and intelligent call handling. Business agents from $129 per month, Personal Assistant from $89.","telephone":"+64-800-002-967","email":"[email protected]","priceRange":"$$","areaServed":[{"@type":"Country","name":"New Zealand"},{"@type":"Country","name":"Australia"}],"address":{"@type":"PostalAddress","addressCountry":"NZ","addressRegion":"Canterbury","addressLocality":"Christchurch"},"contactPoint":[{"@type":"ContactPoint","telephone":"+64-800-002-967","contactType":"sales","areaServed":"NZ","availableLanguage":["English","te reo Māori"]},{"@type":"ContactPoint","telephone":"+64-3-242-1262","contactType":"demo","areaServed":["NZ","AU"]},{"@type":"ContactPoint","telephone":"+611300852142","contactType":"sales","areaServed":"AU","availableLanguage":["English"]}],"foundingDate":"2024","foundingLocation":{"@type":"Place","address":{"@type":"PostalAddress","addressCountry":"NZ","addressLocality":"Christchurch"}},"parentOrganization":{"@type":"Organization","name":"D3V Services Limited","address":{"@type":"PostalAddress","addressCountry":"NZ","addressRegion":"Canterbury","addressLocality":"Christchurch"}},"knowsAbout":["AI receptionist","Virtual receptionist","Phone answering service","After-hours call answering","AI phone agent","Appointment booking","Outbound calling campaigns","Business phone numbers"],"sameAs":["https://www.facebook.com/profile.php?id=61572226258048","https://www.instagram.com/talkifynz/","https://www.linkedin.com/company/talkify-nz/"]},{"@type":"WebSite","@id":"https://talkify.nz#website","name":"Talkify","url":"https://talkify.nz","publisher":{"@id":"https://talkify.nz#organization"},"inLanguage":"en-NZ"},{"@type":"Service","@id":"https://talkify.nz#service","name":"Talkify AI Phone Agent","description":"AI-powered phone agent providing 24/7 AI reception, smart booking, lead qualification and intelligent call handling for New Zealand and Australian businesses.","provider":{"@id":"https://talkify.nz#organization"},"areaServed":[{"@type":"Country","name":"New Zealand"},{"@type":"Country","name":"Australia"}],"serviceType":"AI Phone Agent","category":"Business Phone System","audience":{"@type":"BusinessAudience","audienceType":"Small and medium businesses"},"hasOfferCatalog":{"@type":"OfferCatalog","name":"Talkify Plans","itemListElement":[{"@type":"Offer","name":"Shortwave (Personal Assistant, for one person)","price":"89","priceCurrency":"NZD"},{"@type":"Offer","name":"Broadcast (Business agents)","price":"129","priceCurrency":"NZD"},{"@type":"Offer","name":"Website Chat","price":"49","priceCurrency":"NZD"},{"@type":"Offer","name":"Custom Setup","price":"499","priceCurrency":"NZD","description":"From price. Includes custom API integration; 12-month contract."},{"@type":"Offer","name":"Fleet","priceCurrency":"NZD","description":"Custom pricing for multi-location operators"}]}}]}</script>
69
70
71            
71<script
72        type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"What is an AI receptionist?","acceptedAnswer":{"@type":"Answer","text":"An AI receptionist is software that answers your business phone in a natural human voice. It greets callers, answers questions about your business, books appointments into your calendar, takes detailed messages and transfers urgent calls to a real person. Unlike voicemail it holds a real conversation, and unlike a person it answers every call at once, 24 hours a day. Talkify is an AI receptionist built in Christchurch for New Zealand businesses."}},{"@type":"Question","name":"What is an AI Phone Agent?","acceptedAnswer":{"@type":"Answer","text":"An AI Phone Agent is a voice-powered artificial intelligence that answers your business phone calls 24/7. It sounds natural and human-like, can answer questions about your business, book appointments, qualify leads, and forward messages via SMS or email."}},{"@type":"Question","name":"Is Talkify a voice assistant for business?","acceptedA
72nswer":{"@type":"Answer","text":"Yes. Talkify is an AI voice assistant that answers your business phone 24/7, in real New Zealand and Australian voices. It books callers straight into your calendar and texts you the summary the moment the call ends. There is no hardware and no new handset: it works by forwarding your existing business number, so you are running in minutes."}},{"@type":"Question","name":"How does Talkify work with my existing phone number?","acceptedAnswer":{"@type":"Answer","text":"Talkify works via call forwarding. You simply set up your existing business number to forward to your Talkify agent when you can't answer. No hardware changes or number porting required - you can be up and running in minutes."}},{"@type":"Question","name":"Can the AI agent book appointments into my calendar?","acceptedAnswer":{"@type":"Answer","text":"Yes. Talkify books into Google Calendar, Microsoft Outlook, Calendly, Zenoti, GymMaster and Cliniko and sends booking requests into MechanicDesk and Workshop Software for the workshop to accept. It syncs contacts and call outcomes to HubSpot and GoHighLevel. Other systems can be connected on a custom setup. Your AI agent checks real-time availability, books the appointment, and sends confirmation details to both you and the caller."}},{"@type":"Question","name":"How much does Talkify cost?","acceptedA
72nswer":{"@type":"Answer","text":"The cheapest way in is Pay As You Go: $10 a month covers your phone number, then $1 a minute as you use it, with no monthly plan at all. Business agents are on the Broadcast plan: $129/month at the founding rate for your first 3 months, then $199, per phone number with up to 3 agents on it. The Personal Assistant (Shortwave) answers one person's own mobile or landline rather than a business line, and is $89/month. A Website Chat agent for your site is $49/month, and custom setups with API integration start at $499 on a 12-month contract. Shortwave includes 50 minutes a month and Broadcast 200; extra minutes are 10c each (20c after your first 3 months), and each number includes free texts (50 a month on Broadcast, 20 on Shortwave), then 9c each."}},{"@type":"Question","name":"Does the AI sound robotic?","acceptedAnswer":{"@type":"Answer","text":"Not at all. Talkify uses state-of-the-art voice AI that sounds remarkably natural and human-like. Callers regularly can't tell they're speaking with an AI. You can choose from 80+ voices, more than 30 of them New Zealand and Australian, and customise the tone to match your brand."}},{"@type":"Question","name":"What languages does Talkify support?","acceptedA
72nswer":{"@type":"Answer","text":"Talkify supports 32 languages including English (NZ, AU, US, GB), te reo Māori, Mandarin, Spanish, Hindi and more. AI agents can detect the caller's language and respond accordingly."}},{"@type":"Question","name":"Can I train the AI on my specific business information?","acceptedAnswer":{"@type":"Answer","text":"Absolutely. You provide your business knowledge (opening hours, services, pricing, FAQs, escalation paths) and the agent learns it all. The dashboard has a live prompt editor so you can tweak anything in seconds."}},{"@type":"Question","name":"How much does an AI receptionist cost in NZ?","acceptedAnswer":{"@type":"Answer","text":"Talkify business agents are $129/month at the founding rate for your first 3 months, then $199, including 200 minutes of calls, with extra minutes from 10c. There is no setup fee and no lock-in. For comparison, an employed receptionist in NZ costs roughly $55,000 to $65,000 a year before KiwiSaver, ACC and leave, and human answering services typically run $200 to $500 a month at real call volumes once per-call charges are counted."}},{"@type":"Question","name":"What is the difference between an AI receptionist and a virtual receptionist?","acceptedA
72nswer":{"@type":"Answer","text":"A virtual receptionist is usually a person in a call centre answering for many businesses during business hours, billed per call or per minute. An AI receptionist answers instantly at any hour, handles every caller at once, never bills you more because you had a busy week, and books the job while the caller is still on the line instead of handing you a message to chase. We compare the two honestly, including when a human service is the better fit, on our virtual receptionist page."}},{"@type":"Question","name":"What happens when a call is too complex for the AI?","acceptedAnswer":{"@type":"Answer","text":"It transfers the call to you or your team, with context. You set the rules: emergencies, VIP clients or anything you flag gets warm-transferred or texted to your mobile within seconds, with the caller's name, number and the gist of what they need. Everything else is handled without interrupting you."}},{"@type":"Question","name":"Where is my data stored?","acceptedAnswer":{"@type":"Answer","text":"Audio, transcripts, and call metadata are stored in NZ data centres. AES-256 encryption at rest. Detailed compliance documentation available on request."}},{"@type":"Question","name":"Is there a free trial or demo available?","acceptedA
72nswer":{"@type":"Answer","text":"Yes. You can call the live demo at 03 242 1262 24/7, click the chat widget on any page to talk to the agent right now, or sign up for a free dedicated demo number on your own line."}}]}</script>
72
73    
73<script
74        type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"Talkify AI Phone Agent","description":"AI-powered phone agent providing 24/7 reception, smart booking, and intelligent call handling for New Zealand businesses.","applicationCategory":"BusinessApplication","operatingSystem":"Web","url":"https://talkify.nz","publisher":{"@type":"Organization","name":"Talkify","url":"https://talkify.nz"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"5","reviewCount":"6","bestRating":"5"},"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Dean W."},"reviewBody":"Thanks Talkify, love the AI Assistant phone service since we have implemented it at SUB10 to take the pressure off our reception staff and after hours phone handling. Its ability to answer most members and prospects questions has been a real game changer and most don't even know its AI, even though the voice states it is! Thank you!"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Dylan B."},"reviewBody":"Awesome! I'm so busy with my little tech support business I've been waiting so long for something like this to at least answer my calls when I'm onsite or with a customer, which is all day as per bookings etc, now instead of a missed call they can at least talk to someone and pass on their info plus how urgent it is, then I can filter through asap after my jobs are done and get back to people already knowing the problem, contact details, address and urgency level already. My customers love it! So far most of them do not know if she's real or not, it's amazing."},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Infinity RV"},"reviewBody":"Talkify Delivers! Highly Recommended. As a busy motorhome and caravan dealership, missing customer calls simply isn't an option. For years, we used traditional answering services, but the costs kept increasing while the service remained much the same. We knew there had to be a better way. Before Talkify, we tried another AI phone agent provider, but when Talkify came looking for a caravan for the family and reached out, we decided to give them a chance. We're glad we did. After several months of using Talkify AI Phone Agents, we can honestly say the system has exceeded our expectations. The AI handles customer enquiries professionally, captures leads effectively, and ensures our customers always have someone available to speak with. It has helped streamline our operations while reducing costs at the same time. What really impressed us, however, wasn't just the technology. In a world where many companies disappear after making the sale, Talkify is the complete opposite. Whether it's during business hours, after hours, or on weekends, they're always available to help. If we leave a message, we usually hear back within 8 minutes. That kind of service is almost unheard of these days. More importantly, they genuinely care about helping businesses succeed, constantly coming up with ideas, improvements, and solutions that go beyond the AI receptionist itself. Rather than simply selling software, they become part of your team and work with you to improve your customer experience and business processes. Talkify has become an important part of our operation today, and the support we receive is second to none. If you're considering a receptionist or phone answering solution, seriously stop looking."},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Anton I."},"reviewBody":"Amazing agent. Very good with natural conversation and accurate. Dictates the information back to make sure it gets everything correct."},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Dan Y."},"reviewBody":"Highly Recommended, Outstanding AI Phone Agent Service. For more than 19 years, we relied on traditional answering services to manage our customer calls. However, with rising operating costs and continual price increases from traditional providers, we knew it was time to look for a smarter and more cost-effective solution. Before Talkify, we worked with another AI phone agent company. When Talkify approached us, we decided to give this local company an opportunity. Looking back, it has been one of the best business decisions we've made. We have now been using Talkify AI Phone Agents for around two months, and the results have been outstanding. Their technology, reliability, and overall performance have exceeded our expectations. The AI handles our calls professionally and consistently, helping us improve customer service while significantly reducing our monthly costs. However, great technology is only part of the equation. What truly sets Talkify apart is the exceptional support. No matter what time we contact them, they are always willing to help. If they miss a call, they typically get back to us within 10 to 15 minutes. That level of responsiveness and commitment is extremely rare these days. More importantly, they don't just provide support for the existing system. They are constantly looking for ways to improve our business operations and often come up with 
74new ideas and solutions that add real value. It feels like having a technology partner rather than just another service provider."},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Lance B."},"reviewBody":"Great system! Highly recommend"}],"offers":{"@type":"Offer","price":"129","priceCurrency":"NZD","description":"Business plan, per month."}}</script>
vendor: 1 bytes, line 74
74
75<script type="application/ld+json">{"\u003C?php $__contextArgs = [];\nif (context()-\u003Ehas($__contextArgs[0])) :\nif (isset($value)) { $__contextPrevious[] = $value; }\n$value = context()-\u003Eget($__contextArgs[0]); ?\u003E":"https://schema.org","@type":"VideoObject","@id":"https://talkify.nz#film","name":"Talkify: a day of calls","description":"A day of calls, all answered: a class booked at dawn, a job written in mid-morning, an appointment moved at lunch, a quote request passed to a busy owner, and a 2am emergency put through to whoever is on call.","thumbnailUrl":["https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-224afe26.jpg"],"uploadDate":"2026-10-01","duration":"PT1M20S","contentUrl":"https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-d7aa3f1f.mp4","embedUrl":"https://talkify.nz","inLanguage":"en-NZ","isFamilyFriendly":true,"transcript":"Caller: Morning! Any room in spin at quarter past six? Talkify agent: Mōrena! Yep, two spots left. You're booked in. Caller: Hi, our hot water cylinder's leaking from the base. Talkify agent: Oh no. What's the address? I'll get the job to the team. Caller: Hey, can I move my Thursday appointment to later in the day? Talkify agent: Sure, three thirty on Thursday is free. I've moved you. Caller: Hi, could I get a quote to rewire our garage? Talkify agent: Absolutely. I'll grab a few details for the quote. Caller: There's water everywhere! A pipe's burst! Talkify agent: Oh, that's not good. Turn the water off at the toby if you can. I'm putting you through to Sam, on call, right now. Every call answered, all day, every day. That's Talkify. You set it up yourself in the builder, card by card. Or ask the assistant to do it for you. Serving New Zealand and Australia, with your privacy in mind. Your calls are handled in New Zealand and Australian data centres. No setup fee, no lock-in. Talkify. It's the phone, answered. Start free at talkify.nz.","publisher":{"@type":"Organization","name":"Talkify","url":"https://talkify.nz"}}</script>
75
76        
76<script type="application/ld+json">{"@context":"https://schema.org","@type":"ItemList","name":"What sets Talkify apart from other AI phone answering services","itemListElement":[{"@type":"ListItem","position":1,"name":"Local NZ SIP network for low-latency, crystal-clear calls"},{"@type":"ListItem","position":2,"name":"Real New Zealand and Australian AI voices"},{"@type":"ListItem","position":3,"name":"Regional phone numbers across New Zealand and Australia"},{"@type":"ListItem","position":4,"name":"Data sovereignty: stored in New Zealand and Australian data centres"},{"@type":"ListItem","position":5,"name":"Outbound AI calling: confirmations, reminders and marketing campaigns"},{"@type":"ListItem","position":6,"name":"AI phone surveys with transcripts and analysis"},{"@type":"ListItem","position":7,"name":"AI call centre capacity with unlimited concurrent lines"},{"@type":"ListItem","position":8,"name":"Deep integrations: calendars, CRMs, gym software, Zapier and REST API"},{"@type":"ListItem","position":9,"name":"Personalised done-for-you setup"},{"@type":"ListItem","position":10,"name":"Mobile apps for iPhone and Android"},{"@type":"ListItem","position":11,"name":"Smart reporting with transcripts, sentiment and outcomes"}]}</script>
76
77
78    
79            <!-- Google Analytics -->
vendor: 68 bytes, lines 79-80
79
80    <script async src="https://www.googletagmanager.com/gtag/js?id=
80G-YS6V82V8W9
vendor: 16 bytes, lines 80-81
80"></script>
81    
81<script>
82        
vendor: 176 bytes, lines 82-89
82window.dataLayer = window.dataLayer || [];
83
84        function gtag() {
85            dataLayer.push(arguments);
86        }
87
88        gtag('js', new Date());
89        gtag('config', "
89G-YS6V82V8W9
vendor: 12 bytes, lines 89-90
89");
90        
90gtag('config', "AW-18227321636");
91    </script>
91
92    
93    
94    
94<script>
95    // Safe before gtag has loaded: dataLayer is already an array by here and
96    // gtag() only pushes onto it, so an event queued early still gets sent.
97    window.talkifyTrack = function (name, params) {
98        if (typeof gtag !== 'function') { return; }
99        gtag('event', name, params || {});
100    };
101    </script>
101
102
103        <!-- Google Tag Manager -->
104    
104<script>
vendor: 534 bytes, lines 104-116
104(function (w, d, s, l, i) {
105            w[l] = w[l] || [];
106            w[l].push({
107                'gtm.start':
108                    new Date().getTime(), event: 'gtm.js'
109            });
110            var f = d.getElementsByTagName(s)[0],
111                j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
112            j.async = true;
113            j.src =
114                'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
115            f.parentNode.insertBefore(j, f);
116        })(window, document, 'script', 'dataLayer', "
116GTM-TTGHDLQ4
vendor: 3 bytes, line 116
116");
116</script>
116
117    <!-- End Google Tag Manager -->
118    <link rel="preconnect" href="https://fonts.googleapis.com">
119    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
120    <!-- Meta Pixel Code -->
121    
121<script>
vendor: 679 bytes, lines 121-140
121
122        !function (f, b, e, v, n, t, s) {
123            if (f.fbq) return;
124            n = f.fbq = function () {
125                n.callMethod ?
126                    n.callMethod.apply(n, arguments) : n.queue.push(arguments)
127            };
128            if (!f._fbq) f._fbq = n;
129            n.push = n;
130            n.loaded = !0;
131            n.version = '2.0';
132            n.queue = [];
133            t = b.createElement(e);
134            t.async = !0;
135            t.src = v;
136            s = b.getElementsByTagName(e)[0];
137            s.parentNode.insertBefore(t, s)
138        }(window, document, 'script',
139            'https://connect.facebook.net/en_US/fbevents.js');
140        fbq('init', '
1401560743332225994
vendor: 42 bytes, lines 140-142
140');
141        fbq('track', 'PageView');
142    
142</script>
142
143    <noscript><img height="1" width="1" style="display:none"
144                   src="https://www.facebook.com/tr?id=1560743332225994&ev=PageView&noscript=1"
145        /></noscript>
146    <!-- End Meta Pixel Code -->
147        
148    <link
149        href="https://fonts.googleapis.com/css2?family=Outfit:[email protected]&family=JetBrains+Mono:wght@400;500&display=swap"
150        rel="stylesheet">
151
152    <style>
153        /* ====== TOKENS ======
154           The 2026 brand guide, in one place.
155
156           Roles, not decoration:
157             blue   #318ABE  PRIMARY. Links, primary buttons, focus rings, the
158                             mark, the start of the gradient.
159             green  #A3D654  ACCENT. Live dots, success, the end of the
160                             gradient, small highlights on dark ground.
161             ink    #101820  Body copy on light, the dark surface on dark.
162
163           Green is never small text on a light ground: #A3D654 on white is
164           1.6:1. Where a word genuinely has to be green and small, use
165           --green-ink.
166
167           Naming note: this sheet grew up with --ink as the page GROUND and
168           --paper as the text on it, and ~65 pages are written against that,
169           so the pair keeps its meaning. :root is the dark treatment;
170           html[data-theme="light"] is what almost every visitor sees, because
171           the no-flash script picks light unless somebody has chosen dark. */
172        :root {
173            /* -- brand constants, identical in both themes -- */
174            --blue: #318ABE;
175            --blue-dark: #256D97;
176            --green: #A3D654;
177            --green-ink: #4F6B18; /* the rare small-green-text case, on light */
178            --brand-blue: #318ABE; /* legacy aliases, still referenced by pages */
179            --brand-blue-bright: #5BC7E8;
180            --brand-green: #A3D654;
181            --brand-green-bright: #B9DD80;
182
183            /* -- dark treatment -- */
184            --ink: #101820;
185            --ink-2: #16202A;
186            --ink-3: #1D2831;
187            --line: rgba(255, 255, 255, .10);
188            --line-2: rgba(255, 255, 255, .18);
189            --paper: #FFFFFF;
190            --paper-warm: #F2F4F5;
191            --bone: #C6CCD1;
192            --mute: #9AA2A8;
193            --mute-2: #79828A;
194
195            /* Primary. Blue carries links and fills here. --plasma is the same
196               family: the .blue / .eb-blue / .plasma-text idiom stays blue, the
197               brand simply has one primary rather than the two accents this
198               sheet used to run. Green is --accent, and only --accent. */
199            --signal: #4FA6D8;
200            --signal-warm: #7BC4E9;
201            --plasma: #4FA6D8;
202            --plasma-bright: #7BC4E9;
203            --accent: #A3D654; /* live, success, gradient end */
204            --coral: #FF5E3A;
205            --violet: #7C5BFF;
206            /* 45deg blue to green, hero surfaces only, never twice on a page */
207            --grad: linear-gradient(45deg, var(--blue) 0%, var(--green) 100%);
208            --grad-soft: linear-gradient(45deg, color-mix(in srgb, var(--blue) 18%, transparent) 0%, color-mix(in srgb, var(--green) 18%, transparent) 100%);
209
210            /* -- type --
211               Outfit does the display, heading and body work; JetBrains Mono
212               does labels. --serif and --serif-italic are kept as names because
213               ~65 pages reference them, but both now resolve to Outfit: there
214               is no second face on the site. */
215            --sans: 'Outfit', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
216            --serif: 'Outfit', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
217            --serif-italic: 'Outfit', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
218            --mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
219
220            /* One scale, so a page cannot invent a size. The old sheet ran
221               138px headlines over 13.5px body copy; nothing here is below
222               14px and nothing above 96px. */
223            --t-display: clamp(44px, 6.4vw, 96px);
224            --t-h2: clamp(34px, 4.4vw, 60px);
225            --t-h3: clamp(22px, 2.2vw, 30px);
226            --t-sub: clamp(20px, 2vw, 26px);
227            --t-lede: 17px;
228            --t-body: 16px;
229            --t-small: 14px;
230            --t-label: 11.5px;
231            --lh-display: 1.04;
232            --lh-head: 1.12;
233            --lh-body: 1.6;
234            --ls-head: -.02em; /* the guide's -2% on headings */
235            --ls-label: .13em; /* the guide's +13% on mono labels */
236
237            --ease: cubic-bezier(.2, .7, .2, 1);
238            --ease-out: cubic-bezier(.16, 1, .3, 1);
239
240            --shell-pad: clamp(20px, 3.5vw, 56px);
241            /* Section rhythm, so a new page stops reaching for
242               style="padding-top:0". See section.shell and .shell.flush. */
243            --space-section: clamp(72px, 8vw, 120px);
244            --space-section-tight: clamp(52px, 5.5vw, 80px);
245
246            /* -- semantic tokens (recurring patterns that must flip per theme) -- */
247            --on-accent: #0B1116; /* text sitting on a brand fill */
248            --panel: #16202A;
249            --panel-2: #1A242E;
250            --panel-grad: linear-gradient(140deg, #18232D, #101820);
251            --panel-grad-160: linear-gradient(160deg, #16202A, #101820);
252            --deck-grad: linear-gradient(180deg, #18232D, #101820);
253            --surface: rgba(255, 255, 255, .02);
254            --surface-2: rgba(255, 255, 255, .04);
255            --surface-3: rgba(255, 255, 255, .06);
256            --scrim-strong: rgba(16, 24, 32, .85);
257            --scrim-mid: rgba(16, 24, 32, .6);
258            --scrim-soft: rgba(16, 24, 32, .4);
259            --scrim-solid: #101820;
260            --shadow-deep: rgba(0, 0, 0, .8);
261            --shadow-soft: rgba(0, 0, 0, .5);
262            --logo-light: none; /* logo image swap: see .logo img rules */
263        }
264
265        /* ====== LIGHT THEME ====== */
266        html[data-theme="light"] {
267            --ink: #FFFFFF;
268            --ink-2: #F7F8F8; /* the guide's surface */
269            --ink-3: #EDEFEF;
270            --line: #E9EAEA; /* the guide's line */
271            --line-2: #D5D8D9;
272            --paper: #101820; /* the guide's ink, as body copy */
273            --paper-warm: #1B242C;
274            --bone: #3F4A52; /* long-form body copy, 9.6:1 on white */
275            --mute: #5A6268; /* the guide's grey, 6.2:1 on white */
276            --mute-2: #79828A;
277
278            /* On white, #318ABE is 3.8:1, which is short of AA for a 14px
279               label or a link in running text. The guide's own blue dark is
280               5.7:1, so that is what carries text and button fills here;
281               #318ABE stays the brand blue for the mark, the gradient and
282               anything large. */
283            --signal: #256D97;
284            --signal-warm: #1F5D80;
285            --plasma: #256D97;
286            --plasma-bright: #1F5D80;
287            --accent: #A3D654;
288
289            --on-accent: #FFFFFF; /* white on the blue fill: 5.7:1 */
290            --panel: #F7F8F8;
291            --panel-2: #EFF1F1;
292            --panel-grad: linear-gradient(140deg, #FFFFFF, #F2F4F4);
293            --panel-grad-160: linear-gradient(160deg, #FFFFFF, #F2F4F4);
294            --deck-grad: linear-gradient(180deg, #FFFFFF, #F7F8F8);
295            --surface: rgba(16, 24, 32, .03);
296            --surface-2: rgba(16, 24, 32, .05);
297            --surface-3: rgba(16, 24, 32, .07);
298            --scrim-strong: rgba(255, 255, 255, .88);
299            --scrim-mid: rgba(255, 255, 255, .58);
300            --scrim-soft: rgba(255, 255, 255, .36);
301            --scrim-solid: #FFFFFF;
302            --shadow-deep: rgba(16, 24, 32, .20);
303            --shadow-soft: rgba(16, 24, 32, .12);
304        }
305
306        html {
307            transition: background-color .35s var(--ease), color .35s var(--ease);
308        }
309
310        @media (prefers-reduced-motion: reduce) {
311            html {
312                transition: none
313            }
314        }
315
316        /* Light-theme atmosphere, the dark grain/scanline/vignette overlays don't suit a light ground */
317        html[data-theme="light"] .grain {
318            opacity: .12;
319            mix-blend-mode: multiply
320        }
321
322        html[data-theme="light"] .scanlines {
323            display: none
324        }
325
326        html[data-theme="light"] .vignette {
327            background: radial-gradient(120% 80% at 50% 0%, transparent 45%, rgba(20, 22, 15, .06) 100%)
328        }
329
330        /* Theme-swappable photos: elements pass --shot-dark / --shot-light as inline custom props */
331        html[data-theme="light"] .hero-bg .photo {
332            background-image: var(--shot-light, var(--shot-dark))
333        }
334
335        html[data-theme="light"] .hero-photo {
336            background-image: var(--shot-light, var(--shot-dark))
337        }
338
339        html[data-theme="light"] .endcta .endcta-photo {
340            background-image: url('/media/frontend/nz-skyline-day.jpg');
341            opacity: .5;
342            filter: saturate(1) contrast(1)
343        }
344
345        /* ── The 2026 mark (x-brand.logo) ──────────────────────────────────
346           The lockup is drawn inline so the spark eye can wink and so the
347           word can take the theme's colour rather than needing a file per
348           combination. Base here is the dark treatment, matching :root; the
349           light theme, which is what the no-flash script picks unless somebody
350           has chosen dark, inverts the pair. The gradient circle is the same
351           blue-to-green in both, per the brand guide. */
352        .tk-logo {
353            --tk-word: #ffffff;
354            --tk-ground: #101820;
355            display: block;
356        }
357
358        html[data-theme="light"] .tk-logo {
359            --tk-word: #101820;
360            --tk-ground: #ffffff;
361        }
362
363        /* The guide's one permitted movement: 300ms close on a 4 second
364           cycle, on an inner group so the star keeps its translate and scale. */
365        @keyframes tk-blink {
366            0%, 92%, 100% { transform: scaleY(1) }
367            95% { transform: scaleY(.08) }
368        }
369
370        .tk-logo .tk-eye {
371            animation: tk-blink 4s ease-in-out infinite;
372            transform-origin: 50px 50px
373        }
374
375        @media (prefers-reduced-motion: reduce) {
376            .tk-logo .tk-eye {
377                animation: none
378            }
379        }
380
381        /* Theme toggle button */
382        .theme-toggle {
383            width: 40px;
384            height: 40px;
385            border-radius: 10px;
386            border: 1px solid var(--line);
387            display: grid;
388            place-items: center;
389            color: var(--bone);
390            transition: .25s var(--ease);
391            flex: 0 0 auto
392        }
393
394        .theme-toggle:hover {
395            border-color: var(--signal);
396            color: var(--paper)
397        }
398
399        .theme-toggle .icon-moon {
400            display: none
401        }
402
403        html[data-theme="light"] .theme-toggle .icon-sun {
404            display: none
405        }
406
407        html[data-theme="light"] .theme-toggle .icon-moon {
408            display: block
409        }
410
411        * {
412            box-sizing: border-box;
413            margin: 0;
414            padding: 0
415        }
416
417        html, body {
418            background: var(--ink);
419            color: var(--paper);
420            font-family: var(--sans);
421            font-weight: 400;
422            -webkit-font-smoothing: antialiased;
423            text-rendering: optimizeLegibility;
424            overflow-x: hidden
425        }
426
427        body {
428            font-size: var(--t-body);
429            line-height: var(--lh-body);
430            letter-spacing: 0
431        }
432
433        a {
434            color: inherit;
435            text-decoration: none
436        }
437
438        img, svg {
439            display: block;
440            max-width: 100%
441        }
442
443        button {
444            font: inherit;
445            color: inherit;
446            background: none;
447            border: 0;
448            cursor: pointer
449        }
450
451        input, textarea, select {
452            font: inherit;
453            color: inherit
454        }
455
456        ::selection {
457            background: var(--signal);
458            color: var(--on-accent)
459        }
460
461        /* Labels: JetBrains Mono 500, uppercase, +13% tracking. */
462        .mono {
463            font-family: var(--mono);
464            font-weight: 500;
465            letter-spacing: var(--ls-label)
466        }
467
468        .serif {
469            font-family: var(--serif)
470        }
471
472        /* The accent idiom.
473           It was a Fraunces italic in green. Outfit ships no italic, and a
474           browser-synthesised slant on a geometric sans at 96px looks broken,
475           so the accent is now weight and colour: Outfit 600 in the primary
476           blue. The !important is deliberate and is the only one in this
477           sheet: several pages set font-style on their own .it descendants
478           and would otherwise reintroduce the fake slant. */
479        .italic, .it, .blue {
480            font-family: var(--serif);
481            font-style: normal !important;
482            font-weight: 600
483        }
484
485        .signal-text {
486            color: var(--signal)
487        }
488
489        .plasma-text {
490            color: var(--plasma-bright)
491        }
492
493        /* ====== ATMOSPHERE ====== */
494        .grain {
495            position: fixed;
496            inset: 0;
497            pointer-events: none;
498            z-index: 200;
499            mix-blend-mode: overlay;
500            opacity: .32;
501            background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .55 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
502            background-size: 160px
503        }
504
505        .scanlines {
506            position: fixed;
507            inset: 0;
508            pointer-events: none;
509            z-index: 201;
510            opacity: .04;
511            background-image: linear-gradient(to bottom, transparent 0, transparent 2px, rgba(255, 255, 255, .6) 2px, rgba(255, 255, 255, .6) 3px);
512            background-size: 100% 3px
513        }
514
515        .vignette {
516            position: fixed;
517            inset: 0;
518            pointer-events: none;
519            z-index: 199;
520            background: radial-gradient(120% 80% at 50% 0%, transparent 40%, rgba(0, 0, 0, .5) 100%)
521        }
522
523        @keyframes pulse {
524            0%, 100% {
525                transform: scale(1);
526                opacity: 1
527            }
528            50% {
529                transform: scale(1.4);
530                opacity: .6
531            }
532        }
533
534        @keyframes slide {
535            from {
536                transform: translateX(0)
537            }
538            to {
539                transform: translateX(-50%)
540            }
541        }
542
543        /* ====== NAV ====== */
544        .nav {
545            position: fixed;
546            top: 0;
547            left: 0;
548            right: 0;
549            z-index: 80;
550            display: grid;
551            grid-template-columns:1fr auto 1fr;
552            align-items: center;
553            gap: 24px;
554            padding: 18px var(--shell-pad);
555            background: linear-gradient(180deg, var(--scrim-strong), var(--scrim-soft) 80%, transparent);
556            backdrop-filter: blur(10px) saturate(140%);
557            -webkit-backdrop-filter: blur(10px) saturate(140%)
558        }
559
560        .nav .logo {
561            display: flex;
562            align-items: center;
563            gap: 14px
564        }
565
566        .nav .logo .mark {
567            width: 34px;
568            height: 34px;
569            border-radius: 10px;
570            background: var(--grad);
571            display: grid;
572            place-items: center;
573            position: relative;
574            overflow: hidden;
575            box-shadow: 0 0 30px rgba(49, 138, 190, .4)
576        }
577
578        .nav .logo .mark::after {
579            content: "";
580            position: absolute;
581            inset: 0;
582            background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, .55), transparent 50%)
583        }
584
585        .nav .logo .mark svg {
586            width: 18px;
587            height: 18px;
588            color: var(--ink);
589            position: relative;
590            z-index: 1
591        }
592
593        .nav .logo b {
594            font-family: var(--serif);
595            font-weight: 500;
596            font-size: 22px;
597            letter-spacing: -.02em
598        }
599
600        .nav .logo .tag {
601            font-family: var(--mono);
602            font-size: var(--t-label);
603            color: var(--mute);
604            text-transform: uppercase;
605            letter-spacing: .18em;
606            margin-left: 6px;
607            padding: 3px 6px;
608            border: 1px solid var(--line);
609            border-radius: 4px
610        }
611
612        .nav ul {
613            display: flex;
614            gap: 6px;
615            list-style: none
616        }
617
618        .nav ul a {
619            display: inline-flex;
620            align-items: center;
621            gap: 6px;
622            padding: 8px 14px;
623            border-radius: 999px;
624            font-size: 13px;
625            color: var(--bone);
626            transition: .25s var(--ease)
627        }
628
629        .nav ul a:hover {
630            background: var(--ink-3);
631            color: var(--paper)
632        }
633
634        .nav ul a.is-active {
635            background: var(--ink-3);
636            color: var(--paper)
637        }
638
639        .nav ul a.is-active .dot {
640            background: var(--signal);
641            box-shadow: 0 0 8px var(--signal)
642        }
643
644        .nav ul a .dot {
645            width: 5px;
646            height: 5px;
647            border-radius: 50%;
648            background: var(--mute)
649        }
650
651        /* ── Agents mega-menu ─────────────────────────────────────────────
652           Desktop: opens on hover, on focus, or on click (the click state is
653           what mobile uses, where the whole nav is a stacked panel and the
654           menu becomes an inline accordion). */
655        .nav-drop {
656            position: relative
657        }
658
659        .nav-drop-btn {
660            display: inline-flex;
661            align-items: center;
662            gap: 6px;
663            padding: 8px 14px;
664            border-radius: 999px;
665            font-family: var(--sans);
666            font-size: 13px;
667            color: var(--bone);
668            background: none;
669            border: 0;
670            cursor: pointer;
671            transition: .25s var(--ease)
672        }
673
674        .nav-drop-btn:hover,
675        .nav-drop-btn.is-active {
676            background: var(--ink-3);
677            color: var(--paper)
678        }
679
680        .nav-drop-btn.is-active .dot {
681            background: var(--signal);
682            box-shadow: 0 0 8px var(--signal)
683        }
684
685        .nav-drop-btn .dot {
686            width: 5px;
687            height: 5px;
688            border-radius: 50%;
689            background: var(--mute)
690        }
691
692        .nav-drop-chev {
693            transition: transform .25s var(--ease);
694            opacity: .7
695        }
696
697        .nav-drop.is-open .nav-drop-chev {
698            transform: rotate(180deg)
699        }
700
701        .nav-drop-panel {
702            position: absolute;
703            top: calc(100% + 10px);
704            left: 0;
705            z-index: 90;
706            display: none;
707            grid-template-columns: minmax(240px, 1fr) minmax(300px, 1fr);
708            gap: 26px;
709            min-width: 620px;
710            padding: 22px;
711            background: var(--ink-2);
712            border: 1px solid var(--line);
713            border-radius: 16px;
714            box-shadow: 0 24px 60px rgba(0, 0, 0, .35)
715        }
716
717        /* Invisible bridge across the 10px gap between the button and the panel.
718           Without it the pointer leaves .nav-drop on the way down and the menu
719           shuts before you get there, unless you move quickly. It spans the full
720           width of the panel, so a diagonal approach is covered too. */
721        .nav-drop-panel::before {
722            content: "";
723            position: absolute;
724            left: 0;
725            right: 0;
726            top: -12px;
727            height: 12px
728        }
729
730        /* One-column variant, for a menu that holds a single short list. The
731           base two-column grid is what Agents uses. */
732        .nav-drop-panel--single {
733            grid-template-columns: 1fr;
734            min-width: 340px
735        }
736
737        /* Industries runs to twenty-three entries in four sectors, so it takes
738           a third column rather than a taller one. Sector headings do the
739           finding; the A-Z inside each does the rest. */
740        .nav-drop-panel--industries {
741            grid-template-columns: repeat(3, minmax(190px, 1fr));
742            min-width: 660px
743        }
744
745        .nav-drop:hover .nav-drop-panel,
746        .nav-drop:focus-within .nav-drop-panel,
747        .nav-drop.is-open .nav-drop-panel {
748            display: grid
749        }
750
751        .nav-drop-hd {
752            display: block;
753            font-family: var(--mono);
754            font-size: var(--t-label);
755            letter-spacing: .18em;
756            text-transform: uppercase;
757            color: var(--mute);
758            margin-bottom: 10px
759        }
760
761        /* These selectors carry `.nav ul` on purpose: the generic `.nav ul a`
762           rule above makes every nav link an inline-flex pill, which would put
763           each label and its description side by side instead of stacked. */
764        .nav ul .nav-drop-panel a {
765            display: block;
766            padding: 9px 10px;
767            border-radius: 10px;
768            font-size: var(--t-small);
769            line-height: 1.35;
770            color: var(--paper);
771            transition: .2s var(--ease)
772        }
773
774        .nav ul .nav-drop-panel a > span {
775            display: block;
776            font-weight: 500
777        }
778
779        .nav ul .nav-drop-panel a em {
780            display: block;
781            font-style: normal;
782            font-size: 11.5px;
783            line-height: 1.4;
784            color: var(--mute);
785            margin-top: 3px
786        }
787
788        .nav ul .nav-drop-panel a:hover {
789            background: var(--ink-3)
790        }
791
792        .nav-drop-col {
793            display: flex;
794            flex-direction: column;
795            align-items: stretch
796        }
797
798        /* A sector column's links sit tighter than the described Agents rows:
799           they are one word each and there is no <em> under them. */
800        .nav ul .nav-drop-panel--industries a:not(.nav-drop-all) {
801            padding-top: 6px;
802            padding-bottom: 6px
803        }
804
805        /* margin-top:auto pins it to the foot of its column, so both "See all"
806           links line up even though the two columns are different lengths. */
807        .nav ul .nav-drop-all {
808            margin-top: auto;
809            padding-top: 12px;
810            border-top: 1px solid var(--line);
811            border-radius: 0;
812            color: var(--signal);
813            font-weight: 500;
814            /* The arrow belongs on the same line as the words. In a sector
815               column ~190px wide it wrapped onto a line of its own. */
816            white-space: nowrap
817        }
818
819        .nav ul .nav-drop-all:hover {
820            background: none;
821            opacity: .8
822        }
823
824        /* `a` is in the selector to out-specify `.nav ul .nav-drop-panel a >
825           span`, which is display:block for the stacked label-and-description
826           rows. Without it the arrow was a block of its own and dropped onto a
827           second line under the words. */
828        .nav ul a.nav-drop-all > span {
829            display: inline;
830            font-weight: 500
831        }
832
833        .nav .actions {
834            justify-self: end;
835            display: flex;
836            align-items: center;
837            gap: 10px
838        }
839
840        .nav .num {
841            font-family: var(--mono);
842            font-size: 13px;
843            color: var(--bone);
844            padding: 8px 12px;
845            border: 1px solid var(--line);
846            border-radius: 8px;
847            transition: .25s;
848            white-space: nowrap
849        }
850
851        .nav .num:hover {
852            border-color: var(--signal);
853            color: var(--paper)
854        }
855
856        .nav .num b {
857            color: var(--signal);
858            font-weight: 500
859        }
860
861        /* The signup pill's two faces: the wide desktop one links to /signup
862           (a tel: link on a desktop rings nothing), the mobile one is a phone
863           glyph that actually dials. Only ever one on screen. */
864        .nav .num-call {
865            display: none;
866            align-items: center;
867            justify-content: center;
868            padding: 8px 10px;
869            line-height: 0
870        }
871
872        .menu-btn {
873            display: none
874        }
875
876        .btn {
877            display: inline-flex;
878            align-items: center;
879            gap: 10px;
880            padding: 12px 20px;
881            border-radius: 999px;
882            font-size: var(--t-small);
883            font-weight: 500;
884            letter-spacing: 0;
885            transition: .25s var(--ease);
886            border: 1px solid transparent;
887            white-space: nowrap
888        }
889
890        /* Primary is Talkify Blue, per the guide. Green is the accent and
891           never the button. */
892        .btn-primary {
893            background: var(--signal);
894            color: var(--on-accent)
895        }
896
897        .btn-primary:hover {
898            background: var(--signal-warm);
899            transform: translateY(-1px);
900            box-shadow: 0 8px 26px -8px color-mix(in srgb, var(--signal) 55%, transparent)
901        }
902
903        .btn-blue {
904            background: var(--plasma);
905            color: var(--on-accent)
906        }
907
908        .btn-blue:hover {
909            background: var(--plasma-bright);
910            transform: translateY(-1px)
911        }
912
913        .btn-ghost {
914            border-color: var(--paper);
915            color: var(--paper)
916        }
917
918        .btn-ghost:hover {
919            background: var(--paper);
920            color: var(--ink);
921            border-color: var(--paper)
922        }
923
924        /* One focus ring for every interactive thing on the site. */
925        .btn:focus-visible, a:focus-visible, button:focus-visible,
926        input:focus-visible, select:focus-visible, textarea:focus-visible,
927        summary:focus-visible, [tabindex]:focus-visible {
928            outline: 2px solid var(--blue);
929            outline-offset: 2px
930        }
931
932        .btn .arr {
933            transition: transform .25s var(--ease)
934        }
935
936        .btn:hover .arr {
937            transform: translateX(3px)
938        }
939
940        .btn-lg {
941            padding: 16px 28px;
942            font-size: 16px
943        }
944
945        /* ====== EYEBROW ====== */
946        .eyebrow {
947            display: inline-flex;
948            align-items: center;
949            gap: 10px;
950            font-family: var(--mono);
951            font-weight: 500;
952            font-size: var(--t-label);
953            text-transform: uppercase;
954            letter-spacing: var(--ls-label);
955            color: var(--mute);
956            padding: 6px 10px;
957            border: 1px solid var(--line);
958            border-radius: 999px;
959            background: var(--surface)
960        }
961
962        /* Green is the live state, which is exactly what this dot is. */
963        .eyebrow .pin {
964            width: 6px;
965            height: 6px;
966            border-radius: 50%;
967            background: var(--accent);
968            box-shadow: 0 0 10px color-mix(in srgb, var(--accent) 70%, transparent)
969        }
970
971        .eyebrow.eb-blue .pin {
972            background: var(--plasma);
973            box-shadow: 0 0 10px var(--plasma)
974        }
975
976        .eyebrow.eb-coral .pin {
977            background: var(--coral);
978            box-shadow: 0 0 10px var(--coral)
979        }
980
981        /* ====== HERO ====== */
982        /* The nav is 84px and fixed, so 160px of padding was 76px of nothing
983           above the headline. On a laptop that pushed the whole hero, and the
984           dialler beside it, most of the way down the fold before a word was
985           read. 120 keeps a comfortable 36px under the bar. */
986        .hero {
987            position: relative;
988            padding: 120px var(--shell-pad) 80px;
989            overflow: hidden
990        }
991
992        .hero-bg {
993            position: absolute;
994            inset: 0;
995            pointer-events: none;
996            z-index: 0;
997            overflow: hidden
998        }
999
1000        .hero-bg .photo {
1001            position: absolute;
1002            inset: 0;
1003            background-image: var(--shot-dark);
1004            background-position: center right;
1005            background-size: cover;
1006            background-repeat: no-repeat;
1007            opacity: .78;
1008            filter: saturate(.85) contrast(1.05)
1009        }
1010
1011        .hero-bg .photo::after {
1012            content: "";
1013            position: absolute;
1014            inset: 0;
1015            background: linear-gradient(90deg, var(--scrim-solid) 0%, var(--scrim-strong) 28%, var(--scrim-mid) 50%, var(--scrim-soft) 72%, var(--scrim-mid) 100%),
1016            linear-gradient(180deg, var(--scrim-soft) 0%, transparent 30%, transparent 70%, var(--scrim-mid) 100%)
1017        }
1018
1019        .hero-bg .glow1 {
1020            position: absolute;
1021            top: -20%;
1022            left: -10%;
1023            width: 80%;
1024            height: 120%;
1025            background: radial-gradient(closest-side, rgba(49, 138, 190, .20), transparent 70%);
1026            filter: blur(20px);
1027            mix-blend-mode: screen
1028        }
1029
1030        .hero-bg .glow2 {
1031            position: absolute;
1032            bottom: -30%;
1033            right: -10%;
1034            width: 70%;
1035            height: 120%;
1036            background: radial-gradient(closest-side, color-mix(in srgb, var(--accent) 12%, transparent), transparent 70%);
1037            filter: blur(20px);
1038            mix-blend-mode: screen
1039        }
1040
1041        .hero-bg .grid-lines {
1042            position: absolute;
1043            inset: 0;
1044            background-image: linear-gradient(to right, var(--line) 1px, transparent 1px), linear-gradient(to bottom, var(--line) 1px, transparent 1px);
1045            background-size: 80px 80px;
1046            mask-image: radial-gradient(ellipse at center, #000, transparent 70%);
1047            opacity: .5
1048        }
1049
1050        /* The two hero columns are rarely the same height: the copy runs long
1051           on some pages, the photo is very tall on others, and the transcript
1052           deck is short everywhere. Bottom-aligning them dropped whichever was
1053           shorter to the floor and left a hole above it, which is what the
1054           debt-collection, outbound-calls, call-centre and pricing heroes were
1055           all showing. Centred, the difference is split top and bottom instead
1056           of piling up in one corner. */
1057        .hero-shell {
1058            position: relative;
1059            z-index: 1;
1060            display: grid;
1061            grid-template-columns:1.4fr 1fr;
1062            gap: 64px;
1063            align-items: center
1064        }
1065
1066        /* A hero photo is the exception: it is a full-bleed panel, so it fills
1067           the row rather than floating in the middle of it. */
1068        .hero-shell > .hero-photo {
1069            align-self: stretch
1070        }
1071
1072        .hero-shell.single {
1073            grid-template-columns:1fr;
1074            max-width: 1200px
1075        }
1076
1077        /* Heroes whose right column is a tall form. Bottom-aligning them drops a
1078           dead band above the headline and top-aligning just moves it below, so
1079           the left column instead stretches to the form's height and spreads its
1080           groups over it. Needs the left column's content in group wrappers. */
1081        .hero-shell.top {
1082            align-items: stretch
1083        }
1084
1085        .hero-shell.top > .hero-side {
1086            display: flex;
1087            flex-direction: column;
1088            justify-content: space-between
1089        }
1090
1091        h1.display {
1092            margin-top: 28px;
1093            font-family: var(--serif);
1094            font-weight: 600;
1095            font-size: var(--t-display);
1096            line-height: var(--lh-display);
1097            letter-spacing: var(--ls-head);
1098            padding-bottom: .06em
1099        }
1100
1101        /* The resting state IS the default. It used to be
1102           translateY(110%) inside overflow:hidden with a 1s animation, so the
1103           largest element on the page -- the LCP element -- was off screen
1104           until the animation ran, and never arrived at all if animations
1105           were suppressed. */
1106        h1.display .ln {
1107            display: block;
1108            padding-bottom: .06em;
1109            padding-right: .06em
1110        }
1111
1112        h1.display .ln span {
1113            display: inline-block;
1114            padding-bottom: .04em
1115        }
1116
1117        h1.display .it,
1118        h1.display .blue {
1119            font-family: var(--serif);
1120            font-style: normal;
1121            font-weight: 600;
1122            color: var(--signal)
1123        }
1124
1125        h1.display .out {
1126            color: var(--bone)
1127        }
1128
1129        @keyframes rise {
1130            from {
1131                opacity: 0;
1132                transform: translateY(16px)
1133            }
1134            to {
1135                opacity: 1;
1136                transform: none
1137            }
1138        }
1139
1140        @media (prefers-reduced-motion: no-preference) {
1141            h1.display .ln {
1142                overflow: hidden
1143            }
1144
1145            h1.display .ln span {
1146                animation: rise .4s var(--ease-out) both
1147            }
1148
1149            .hero h1.display .ln:nth-child(1) span { animation-delay: 0s }
1150
1151            .hero h1.display .ln:nth-child(2) span { animation-delay: .06s }
1152
1153            .hero h1.display .ln:nth-child(3) span { animation-delay: .12s }
1154
1155            .hero h1.display .ln:nth-child(4) span { animation-delay: .18s }
1156        }
1157
1158        .hero-sub {
1159            margin-top: 32px;
1160            max-width: 580px;
1161            color: var(--bone);
1162            font-size: var(--t-sub);
1163            line-height: 1.45
1164        }
1165
1166        /* rise2 is the site's general "arrive" animation. It is written from
1167           the resting state outwards, so an element that never animates is
1168           already where it belongs. */
1169        @keyframes rise2 {
1170            from {
1171                opacity: 0;
1172                transform: translateY(16px)
1173            }
1174            to {
1175                opacity: 1;
1176                transform: none
1177            }
1178        }
1179
1180        @media (prefers-reduced-motion: no-preference) {
1181            .hero-sub {
1182                animation: rise2 .4s .1s var(--ease-out) both
1183            }
1184        }
1185
1186        .hero-sub b {
1187            color: var(--paper);
1188            font-weight: 500
1189        }
1190
1191        .hero-cta {
1192            margin-top: 36px;
1193            display: flex;
1194            flex-wrap: wrap;
1195            align-items: center;
1196            gap: 14px
1197        }
1198
1199        .hero-meta {
1200            display: flex;
1201            flex-wrap: wrap;
1202            gap: 36px 56px;
1203            margin-top: 48px;
1204            padding-top: 28px;
1205            border-top: 1px dashed var(--line-2)
1206        }
1207
1208        @media (prefers-reduced-motion: no-preference) {
1209            .hero-cta {
1210                animation: rise2 .4s .16s var(--ease-out) both
1211            }
1212
1213            .hero-meta {
1214                animation: rise2 .4s .22s var(--ease-out) both
1215            }
1216        }
1217
1218        .hero-meta dt {
1219            font-family: var(--mono);
1220            font-size: var(--t-label);
1221            letter-spacing: .18em;
1222            text-transform: uppercase;
1223            color: var(--mute)
1224        }
1225
1226        .hero-meta dd {
1227            font-family: var(--serif);
1228            font-weight: 600;
1229            font-size: 30px;
1230            letter-spacing: var(--ls-head);
1231            margin-top: 4px
1232        }
1233
1234        .hero-meta dd b {
1235            color: var(--signal);
1236            font-weight: 600
1237        }
1238
1239        .hero-meta dd small {
1240            font-family: var(--mono);
1241            font-size: var(--t-small);
1242            color: var(--mute);
1243            margin-left: 4px
1244        }
1245
1246        /* Short reassurance list that sits under the hero meta, used to carry the
1247           left column down beside a tall form. */
1248        .hero-points {
1249            margin-top: 34px;
1250            padding-top: 26px;
1251            border-top: 1px dashed var(--line-2);
1252            display: grid;
1253            gap: 14px;
1254            max-width: 560px;
1255            opacity: 0;
1256            animation: rise2 .9s 1s var(--ease-out) forwards
1257        }
1258
1259        .hero-points .pt {
1260            display: flex;
1261    
1261        align-items: flex-start;
1262            gap: 12px;
1263            font-size: 14px;
1264            line-height: 1.5;
1265            color: var(--bone)
1266        }
1267
1268        .hero-points .pt svg {
1269            flex: 0 0 16px;
1270            margin-top: 3px;
1271            color: var(--signal)
1272        }
1273
1274        .hero-points .pt b {
1275            color: var(--paper);
1276            font-weight: 500
1277        }
1278
1279        /* HERO PHOTO PANEL, used on industry pages to showcase a story image as the hero visual */
1280        .hero-photo {
1281            position: relative;
1282            border-radius: 18px;
1283            overflow: hidden;
1284            box-shadow: 0 50px 80px -40px var(--shadow-deep), 0 0 0 1px var(--surface-2) inset;
1285            aspect-ratio: 4/5;
1286            background-image: var(--shot-dark);
1287            background-size: cover;
1288            background-position: center;
1289            opacity: 0;
1290            transform: translateY(30px);
1291            animation: rise2 1s 1s var(--ease-out) forwards
1292        }
1293
1294        .hero-photo::before {
1295            content: "";
1296            position: absolute;
1297            inset: 0;
1298            background: linear-gradient(180deg, transparent 50%, var(--scrim-mid) 100%);
1299            pointer-events: none
1300        }
1301
1302        .hero-photo::after {
1303            content: "";
1304            position: absolute;
1305            top: 0;
1306            left: 0;
1307            right: 0;
1308            height: 1px;
1309            background: linear-gradient(90deg, transparent, var(--signal), transparent);
1310            opacity: .6
1311        }
1312
1313        .hero-photo .corner {
1314            position: absolute;
1315            top: 18px;
1316            left: 18px;
1317            display: flex;
1318            align-items: center;
1319            gap: 8px;
1320            font-family: var(--mono);
1321            font-size: var(--t-label);
1322            letter-spacing: .18em;
1323            text-transform: uppercase;
1324            color: var(--paper);
1325            padding: 6px 12px;
1326            background: var(--scrim-strong);
1327            backdrop-filter: blur(6px);
1328            border: 1px solid var(--line-2);
1329            border-radius: 999px
1330        }
1331
1332        .hero-photo .corner::before {
1333            content: "";
1334            width: 6px;
1335            height: 6px;
1336            border-radius: 50%;
1337            background: var(--coral);
1338            box-shadow: 0 0 8px var(--coral);
1339            animation: pulse 1.6s var(--ease) infinite
1340        }
1341
1342        .hero-photo .caption {
1343            position: absolute;
1344            bottom: 24px;
1345            left: 24px;
1346            right: 24px;
1347            display: flex;
1348            justify-content: space-between;
1349            align-items: flex-end;
1350            gap: 16px;
1351            color: var(--paper);
1352            z-index: 1
1353        }
1354
1355        .hero-photo .caption .title {
1356            font-family: var(--serif);
1357            font-weight: 600;
1358            font-size: 22px;
1359            letter-spacing: -.01em;
1360            line-height: 1.1;
1361            max-width: 18ch
1362        }
1363
1364        .hero-photo .caption .title .it {
1365            font-family: var(--serif);
1366            font-weight: 600;
1367            color: var(--signal)
1368        }
1369
1370        .hero-photo .caption .stat {
1371            font-family: var(--mono);
1372            font-size: 11px;
1373            letter-spacing: .1em;
1374            text-align: right;
1375            flex: 0 0 auto
1376        }
1377
1378        .hero-photo .caption .stat b {
1379            display: block;
1380            font-family: var(--serif);
1381            font-size: 24px;
1382            font-weight: 300;
1383            color: var(--signal);
1384            letter-spacing: -.02em
1385        }
1386
1387        /* CALL DECK */
1388        /* The live call transcript. V2 renders the same thing as a left-ruled
1389           column rather than a floating rounded panel, so the conversation
1390           reads as part of the section instead of a card dropped onto it. */
1391        /* The live call transcript.
1392           This is a CARD, not a ruled column, and that is what /v2 does too:
1393           its hero carries .v2-livecard, which has a fill, a 10px radius and a
1394           drop shadow. Only the deck sitting inside a section (.v2-mini-deck)
1395           is left-ruled.
1396
1397           It was briefly converted to the ruled treatment everywhere, which
1398           left the transcript floating unanchored in the middle of five
1399           different heroes. The rule is: in a hero it is a card, in a section
1400           it is a ruled column (.deck.in-section below). */
1401        .deck {
1402            position: relative;
1403            background: var(--deck-grad);
1404            border-radius: 10px;
1405            padding: 18px 18px 14px;
1406            box-shadow: 0 30px 60px -20px var(--shadow-deep);
1407            backdrop-filter: blur(6px);
1408            font-family: var(--mono);
1409            font-size: 12.5px;
1410            line-height: 1.5;
1411            color: var(--bone);
1412            overflow: hidden;
1413            opacity: 0;
1414            transform: translateY(30px);
1415            animation: rise2 1s 1s var(--ease-out) forwards
1416        }
1417
1418        /* the in-section variant, matching .v2-mini-deck */
1419        .deck.in-section {
1420            background: none;
1421            border-radius: 0;
1422            box-shadow: none;
1423            backdrop-filter: none;
1424            border-left: 1px solid var(--line-2);
1425            padding: 6px 0 6px 28px
1426        }
1427
1428        /* This drew a green hairline across the top of the panel. The deck is
1429           ruled down its left edge now, so a top rule as well met it in a
1430           corner and read as half a box. The left rule is the deck's mark. */
1431        .deck::before {
1432            content: none
1433        }
1434
1435        .deck-hd {
1436            display: flex;
1437            justify-content: space-between;
1438            align-items: center;
1439            padding-bottom: 12px;
1440            border-bottom: 1px solid var(--line);
1441            margin-bottom: 14px;
1442            gap: 12px
1443        }
1444
1445        .deck-hd .dots {
1446            display: flex;
1447            gap: 6px
1448        }
1449
1450        .deck-hd .dots i {
1451            width: 9px;
1452            height: 9px;
1453            border-radius: 50%;
1454            background: var(--ink-3);
1455            display: block
1456        }
1457
1458        .deck-hd .dots i:first-child {
1459            background: var(--coral)
1460        }
1461
1462        .deck-hd .dots i:nth-child(2) {
1463            background: #f5b942
1464        }
1465
1466        .deck-hd .dots i:nth-child(3) {
1467            background: var(--signal)
1468        }
1469
1470        .deck-hd .ttl {
1471            font-size: 10px;
1472            letter-spacing: .16em;
1473            text-transform: uppercase;
1474            color: var(--mute);
1475            overflow: hidden;
1476            text-overflow: ellipsis;
1477            white-space: nowrap
1478        }
1479
1480        .deck-hd .rec {
1481            display: inline-flex;
1482            gap: 6px;
1483            align-items: center;
1484            color: var(--coral);
1485            font-size: 10px;
1486            text-transform: uppercase;
1487            letter-spacing: .16em;
1488            flex: 0 0 auto
1489        }
1490
1491        .deck-hd .rec::before {
1492            content: "";
1493            width: 6px;
1494            height: 6px;
1495            border-radius: 50%;
1496            background: var(--coral);
1497            animation: pulse 1.6s infinite
1498        }
1499
1500        .deck-row {
1501            display: flex;
1502            gap: 10px;
1503            padding: 6px 0;
1504            align-items: flex-start;
1505            opacity: 0;
1506            transform: translateY(6px);
1507            transition: opacity .55s var(--ease-out), transform .55s var(--ease-out)
1508        }
1509
1510        .deck-row.in {
1511            opacity: 1;
1512            transform: translateY(0)
1513        }
1514
1515        .deck-row .ts {
1516            color: var(--mute);
1517            min-width: 48px;
1518            flex: 0 0 48px;
1519            font-size: 11px
1520        }
1521
1522        /* Typing indicator, three dots that pulse */
1523        .deck-typing {
1524            display: flex;
1525            gap: 10px;
1526            padding: 6px 0;
1527            align-items: center;
1528            font-family: var(--mono);
1529            opacity: 0;
1530            transition: opacity .25s ease;
1531            height: 0;
1532            overflow: hidden
1533        }
1534
1535        .deck-typing.on {
1536            opacity: 1;
1537            height: auto;
1538            overflow: visible
1539        }
1540
1541        .deck-typing .ts {
1542            color: var(--mute);
1543            min-width: 48px;
1544            flex: 0 0 48px;
1545            font-size: 11px
1546        }
1547
1548        .deck-typing .who {
1549            min-width: 64px;
1550            flex: 0 0 64px;
1551            text-transform: uppercase;
1552            font-size: 10px;
1553            letter-spacing: .12em;
1554            color: var(--signal)
1555        }
1556
1557        .deck-typing .dotset {
1558            display: inline-flex;
1559            gap: 4px;
1560            align-items: center
1561        }
1562
1563        .deck-typing .dotset i {
1564            width: 6px;
1565            height: 6px;
1566            border-radius: 50%;
1567            background: var(--signal);
1568            opacity: .4;
1569            animation: typingDot 1.2s ease-in-out infinite
1570        }
1571
1572        .deck-typing .dotset i:nth-child(2) {
1573            animation-delay: .2s
1574        }
1575
1576        .deck-typing .dotset i:nth-child(3) {
1577            animation-delay: .4s
1578        }
1579
1580        @keyframes typingDot {
1581            0%, 60%, 100% {
1582                opacity: .3;
1583                transform: scale(.8)
1584            }
1585            30% {
1586                opacity: 1;
1587                transform: scale(1.1)
1588            }
1589        }
1590
1591        /* PA floater notifications, arrive with a green flash and slide */
1592        .pa-floater .row {
1593            opacity: 0;
1594            transform: translateY(-8px);
1595            transition: opacity .55s var(--ease-out), transform .55s var(--ease-out)
1596        }
1597
1598        .pa-floater .row.in {
1599            opacity: 1;
1600            transform: translateY(0)
1601        }
1602
1603        .pa-floater .row.ping {
1604            animation: ping 1.4s var(--ease-out)
1605        }
1606
1607        @keyframes ping {
1608            0% {
1609                box-shadow: 0 0 0 0 transparent
1610            }
1611            20% {
1612                box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 60%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 45%, transparent);
1613                background: color-mix(in srgb, var(--accent) 8%, transparent)
1614            }
1615            100% {
1616                box-shadow: 0 0 0 0 transparent;
1617                background: transparent
1618            }
1619        }
1620
1621        .pa-floater .row.fresh::before {
1622            content: "NEW";
1623            position: absolute;
1624            right: 0;
1625            top: -4px;
1626            font-family: var(--mono);
1627            font-size: 8px;
1628            letter-spacing: .18em;
1629            color: var(--ink);
1630            background: var(--signal);
1631            padding: 2px 5px;
1632            border-radius: 3px;
1633            animation: freshFade 4s ease-out forwards
1634        }
1635
1636        .pa-floater .row {
1637            position: relative
1638        }
1639
1640        @keyframes freshFade {
1641            0%, 60% {
1642                opacity: 1
1643            }
1644            100% {
1645                opacity: 0
1646            }
1647        }
1648
1649        .deck-row .who {
1650            min-width: 64px;
1651            flex: 0 0 64px;
1652            text-transform: uppercase;
1653            font-size: 10px;
1654            letter-spacing: .12em
1655        }
1656
1657        .deck-row.caller .who {
1658            color: var(--plasma-bright)
1659        }
1660
1661        .deck-row.agent .who {
1662            color: var(--signal)
1663        }
1664
1665        .deck-row .msg {
1666            color: var(--paper);
1667            flex: 1;
1668            font-size: 12px
1669        }
1670
1671        .deck-foot {
1672            margin-top: 12px;
1673            padding-top: 12px;
1674            border-top: 1px solid var(--line);
1675            display: grid;
1676            grid-template-columns:repeat(3, 1fr);
1677            gap: 8px
1678        }
1679
1680        .deck-foot .stat {
1681            padding: 8px 10px;
1682            background: var(--surface);
1683            border: 1px solid var(--line);
1684            border-radius: 8px
1685        }
1686
1687        .deck-foot .stat span {
1688            display: block;
1689            color: var(--mute-2);
1690            font-size: 9px;
1691            text-transform: uppercase;
1692            letter-spacing: .16em;
1693            margin-bottom: 4px
1694        }
1695
1696        .deck-foot .stat b {
1697            color: var(--paper);
1698            font-weight: 500;
1699            font-size: 13px
1700        }
1701
1702        .wave {
1703            display: flex;
1704            align-items: center;
1705            gap: 2px;
1706            height: 28px;
1707            margin-top: 14px
1708        }
1709
1710        .wave i {
1711            flex: 1;
1712            background: var(--signal);
1713            border-radius: 1px;
1714            animation: wv 1.2s ease-in-out infinite;
1715            height: 30%;
1716            box-shadow: 0 0 6px var(--signal)
1717        }
1718
1719        .wave i:nth-child(2) {
1720            animation-delay: .1s
1721        }
1722
1723        .wave i:nth-child(3) {
1724            animation-delay: .2s
1725        }
1726
1727        .wave i:nth-child(4) {
1728            animation-delay: .3s
1729        }
1730
1731        .wave i:nth-child(5) {
1732            animation-delay: .4s
1733        }
1734
1735        .wave i:nth-child(6) {
1736            animation-delay: .5s
1737        }
1738
1739        .wave i:nth-child(7) {
1740            animation-delay: .6s
1741        }
1742
1743        .wave i:nth-child(8) {
1744            animation-delay: .7s
1745        }
1746
1747        .wave i:nth-child(9) {
1748            animation-delay: .8s
1749        }
1750
1751        .wave i:nth-child(10) {
1752            animation-delay: .9s
1753        }
1754
1755        .wave i:nth-child(11) {
1756            animation-delay: 1s
1757        }
1758
1759        .wave i:nth-child(12) {
1760            animation-delay: 1.1s
1761        }
1762
1763        .wave i:nth-child(13) {
1764            animation-delay: .05s
1765        }
1766
1767        .wave i:nth-child(14) {
1768            animation-delay: .15s
1769        }
1770
1771        .wave i:nth-child(15) {
1772            animation-delay: .25s
1773        }
1774
1775        .wave i:nth-child(16) {
1776            animation-delay: .35s
1777        }
1778
1779        .wave i:nth-child(17) {
1780            animation-delay: .45s
1781        }
1782
1783        .wave i:nth-child(18) {
1784            animation-delay: .55s
1785        }
1786
1787        .wave i:nth-child(19) {
1788            animation-delay: .65s
1789        }
1790
1791        .wave i:nth-child(20) {
1792            animation-delay: .75s
1793        }
1794
1795        @keyframes wv {
1796            0%, 100% {
1797                height: 20%;
1798                opacity: .4
1799            }
1800            50% {
1801                height: 95%;
1802                opacity: 1
1803            }
1804        }
1805
1806        /* ====== STRIP ====== */
1807        /* same treatment as the V2 ticker: a faint raised surface between two
1808           hairlines, rather than a solid slab of ink */
1809        .strip {
1810            border-top: 1px solid var(--line);
1811            border-bottom: 1px solid var(--line);
1812            background: var(--surface);
1813            overflow: hidden;
1814            padding: 18px 0;
1815            font-family: var(--serif);
1816            font-size: 36px;
1817            letter-spacing: -.02em
1818        }
1819
1820        .strip-track {
1821            display: flex;
1822            gap: 64px;
1823            white-space: nowrap;
1824            animation: slide 60s linear infinite;
1825            will-change: transform
1826        }
1827
1828        .strip-track:hover {
1829            animation-play-state: paused
1830        }
1831
1832        @media (prefers-reduced-motion: reduce) {
1833            .strip-track {
1834                animation: none
1835            }
1836        }
1837
1838        .strip-track .pip {
1839            color: var(--signal)
1840        }
1841
1842        .strip-track .it {
1843            font-family: var(--serif);
1844            font-weight: 600;
1845            color: var(--bone)
1846        }
1847
1848        .strip-track .blue {
1849            color: var(--plasma)
1850        }
1851
1852        .strip-link {
1853            color: var(--paper);
1854            text-decoration: none;
1855            display: inline-flex;
1856            align-items: center;
1857            gap: 14px;
1858            padding: 0 4px;
1859            border-radius: 6px;
1860            transition: color .25s, background .25s
1861        }
1862
1863        .strip-link.it {
1864            font-family: var(--serif);
1865            font-weight: 600;
1866            color: var(--bone)
1867        }
1868
1869        .strip-link:hover {
1870            color: var(--signal);
1871            background: color-mix(in srgb, var(--signal) 6%, transparent)
1872        }
1873
1874        /* An item with no page behind it states rather than links, so it takes
1875           no pointer and no hover. */
1876        .strip-link.is-static {
1877            color: var(--mute);
1878            cursor: default
1879        }
1880
1881        .strip-l
1881ink.is-static:hover {
1882            color: var(--mute);
1883            background: none
1884        }
1885
1886        .strip-link:hover .pip {
1887            color: var(--paper)
1888        }
1889
1890        /* ====== SECTION SHELL ====== */
1891        section.shell {
1892            padding: var(--space-section) var(--shell-pad);
1893            position: relative
1894        }
1895
1896        section.shell.tight {
1897            padding: var(--space-section-tight) var(--shell-pad)
1898        }
1899
1900        /* A section that butts straight onto the one above it. Pages were
1901           writing style="padding-top:0" for this, ~1,400 inline styles' worth
1902           of ad-hoc rhythm across the site; new work uses the modifier. */
1903        section.shell.flush {
1904            padding-top: 0
1905        }
1906
1907        section.shell.flush-bottom {
1908            padding-bottom: 0
1909        }
1910
1911        .section-hd {
1912            display: flex;
1913            justify-content: space-between;
1914            align-items: flex-end;
1915            gap: 32px;
1916            margin-bottom: 64px;
1917            flex-wrap: wrap
1918        }
1919
1920        .section-hd h2 {
1921            font-family: var(--serif);
1922            font-weight: 600;
1923            font-size: var(--t-h2);
1924            line-height: var(--lh-head);
1925            letter-spacing: var(--ls-head);
1926            max-width: 18ch
1927        }
1928
1929        .section-hd h2 .it,
1930        .section-hd h2 .blue {
1931            font-family: var(--serif);
1932            font-style: normal;
1933            font-weight: 600;
1934            color: var(--signal)
1935        }
1936
1937        .section-hd .lede {
1938            max-width: 46ch;
1939            color: var(--bone);
1940            line-height: var(--lh-body);
1941            font-size: var(--t-lede)
1942        }
1943
1944        /* ====== SLAB ====== */
1945        /* V2 design language: a ruled band rather than a filled, rounded slab */
1946        .slab {
1947            display: grid;
1948            grid-template-columns:1.1fr 1fr;
1949            gap: 0;
1950            border-top: 1px solid var(--line-2);
1951            overflow: hidden
1952        }
1953
1954        .slab-l {
1955            padding: clamp(40px, 5vw, 64px) clamp(28px, 4vw, 56px) clamp(40px, 5vw, 64px) 0;
1956            display: flex;
1957            flex-direction: column;
1958            justify-content: center;
1959            gap: 40px
1960        }
1961
1962        .slab-l h3 {
1963            font-family: var(--serif);
1964            font-weight: 600;
1965            font-size: clamp(36px, 4.4vw, 60px);
1966            line-height: .98;
1967            letter-spacing: -.02em
1968        }
1969
1970        .slab-l h3 .it {
1971            font-family: var(--serif);
1972            font-weight: 600;
1973            color: var(--signal)
1974        }
1975
1976        .slab-l h3 .blue {
1977            font-family: var(--serif);
1978            font-weight: 600;
1979            color: var(--plasma-bright)
1980        }
1981
1982        .slab-l p {
1983            color: var(--bone);
1984            font-size: 15px;
1985            line-height: 1.6;
1986            max-width: 42ch
1987        }
1988
1989        .slab-l ul {
1990            list-style: none;
1991            display: flex;
1992            flex-direction: column;
1993            gap: 14px;
1994            font-size: 14px;
1995            color: var(--bone)
1996        }
1997
1998        .slab-l ul li {
1999            display: flex;
2000            gap: 12px;
2001            align-items: flex-start;
2002            padding-bottom: 14px;
2003            border-bottom: 1px dashed var(--line)
2004        }
2005
2006        .slab-l ul li:last-child {
2007            border-bottom: 0;
2008            padding-bottom: 0
2009        }
2010
2011        .slab-l ul li::before {
2012            content: "";
2013            flex: 0 0 8px;
2014            width: 8px;
2015            height: 8px;
2016            border-radius: 50%;
2017            margin-top: 7px;
2018            background: var(--signal);
2019            box-shadow: 0 0 12px var(--signal)
2020        }
2021
2022        .slab-l ul li b {
2023            color: var(--paper);
2024            font-weight: 500
2025        }
2026
2027        .slab-r {
2028            position: relative;
2029            padding: 46px 0;
2030            background: radial-gradient(closest-side at 50% 30%, rgba(49, 138, 190, .18), transparent 70%);
2031            display: flex;
2032            align-items: center;
2033            justify-content: center;
2034            overflow: hidden;
2035            min-height: 520px
2036        }
2037
2038        .slab-r::before {
2039            content: "";
2040            position: absolute;
2041            inset: 0;
2042            background-image: linear-gradient(to right, var(--line) 1px, transparent 1px), linear-gradient(to bottom, var(--line) 1px, transparent 1px);
2043            background-size: 48px 48px;
2044            mask: radial-gradient(closest-side, #000, transparent 70%)
2045        }
2046
2047        .slab-r::after {
2048            content: "";
2049            position: absolute;
2050            inset: 0;
2051            pointer-events: none;
2052            background: linear-gradient(to bottom, var(--ink) 0, transparent 13%, transparent 87%, var(--ink) 100%)
2053        }
2054
2055        /* ====== PHONE FRAME ====== */
2056        .phone-frame {
2057            position: relative;
2058            width: 280px;
2059            aspect-ratio: 9/19;
2060            border-radius: 38px;
2061            background: linear-gradient(180deg, #1a1d22, #0a0d10);
2062            padding: 8px;
2063            box-shadow: 0 60px 120px -30px rgba(0, 0, 0, .9), 0 0 0 1px rgba(255, 255, 255, .06) inset
2064        }
2065
2066        .phone-frame::before {
2067            content: "";
2068            position: absolute;
2069            top: 14px;
2070            left: 50%;
2071            transform: translateX(-50%);
2072            width: 90px;
2073            height: 24px;
2074            background: #000;
2075            border-radius: 14px;
2076            z-index: 2
2077        }
2078
2079        .phone-screen {
2080            width: 100%;
2081            height: 100%;
2082            border-radius: 32px;
2083            background: linear-gradient(180deg, #0a0d12, #13171f);
2084            overflow: hidden;
2085            position: relative;
2086            display: flex;
2087            flex-direction: column;
2088            padding: 42px 14px 14px;
2089            font-family: var(--mono);
2090            font-size: var(--t-label)
2091        }
2092
2093        /* Light mode: silver handset + light app screen (text inside uses tokens, so it flips to dark) */
2094        html[data-theme="light"] .phone-frame {
2095            background: linear-gradient(180deg, #dde0e6, #b7bcc6);
2096            box-shadow: 0 50px 90px -30px var(--shadow-deep), 0 0 0 1px rgba(0, 0, 0, .12) inset
2097        }
2098
2099        html[data-theme="light"] .phone-screen {
2100            background: linear-gradient(180deg, #ffffff, #f4f1e8)
2101        }
2102
2103        .phone-screen .stat-row {
2104            display: flex;
2105            justify-content: space-between;
2106            color: var(--bone);
2107            font-size: 9px;
2108            letter-spacing: .06em;
2109            padding: 0 6px 14px
2110        }
2111
2112        .phone-screen .ph-h {
2113            font-family: var(--serif);
2114            font-weight: 600;
2115            font-size: 24px;
2116            color: var(--paper);
2117            padding: 0 6px;
2118            letter-spacing: -.02em;
2119            line-height: 1
2120        }
2121
2122        .phone-screen .ph-h .it {
2123            font-family: var(--serif);
2124            font-weight: 600;
2125            color: var(--signal)
2126        }
2127
2128        .phone-screen .ph-h .blue {
2129            font-family: var(--serif);
2130            font-weight: 600;
2131            color: var(--plasma-bright)
2132        }
2133
2134        .phone-screen .ph-card {
2135            margin-top: 14px;
2136            background: var(--surface-2);
2137            border: 1px solid var(--line);
2138            border-radius: 14px;
2139            padding: 12px;
2140            display: flex;
2141            flex-direction: column;
2142            gap: 8px
2143        }
2144
2145        .phone-screen .ph-card .lbl {
2146            color: var(--mute);
2147            font-size: 9px;
2148            text-transform: uppercase;
2149            letter-spacing: .16em
2150        }
2151
2152        .phone-screen .ph-card .name {
2153            color: var(--paper);
2154            font-size: 12px
2155        }
2156
2157        .phone-screen .ph-card .meta {
2158            color: var(--bone);
2159            font-size: 9px;
2160            display: flex;
2161            gap: 8px
2162        }
2163
2164        .phone-screen .ph-card .meta i {
2165            font-style: normal;
2166            color: var(--signal)
2167        }
2168
2169        .phone-screen .ph-bar {
2170            margin-top: 4px;
2171            display: flex;
2172            align-items: center;
2173            gap: 6px
2174        }
2175
2176        .phone-screen .ph-bar .b {
2177            flex: 1;
2178            height: 3px;
2179            border-radius: 2px;
2180            background: var(--line)
2181        }
2182
2183        .phone-screen .ph-bar .b.on {
2184            background: var(--signal);
2185            box-shadow: 0 0 8px var(--signal)
2186        }
2187
2188        .phone-screen .ph-cta {
2189            margin-top: auto;
2190            background: var(--signal);
2191            color: var(--ink);
2192            padding: 10px;
2193            border-radius: 999px;
2194            text-align: center;
2195            font-size: 11px;
2196            font-weight: 600;
2197            font-family: var(--sans);
2198            letter-spacing: .02em
2199        }
2200
2201        /* ====== METRICS ====== */
2202        .metrics {
2203            display: grid;
2204            grid-template-columns:repeat(12, 1fr);
2205            gap: 0 clamp(24px, 3vw, 40px)
2206        }
2207
2208        /* ruled stats, the way the V2 proof block does them */
2209        .metric {
2210            grid-column: span 3;
2211            border-top: 1px solid var(--line-2);
2212            padding: 24px 0 0;
2213            position: relative;
2214            overflow: hidden;
2215            min-height: 170px;
2216            display: flex;
2217            flex-direction: column;
2218            justify-content: space-between;
2219            transition: border-color .3s var(--ease)
2220        }
2221
2222        .metric:hover {
2223            border-top-color: var(--signal)
2224        }
2225
2226        .metric .lbl {
2227            font-family: var(--mono);
2228            font-size: var(--t-label);
2229            letter-spacing: .16em;
2230            text-transform: uppercase;
2231            color: var(--mute)
2232        }
2233
2234        .metric .val {
2235            font-family: var(--serif);
2236            font-weight: 600;
2237            font-size: 60px;
2238            line-height: 1;
2239            letter-spacing: -.04em;
2240        }
2241
2242        .metric .val small {
2243            font-size: 18px;
2244            color: var(--mute);
2245            font-family: var(--mono);
2246            margin-left: 4px
2247        }
2248
2249        .metric .delta {
2250            font-family: var(--mono);
2251            font-size: 11px;
2252            color: var(--signal)
2253        }
2254
2255        .metric .delta.dn {
2256            color: var(--coral)
2257        }
2258
2259        .metric.wide {
2260            grid-column: span 6
2261        }
2262
2263        /* ====== TIERS ====== */
2264        .tiers {
2265            display: grid;
2266            grid-template-columns:repeat(3, 1fr);
2267            gap: 18px
2268        }
2269
2270        /* Pricing tiers in the V2 language: a rule, a label, a number. They were
2271           rounded, filled cards, and the featured one was picked out with a
2272           masked gradient border. A plan is now marked out by the weight and
2273           colour of its rule instead, which is how the V2 price blocks do it. */
2274        .tier {
2275            position: relative;
2276            border-top: 2px solid var(--line-2);
2277            padding: clamp(26px, 3vw, 40px) 0 0;
2278            display: flex;
2279            flex-direction: column;
2280            gap: 24px;
2281            transition: border-color .3s var(--ease)
2282        }
2283
2284        .tier:hover {
2285            border-top-color: var(--mute-2)
2286        }
2287
2288        .tier.featured {
2289            border-top-color: var(--signal)
2290        }
2291
2292        .tier.featured:hover {
2293            border-top-color: var(--signal)
2294        }
2295
2296        .tier .row1 {
2297            display: flex;
2298            justify-content: space-between;
2299            align-items: center
2300        }
2301
2302        .tier .name {
2303            font-family: var(--mono);
2304            font-size: 11px;
2305            text-transform: uppercase;
2306            letter-spacing: .18em;
2307            color: var(--bone)
2308        }
2309
2310        /* was a filled badge; the rule above already says which plan this is */
2311        .tier .badge {
2312            font-family: var(--mono);
2313            font-size: var(--t-label);
2314            color: var(--signal);
2315            letter-spacing: .14em;
2316            text-transform: uppercase
2317        }
2318
2319        .tier .price {
2320            font-family: var(--serif);
2321            font-weight: 600;
2322            font-size: 64px;
2323            line-height: .95;
2324            letter-spacing: -.035em
2325        }
2326
2327        .tier .price small {
2328            font-family: var(--mono);
2329            font-size: 13px;
2330            color: var(--mute);
2331            margin-left: 6px
2332        }
2333
2334        .tier .desc {
2335            font-size: 14px;
2336            color: var(--bone);
2337            line-height: 1.5;
2338            border-top: 1px dashed var(--line);
2339            padding-top: 20px
2340        }
2341
2342        .tier ul {
2343            list-style: none;
2344            display: flex;
2345            flex-direction: column;
2346            gap: 10px;
2347            font-size: 14px;
2348            color: var(--bone)
2349        }
2350
2351        .tier ul li {
2352            display: flex;
2353            gap: 10px;
2354            align-items: flex-start
2355        }
2356
2357        .tier ul li svg {
2358            flex: 0 0 16px;
2359            color: var(--signal);
2360            margin-top: 3px
2361        }
2362
2363        .tier .cta {
2364            margin-top: auto
2365        }
2366
2367        /* ====== EDITORIAL QUOTE ====== */
2368        .editorial {
2369            display: grid;
2370            grid-template-columns:1fr 1.4fr;
2371            gap: 64px;
2372            align-items: center
2373        }
2374
2375        .ed-num {
2376            font-family: var(--mono);
2377            font-size: 11px;
2378            color: var(--mute);
2379            letter-spacing: .18em;
2380            text-transform: uppercase;
2381            margin-bottom: 24px
2382        }
2383
2384        .ed-quote {
2385            font-family: var(--serif);
2386            font-weight: 600;
2387            font-size: clamp(28px, 3.4vw, 46px);
2388            line-height: 1.1;
2389            letter-spacing: -.02em;
2390        }
2391
2392        .ed-quote .it {
2393            font-family: var(--serif);
2394            font-weight: 600
2395        }
2396
2397        .ed-quote .hl {
2398            background: linear-gradient(180deg, transparent 62%, color-mix(in srgb, var(--accent) 55%, transparent) 62%);
2399            color: inherit;
2400            padding: 0 2px;
2401            -webkit-box-decoration-break: clone;
2402            box-decoration-break: clone
2403        }
2404
2405        .ed-attr {
2406            margin-top: 32px;
2407            display: flex;
2408            align-items: center;
2409            gap: 16px;
2410            color: var(--mute);
2411            font-family: var(--mono);
2412            font-size: 12px;
2413            letter-spacing: .04em
2414        }
2415
2416        .ed-attr .av {
2417            width: 46px;
2418            height: 46px;
2419            border-radius: 50%;
2420            background: var(--grad);
2421            display: grid;
2422            place-items: center;
2423            color: var(--ink);
2424            font-family: var(--serif);
2425            font-weight: 500;
2426            font-size: 18px
2427        }
2428
2429        .ed-attr b {
2430            color: var(--paper);
2431            font-weight: 500;
2432            font-family: var(--sans);
2433            text-transform: none;
2434            letter-spacing: 0
2435        }
2436
2437        /* ====== APP STRIP ====== */
2438        /* V2 lays the app section out as a ruled band with the phone beside the
2439           copy, not as a filled panel with the whole thing inside it. */
2440        .app {
2441            display: grid;
2442            grid-template-columns:1.2fr 1fr;
2443            gap: clamp(32px, 5vw, 80px);
2444            align-items: center;
2445            padding: clamp(48px, 6vw, 80px) 0 0;
2446            border-top: 1px solid var(--line-2);
2447            position: relative
2448        }
2449
2450        /* the glow behind the phone belonged to the filled panel this section
2451           used to sit in; a ruled band carries no lighting of its own */
2452        .app::before {
2453            content: none
2454        }
2455
2456        .app-l {
2457            position: relative;
2458            z-index: 1
2459        }
2460
2461        /* Was a violet pill. The V2 language has no pills: a kicker is a rule,
2462           then mono caps. The leading dot in the markup is redundant against
2463           the rule, so it is not rendered. */
2464        .app-tag {
2465            display: flex;
2466            align-items: center;
2467            gap: 12px;
2468            font-family: var(--mono);
2469            font-size: 11px;
2470            color: var(--mute-2);
2471            text-transform: uppercase;
2472            letter-spacing: .22em
2473        }
2474
2475        .app-tag::before {
2476            content: "";
2477            flex: 0 0 28px;
2478            height: 1px;
2479            background: var(--signal)
2480        }
2481
2482        .app h2 {
2483            font-family: var(--serif);
2484            font-weight: 600;
2485            font-size: clamp(36px, 4.6vw, 68px);
2486            line-height: .98;
2487            letter-spacing: -.025em;
2488            margin-top: 24px;
2489        }
2490
2491        .app h2 .it {
2492            font-family: var(--serif);
2493            font-weight: 600;
2494            color: var(--signal)
2495        }
2496
2497        .app p {
2498            color: var(--bone);
2499            max-width: 48ch;
2500            margin-top: 20px;
2501            font-size: 15px;
2502            line-height: 1.6
2503        }
2504
2505        /* ── Store badges (x-app-badges) ───────────────────────────────────
2506           Apple's and Google's own artwork, which neither will let anybody
2507           redraw. What used to sit here was our own box with a hand-drawn
2508           glyph and the store name set in the site's serif, which is exactly
2509           what both sets of guidelines forbid.
2510
2511           Both files are the black badge with white type. On the light theme
2512           that is the standard treatment. On the dark theme the pill sinks
2513           into the page, so a hairline gives it its edge back; the white
2514           lettering carries either way. */
2515        .app-stores {
2516            margin-top: 32px;
2517            display: flex;
2518            align-items: center;
2519            gap: 14px;
2520            flex-wrap: wrap
2521        }
2522
2523        .app-badge {
2524            display: inline-block;
2525            border-radius: 8px;
2526            box-shadow: 0 0 0 1px var(--line);
2527            transition: opacity .25s var(--ease), box-shadow .25s var(--ease)
2528        }
2529
2530        html[data-theme="light"] .app-badge {
2531            box-shadow: none
2532        }
2533
2534        .app-badge:hover {
2535            opacity: .82;
2536            box-shadow: 0 0 0 1px var(--line-2)
2537        }
2538
2539        .app-badge img {
2540            display: block;
2541            height: var(--app-badge-h, 56px);
2542            width: auto
2543        }
2544
2545        /* Two badges side by side stop fitting a phone at about 340px, and a
2546           badge that has to shrink stops being the store's badge. Let them
2547           stack instead. */
2548        @media (max-width: 420px) {
2549            .app-badge img {
2550                height: calc(var(--app-badge-h, 56px) * .82)
2551            }
2552        }
2553
2554
2555        .app-r {
2556            position: relative;
2557            z-index: 1;
2558            display: flex;
2559            justify-content: center;
2560            align-items: center
2561        }
2562
2563        .app-phone {
2564            transform: rotate(-6deg)
2565        }
2566
2567        .app-phone .phone-screen {
2568            padding: 42px 12px 12px
2569        }
2570
2571        .app-phone .ph-h {
2572            font-size: 18px
2573        }
2574
2575        /* ====== FORMS ====== */
2576        /* The demo deck and other steppers hide panels with the hidden
2577           attribute; any display rule on the element would otherwise win. */
2578        [hidden] {
2579            display: none !important
2580        }
2581
2582        .form {
2583            display: grid;
2584            gap: 18px
2585        }
2586
2587        .form .row {
2588            display: grid;
2589            gap: 18px;
2590            grid-template-columns:1fr 1fr
2591        }
2592
2593        .form .field {
2594            display: flex;
2595            flex-direction: column;
2596            gap: 6px;
2597            position: relative
2598        }
2599
2600        .form .field label {
2601            font-family: var(--mono);
2602            font-size: var(--t-label);
2603            color: var(--mute);
2604            text-transform: uppercase;
2605            letter-spacing: .18em
2606        }
2607
2608        /* squared off; the ruled language has no rounded fields in it */
2609        .form .field input, .form .field select, .form .field textarea {
2610            background: var(--surface);
2611            border: 1px solid var(--line);
2612            border-radius: 2px;
2613            padding: 14px 16px;
2614            color: var(--paper);
2615            font-size: 15px;
2616            font-family: var(--sans);
2617            transition: .25s var(--ease);
2618        }
2619
2620        .form .field input:focus, .form .field select:focus, .form .field textarea:focus {
2621            outline: none;
2622            border-color: var(--signal);
2623            background: var(--ink-3);
2624            box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 22%, transparent)
2625        }
2626
2627        .form .field input::placeholder, .form .field textarea::placeholder {
2628            color: var(--mute-2)
2629        }
2630
2631        .form .field textarea {
2632            min-height: 120px;
2633            resize: vertical;
2634            line-height: 1.5
2635        }
2636
2637        .form .radios {
2638            display: grid;
2639            grid-template-columns:repeat(2, 1fr);
2640            gap: 10px
2641        }
2642
2643        /* Options in the V2 language: a hairline and square corners rather than
2644           a filled, rounded card each. They keep a full border rather than only
2645           a top rule because they sit in a two-column grid and have to read as
2646           separately selectable, which a top rule alone does not convey. The
2647           control marks themselves stay round: a radio dot is an affordance
2648           people know by its shape, not decoration. */
2649        .form .radio,
2650        .form .check {
2651            position: relative;
2652            display: flex;
2653            align-items: flex-start;
2654            gap: 12px;
2655            padding: 16px;
2656            border: 1px solid var(--line);
2657            border-radius: 2px;
2658            cursor: pointer;
2659            transition: .25s var(--ease);
2660            background: none
2661        }
2662
2663        .form .radio:hover,
2664        .form .check:hover {
2665            border-color: var(--line-2);
2666            background: var(--surface-2)
2667        }
2668
2669        .form .radio input,
2670        .form .check input {
2671            position: absolute;
2672            opacity: 0;
2673            pointer-events: none
2674        }
2675
2676        .form .radio .dot {
2677            width: 18px;
2678            height: 18px;
2679            border-radius: 50%;
2680            border: 1px solid var(--line-2);
2681            flex: 0 0 18px;
2682            display: grid;
2683            place-items: center;
2684            margin-top: 2px;
2685            transition: .25s
2686        }
2687
2688        .form .radio .dot::after {
2689            content: "";
2690            width: 8px;
2691            height: 8px;
2692            border-radius: 50%;
2693            background: var(--signal);
2694            transform: scale(0);
2695            transition: .25s;
2696            box-shadow: 0 0 8px var(--signal)
2697        }
2698
2699        .form .radio input:checked ~ .dot {
2700            border-color: var(--signal)
2701        }
2702
2703        .form .radio input:checked ~ .dot::after {
2704            transform: scale(1)
2705        }
2706
2707        .form .radio:has(input:checked),
2708        .form .check:has(input:checked) {
2709            border-color: var(--signal);
2710            background: color-mix(in srgb, var(--signal) 6%, transparent)
2711        }
2712
2713        /* Same card as a radio, squared off with a tick so it reads as a
2714           multi-select rather than one of a set. */
2715        .form .check .box {
2716            width: 18px;
2717            height: 18px;
2718            border-radius: 5px;
2719            border: 1px solid var(--line-2);
2720            flex: 0 0 18px;
2721            display: grid;
2722            place-items: center;
2723            margin-top: 2px;
2724            transition: .25s
2725        }
2726
2727        .form .check .box::after {
2728            content: "";
2729            width: 10px;
2730            height: 5px;
2731            margin-top: -2px;
2732            border-left: 2px solid var(--signal);
2733            border-bottom: 2px solid var(--signal);
2734            transform: rotate(-45deg) scale(0);
2735            transition: .25s
2736        }
2737
2738        .form .check input:checked ~ .box {
2739            border-color: var(--signal)
2740        }
2741
2742        .form .check input:checked ~ .box::after {
2743            transform: rotate(-45deg) scale(1)
2744        }
2745
2746        .form .radio .ttl,
2747        .form .check .ttl {
2748            font-family: var(--serif);
2749            font-weight: 400;
2750            font-size: 18px;
2751            letter-spacing: -.01em;
2752            color: var(--paper);
2753            line-height: 1
2754        }
2755
2756        .form .radio .sub,
2757        .form .check .sub {
2758            font-size: 12px;
2759            color: var(--bone);
2760            margin-top: 4px;
2761            line-height: 1.4
2762        }
2763
2764        .form .actions {
2765            display: flex;
2766            justify-content: space-between;
2767            align-items: center;
2768            gap: 16px;
2769            flex-wrap: wrap;
2770            margin-top: 8px
2771        }
2772
2773        .form .actions .note {
2774            font-size: 12px;
2775            color: var(--mute);
2776            font-family: var(--mono);
2777            letter-spacing: .04em
2778        }
2779
2780        /* ====== PLAN DISPLAY (live price panel under agent_type radios) ====== */
2781        /* The running total of what has been picked. Was a rounded card filled
2782           with a blue-to-green wash; in the V2 language a price is a rule and a
2783           number, so it is ruled top and bottom and carries no fill. */
2784        .plan-display {
2785            display: grid;
2786            grid-template-columns:1fr auto;
2787            gap: 18px;
2788            align-items: center;
2789            padding: 22px 0;
2790            margin-top: 24px;
2791            border-top: 1px solid var(--line-2);
2792            border-bottom: 1px solid var(--line);
2793            position: relative;
2794        }
2795
2796        .plan-display::before {
2797            content: "";
2798            position: absolute;
2799            top: 0;
2800            left: 0;
2801            right: 0;
2802            height: 1px;
2803            background: linear-gradient(90deg, transparent, var(--signal), transparent);
2804            opacity: .6
2805        }
2806
2807        .plan-display-label {
2808            font-family: var(--serif);
2809            font-weight: 400;
2810            font-size: 18px;
2811            letter-spacing: -.01em;
2812            color: var(--paper);
2813            line-height: 1.1
2814        }
2815
2816        .plan-display-sub {
2817            font-family: var(--sans);
2818            font-size: 12px;
2819            color: var(--bone);
2820            line-height: 1.5;
2821            margin-top: 4px;
2822            max-width: 38ch
2823        }
2824
2825        .plan-display-right {
2826            text-align: right;
2827            flex: 0 0 auto
2828        }
2829
2830        .plan-display-price {
2831            font-family: var(--serif);
2832            font-weight: 600;
2833            font-size: 34px;
2834            line-height: 1;
2835            letter-spacing: -.025em;
2836            color: var(--signal);
2837            white-space: nowrap
2838        }
2839
2840        .plan-display-price small {
2841            font-family: var(--mono);
2842            font-size: 11px;
2843            color: var(--mute);
2844            margin-left: 4px;
2845            font-weight: 400
2846        }
2847
2848        .plan-display-tier {
2849            font-family: var(--mono);
2850            font-size: 9.5px;
2851            text-transform: uppercase;
2852            letter-spacing: .16em;
2853            color: var(--mute);
2854            margin-top: 6px
2855        }
2856
2857        /* Spells out how long the quoted founding rate lasts and what it becomes. */
2858        .plan-display-note {
2859            font-family: var(--sans);
2860            font-size: 11.5px;
2861            line-height: 1.5;
2862            color: var(--mute);
2863            margin-top: 6px;
2864            max-width: 34ch;
2865            margin-left: auto
2866        }
2867
2868        .plan-asterisk {
2869            font-family: var(--sans);
2870            font-size: 11.5px;
2871            line-height: 1.5;
2872            color: var(--mute);
2873            margin-top: 10px;
2874            padding: 0 4px
2875        }
2876
2877        .plan-asterisk span {
2878            color: var(--signal);
2879            font-weight: 600;
2880            margin-right: 2px
2881        }
2882
2883        /* Shown under "Pick your agent" only for plans that pair with another
2884           one (currently the Outgoing Agent, which wants an incoming agent to
2885           catch the return calls). Toggled by the plan-display script. */
2886        .plan-recommend {
2887            font-family: var(--sans);
2888            font-size: 12.5px;
2889            line-height: 1.55;
2890            color: var(--bone);
2891            margin-top: 12px;
2892            padding: 10px 12px;
2893            border-left: 2px solid var(--signal);
2894            background: rgba(49, 138, 190, .07)
2895        }
2896
2897        @media (max-width: 480px) {
2898            .plan-display {
2899                grid-template-columns:1fr;
2900                gap: 10px
2901            }
2902
2903            .plan-display-right {
2904                text-align: left
2905            }
2906
2907            .plan-display-price {
2908                font-size: 30px
2909            }
2910        }
2911
2912        /* ====== END CTA ====== */
2913        .endcta {
2914            padding: 140px var(--shell-pad);
2915            position: relative;
2916            overflow: hidden;
2917            text-align: center
2918        }
2919
2920        .endcta .endcta-photo {
2921            position: absolute;
2922            inset: 0;
2923            background-image: url('/media/frontend/nz-skyline-dusk.jpg');
2924            background-size: cover;
2925            background-position: center bottom;
2926            opacity: .32;
2927            filter: saturate(.9) contrast(1.1);
2928            z-index: 0
2929        }
2930
2931        .endcta .endcta-photo::after {
2932            content: "";
2933            position: absolute;
2934            inset: 0;
2935            background: linear-gradient(180deg, var(--scrim-strong) 0%, var(--scrim-mid) 30%, var(--scrim-soft) 70%, var(--scrim-strong) 100%),
2936            radial-gradient(ellipse at center, rgba(49, 138, 190, .22) 0%, transparent 60%)
2937        }
2938
2939        .endcta > * {
2940            position: relative;
2941            z-index: 1
2942        }
2943
2944        .endcta::before {
2945            content: "";
2946            position: absolute;
2947            inset: 0;
2948            z-index: 0
2949        }
2950
2951        .endcta .stamp {
2952            font-family: var(--mono);
2953            font-size: 11px;
2954            color: var(--mute);
2955            text-transform: uppercase;
2956            letter-spacing: .2em;
2957            margin-bottom: 24px;
2958            display: flex;
2959            justify-content: center;
2960            align-items: center;
2961            gap: 14px
2962        }
2963
2964        .endcta .stamp::before, .endcta .stamp::after {
2965            content: "";
2966            flex: 0 0 80px;
2967            height: 1px;
2968            background: var(--line)
2969        }
2970
2971        .endcta h2 {
2972            font-family: var(--serif);
2973            font-weight: 600;
2974            font-size: var(--t-display);
2975            line-height: var(--lh-display);
2976            letter-spacing: var(--ls-head)
2977        }
2978
2979        .endcta h2 .it {
2980            font-family: var(--serif);
2981            font-weight: 600;
2982            color: var(--signal)
2983        }
2984
2985        .endcta h2 .blue {
2986            font-family: var(--serif);
2987            font-weight: 600;
2988            color: var(--plasma-bright)
2989        }
2990
2991        /* The two numbers were pills with a circular icon badge each. In the V2
2992           language a number is a rule, a mono label and the figure itself: the
2993           same shape the price blocks use, so the closing line of every page
2994           rhymes with the pricing. The rule fills with the brand gradient on
2995           hover, which is the only affordance it needs. */
2996        .endcta .num-big {
2997            margin-top: 0;
2998            position: relative;
2999            display: block;
3000            text-align: left;
3001            padding: 26px 0 0;
3002            font-family: var(--serif);
3003            font-size: clamp(30px, 3.2vw, 44px);
3004            font-weight: 600;
3005            line-height: 1.1;
3006            letter-spacing: var(--ls-head);
3007            color: var(--paper);
3008            transition: color .3s var(--ease)
3009        }
3010
3011        .endcta .num-big::before, .endcta .num-big::after {
3012            content: "";
3013            position: absolute;
3014            top: 0;
3015            left: 0;
3016            right: 0;
3017            height: 1px
3018        }
3019
3020        .endcta .num-big::before {
3021            background: var(--line-2)
3022        }
3023
3024        .endcta .num-big::after {
3025            background: var(--grad);
3026            transform: scaleX(0);
3027            transform-origin: left;
3028            transition: transform .5s var(--ease-out)
3029        }
3030
3031        .endcta .num-big:hover::after {
3032            transform: scaleX(1)
3033        }
3034
3035        .endcta .num-big:hover {
3036            color: var(--signal)
3037        }
3038
3039        .endcta .num-big.num-blue:hover {
3040            color: var(--plasma-bright)
3041        }
3042
3043        /* the icon badges go with the pills */
3044        .endcta .num-big .ic {
3045            display: none
3046        }
3047
3048        .endcta .num-big small {
3049            display: block;
3050            margin-bottom: 14px;
3051            font-family: var(--mono);
3052            font-size: var(--t-label);
3053            color: var(--mute);
3054            letter-spacing: .18em;
3055            text-transform: uppercase;
3056            line-height: 1.5
3057        }
3058
3059        .endcta .endcta-meta {
3060            margin-top: 32px;
3061            display: flex;
3062            justify-content: center;
3063            gap: 32px;
3064            font-family: var(--mono);
3065            font-size: 11px;
3066            color: var(--mute);
3067            text-transform: uppercase;
3068            letter-spacing: .14em;
3069            flex-wrap: wrap
3070        }
3071
3072        /* ====== FOOTER ====== */
3073        .foot {
3074            padding: 80px var(--shell-pad) 32px;
3075            border-top: 1px solid var(--line);
3076            background: var(--ink-2)
3077        }
3078
3079        /* Brand block plus five link columns. Six tracks only pay off on a wide
3080           screen; between 1100 and 1400 the brand column gives ground and the
3081           gap tightens rather than the links wrapping to a second row. */
3082        .foot-grid {
3083            display: grid;
3084            grid-template-columns:2fr repeat(5, 1fr);
3085            gap: 48px;
3086            margin-bottom: 64px
3087        }
3088
3089        @media (max-width: 1400px) {
3090            .foot-grid {
3091                grid-template-columns:1.4fr repeat(5, 1fr);
3092                gap: 28px
3093            }
3094        }
3095
3096        .foot h4 {
3097            font-family: var(--mono);
3098            font-size: 11px;
3099            color: var(--mute);
3100            text-transform: uppercase;
3101            letter-spacing: .16em;
3102            margin-bottom: 16px
3103        }
3104
3105        .foot ul {
3106            list-style: none;
3107            display: flex;
3108            flex-direction: column;
3109            gap: 8px;
3110            font-size: 13px;
3111            color: var(--bone)
3112        }
3113
3114        .foot ul a {
3115            transition: .25s
3116        }
3117
3118        .foot ul a:hover {
3119            color: var(--signal)
3120        }
3121
3122        .foot-brand p {
3123            margin-top: 16px;
3124            color: var(--bone);
3125            font-size: 13px;
3126            line-height: 1.55;
3127            max-width: 36ch
3128        }
3129
3130        .foot-bot {
3131            display: flex;
3132            justify-content: space-between;
3133            align-items: center;
3134            padding-top: 32px;
3135            border-top: 1px solid var(--line);
3136            font-family: var(--mono);
3137            font-size: 11px;
3138            color: var(--mute);
3139            letter-spacing: .06em;
3140            flex-wrap: wrap;
3141            gap: 16px
3142        }
3143
3144        /* ====== V2 RULED VOCABULARY ======
3145           The shared shapes of the V2 design language, so a new section does
3146           not have to hand-roll the hairline pair again. The language is:
3147
3148             · no boxed cards. A block is a rule and the copy under it.
3149             · no icon marks, no tag pills, no lift-on-hover.
3150             · the rule fills with the brand gradient as the block scrolls in,
3151               which is the only motion a block gets.
3152             · a price, a phone number and a stat all take the same shape:
3153               a rule, a mono label, and a big serif figure.
3154
3155           Reach for these on anything new. The older components (.cap-plate,
3156           .step, .tier, .metric, .trade) carry their own copies of the same
3157           shapes because their markup predates this block; they are not worth
3158           rewriting just to share four declarations, but they must not drift.
3159
3160             <div class="ruled-set r">
3161               <div class="ruled-col">...</div>
3162             </div>
3163
3164           .r on the container is what starts the fill: the site-wide reveal
3165           observer adds .in, and .ruled-set.in is the trigger. */
3166        .ruled-set {
3167            display: grid;
3168            gap: clamp(20px, 2.6vw, 40px)
3169        }
3170
3171        .ruled-set.cols-2 { grid-template-columns:repeat(2, 1fr) }
3172        .ruled-set.cols-3 { grid-template-columns:repeat(3, 1fr) }
3173        .ruled-set.cols-4 { grid-template-columns:repeat(4, 1fr) }
3174
3175        .ruled-col {
3176            position: relative;
3177            padding: 30px 0 0
3178        }
3179
3180        .ruled-col::before, .ruled-col::after {
3181            content: "";
3182            position: absolute;
3183            top: 0;
3184            left: 0;
3185            right: 0;
3186            height: 1px
3187        }
3188
3189        .ruled-col::before { background: var(--line-2) }
3190
3191        .ruled-col::after {
3192            background: var(--grad);
3193            transform: scaleX(0);
3194            transform-origin: left;
3195            transition: transform .9s var(--ease-out)
3196        }
3197
3198        /* the reveal class lands on the container in most sections and on the
3199           column itself in a few, so both spellings start the fill */
3200        .ruled-set.in .ruled-col::after, .ruled-col.in::after {
3201            transform: scaleX(1)
3202        }
3203
3204        .ruled-set.in .ruled-col:nth-child(2)::after { transition-delay: .12s }
3205        .ruled-set.in .ruled-col:nth-child(3)::after { transition-delay: .24s }
3206        .ruled-set.in .ruled-col:nth-child(4)::after { transition-delay: .36s }
3207
3208        .ruled-col h3 {
3209            font-family: var(--serif);
3210            font-weight: 600;
3211            font-size: var(--t-h3);
3212            line-height: var(--lh-head);
3213            letter-spacing: var(--ls-head);
3214            color: var(--paper)
3215        }
3216
3217        .ruled-col h3 .it {
3218            font-family: var(--serif);
3219            font-style: normal;
3220            font-weight: 600;
3221            color: var(--signal)
3222        }
3223
3224        .ruled-col p {
3225            margin-top: 12px;
3226            color: var(--bone);
3227            font-size: var(--t-body);
3228            line-height: var(--lh-body)
3229        }
3230
3231        .ruled-col p b { color: var(--paper); font-weight: 500 }
3232
3233        .ruled-col .tag {
3234            margin-top: 18px;
3235            display: inline-block;
3236            font-family: var(--mono);
3237            font-weight: 500;
3238            font-size: var(--t-label);
3239            letter-spacing: var(--ls-label);
3240            text-transform: uppercase;
3241            color: var(--signal)
3242        }
3243
3244        /* A ruled index: numbered rows under one another, each a hairline, a
3245           name, a description and a tag. This is the /v2 service index and the
3246           shape the FAQ and the wellness escalation ladder both take. Rows may
3247           be links or plain divs; only the links get the sliding arrow.
3248
3249             <div class="rul
3249ed-index r">
3250               <a class="ruled-row" href="...">
3251                 <span class="num">01</span>
3252                 <span class="name">Fergus</span>
3253                 <span class="desc">...</span>
3254                 <span class="go"><span>Books visits</span><span class="arr">→</span></span>
3255               </a>
3256             </div> */
3257        .ruled-index {
3258            margin-top: 44px;
3259            border-bottom: 1px solid var(--line-2)
3260        }
3261
3262        .ruled-row {
3263            display: grid;
3264            grid-template-columns:64px minmax(160px, 240px) 1fr auto;
3265            gap: clamp(14px, 2vw, 28px);
3266            align-items: center;
3267            padding: 22px clamp(4px, 1vw, 12px);
3268            border-top: 1px solid var(--line-2);
3269            text-decoration: none;
3270            transition: background .3s var(--ease)
3271        }
3272
3273        .ruled-row .num {
3274            font-family: var(--mono);
3275            font-size: 11px;
3276            letter-spacing: .14em;
3277            color: var(--mute-2)
3278        }
3279
3280        .ruled-row .name {
3281            font-family: var(--serif);
3282            font-weight: 600;
3283            font-size: clamp(19px, 1.8vw, 24px);
3284            letter-spacing: -.01em;
3285            color: var(--paper);
3286            transition: color .3s var(--ease)
3287        }
3288
3289        .ruled-row .desc {
3290            color: var(--bone);
3291            font-size: var(--t-small);
3292            line-height: var(--lh-body)
3293        }
3294
3295        .ruled-row .go {
3296            display: inline-flex;
3297            align-items: center;
3298            gap: 14px;
3299            font-family: var(--mono);
3300            font-size: var(--t-label);
3301            letter-spacing: .14em;
3302            text-transform: uppercase;
3303            color: var(--mute);
3304            white-space: nowrap
3305        }
3306
3307        .ruled-row .go .arr {
3308            color: var(--signal);
3309            font-size: 15px;
3310            transition: transform .3s var(--ease-out)
3311        }
3312
3313        a.ruled-row:hover {
3314            background: var(--surface-2)
3315        }
3316
3317        a.ruled-row:hover .name {
3318            color: var(--signal)
3319        }
3320
3321        a.ruled-row:hover .go .arr {
3322            transform: translateX(6px)
3323        }
3324
3325        @media (max-width: 900px) {
3326            .ruled-row {
3327                grid-template-columns:40px 1fr auto
3328            }
3329
3330            .ruled-row .desc {
3331                grid-column:2 / 3;
3332                grid-row: 2;
3333                margin-top: 2px
3334            }
3335
3336            .ruled-row .go span:not(.arr) {
3337                display: none
3338            }
3339        }
3340
3341        /* ====== INTEGRATION WALL ======
3342           "Plugged into the software you already run", shared by the industry
3343           pages and the booking page. Replaces a bare grid of words whose cells
3344           were divided by a 1px gap, so "Microsoft" and "Outlook" ran together
3345           with nothing between one system and the next. Each system now gets
3346           its logo and room to breathe, which is the treatment /integrations
3347           already uses. Markup lives in frontend.partials.integration-wall. */
3348        .ig-wall {
3349            margin-top: 40px;
3350            display: grid;
3351            grid-template-columns:repeat(auto-fit, minmax(210px, 1fr));
3352            gap: clamp(20px, 2.4vw, 34px)
3353        }
3354
3355        .ig-item {
3356            display: flex;
3357            align-items: center;
3358            gap: 14px;
3359            padding: 20px 0 0;
3360            border-top: 1px solid var(--line-2);
3361            min-width: 0
3362        }
3363
3364        .ig-tile {
3365            flex: 0 0 44px;
3366            width: 44px;
3367            height: 44px;
3368            border-radius: 3px;
3369            border: 1px solid var(--line-2);
3370            display: grid;
3371            place-items: center;
3372            overflow: hidden
3373        }
3374
3375        .ig-tile.is-light {
3376            background: #fff
3377        }
3378
3379        .ig-tile img {
3380            width: 100%;
3381            height: 100%;
3382            object-fit: contain;
3383            padding: 7px
3384        }
3385
3386        .ig-tile b {
3387            font-family: var(--serif);
3388            font-size: 20px;
3389            font-weight: 400;
3390            line-height: 1
3391        }
3392
3393        .ig-name {
3394            font-family: var(--serif);
3395            font-weight: 400;
3396            font-size: 17px;
3397            line-height: 1.15;
3398            letter-spacing: -.01em;
3399            color: var(--paper);
3400            min-width: 0
3401        }
3402
3403        .ig-name small {
3404            display: block;
3405            margin-top: 4px;
3406            font-family: var(--mono);
3407            font-size: var(--t-label);
3408            letter-spacing: .14em;
3409            text-transform: uppercase;
3410            color: var(--mute)
3411        }
3412
3413        /* A price, a phone number, a headline figure: a heavier rule, a mono
3414           label and a big serif number. .is-pick marks the one being pushed. */
3415        .ruled-figure {
3416            border-top: 2px solid var(--line-2);
3417            padding: clamp(24px, 3vw, 40px) 0 0
3418        }
3419
3420        .ruled-figure.is-pick { border-top-color: var(--signal) }
3421
3422        .ruled-figure .lbl {
3423            display: block;
3424            font-family: var(--mono);
3425            font-size: 11px;
3426            letter-spacing: .18em;
3427            text-transform: uppercase;
3428            color: var(--mute)
3429        }
3430
3431        .ruled-figure .big {
3432            display: block;
3433            margin-top: 16px;
3434            font-family: var(--serif);
3435            font-weight: 600;
3436            font-size: clamp(46px, 5vw, 72px);
3437            line-height: 1;
3438            letter-spacing: -.03em;
3439            color: var(--paper)
3440        }
3441
3442        .ruled-figure .big small {
3443            font-family: var(--mono);
3444            font-size: 12px;
3445            letter-spacing: .08em;
3446            color: var(--mute)
3447        }
3448
3449        /* A list inside the ruled language leads with an arrow in the signal
3450           colour, over a dashed rule. No bullets, no ticks in circles. */
3451        .ruled-list {
3452            margin-top: 24px;
3453            list-style: none;
3454            display: flex;
3455            flex-direction: column;
3456            gap: 12px;
3457            border-top: 1px dashed var(--line);
3458            padding-top: 22px
3459        }
3460
3461        .ruled-list li {
3462            display: flex;
3463            gap: 12px;
3464            color: var(--bone);
3465            font-size: 14px;
3466            line-height: 1.5
3467        }
3468
3469        .ruled-list li::before {
3470            content: "\2192";
3471            color: var(--signal);
3472            font-family: var(--mono)
3473        }
3474
3475        /* The list started life as a list of statements. The trade and town
3476           indexes use it as navigation instead, so a link inside one has to
3477           read as a link: the arrow already leads the row, and this gives the
3478           words themselves the signal colour and something on hover. */
3479        .ruled-list li a {
3480            color: var(--signal);
3481            transition: color .2s var(--ease)
3482        }
3483
3484        .ruled-list li a:hover { color: var(--signal-warm) }
3485
3486        /* An aside is ruled down its edge rather than boxed in a tinted panel. */
3487        .ruled-aside {
3488            padding: 4px 0 4px 18px;
3489            border-left: 2px solid var(--plasma);
3490            color: var(--bone);
3491            font-size: 14px;
3492            line-height: 1.6
3493        }
3494
3495        .ruled-aside.is-ok { border-left-color: var(--signal) }
3496
3497        @media (prefers-reduced-motion: reduce) {
3498            .ruled-col::after { transition: none; transform: scaleX(1) }
3499        }
3500
3501        @media (max-width: 1000px) {
3502            .ruled-set.cols-3, .ruled-set.cols-4 { grid-template-columns:repeat(2, 1fr) }
3503        }
3504
3505        @media (max-width: 640px) {
3506            .ruled-set.cols-2, .ruled-set.cols-3, .ruled-set.cols-4 { grid-template-columns:1fr }
3507            .ruled-set.in .ruled-col::after { transition-delay: 0s }
3508        }
3509
3510        /* ====== SCROLL REVEAL ======
3511       .r hides a block until it scrolls into view. Two things it must never
3512       do: hold content back for a full second, and hide it for ever when the
3513       observer never runs. So the hidden state is applied only once the
3514       script has declared itself (html.js), and only where motion is wel
3514come.
3515       No JS, or reduced motion, means everything is simply visible. */
3516        html.js .r {
3517            opacity: 0;
3518            transform: translateY(16px);
3519            transition: opacity .4s var(--ease-out), transform .4s var(--ease-out)
3520        }
3521
3522        html.js .r.in {
3523            opacity: 1;
3524            transform: none
3525        }
3526
3527        .r-1 { transition-delay: .05s }
3528
3529        .r-2 { transition-delay: .1s }
3530
3531        @media (prefers-reduced-motion: reduce) {
3532            html.js .r, html.js .r.in, .r, .r.in {
3533                opacity: 1;
3534                transform: none;
3535                transition: none
3536            }
3537        }
3538
3539        /* ====== STEPS ====== */
3540        .steps {
3541            display: grid;
3542            grid-template-columns:repeat(3, 1fr);
3543            gap: clamp(20px, 3vw, 40px);
3544            margin-top: 56px;
3545            position: relative
3546        }
3547
3548        /* There was a connector line here, threaded through the middle of the
3549           circular step badges at a fixed 36px from the top. The badges are
3550           outlined numerals now and each step carries its own rule, so the
3551           connector had nothing left to connect and simply struck through the
3552           numbers. */
3553
3554        /* V2 numbered steps: a hairline over each that fills with the brand
3555           gradient as it scrolls in, rather than a filled card that lifts. */
3556        .step {
3557            position: relative;
3558            padding: 30px 0 0;
3559            display: flex;
3560            flex-direction: column;
3561            gap: 16px
3562        }
3563
3564        .step::before, .step::after {
3565            content: "";
3566            position: absolute;
3567            top: 0;
3568            left: 0;
3569            right: 0;
3570            height: 1px
3571        }
3572
3573        .step::before {
3574            background: var(--line-2)
3575        }
3576
3577        .step::after {
3578            background: var(--grad);
3579            transform: scaleX(0);
3580            transform-origin: left;
3581            transition: transform .9s var(--ease-out)
3582        }
3583
3584        .step.in::after, .steps.in .step::after {
3585            transform: scaleX(1)
3586        }
3587
3588        .steps.in .step:nth-child(2)::after {
3589            transition-delay: .12s
3590        }
3591
3592        .steps.in .step:nth-child(3)::after {
3593            transition-delay: .24s
3594        }
3595
3596        .step:hover::after {
3597            transform: scaleX(1)
3598        }
3599
3600        /* V2 numbers a step with a big outlined italic numeral rather than a
3601           digit inside a circular badge. */
3602        .step .num {
3603            font-family: var(--serif);
3604            font-weight: 600;
3605            font-size: 64px;
3606            line-height: 1;
3607            color: transparent;
3608            -webkit-text-stroke: 1px var(--line-2);
3609            position: relative;
3610            z-index: 1
3611        }
3612
3613        .step h4 {
3614            font-family: var(--serif);
3615            font-weight: 400;
3616            font-size: 24px;
3617            letter-spacing: -.01em;
3618            line-height: 1.1
3619        }
3620
3621        .step h4 .it {
3622            font-family: var(--serif);
3623            font-weight: 600;
3624            color: var(--mute)
3625        }
3626
3627        .step h4 {
3628            margin-top: 2px
3629        }
3630
3631        .step p {
3632            color: var(--bone);
3633            font-size: var(--t-body);
3634            line-height: 1.6
3635        }
3636
3637        .hero-steps-hd {
3638            margin-top: 34px;
3639            font-family: var(--serif);
3640            font-weight: 600;
3641            font-size: 34px;
3642            letter-spacing: -.02em;
3643            line-height: 1.1;
3644            color: var(--paper);
3645            opacity: 0;
3646            animation: rise2 .9s 1.1s var(--ease-out) forwards
3647        }
3648
3649        .hero-steps-hd .it {
3650            font-family: var(--serif);
3651            font-weight: 600;
3652            color: var(--signal)
3653        }
3654
3655        /* Vertical variant, so the steps can run down a narrow hero column
3656           beside a tall form instead of across the page. */
3657        .steps.stack {
3658            grid-template-columns:1fr;
3659            gap: 12px;
3660            margin-top: 30px;
3661            max-width: 560px
3662        }
3663
3664        .steps.stack::before {
3665            display: none
3666        }
3667
3668        .steps.stack .step {
3669            flex-direction: row;
3670            align-items: flex-start;
3671            gap: 20px;
3672            padding: 22px 0 0
3673        }
3674
3675        .steps.stack .step .num {
3676            flex: 0 0 auto;
3677            font-size: 40px;
3678            line-height: .9
3679        }
3680
3681        .steps.stack .step .body {
3682            display: grid;
3683            gap: 8px
3684        }
3685
3686        .steps.stack .step h4 {
3687            font-size: 20px
3688        }
3689
3690        .steps.stack .step p {
3691            font-size: 13px
3692        }
3693
3694        /* ====== CAPABILITY PLATE ======
3695           Capabilities in the V2 design language, the same vocabulary the /v2
3696           homepage and the wellness page use: top-ruled columns rather than
3697           boxed cards. Each cell is a hairline and the copy under it, and the
3698           hairline fills with the brand gradient as the plate scrolls in.
3699
3700           It was a filled, rounded plate whose cells were divided by letting a
3701           1px grid gap show the plate's own background through. That is 
3701what
3702           made a short last row read as a slab of grey, and what made the set
3703           look like cards floating on the page rather than part of it.
3704
3705           Each cell still leads with the moment in the call it fires, so the
3706           set reads as a timeline rather than a feature dump. */
3707        .cap-plate {
3708            display: grid;
3709            gap: clamp(22px, 3vw, 44px);
3710            grid-template-columns:repeat(3, 1fr)
3711        }
3712
3713        .cap {
3714            position: relative;
3715            padding: 30px 0 0;
3716            display: flex;
3717            flex-direction: column;
3718            gap: 10px
3719        }
3720
3721        /* the standing hairline, and the gradient that draws over it */
3722        .cap::before, .cap::after {
3723            content: "";
3724            position: absolute;
3725            top: 0;
3726            left: 0;
3727            right: 0;
3728            height: 1px
3729        }
3730
3731        .cap::before {
3732            background: var(--line-2)
3733        }
3734
3735        .cap::after {
3736            background: var(--grad);
3737            transform: scaleX(0);
3738            transform-origin: left;
3739            transition: transform .9s var(--ease-out)
3740        }
3741
3742        /* the plate carries .r, so the site-wide reveal observer is what starts
3743           the fill; the cells stagger across the row behind it */
3744        .cap-plate.in .cap::after {
3745            transform: scaleX(1)
3746        }
3747
3748        .cap-plate .cap:nth-child(3n + 2)::after {
3749            transition-delay: .12s
3750        }
3751
3752        .cap-plate .cap:nth-child(3n)::after {
3753            transition-delay: .24s
3754        }
3755
3756        /* No icon marks in this language: the rule and the type carry the cell,
3757           and a glyph per capability was the last of the card furniture. The
3758           mark is still rendered so the components keep their contract; it just
3759           has nothing to say here. */
3760        .cap-mark {
3761            display: none
3762        }
3763
3764        .cap .when {
3765            font-family: var(--mono);
3766            font-size: var(--t-label);
3767            letter-spacing: .16em;
3768            text-transform: uppercase;
3769            color: var(--signal);
3770            display: flex;
3771            align-items: center;
3772            justify-content: space-between;
3773            gap: 14px
3774        }
3775
3776        /* the mark is gone, so this is just the title's own line now */
3777        .cap-hd {
3778            display: block
3779        }
3780
3781        .cap h3 {
3782            font-family: var(--serif);
3783            font-weight: 400;
3784            font-size: 24px;
3785            line-height: 1.14;
3786            letter-spacing: -.012em;
3787            color: var(--paper);
3788            padding-bottom: 2px
3789        }
3790
3791        .cap h3 .it {
3792            font-family: var(--serif);
3793            font-weight: 600;
3794            color: var(--signal)
3795        }
3796
3797        .cap h3 .blue {
3798            font-family: var(--serif);
3799            font-weight: 600;
3800            color: var(--plasma-bright)
3801        }
3802
3803        /* .green was never styled inside the old bento h4s, so it rendered as
3804           flat body text there. Carried onto the plate it gets the same
3805           treatment as .it, matching the tuner headings. */
3806        .cap h3 .green {
3807            font-family: var(--serif);
3808            font-weight: 600;
3809            color: var(--signal)
3810        }
3811
3812        .cap p {
3813            color: var(--bone);
3814            font-size: var(--t-body);
3815            line-height: 1.62
3816        }
3817
3818        .cap p b {
3819            color: var(--paper);
3820            font-weight: 500
3821        }
3822
3823        /* The closing call to action sits under the plate rather than in it. As
3824           a cell it was three times the width of its neighbours and read as a
3825           row that had failed to fill, so it carries no fill of its own.
3826
3827           It does carry a rule across the full width, which is what closes the
3828           plate off now that the plate has no border: the cells are ruled at
3829           the top, this rules underneath them, and the set reads as one block
3830           rather than a run of columns that simply stops. */
3831        .cap-foot {
3832            display: flex;
3833            align-items: center;
3834            justify-content: space-between;
3835            flex-wrap: wrap;
3836            gap: 20px 36px;
3837            margin-top: clamp(38px, 4vw, 56px);
3838            padding: clamp(26px, 3vw, 38px) 0 0;
3839            border-top: 1px solid var(--line-2)
3840        }
3841
3842        .cap-foot > div {
3843            max-width: 62ch;
3844            display: flex;
3845            flex-direction: column;
3846            gap: 8px
3847        }
3848
3849        .cap-foot h3 {
3850            font-family: var(--serif);
3851            font-weight: 600;
3852            font-size: 26px;
3853            line-height: 1.2;
3854            letter-spacing: -.015em;
3855            color: var(--paper);
3856            margin: 0
3857        }
3858
3859        .cap-foot h3 .it {
3860            font-family: var(--serif);
3861            font-weight: 600;
3862        }
3863
3864        .cap-foot p {
3865            font-size: var(--t-body);
3866            line-height: 1.6;
3867            color: var(--mute);
3868            margin: 0
3869        }
3870
3871        @media (max-width: 640px) {
3872            .cap-foot {
3873                margin-top: 24px
3874            }
3875
3876            .cap-foot h3 {
3877                font-size: 22px
3878            }
3879        }
3880
3881        /* Industry pages keep their own emphasis: two lead cells across the
3882           top, three underneath. A six-column track divides cleanly both ways,
3883           so neither row is left with a hole. */
3884        .cap-plate.mixed {
3885            grid-template-columns:repeat(6, 1fr)
3886        }
3887
3888        .cap-plate.mixed .cap.half {
3889            grid-column:span 3
3890        }
3891
3892        .cap-plate.mixed .cap.third {
3893            grid-column:span 2
3894        }
3895
3896        /* There used to be a set of rules here that stretched whatever was left
3897           alone on the final row so it filled the width. That existed only
3898           because the old plate drew its rules by letting its own background
3899           through a 1px grid gap, so a row the cells did not fill showed up as
3900           a slab of grey.
3901
3902           Top-ruled columns have no fill to show through, so a short last row
3903           is simply empty space and needs no correction. Stretching a lone cell
3904           now would be actively wrong: its hairline would run three times the
3905           length of every other cell's and break the measure. The plates are
3906           still authored to fill their rows, and CapabilityPlateTest still
3907           guards that, but it is a composition rule now rather than a patch
3908           over an artefact.
3909
3910           (The old block also had a stray half-comment in it, which made the
3911           browser discard the first of the two rules outright.) */
3912
3913        @media (max-width: 1000px) {
3914            .cap-plate {
3915                grid-template-columns:repeat(2, 1fr)
3916            }
3917
3918            .cap-plate.mixed {
3919                grid-template-columns:repeat(2, 1fr)
3920            }
3921
3922            .cap-plate.mixed .cap.half,
3923            .cap-plate.mixed .cap.third {
3924                grid-column:auto
3925            }
3926
3927            /* two across, so the three-column stagger no longer describes a row */
3928            .cap-plate .cap:nth-child(3n + 2)::after,
3929            .cap-plate .cap:nth-child(3n)::after {
3930                transition-delay: 0s
3931            }
3932
3933            .cap-plate .cap:nth-child(even)::after {
3934                transition-delay: .12s
3935            }
3936        }
3937
3938        @media (max-width: 640px) {
3939            .cap-plate,
3940            .cap-plate.mixed {
3941                grid-template-columns:1fr
3942            }
3943
3944            /* one column, so nothing is beside anything: no stagger */
3945            .cap-plate .cap::after {
3946                transition-delay: 0s
3947            }
3948
3949            .cap.wide {
3950                flex-direction: column;
3951                align-items: flex-start
3952            }
3953        }
3954
3955        @media (prefers-reduced-motion: reduce) {
3956            .cap::after {
3957                transition: none;
3958                transform: scaleX(1)
3959            }
3960        }
3961
3962        /* ====== HERO PHONE ======
3963           The one device mock on the site. It earns its place by being
3964           interactive: the chips drive the notification and pause the cycle. */
3965        .hphone {
3966            display: flex;
3967            flex-direction: column;
3968            align-items: center;
3969            gap: 20px;
3970            width: 100%
3971        }
3972
3973        .hphone-frame {
3974            width: min(268px, 72vw);
3975            aspect-ratio: 9/18.6;
3976            border-radius: 38px;
3977            padding: 9px;
3978            background: linear-gradient(160deg, #23262b, #0e1013 60%, #191c20);
3979            box-shadow: 0 30px 70px var(--shadow-deep), 0 0 0 1px rgba(255, 255, 255, .07) inset;
3980            flex: 0 0 auto
3981        }
3982
3983        .hphone-screen {
3984            position: relative;
3985            height: 100%;
3986            border-radius: 30px;
3987            overflow: hidden;
3988            background: radial-gradient(120% 80% at 50% 0%, #1c2330, #0a0d12 70%);
3989            display: flex;
3990            flex-direction: column;
3991            padding: 26px 12px 14px
3992        }
3993
3994        .hphone-notch {
3995            position: absolute;
3996            top: 8px;
3997            left: 50%;
3998            transform: translateX(-50%);
3999            width: 78px;
4000            height: 20px;
4001            border-radius: 12px;
4002            background: #05070a
4003        }
4004
4005        .hphone-clock {
4006            text-align: center;
4007            margin: 14px 0 18px;
4008            color: #fff
4009        }
4010
4011        .hphone-clock .t {
4012            font-size: 46px;
4013            font-weight: 300;
4014            letter-spacing: -.02em;
4015            line-height: 1
4016        }
4017
4018        .hphone-clock .d {
4019            font-size: 11.5px;
4020            color: rgba(255, 255, 255, .68);
4021            margin-top: 4px
4022        }
4023
4024        .hphone-stack {
4025            display: flex;
4026            flex-direction: column;
4027            gap: 7px;
4028            flex: 1
4029        }
4030
4031        .hpn {
4032            background: rgba(238, 238, 240, .93);
4033            border-radius: 16px;
4034            padding: 9px 11px 11px;
4035            opacity: 0;
4036            /* drops in from above the notch with a little overshoot, the way a
4037               push actually arrives, rather than fading on the spot */
4038            transform: translateY(-22px) scale(.94);
4039            transition: opacity .42s var(--ease-out),
4040                        transform .62s cubic-bezier(.22, 1.4, .36, 1);
4041            pointer-events: none
4042        }
4043
4044        .hpn.is-in {
4045            opacity: 1;
4046            transform: none
4047        }
4048
4049        .hpn header {
4050            display: flex;
4051            align-items: center;
4052            gap: 6px;
4053            margin-bottom: 5px
4054        }
4055
4056        .hpn header img {
4057            border-radius: 5px;
4058            display: block
4059        }
4060
4061        /* hpn- prefixed: a bare .app collides with the app showcase panel,
4062           which is an 80px-padded gradient grid, and it ate the header */
4063        .hpn .hpn-app {
4064            font-size: 10.5px;
4065            color: #63666b;
4066            flex: 1
4067        }
4068
4069        .hpn .hpn-ago {
4070            font-size: 10.5px;
4071            color: #8b8e93
4072        }
4073
4074        .hpn h4 {
4075            font-size: 13.5px;
4076            font-weight: 600;
4077            color: #14171a;
4078            letter-spacing: -.005em
4079        }
4080
4081        .hpn p {
4082            font-size: 11.5px;
4083            color: #4e5155;
4084            margin-top: 1px;
4085            line-height: 1.35
4086        }
4087
4088        .hphone-bar {
4089            width: 96px;
4090            height: 4px;
4091            border-radius: 4px;
4092            background: rgba(255, 255, 255, .55);
4093            margin: 8px auto 0
4094        }
4095
4096        /* A LOCK SCREEN THAT PLAYS. Used by the PA and reception panels, which
4097           tell the same story with different notifications. See
4098           partials/agent-phone.blade.php.
4099
4100           --ag-tilt and --ag-sheen are written by the scroll handler; the
4101           values here are the resting state before it runs and whenever motion
4102           is refused. The two panels lean opposite ways so the pair reads as a
4103           spread rather than as the same picture twice. */
4104        .agent-phone {
4105            transform: rotate(var(--ag-tilt, 3deg));
4106            transition: transform .25s linear
4107        }
4108
4109        .agent-phone--left {
4110            --ag-tilt: -3deg
4111        }
4112
4113        .agent-phone .hphone-frame {
4114            position: relative;
4115            overflow: hidden
4116        }
4117
4118        /* The sheen is what sells the front as glass rather than as a
4119           rectangle. Decorative only: nothing sits under it. */
4120        .agent-phone .hphone-frame::after {
4121            content: "";
4122            position: absolute;
4123            inset: -30%;
4124            pointer-events: none;
4125            z-index: 3;
4126            background: linear-gradient(105deg,
4127                transparent 38%,
4128                rgba(255, 255, 255, .13) 47%,
4129                rgba(255, 255, 255, .22) 50%,
4130                rgba(255, 255, 255, .13) 53%,
4131                transparent 62%);
4132            transform: translateX(var(--ag-sheen, -20%));
4133            transition: transform .25s linear
4134        }
4135
4136        /* iOS shrinks the clock and lifts it the moment something lands on a
4137           locked screen. Doing the same is what makes the notifications read as
4138           arriving rather than as part of the wallpaper. */
4139        .agent-phone .hphone-clock {
4140            transition: margin .55s var(--ease-out)
4141        }
4142
4143        .agent-phone .hphone-clock .t {
4144            transition: font-size .55s var(--ease-out)
4145        }
4146
4147        .agent-phone .hphone-clock .d {
4148            transition: font-size .55s var(--ease-out), opacity .4s var(--ease)
4149        }
4150
4151        .agent-phone .hphone-clock.is-compact {
4152            margin: 2px 0 12px
4153        }
4154
4155        .agent-phone .hphone-clock.is-compact .t {
4156            font-size: 21px
4157        }
4158
4159        .agent-phone .hphone-clock.is-compact .d {
4160            font-size: 10px;
4161            opacity: .8
4162        }
4163
4164        @media (prefers-reduced-motion: reduce) {
4165            .agent-phone,
4166            .agent-phone .hphone-clock,
4167            .agent-phone .hphone-clock .t,
4168            .agent-phone .hphone-clock .d,
4169            .agent-phone .hphone-frame::after {
4170                transition: none
4171            }
4172
4173            .agent-phone {
4174                transform: none
4175            }
4176
4177            .agent-phone .hphone-frame::after {
4178                display: none
4179            }
4180        }
4181
4182        .hphone-chips {
4183            display: flex;
4184            flex-wrap: wrap;
4185            justify-content: center;
4186            gap: 7px;
4187            max-width: 340px
4188        }
4189
4190        .hpc {
4191            font-family: var(--mono);
4192            font-size: var(--t-label);
4193            letter-spacing: .1em;
4194            text-transform: uppercase;
4195            /* --bone not --mute: the label is 10px, so it needs AA, and mute
4196               only clears 3:1 against the chip fill in light theme */
4197            color: var(--bone);
4198            background: var(--surface-2);
4199            border: 1px solid var(--line);
4200            border-radius: 7px;
4201            padding: 6px 9px;
4202            cursor: pointer;
4203            transition: color .25s var(--ease), border-color .25s var(--ease), background .25s var(--ease)
4204        }
4205
4206        .hpc:hover {
4207            color: var(--paper);
4208            border-color: var(--line-2)
4209        }
4210
4211        .hpc.is-on {
4212            /* fixed dark ink rather than --on-accent: it has to clear AA on
4213               both the light-theme green and the brighter dark-theme one */
4214            color: #0b0d0a;
4215            background: var(--signal);
4216            border-color: transparent
4217        }
4218
4219        .hpc:focus-visible {
4220            outline: 2px solid var(--plasma-bright);
4221            outline-offset: 2px
4222        }
4223
4224        @media (max-width: 900px) {
4225            .hphone {
4226                margin-top: 34px
4227            }
4228
4229            .hphone-frame {
4230                width: min(232px, 62vw)
4231            }
4232        }
4233
4234        @media (prefers-reduced-motion: reduce) {
4235            .hpn {
4236                transition: none
4237            }
4238        }
4239
4240        /* ====== TRADE INDEX ======
4241           Photographic directory. The tiles were held inside one rounded,
4242           filled container and ruled off each other by letting its background
4243           through a 1px grid gap. In the V2 language the container goes and the
4244           tiles are ruled individually, so the set sits on the page rather than
4245           on a plate laid over it. The photography stays: V2 keeps photographs,
4246           it is the boxes around them it does without. */
4247        .trade-plate {
4248            display: grid;
4249            gap: clamp(20px, 2.6vw, 36px)
4250        }
4251
4252        .trade-plate.cols-3 {
4253            grid-template-columns:repeat(3, 1fr)
4254        }
4255
4256        .trade-plate.cols-4 {
4257            grid-template-columns:repeat(4, 1fr)
4258        }
4259
4260        /* four across is tighter, so the type steps down with it */
4261        .trade-plate.cols-4 .body {
4262            padding: 19px 20px 18px;
4263            gap: 8px
4264        }
4265
4266        .trade-plate.cols-4 h3 {
4267            font-size: 20px
4268        }
4269
4270        .trade-plate.cols-4 p {
4271            font-size: 13px;
4272            line-height: 1.55
4273        }
4274
4275        .trade-plate.cols-4 .go {
4276            padding-top: 13px;
4277            font-size: 10px
4278        }
4279
4280        .trade {
4281            position: relative;
4282            display: flex;
4283            flex-direction: column;
4284            text-decoration: none;
4285            color: inherit;
4286            transition: background .35s var(--ease)
4287        }
4288
4289        .trade:hover {
4290            background: var(--surface-2)
4291        }
4292
4293        .trade .shot {
4294            position: relative;
4295            aspect-ratio: 16/10;
4296            overflow: hidden;
4297            /* the notification card inside is sized in cqw against this */
4298            container-type: inline-size
4299        }
4300
4301        /* THE NOTIFICATION ON A PHOTOGRAPH. See components/frontend/shot-alert.
4302           It used to be composited into the JPEG, which pinned it to one spot
4303           in a portrait frame and froze an old mark inside it. Drawn here it
4304           takes the mark from the brand component and sits where each context
4305           needs it.
4306
4307           Everything is derived from one unit, --u, so the whole card scales
4308           together: type, padding, corner radius, mark and tail all stay in
4309           proportion at every tile size. The card is 56 units wide, and .75cqw
4310           makes that 42% of the photo, which is the proportion the composited
4311           card had and the one the crops were framed around.
4312
4313           The clamp holds both ends of that. Below about a 350px tile a strict
4314           42% would put the subtitle under 10px, so the card is allowed to take
4315           a larger share of a small photo rather than become unreadable on it.
4316           Above about a 730px tile it stops growing, because past that the card
4317           has stopped reading as a notification and started reading as a
4318           banner. Anything holding a .shot-alert needs container-type:
4319           inline-size for cqw to resolve.
4320
4321           Light in both themes on purpose: it sits on a daylight photograph,
4322           not on the page. */
4323        .shot-alert {
4324            --u: clamp(3.1px, .75cqw, 5.5px);
4325            --alert-ground: rgba(244, 244, 242, .93);
4326            position: absolute;
4327            z-index: 2;
4328            display: flex;
4329            flex-direction: column;
4330            gap: calc(1.1 * var(--u));
4331            width: calc(56 * var(--u));
4332            padding: calc(3.6 * var(--u)) calc(4 * var(--u)) calc(4 * var(--u));
4333            border-radius: calc(4.4 * var(--u));
4334            background: var(--alert-ground);
4335            backdrop-filter: blur(7px);
4336            -webkit-backdrop-filter: blur(7px);
4337            box-shadow: 0 calc(3 * var(--u)) calc(6 * var(--u)) calc(-2 * var(--u)) rgba(8, 12, 16, .32);
4338            color: #101820;
4339            font-family: var(--sans);
4340            line-height: 1.25;
4341            text-wrap: balance;
4342            pointer-events: none
4343        }
4344
4345        /* the tail, on the side the card is anchored to */
4346        .shot-alert::after {
4347            content: "";
4348            position: absolute;
4349            bottom: calc(-2.6 * var(--u));
4350            width: 0;
4351            height: 0;
4352            border-top: calc(3 * var(--u)) solid var(--alert-ground);
4353            border-right: calc(3.4 * var(--u)) solid transparent
4354        }
4355
4356        /* Insets stay a fraction of the photo rather than of the card, so the
4357           gap to the frame edge reads the same on a tile and on a hero. */
4358        .shot-alert.at-top-left, .shot-alert.at-bottom-left {
4359            left: min(4cqw, 24px)
4360        }
4361
4362        .shot-alert.at-top-right, .shot-alert.at-bottom-right {
4363            right: min(4cqw, 24px)
4364        }
4365
4366        .shot-alert.at-top-left, .shot-alert.at-top-right {
4367            top: min(4.5cqw, 26px)
4368        }
4369
4370        .shot-alert.at-bottom-left, .shot-alert.at-bottom-right {
4371            bottom: min(7cqw, 40px)
4372        }
4373
4374        .shot-alert.at-top-left::after, .shot-alert.at-bottom-left::after {
4375            left: calc(9 * var(--u))
4376        }
4377
4378        .shot-alert.at-top-right::after, .shot-alert.at-bottom-right::after {
4379            right: calc(9 * var(--u));
4380            border-right: 0;
4381            border-left: calc(3.4 * var(--u)) solid transparent
4382        }
4383
4384        /* a card anchored to the bottom points its tail upward instead */
4385        .shot-alert.at-bottom-left::after, .shot-alert.at-bottom-right::after {
4386            bottom: auto;
4387            top: calc(-2.6 * var(--u));
4388            border-top: 0;
4389            border-bottom: calc(3 * var(--u)) solid var(--alert-ground)
4390        }
4391
4392        .shot-alert-hd {
4393            display: flex;
4394            align-items: center;
4395            gap: calc(1.8 * var(--u))
4396        }
4397
4398        .shot-alert-mark {
4399            width: calc(5.2 * var(--u));
4400            height: calc(5.2 * var(--u));
4401            flex: none
4402        }
4403
4404        .shot-alert-app {
4405            font-size: calc(2.8 * var(--u));
4406            font-weight: 500;
4407            color: #5b6570
4408        }
4409
4410        .shot-alert-stamp {
4411            margin-left: auto;
4412            font-size: calc(2.66 * var(--u));
4413            color: #8c949d
4414        }
4415
4416        .shot-alert-title {
4417            font-size: calc(3.86 * var(--u));
4418            font-weight: 600;
4419            letter-spacing: -.01em
4420        }
4421
4422        .shot-alert-body {
4423            font-size: calc(3.06 * var(--u));
4424            color: #3d4650
4425        }
4426
4427        /* Four across on a small laptop makes a tile barely wider than the card
4428           itself. The floor has already stopped the type shrinking, so the only
4429           thing left to give is the detail line: below this the card keeps the
4430           headline and drops the rest, the way a notification does when the
4431           space it has is one line deep. */
4432        @container (max-width: 300px) {
4433            .shot-alert-body {
4434                display: none
4435            }
4436        }
4437
4438        /* inner layer carries the photo so the scale-on-hover never touches type */
4439        .trade .shot i {
4440            position: absolute;
4441            inset: 0;
4442            background-image: var(--shot-dark);
4443            background-size: cover;
4444            /* --pos is set per entry: the source photos are a mix of portrait
4445               and landscape, so each one gets its own crop anchor to keep the
4446               face and the phone in frame */
4447            background-position: var(--pos, center);
4448            filter: saturate(.8) contrast(1.03);
4449            transform: scale(1.01);
4450            transition: transform .9s var(--ease-out), filter .5s var(--ease)
4451        }
4452
4453        html[data-theme="light"] .trade .shot i {
4454            background-image: var(--shot-light, var(--shot-dark));
4455            /* two of the day shots are portrait where their night twin is
4456               landscape, so they need their own anchor */
4457            background-position: var(--pos-light, var(--pos, center))
4458        }
4459
4460        .trade:hover .shot i {
4461            transform: scale(1.06);
4462            filter: none
4463        }
4464
4465        /* brand rule wipes along the photo edge, standing in for a hover lift */
4466        .trade .shot::after {
4467            content: "";
4468            position: absolute;
4469            top: 0;
4470            left: 0;
4471            right: 0;
4472            height: 2px;
4473            background: var(--grad);
4474            transform: scaleX(0);
4475            transform-origin: left;
4476            transition: transform .55s var(--ease-out)
4477        }
4478
4479        .trade:hover .shot::after {
4480            transform: scaleX(1)
4481        }
4482
4483        .trade .body {
4484            flex: 1;
4485            display: flex;
4486            flex-direction: column;
4487            gap: 9px;
4488            padding: 22px 24px 20px
4489        }
4490
4491        .trade .hd {
4492            display: flex;
4493            align-items: flex-start;
4494            justify-content: space-between;
4495            gap: 18px
4496        }
4497
4498        .trade h3 {
4499            font-family: var(--serif);
4500            font-weight: 400;
4501            font-size: 23px;
4502            line-height: 1.14;
4503            letter-spacing: -.012em;
4504            padding-bottom: 2px
4505        }
4506
4507        .trade h3 .it {
4508            font-family: var(--serif);
4509            font-weight: 600;
4510            color: var(--signal)
4511        }
4512
4513        .trade h3 .blue {
4514            font-family: var(--serif);
4515            font-weight: 600;
4516            color: var(--plasma-bright)
4517        }
4518
4519        /* the mark: bare glyph, no tile, no fill, muted until you reach for it.
4520           --mute not --mute-2: mute-2 only clears 2.8:1 on the light paper
4521           ground, which fails both the AA text and the 3:1 graphics minimum */
4522        .trade .mark {
4523            flex: 0 0 auto;
4524            color: var(--mute);
4525            transition: color .35s var(--ease)
4526        }
4527
4528        .trade:hover .mark {
4529            color: var(--signal)
4530        }
4531
4532        .trade p {
4533            color: var(--bone);
4534            font-size: var(--t-small);
4535            line-height: 1.58
4536        }
4537
4538        .trade .go {
4539            margin-top: auto;
4540            padding-top: 16px;
4541            display: flex;
4542            align-items: center;
4543            gap: 9px;
4544            font-family: var(--mono);
4545            font-size: var(--t-label);
4546            letter-spacing: .16em;
4547            text-transform: uppercase;
4548            color: var(--mute);
4549            transition: color .35s var(--ease)
4550        }
4551
4552        .trade:hover .go {
4553            color: var(--paper)
4554        }
4555
4556        .trade .go em {
4557            font-style: normal;
4558            transition: transform .35s var(--ease-out)
4559        }
4560
4561        .trade:hover .go em {
4562            transform: translateX(5px)
4563        }
4564
4565        /* full-width entry: photo becomes a left band, rule wipes down its edge */
4566        .trade.wide {
4567            grid-column:1 / -1;
4568            flex-direction: row;
4569            align-items: stretch
4570        }
4571
4572        .trade.wide .shot {
4573            flex: 0 0 36%;
4574            aspect-ratio: auto;
4575            min-height: 216px
4576        }
4577
4578        .trade.wide .shot::after {
4579            top: 0;
4580            bottom: 0;
4581            left: 0;
4582            right: auto;
4583            width: 2px;
4584            height: auto;
4585            transform: scaleY(0);
4586            transform-origin: top
4587        }
4588
4589        .trade.wide:hover .shot::after {
4590            transform: scaleY(1)
4591        }
4592
4593        .trade.wide .body {
4594            justify-content: center;
4595            padding: 34px 38px;
4596            max-width: 62ch
4597        }
4598
4599        .trade.wide h3 {
4600            font-size: 30px
4601        }
4602
4603        .trade.wide p {
4604            font-size: var(--t-body)
4605        }
4606
4607        /* compact ruled entries for the non-trade set: no photo, mark leads the row */
4608        /* The row variant carries no photo, so it is the V2 service index: a
4609           hairline over each row, the name, the description, and the tag with
4610           an arrow that slides on hover. It used to be a filled bar with a
4611           gradient stripe running down its left edge and an icon opposite. */
4612        .trade-plate:has(.trade.row) {
4613            gap: 0;
4614            border-bottom: 1px solid var(--line-2)
4615        }
4616
4617        .trade.row {
4618            flex-direction: row;
4619            align-items: center;
4620            gap: clamp(14px, 2vw, 28px);
4621            padding: 22px clamp(4px, 1vw, 12px);
4622            border-top: 1px solid var(--line-2)
4623        }
4624
4625        /* the icon mark goes with the boxes */
4626        .trade.row .mark {
4627            display: none
4628        }
4629
4630        .trade.row h3 {
4631            flex: 0 0 clamp(190px, 21vw, 270px);
4632            font-family: var(--serif);
4633            font-weight: 400;
4634            font-size: clamp(19px, 1.8vw, 24px);
4635            letter-spacing: -.01em;
4636            color: var(--paper);
4637            transition: color .3s var(--ease)
4638        }
4639
4640        .trade.row:hover h3 {
4641            color: var(--signal)
4642        }
4643
4644        .trade.row .go em {
4645            display: inline-block;
4646            color: var(--signal);
4647            font-style: normal;
4648            transition: transform .3s var(--ease-out)
4649        }
4650
4651        .trade.row:hover .go em {
4652            transform: translateX(6px)
4653        }
4654
4655        .trade.row p {
4656            flex: 1
4657        }
4658
4659        .trade.row .go {
4660            margin: 0;
4661            padding: 0;
4662            flex: 0 0 auto
4663        }
4664
4665        @media (max-width: 1240px) {
4666            .trade-plate.cols-4 {
4667                grid-template-columns:repeat(3, 1fr)
4668            }
4669        }
4670
4671        @media (max-width: 940px) {
4672            .trade-plate.cols-4 {
4673                grid-template-columns:repeat(2, 1fr)
4674            }
4675        }
4676
4677        @media (max-width: 1100px) {
4678            .trade-plate.cols-3 {
4679                grid-template-columns:repeat(2, 1fr)
4680            }
4681
4682            .trade.row h3 {
4683                flex-basis: 210px
4684            }
4685
4686            .trade.row .go span {
4687                display: none
4688            }
4689        }
4690
4691        @media (max-width: 640px) {
4692            .trade-plate.cols-4 {
4693                grid-template-columns:1fr
4694            }
4695
4696            .trade-plate.cols-3 {
4697                grid-template-columns:1fr
4698            }
4699
4700            .trade.wide {
4701                flex-direction: column
4702            }
4703
4704            .trade.wide .shot {
4705                flex: none;
4706                aspect-ratio: 16/9;
4707                min-height: 0
4708            }
4709
4710            .trade.wide .shot::after {
4711                top: 0;
4712                bottom: auto;
4713                left: 0;
4714                right: 0;
4715                width: auto;
4716                height: 2px;
4717                transform: scaleX(0);
4718                transform-origin: left
4719            }
4720
4721            .trade.wide:hover .shot::after {
4722                transform: scaleX(1)
4723            }
4724
4725            .trade.wide .body {
4726                padding: 22px 24px 20px
4727            }
4728
4729            .trade.wide h3 {
4730                font-size: 24px
4731            }
4732
4733            .trade.row {
4734                flex-direction: column;
4735                align-items: flex-start;
4736                gap: 10px;
4737                padding: 22px 24px
4738            }
4739
4740            .trade.row h3 {
4741                flex: none
4742            }
4743
4744            .trade.row .go span {
4745                display: inline
4746            }
4747        }
4748
4749        @media (prefers-reduced-motion: reduce) {
4750            .trade, .trade .shot i, .trade .shot::after, .trade .mark, .trade .go, .trade .go em, .trade.row::before {
4751                transition: none
4752            }
4753
4754            .trade:hover .shot i {
4755                transform: scale(1.01)
4756            }
4757        }
4758
4759        /* ====== CONVO ====== */
4760        .convo {
4761            display: flex;
4762            flex-direction: column;
4763            gap: 14px;
4764            max-width: 760px;
4765            margin: 0 auto;
4766            font-family: var(--mono);
4767            font-size: 13px
4768        }
4769
4770        .convo .bub {
4771            padding: 14px 18px;
4772            border-radius: 14px;
4773            border: 1px solid var(--line);
4774            max-width: 78%;
4775            line-height: 1.55;
4776            position: relative;
4777            opacity: 0;
4778            transform: translateY(12px) scale(.97);
4779            transition: opacity .55s var(--ease-out), transform .55s var(--ease-out)
4780        }
4781
4782        .convo .bub.in {
4783            opacity: 1;
4784            transform: translateY(0) scale(1)
4785        }
4786
4787        .convo .bub.caller {
4788            align-self: flex-start;
4789            background: rgba(49, 138, 190, .06);
4790            border-color: rgba(49, 138, 190, .25);
4791            color: var(--paper);
4792            border-bottom-left-radius: 4px
4793        }
4794
4795        .convo .bub.agent {
4796            align-self: flex-end;
4797            background: color-mix(in srgb, var(--signal) 6%, transparent);
4798            border-color: color-mix(in srgb, var(--signal) 25%, transparent);
4799            color: var(--paper);
4800            border-bottom-right-radius: 4px
4801        }
4802
4803        .convo .bub .lbl {
4804            font-size: 9px;
4805            color: var(--mute);
4806            text-transform: uppercase;
4807            letter-spacing: .2em;
4808            display: block;
4809            margin-bottom: 6px
4810        }
4811
4812        .convo .bub.caller .lbl {
4813            color: var(--plasma-bright)
4814        }
4815
4816        .convo .bub.agent .lbl {
4817            color: var(--signal)
4818        }
4819
4820        /* Typing indicator inside .convo */
4821        .convo-typing {
4822            align-self: flex-end;
4823            background: color-mix(in srgb, var(--signal) 6%, transparent);
4824            border: 1px solid color-mix(in srgb, var(--signal) 25%, transparent);
4825            border-radius: 14px;
4826            border-bottom-right-radius: 4px;
4827            padding: 14px 18px;
4828            display: none;
4829            align-items: center;
4830            gap: 10px;
4831            opacity: 0;
4832            transition: opacity .25s ease
4833        }
4834
4835        .convo-typing.on {
4836            display: inline-flex;
4837            opacity: 1
4838        }
4839
4840        .convo-typing.caller {
4841            align-self: flex-start;
4842            background: rgba(49, 138, 190, .06);
4843            border-color: rgba(49, 138, 190, .25);
4844            border-bottom-left-radius: 4px;
4845            border-bottom-right-radius: 14px
4846        }
4847
4848        .convo-typing .lbl {
4849            font-size: 9px;
4850            color: var(--signal);
4851            text-transform: uppercase;
4852            letter-spacing: .2em
4853        }
4854
4855        .convo-typing.caller .lbl {
4856            color: var(--plasma-bright)
4857        }
4858
4859        .convo-typing .dotset {
4860            display: inline-flex;
4861            gap: 4px;
4862            align-items: center
4863        }
4864
4865        .convo-typing .dotset i {
4866            width: 6px;
4867            height: 6px;
4868            border-radius: 50%;
4869            background: var(--signal);
4870            opacity: .4;
4871            animation: typingDot 1.2s ease-in-out infinite
4872        }
4873
4874        .convo-typing.caller .dotset i {
4875            background: var(--plasma)
4876        }
4877
4878        .convo-typing .dotset i:nth-child(2) {
4879            animation-delay: .2s
4880        }
4881
4882        .convo-typing .dotset i:nth-child(3) {
4883            animation-delay: .4s
4884        }
4885
4886        /* ====== INTEGRATION LOGOS ROW ====== */
4887        .integrations {
4888            display: grid;
4889            grid-template-columns:repeat(6, 1fr);
4890            gap: 1px;
4891            background: var(--line);
4892            border-top: 1px solid var(--line);
4893            border-bottom: 1px solid var(--line);
4894            overflow: hidden
4895        }
4896
4897        .integrations .ig {
4898            padding: 24px;
4899            background: var(--ink);
4900            display: flex;
4901            align-items: center;
4902            justify-content: center;
4903            font-family: var(--serif);
4904            font-size: 18px;
4905            color: var(--bone);
4906            transition: .25s;
4907            text-align: center
4908        }
4909
4910        .integrations .ig:hover {
4911            background: var(--ink-3);
4912            color: var(--paper)
4913        }
4914
4915        .integrations .ig small {
4916            font-family: var(--mono);
4917            font-size: var(--t-label);
4918            color: var(--mute);
4919            letter-spacing: .14em;
4920            text-transform: uppercase;
4921            display: block;
4922            margin-top: 4px
4923        }
4924
4925        /* ====== PAGE INDICATORS ====== */
4926        .crumb {
4927            font-family: var(--mono);
4928            font-size: 11px;
4929            color: var(--mute);
4930            text-transform: uppercase;
4931            letter-spacing: .18em;
4932            display: flex;
4933            gap: 10px;
4934            align-items: center
4935        }
4936
4937        .crumb a {
4938            color: var(--mute);
4939            transition: .25s
4940        }
4941
4942        .crumb a:hover {
4943            color: var(--signal)
4944        }
4945
4946        /* ====== RESPONSIVE ====== */
4947        @media (max-width: 1100px) {
4948            .hero-shell, .slab, .editorial, .app {
4949                grid-template-columns:1fr;
4950                gap: 48px
4951            }
4952
4953            .metric {
4954                grid-column: span 6
4955            }
4956
4957            .metric.wide {
4958                grid-column: span 12
4959            }
4960
4961            .tiers {
4962                grid-template-columns:1fr
4963            }
4964
4965            .nav ul {
4966                display: none
4967            }
4968
4969            /* Collapsed nav: the Agents menu stops being a floating panel and
4970               becomes an inline accordion inside the stacked menu, opened by
4971               tapping (never by hover, which does not exist on touch). */
4972            .nav-drop {
4973                width: 100%
4974            }
4975
4976            .nav-drop-btn {
4977                width: 100%;
4978                justify-content: flex-start
4979            }
4980
4981            .nav-drop-chev {
4982                margin-left: auto
4983            }
4984
4985            .nav-drop:hover .nav-drop-panel,
4986            .nav-drop:focus-within .nav-drop-panel {
4987                display: none
4988            }
4989
4990            .nav-drop.is-open .nav-drop-panel {
4991                display: grid
4992            }
4993
4994            /* No hover on touch, and the panel is inline here, so the bridge
4995               has nothing to bridge. */
4996            .nav-drop-panel::before {
4997                display: none
4998            }
4999
5000            .nav-drop-panel {
5001                position: static;
5002                min-width: 0;
5003                width: 100%;
5004                grid-template-columns: 1fr;
5005                gap: 14px;
5006                margin: 6px 0 4px;
5007                padding: 12px;
5008                max-height: min(58vh, 460px);
5009                overflow-y: auto;
5010                -webkit-overflow-scrolling: touch;
5011                box-shadow: none;
5012                background: var(--ink-3)
5013            }
5014
5015            .nav ul .nav-drop-panel a {
5016                padding: 10px
5017            }
5018
5019            /* Stacked on mobile, so there is no second column to line up with. */
5020            .nav ul .nav-drop-all {
5021                margin-top: 6px
5022            }
5023
5024            /* Descriptions are noise on a small screen; the labels carry it. */
5025            .nav ul .nav-drop-panel a em {
5026                display: none
5027            }
5028
5029            /* Collapsed nav: the wide signup-plus-number pill gives way to a
5030               compact call button that actually dials (this is a phone), and
5031               the full number stays in the footer. Sign in + CTA keep their
5032               places. */
5033            .nav .actions .num-signup {
5034                display: none
5035            }
5036
5037            .nav .actions .num-call {
5038                display: inline-flex
5039            }
5040
5041            .menu-btn {
5042                display: inline-flex;
5043                align-items: center;
5044                justify-content: center;
5045                width: 38px;
5046                height: 38px;
5047                border: 1px solid var(--line-2);
5048                border-radius: 8px
5049            }
5050
5051            .foot-grid {
5052                grid-template-columns:1fr 1fr;
5053                gap: 32px
5054            }
5055
5056            .steps {
5057                grid-template-columns:1fr
5058            }
5059
5060            .steps::before {
5061                display: none
5062            }
5063
5064            .integrations {
5065                grid-template-columns:repeat(3, 1fr)
5066            }
5067
5068            .form .row {
5069                grid-template-columns:1fr
5070            }
5071
5072            .form .radios {
5073                grid-template-columns:1fr
5074            }
5075        }
5076
5077        @media (max-width: 640px) {
5078            .nav {
5079                grid-template-columns:1fr auto;
5080                gap: 12px;
5081                padding: 14px var(--shell-pad)
5082            }
5083
5084            /* Small phones: also drop Sign in (still in the footer), leaving
5085               toggle + call icon + Start free + menu. The call icon stays: a
5086               phone is the one place the number can actually be rung. */
5087            .nav .actions .num {
5088                display: none
5089            }
5090
5091            .nav .actions .num-call {
5092                display: inline-flex
5093            }
5094
5095            /* Tighter again on a short screen, where the fold is the whole
5096               argument and every pixel above the headline is spent. */
5097            .hero {
5098                padding-top: 96px
5099            }
5100
5101            .hero-meta {
5102                gap: 24px 32px
5103            }
5104
5105            .hero-meta dd {
5106                font-size: 24px
5107            }
5108
5109            .slab-l, .app {
5110                padding: 36px 28px
5111            }
5112
5113            .slab-r {
5114                padding: 48px 0;
5115                min-height: 480px
5116            }
5117
5118            .metric {
5119                grid-column: span 12
5120            }
5121
5122            .foot-grid {
5123                grid-template-columns:1fr
5124            }
5125
5126            .editorial {
5127                gap: 32px
5128            }
5129
5130            .endcta .num-big {
5131                font-size: 32px;
5132                padding: 16px 24px
5133            }
5134
5135            .strip {
5136                font-size: 24px
5137            }
5138
5139            /* Pricing tier cards on phones: tighter padding + smaller price so $
5140        129/mo fits */
5141            .tier {
5142                padding: 28px 22px;
5143                gap: 18px
5144            }
5145
5146            .tier .price {
5147                font-size: 48px
5148            }
5149
5150            .tier .price small {
5151                font-size: 12px
5152            }
5153
5154            .tier .name {
5155                font-size: 10px
5156            }
5157
5158            .tier .desc {
5159                padding-top: 16px
5160            }
5161
5162            .tier ul {
5163                font-size: 13px
5164            }
5165
5166            .tier ul li {
5167                gap: 8px
5168            }
5169
5170            /* Pricing FAQ */
5171            .pricing-faq-grid {
5172                grid-template-columns:1fr !important
5173            }
5174        }
5175    </style>
5176
5177        <link rel="preload" as="image" type="image/webp" fetchpriority="high"
5178          href="https://talkify.nz/media/frontend/hero-phone-day.webp">
5179    
5180    <style>
5181        .hero-film { display: inline-flex; align-items: center; gap: 14px; margin-top: 22px; color: inherit; text-decoration: none; }
5182        .hero-film__thumb { position: relative; width: 104px; aspect-ratio: 16 / 9; border-radius: 10px; background: #0a1016 center / cover no-repeat;
5183            box-shadow: 0 8px 24px rgba(0, 0, 0, .25); display: grid; place-items: center; color: #fff; flex: none; }
5184        .hero-film__thumb::after { content: ''; position: absolute; inset: 0; border-radius: inherit; background: rgba(10, 16, 22, .35); transition: background .2s; }
5185        .hero-film__thumb svg { position: relative; z-index: 1; width: 26px; height: 26px; filter: drop-shadow(0 1px 4px rgba(0, 0, 0, .5)); }
5186        .hero-film:hover .hero-film__thumb::after, .hero-film:focus-visible .hero-film__thumb::after { background: rgba(49, 138, 190, .55); }
5187        .hero-film__text { display: grid; gap: 2px; line-height: 1.25; }
5188        .hero-film__text b { font-weight: 600; text-decoration: underline; text-decoration-color: transparent; text-underline-offset: 3px; transition: text-decoration-color .2s; }
5189        .hero-film:hover .hero-film__text b { text-decoration-color: currentColor; }
5190        .hero-film__text small { font-family: var(--mono); font-size: 12px; letter-spacing: .06em; text-transform: uppercase; opacity: .7; }
5191        /* The grid centres its columns, and the copy column is the taller one,
5192           so the demo sat low with a dead band above it. Top it out level with
5193           the headline instead (h1.display's own 28px top margin). */
5194        .hero-demo { align-self: start; margin-top: 28px; }
5195        .hero-demo .hero-film { margin-top: 18px; }
5196    </style>
5197    <style>
5198        /* Outbound demo stepper: calling/done visuals on the site palette */
5199        .od-ringwrap {
5200            position: relative;
5201            width: 110px;
5202            height: 110px;
5203            margin: 6px auto 0;
5204            display: grid;
5205            place-items: center
5206        }
5207
5208        .od-core {
5209            width: 54px;
5210            height: 54px;
5211            border-radius: 50%;
5212            background: var(--signal);
5213            color: var(--ink-2);
5214            display: grid;
5215            place-items: center;
5216            animation: od-pulse 1.3s ease-in-out infinite
5217        }
5218
5219        .od-ring {
5220            position: absolute;
5221            width: 54px;
5222            height: 54px;
5223            border-radius: 50%;
5224            border: 2px solid var(--signal);
5225            opacity: .7;
5226            animation: od-rip 2.4s ease-out infinite
5227        }
5228
5229        .od-ring.od-r2 {
5230            animation-delay: .8s
5231        }
5232
5233        .od-ring.od-r3 {
5234            animation-delay: 1.6s
5235        }
5236
5237        @keyframes od-rip {
5238            0% {
5239                transform: scale(1);
5240                opacity: .7
5241            }
5242            100% {
5243                transform: scale(2.1);
5244                opacity: 0
5245            }
5246        }
5247
5248        @keyframes od-pulse {
5249            0%, 100% {
5250                transform: scale(1)
5251            }
5252            50% {
5253                transform: scale(1.08)
5254            }
5255        }
5256
5257        .od-check {
5258            width: 72px;
5259            height: 72px;
5260            margin: 6px auto 0;
5261            border-radius: 50%;
5262            display: grid;
5263            place-items: center;
5264            border: 2px solid var(--signal);
5265            color: var(--signal);
5266            background: color-mix(in srgb, var(--signal) 10%, transparent)
5267        }
5268
5269        .od-dots::after {
5270            content: '';
5271            animation: od-dots 1.4s steps(4, end) infinite
5272        }
5273
5274        @keyframes od-dots {
5275            0% {
5276                content: ''
5277            }
5278            25% {
5279                content: '.'
5280            }
5281            50% {
5282                content: '..'
5283            }
5284            75% {
5285                content: '...'
5286            }
5287        }
5288
5289        #odSteps .on {
5290            color: var(--signal)
5291        }
5292
5293        /* ============ PHONE ============
5294           This is the thing on the homepage that lets somebody hear the product,
5295           and on a phone it was the weakest part of the page: a squashed action
5296           row with the button jammed against the caption, the step indicator
5297           overflowing, and 28px of padding eating a 375px screen.
5298
5299           Nothing below changes the desktop layout. */
5300        /* The card is the one thing on the hero a visitor can actually use,
5301           and it sat on the photograph as a soft-edged panel that the eye slid
5302           off. It has an edge now: a hairline all the way round and the brand
5303           gradient across the top, the same rule the ruled blocks use, so it
5304           reads as a thing to fill in rather than another pane of the image
5305           behind it. */
5306        .od-deck {
5307            position: relative;
5308            border: 1px solid var(--line);
5309            /* Two shadows: a tight one for the edge so the card reads as a
5310               real surface, and a wide soft one for the lift off the photo. */
5311            box-shadow: 0 1px 2px rgba(16, 24, 32, .07),
5312                        0 28px 70px -28px rgba(16, 24, 32, .38);
5313            overflow: hidden;
5314        }
5315
5316        .od-title {
5317            font-family: var(--serif);
5318            font-size: clamp(19px, 1.7vw, 22px);
5319            font-weight: 600;
5320            letter-spacing: var(--ls-head);
5321            line-height: 1.2;
5322            color: var(--paper);
5323        }
5324
5325        .od-deck::before {
5326            content: "";
5327            position: absolute;
5328            inset: 0 0 auto;
5329            height: 3px;
5330            background: var(--grad);
5331        }
5332
5333        @media (max-width: 640px) {
5334            /* The padding is set inline by the caller, so this has to outrank it. */
5335            .od-deck {
5336                padding: 22px 18px !important;
5337            }
5338
5339            /* The action row is a caption and a button held apart by
5340               space-between. At this width there is nothing to hold apart, so
5341               they stacked into a ragged two-line mess. The button leads,
5342               full width, and the caption sits under it as a footnote. */
5343            .od-deck .actions {
5344                flex-direction: column-reverse;
5345                align-items: stretch;
5346                gap: 12px;
5347            }
5348
5349            .od-deck .actions .btn {
5350                width: 100%;
5351                justify-content: center;
5352            }
5353
5354            .od-deck .actions .note {
5355                text-align: center;
5356                justify-content: center;
5357            }
5358
5359            /* Three steps and two connectors do not fit across 375px. */
5360            .od-deck #odSteps {
5361                flex-wrap: wrap;
5362                gap: 6px 8px;
5363                font-size: 9.5px;
5364                letter-spacing: .1em;
5365            }
5366
5367            /* Give the block a proper heading rather than a 11px mono label, so
5368               it reads as an invitation instead of a form caption. */
5369            .od-deck > div:first-child {
5370                margin-bottom: 18px;
5371                padding-bottom: 14px;
5372            }
5373
5374            .od-deck > div:first-child > span:first-child {
5375                font-family: var(--serif) !important;
5376                font-size: 21px !important;
5377                letter-spacing: -.01em !important;
5378                text-transform: none !important;
5379                color: var(--paper) !important;
5380            }
5381
5382            .od-deck > p {
5383                font-size: 14.5px !important;
5384                line-height: 1.6 !important;
5385            }
5386
5387            /* The code field is 24px with .4em of tracking, which ran past the
5388               edge of the field on a narrow screen. */
5389            .od-deck #od-code {
5390                font-size: 20px !important;
5391                letter-spacing: .28em !important;
5392            }
5393
5394            /* Touch targets. These are bare buttons styled as links. */
5395            .od-deck #odChangeBtn,
5396            .od-deck #odResendBtn,
5397            .od-deck #odAgainBtn {
5398                padding: 8px 2px !important;
5399            }
5400
5401            .od-deck .od-ringwrap {
5402                width: 92px;
5403                height: 92px;
5404            }
5405        }
5406    </style>
5407<style>
5408  .pv { scroll-margin-top: 90px; }
5409  .pv-frame { position:relative; max-width:1120px; margin:0 auto; border-radius:18px; overflow:hidden; background:#0a1016;
5410    border:1px solid rgba(255,255,255,0.08); box-shadow:0 30px 80px rgba(0,0,0,0.35); aspect-ratio:16/9; }
5411  .pv-frame video { display:block; width:100%; height:100%; object-fit:cover; background:#0a1016; }
5412  .pv-sound { position:absolute; right:16px; top:16px; display:inline-flex; align-items:center; gap:8px; padding:10px 16px; border:0; border-radius:10px;
5413    background:rgba(10,16,22,0.78); color:#fff; font:600 15px/1 inherit; cursor:pointer; backdrop-filter:blur(4px); }
5414  .pv-sound svg { width:18px; height:18px; }
5415  .pv-sound:hover, .pv-sound:focus-visible { background:rgba(49,138,190,0.95); outline:none; }
5416  .pv-transcript { max-width:1120px; margin:18px auto 0; font-size:15px; line-height:1.6; color:var(--muted, #8a9aa8); }
5417  .pv-transcript summary { cursor:pointer; width:max-content; max-width:100%; }
5418  .pv-transcript p { margin:10px 0 0; max-width:70ch; }
5419</style>
5420<style>
5421  /* Six named rows, and every profile is a subgrid spanning all six. That is
5422     what makes the portraits, the names, the bios, the quotes and the prices
5423     line up across the row: each row takes the height of the tallest profile,
5424     so a long bio pushes every quote down together rather than only its own.
5425     Doing it with padding would need the copy to stay the length it is today. */
5426  .roster{margin-top:clamp(28px,4vw,46px);display:grid;
5427    grid-template-columns:repeat(5,minmax(0,1fr));
5428    grid-template-rows:auto auto auto auto auto auto;
5429    column-gap:clamp(18px,2.2vw,32px)}
5430
5431  /* Ruled, not boxed: a hairline along the top that fills with the brand
5432     gradient when the block reveals, and no fill or radius on the column
5433     itself. Nothing lifts on hover. */
5434  .ag{position:relative;grid-row:span 6;display:grid;grid-template-rows:subgrid;
5435    color:inherit;padding-top:18px;border-top:1px solid var(--line)}
5436
5437  /* Safari before 16 and Firefox before 71 have no subgrid. They fall back to
5438     the old column, which reads correctly, just without the shared baselines. */
5439  @supports not (grid-template-rows: subgrid){
5440    .roster{grid-template-rows:none;row-gap:clamp(18px,2.2vw,32px)}
5441    .ag{grid-row:auto;display:flex;flex-direction:column}
5442  }
5443  .ag::before{content:"";position:absolute;
5443left:0;top:-1px;height:1px;width:0;
5444    background:var(--grad);transition:width .7s var(--ease-out)}
5445  .roster.in .ag::before{width:100%}
5446    .roster.in .ag:nth-child(1)::before{transition-delay:0.08s}
5447    .roster.in .ag:nth-child(2)::before{transition-delay:0.16s}
5448    .roster.in .ag:nth-child(3)::before{transition-delay:0.24s}
5449    .roster.in .ag:nth-child(4)::before{transition-delay:0.32s}
5450    .roster.in .ag:nth-child(5)::before{transition-delay:0.4s}
5451    /* The name is the link, stretched over the whole profile; the button sits
5452     above the stretch so it is a control of its own. */
5453  .ag-link{color:inherit;text-decoration:none}
5454  .ag-link::after{content:"";position:absolute;inset:0;z-index:1}
5455  .ag-link:focus-visible{outline:none}
5456  .ag:has(.ag-link:focus-visible){outline:2px solid var(--signal);outline-offset:4px}
5457
5458  /* "Hear it": a quiet mono control, not a pill. */
5459  .ag-hear{position:relative;z-index:2;align-self:start;display:inline-flex;align-items:center;gap:8px;
5460    padding:7px 12px 7px 9px;border:1px solid var(--line);border-radius:4px;background:transparent;
5461    color:var(--paper);font-family:var(--mono);font-size:10px;letter-spacing:var(--ls-label);
5462    text-transform:uppercase;cursor:pointer;transition:border-color .25s var(--ease),color .25s var(--ease)}
5463  .ag-hear svg{width:14px;height:14px;color:var(--signal)}
5464  .ag-hear small{font-size:9px;color:var(--mute);letter-spacing:var(--ls-label)}
5465  .ag-hear:hover,.ag-hear:focus-visible{border-color:var(--signal)}
5466  .ag-hear:focus-visible{outline:2px solid var(--signal);outline-offset:2px}
5467  .ag-hear .ag-hear-stop{display:none}
5468  .ag.speaking .ag-hear{border-color:var(--signal)}
5469  .ag.speaking .ag-hear .ag-hear-play{display:none}
5470  .ag.speaking .ag-hear .ag-hear-stop{display:inline}
5471
5472  /* What the voice is saying, over the bottom of the portrait while it
5473     speaks: a dark band, each word dim until said. Over the art rather than
5474     in the copy, so nothing in the row moves. */
5475  .ag-shot > .ag-cap{position:absolute;left:0;right:0;bottom:0;width:auto;height:auto;z-index:1;
5476    padding:46px 14px 13px;background:linear-gradient(180deg,rgba(8,14,20,0),rgba(8,14,20,.9) 42%);
5477    font-size:12.5px;line-height:1.45;color:rgba(255,255,255,.38);text-align:left;
5478    opacity:0;transition:opacity .25s var(--ease)}
5479  .ag-cap .w{transition:color .18s var(--ease)}
5480  .ag-cap .w.on{color:#fff}
5481  .ag.speaking .ag-cap{opacity:1}
5482
5483  /* The portrait wakes: its ground comes up as on hover, the figure floats,
5484     and a waveform runs along the bottom while anyone is speaking. */
5485  .ag-shot > .ag-wave{position:absolute;left:0;right:0;top:12px;width:auto;height:26px;
5486    display:flex;align-items:center;justify-content:center;gap:4px;opacity:0;transition:opacity .25s var(--ease)}
5487  .ag-wave i{display:block;width:4px;height:6px;border-radius:2px;background:#fff}
5488  .ag.speaking .ag-wave{opacity:.9}
5489  .ag.speaking .ag-wave i{animation:ag-wave .9s ease-in-out infinite}
5490    .ag-wave i:nth-child(1){animation-delay:0s}
5491    .ag-wave i:nth-child(2){animation-delay:0.32s}
5492    .ag-wave i:nth-child(3){animation-delay:0.12s}
5493    .ag-wave i:nth-child(4){animation-delay:0.5s}
5494    .ag-wave i:nth-child(5){animation-delay:0.2s}
5495    .ag-wave i:nth-child(6){animation-delay:0.4s}
5496    .ag-wave i:nth-child(7){animation-delay:0.06s}
5497    @keyframes ag-wave{0%,100%{height:5px}50%{height:22px}}
5498  .ag.speaking .tk-ground-hot{opacity:1}
5499  .ag.speaking .tk-figure{animation:tk-float 1.6s ease-in-out infinite}
5500
5501  /* Square, and never anything else: the art is composed to a 1:1 crop with
5502     the figure running to the bottom edge, so letterboxing it cuts the
5503     drawing. The brief also sets a 120px floor, below which the badge closes
5504     up, which is why the phone thumbnail is 120 and not smaller. */
5505  .ag-shot{position:relative;aspect-ratio:1/1;overflow:hidden;border-radius:4px;
5506    background:var(--ink-2);display:grid;place-items:center}
5507  .ag-shot > *{display:block;width:100%;height:100%}
5508
5509  /* the stand-in: the agent's initial on the brand gradient */
5510  .ag-mono{display:grid;place-items:center;width:100%;height:100%;
5511    background:var(--grad);color:var(--on-accent);
5512    font-family:var(--serif);font-size:clamp(44px,5vw,64px);font-weight:600;
5513    letter-spacing:-.03em;line-height:1}
5514
5515  .ag-name{font-size:clamp(18px,1.5vw,21px);font-weight:600;letter-spacing:var(--ls-head);
5516    color:var(--paper);margin:16px 0 0;display:flex;align-items:baseline;gap:8px;
5517    transition:color .3s var(--ease)}
5518  /* the qualifier is a mono word, not a pill: the guide has no pills */
5519  .ag-name em{font-family:var(--mono);font-style:normal;font-size:9px;font-weight:500;
5520    letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--signal)}
5521  .ag:hover .ag-name{color:var(--signal)}
5522
5523  .ag-role{font-family:var(--mono);font-size:10px;letter-spacing:var(--ls-label);
5524    text-transform:uppercase;color:var(--mute);margin:7px 0 0}
5525
5526  .ag-bio{font-size:var(--t-small);line-height:1.55;color:var(--bone);margin:13px 0 0}
5527
5528  /* the agent in its own voice, ruled down the left the way the guide rules a
5529     quote, so a profile carries a line of proof rather than only a claim */
5530  .ag-said{margin:15px 0 0;padding-left:13px;border-left:2px solid var(--blue);
5531    font-size:13px;line-height:1.5;color:var(--paper)}
5532  .ag-said::before{content:"\201C"}
5533  .ag-said::after{content:"\201D"}
5534
5535  .ag-foot{align-self:end;padding-top:18px;display:flex;flex-direction:column;gap:9px}
5536  .ag-price{font-family:var(--mono);font-size:var(--t-label);letter-spacing:var(--ls-label);
5537    text-transform:uppercase;color:var(--mute)}
5538  .ag-price b{font-family:var(--serif);font-size:16px;font-weight:600;letter-spacing:-.01em;
5539    color:var(--paper);text-transform:none}
5540  .ag-go{font-family:var(--mono);font-size:10px;letter-spacing:var(--ls-label);
5541    text-transform:uppercase;color:var(--mute);display:inline-flex;align-items:center;gap:8px;
5542    transition:color .3s var(--ease)}
5543  .ag-go .arr{font-style:normal;transition:transform .3s var(--ease-out)}
5544  .ag:hover .ag-go{color:var(--paper)}
5545  .ag:hover .ag-go .arr{transform:translateX(4px)}
5546
5547  /* row-gap would open a gap between every one of the six subgrid rows, not
5548     just between bands of profiles, so the space under a profile is carried by
5549     its own last row instead. */
5550  .ag-foot{padding-bottom:6px}
5551
5552  @media (max-width:1180px){
5553    .roster{grid-template-columns:repeat(3,minmax(0,1fr))}
5554    .ag-foot{padding-bottom:38px}
5555  }
5556  @media (max-width:820px){
5557    .roster{grid-template-columns:repeat(2,minmax(0,1fr))}
5558    .ag-bio{font-size:13.5px}
5559  }
5560  @media (max-width:520px){
5561    /* One per row on a phone, with the portrait beside the copy rather than
5562       five full-width images to scroll past. Subgrid is dropped here: with one
5563       profile per row there is nothing left to line up against. */
5564    .roster{grid-template-columns:1fr;grid-template-rows:none}
5565    .ag{grid-row:auto;
5566      grid-template-columns:120px minmax(0,1fr);
5567      grid-template-rows:auto auto auto auto;
5568      grid-template-areas:"shot name" "shot role" "shot bio" "foot foot";
5569      column-gap:16px;padding:18px 0 0}
5570    .ag-shot{grid-area:shot;align-self:start}
5571    .ag-name{grid-area:name;margin-top:0}
5572    .ag-role{grid-area:role}
5573    .ag-bio{grid-area:bio}
5574    .ag-said{display:none}
5575    .ag-foot{grid-area:foot;padding-top:14px;padding-bottom:18px;
5576      flex-direction:row;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:12px 16px}
5577    .ag-hear{flex-basis:100%;justify-content:center}
5578  }
5579
5580  /* Hover lives inside the drawing: the figure floats.
5581     transform-box:fill-box is not optional -- without it a CSS transform on an
5582     SVG group is measured against the whole SVG viewport rather than the
5583     element, so the float travels the wrong distance.
5584
5585     The star wink went with the artwork that had a face. The figure is a
5586     plain silhouette now and carries no star to wink.
5587
5588     The card itself does not lift. The brief asks for translateY(-8px), but
5589     "nothing lifts on hover" is a rule of the site's design language
5590     (docs/frontend-design-language.md), and the float and the ground
5591     cross-fade already make the tile feel live. Say the word and it goes on. */
5592  .ag .tk-figure{transform-box:fill-box}
5593  .ag:hover .tk-figure{animation:tk-float 2.4s ease-in-out infinite}
5594
5595  /* The ground cross-fade. Each tile sits on slate and carries a second
5596     full-bleed rect of brand blue at opacity 0; hovering brings it up. The
5597     inline opacity="0" in the file is a presentation attribute, so any CSS
5598     rule outranks it and this needs no !important. */
5599  .tk-ground-hot{opacity:0;transition:opacity 340ms ease}
5600  .ag:hover .tk-ground-hot{opacity:1}
5601
5602  @keyframes tk-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}}
5603
5604  @media (prefers-reduced-motion: reduce){
5605    .ag::before{transition:none}
5606    .ag-go,.ag-go .arr,.ag-name{transition:none}
5607    .ag:hover .tk-figure,.ag.speaking .tk-figure{animation:none}
5608    .ag.speaking .ag-wave i{animation:none;height:12px}
5609    /* the ground still changes on hover, it just stops sliding there */
5610    .tk-ground-hot{transition:none}
5611  }
5612</style>
5613<style>
5614  /* The sector kicker: a 28px rule then mono caps, which is how the guide
5615     sets a kicker. Four groups in the same order as the Industries menu, so
5616     somebody who found their trade in the nav finds it in the same place
5617     here. Twenty-two tiles in one alphabetical run meant a plumber read past
5618     the Chinese takeaways to reach their own trade. */
5619  .trade-sector{margin:clamp(34px,4vw,54px) 0 clamp(16px,1.8vw,24px);
5620    font-family:var(--mono);font-size:var(--t-label);font-weight:500;
5621    letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--mute);
5622    display:flex;align-items:center;gap:14px}
5623  .trade-sector::before{content:"";flex:0 0 28px;height:1px;background:var(--signal)}
5624  .trade-sector:first-of-type{margin-top:clamp(24px,3vw,36px)}
5625</style>
5626    <style>
5627        .tst {
5628            position: relative
5629        }
5630
5631        /* scroll-snap does the paging, so the rail still works with JS off and keeps
5632           native touch momentum on mobile */
5633        .tst-track {
5634            display: flex;
5635            gap: 36px;
5636            overflow-x: auto;
5637            scroll-snap-type: x mandatory;
5638            scroll-behavior: smooth;
5639            padding: 2px 2px 6px;
5640            margin: 0 -2px;
5641            scrollbar-width: none;
5642            -ms-overflow-style: none
5643        }
5644
5645        .tst-track::-webkit-scrollbar {
5646            display: none
5647        }
5648
5649        /* V2 design language: a review is a top-ruled column, not a filled card.
5650           The rule fills with the brand gradient on hover, the way every other
5651           ruled block on the site does. */
5652        .tst-card {
5653            position: relative;
5654            flex: 0 0 calc((100% - 72px) / 3);
5655            scroll-snap-align: start;
5656            padding: 28px 0 0;
5657            display: flex;
5658            flex-direction: column;
5659            gap: 16px
5660        }
5661
5662        .tst-card::before, .tst-card::after {
5663            content: "";
5664            position: absolute;
5665            top: 0;
5666            left: 0;
5667            right: 0;
5668            height: 1px
5669        }
5670
5671        .tst-card::before {
5672            background: var(--line-2)
5673        }
5674
5675        .tst-card::after {
5676            background: var(--grad);
5677            transform: scaleX(0);
5678            transform-origin: left;
5679            transition: transform .5s var(--ease-out)
5680        }
5681
5682        .tst-card:hover::after {
5683            transform: scaleX(1)
5684        }
5685
5686        .tst-top {
5687            display: flex;
5688            justify-content: space-between;
5689            align-items: center
5690        }
5691
5692        .tst-stars {
5693            color: var(--signal);
5694            font-size: 13px;
5695            letter-spacing: 2px
5696        }
5697
5698        .tst-badge {
5699            font-family: var(--mono);
5700            font-size: 9.5px;
5701            letter-spacing: .16em;
5702            text-transform: uppercase;
5703            color: var(--mute)
5704        }
5705
5706        .tst-quote {
5707            font-family: var(--serif);
5708            font-weight: 300;
5709            font-size: 17.5px;
5710            line-height: 1.45;
5711            letter-spacing: -.008em;
5712            color: var(--paper);
5713            margin: 0;
5714            flex: 1
5715        }
5716
5717        .tst-quote mark {
5718            background: linear-gradient(180deg, transparent 62%, color-mix(in srgb, var(--signal) 55%, transparent) 62%);
5719            color: inherit;
5720            padding: 0 2px;
5721            -webkit-box-decoration-break: clone;
5722            box-decoration-break: clone
5723        }
5724
5725        /* clamped rather than cut in the markup, so the whole review stays in the DOM
5726           for search engines and screen readers */
5727        .tst-quote.is-clamped {
5728            display: -webkit-box;
5729            -webkit-line-clamp: 7;
5730            -webkit-box-orient: vertical;
5731            overflow: hidden;
5732            flex: 0 0 auto
5733        }
5734
5735        .tst-more-btn {
5736            align-self: flex-start;
5737            font-family: var(--mono);
5738            font-size: 10px;
5739            letter-spacing: .14em;
5740            text-transform: uppercase;
5741            color: var(--mute);
5742            background: none;
5743            border: 0;
5744            border-bottom: 1px solid var(--line-2);
5745            padding: 0 0 3px;
5746            cursor: pointer;
5747            transition: color .25s var(--ease)
5748        }
5749
5750        .tst-more-btn:hover {
5751            color: var(--paper)
5752        }
5753
5754        .tst-more-btn:focus-visible {
5755            outline: 2px solid var(--plasma-bright);
5756            outline-offset: 3px
5757        }
5758
5759        .tst-foot {
5760            display: flex;
5761            align-items: center;
5762            gap: 14px;
5763            margin-top: auto;
5764            border-top: 1px dashed var(--line);
5765            padding-top: 18px
5766        }
5767
5768        .tst-init {
5769            width: 40px;
5770            height: 40px;
5771            border-radius: 50%;
5772            background: var(--grad);
5773            display: grid;
5774            place-items: center;
5775            color: var(--on-accent);
5776            font-family: var(--serif);
5777            font-weight: 500;
5778            font-size: 15px;
5779            flex: 0 0 40px
5780        }
5781
5782        .tst-name {
5783            font-family: var(--sans);
5784            font-size: 14px;
5785            color: var(--paper);
5786            font-weight: 500
5787        }
5788
5789        .tst-role {
5790            font-family: var(--mono);
5791            font-size: 10.5px;
5792            color: var(--mute);
5793            letter-spacing: .04em
5794        }
5795
5796        .tst-controls {
5797            display: flex;
5798            align-items: center;
5799            justify-content: center;
5800            gap: 16px;
5801            margin-top: 26px
5802        }
5803
5804        .tst-arrow {
5805            width: 38px;
5806            height: 38px;
5807            border-radius: 50%;
5808            border: 1px solid var(--line);
5809            background: none;
5810            color: var(--mute);
5811            cursor: pointer;
5812            font-size: 15px;
5813            transition: color .25s var(--ease), border-color .25s var(--ease)
5814        }
5815
5816        .tst-arrow:hover {
5817            color: var(--paper);
5818            border-color: var(--line-2)
5819        }
5820
5821        .tst-arrow:focus-visible {
5822            outline: 2px solid var(--plasma-bright);
5823            outline-offset: 2px
5824        }
5825
5826        .tst-dots {
5827            display: flex;
5828            gap: 8px
5829        }
5830
5831        .tst-dot {
5832            width: 7px;
5833            height: 7px;
5834            border-radius: 50%;
5835            border: 0;
5836            padding: 0;
5837            cursor: pointer;
5838            background: var(--line-2);
5839            transition: background .25s var(--ease), width .25s var(--ease)
5840        }
5841
5842        .tst-dot.is-on {
5843            background: var(--signal);
5844            width: 20px;
5845            border-radius: 4px
5846        }
5847
5848        .tst-dot:focus-visible {
5849            outline: 2px solid var(--plasma-bright);
5850            outline-offset: 3px
5851        }
5852
5853        .tst-more {
5854            margin-top: 26px;
5855            text-align: center
5856        }
5857
5858        .tst-more a {
5859            font-family: var(--mono);
5860            font-size: 11px;
5861            letter-spacing: .16em;
5862            text-transform: uppercase;
5863            color: var(--mute);
5864            display: inline-flex;
5865            align-items: center;
5866            gap: 9px;
5867            padding: 11px 0 6px;
5868            border-bottom: 1px solid var(--line-2);
5869            transition: color .3s var(--ease), border-color .3s var(--ease)
5870        }
5871
5872        .tst-more a:hover {
5873            color: var(--paper);
5874            border-bottom-color: var(--signal)
5875        }
5876
5877        .tst-more .arr {
5878            transition: transform .3s var(--ease-out)
5879        }
5880
5881        .tst-more a:hover .arr {
5882            transform: translateX(4px)
5883        }
5884
5885        @media (max-width: 1100px) {
5886            .tst-card {
5887                flex-basis: calc((100% - 36px) / 2)
5888            }
5889        }
5890
5891        @media (max-width: 720px) {
5892            .tst-card {
5893                flex-basis: 100%
5894            }
5895        }
5896
5897        @media (prefers-reduced-motion: reduce) {
5898            .tst-track {
5899                scroll-behavior: auto
5900            }
5901
5902            .tst-card::after, .tst-arrow, .tst-dot, .tst-more a, .tst-more .arr, .tst-more-btn {
5903                transition: none
5904            }
5905        }
5906    </style>
5907</head>
5908<body data-page="home">
5909<!-- Google Tag Manager (noscript) -->
vendor: 73 bytes, lines 5909-5911
5909
5910<noscript>
5911    <iframe src="https://www.googletagmanager.com/ns.html?id=
5911GTM-TTGHDLQ4
vendor: 97 bytes, lines 5911-5914
5911"
5912            height="0" width="0" style="display:none;visibility:hidden"></iframe>
5913</noscript>
5914
5915<!-- End Google Tag Manager (noscript) -->
5916<div class="grain"></div>
5917<div class="scanlines"></div>
5918<div class="vignette"></div>
5919
5920<nav class="nav">
5921  
5922  <a href="https://talkify.nz" class="logo" aria-label="Talkify, home">
5923    <svg class="tk-logo" viewBox="-3 -3 317.81 106"
5924     width="113.93" height="38"
5925     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
5926            <defs>
5927            <linearGradient id="tkgXIGJlH" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
5928                <stop offset="0" stop-color="#318abe"/>
5929                <stop offset="1" stop-color="#a3d654"/>
5930            </linearGradient>
5931        </defs>
5932        <circle cx="50" cy="50" r="50" fill="url(#tkgXIGJlH)"/>
5933    
5934    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
5935        <path d="M34 26 V54 C34 74 62 80 76 62"/>
5936        <path d="M20 40 H46"/>
5937    </g>
5938    
5939    <g transform="translate(56 20) scale(0.30)">
5940        <g class="tk-eye">
5941            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
5942        </g>
5943    </g>
5944            <path d="M271.37 19.44 L274.1 19.47 L276.98 20.13 L279.56 21.51 L281.93 23.58 L276.86 28.65 L275.24 27.45 L274.04 26.97 L273.32 26.85 L270.62 26.97 L269.6 27.27 L268.28 28.05 L267.23 29.28 L266.57 30.96 L266.39 32.28 L266.39 37.38 L284.84 37.41 L293.66 59.85 L302.99 37.5 L311.81 37.44 L289.55 86.04 L289.34 86.37 L288.98 86.37 L280.61 86.34 L289.25 68.4 L276.89 39.18 L276.8 44.61 L266.39 44.64 L266.36 71.97 L258.47 71.94 L258.47 44.64 L250.19 44.58 L250.19 37.44 L258.44 37.41 L258.47 32.28 L258.71 30 L259.49 27.36 L260.69 25.14 L262.52 23.01 L264.98 21.21 L267.8 20.01 L270.08 19.53ZM190.01 20.16 L197.93 20.16 L197.93 71.94 L190.01 71.94ZM204.53 20.16 L212.45 20.16 L212.48 53.61 L226.46 37.41 L235.85 37.44 L221.33 53.94 L230.24 64.47 L236.57 71.94 L226.52 71.97 L212.48 55.05 L212.45 71.94 L204.53 71.94ZM131.63 23.04 L139.55 23.04 L139.58 37.41 L147.83 37.44 L147.8 44.61 L139.55 44.64 L139.55 71.94 L131.63 71.94 L131.63 44.64 L123.35 44.58 L123.38 37.41 L131.63 37.38ZM164.09 36.72 L167.06 36.81 L170.24 37.59 L171.92 38.37 L173.42 39.33 L175.4 41.19 L175.52 37.41 L183.41 37.44 L183.41 71.94 L175.52 71.97 L175.46 68.25 L174.08 69.57 L172.85 70.44 L170.84 71.55 L169.34 72.09 L167.84 72.45 L165.8 72.69 L163.76 72.69 L161.84 72.45 L159.92 71.97 L158.48 71.43 L156.44 70.35 L154.76 69.15 L152.27 66.66 L150.47 63.96 L149.57 62.04 L148.91 60.06 L148.55 58.5 L148.25 55.86 L148.37 52.2 L148.79 49.86 L149.39 47.88 L149.93 46.56 L151.01 44.58 L152.33 42.72 L153.65 41.28 L156.5 39.03 L158.54 37.95 L159.98 37.41 L161.9 36.93ZM239.21 37.44 L247.13 37.44 L247.13 71.94 L239.21 71.94ZM165.2 44.19 L163.04 44.61 L161.48 45.27 L159.98 46.29 L158.51 47.82 L157.73 49.02 L156.83 51.18 L156.41 53.52 L156.41 55.86 L156.65 57.48 L157.31 59.52 L158.51 61.56 L160.04 63.15 L161.48 64.11 L163.46 64.89 L165.32 65.19 L167.12 65.13 L169.34 64.77 L171.14 63.99 L172.34 63.15 L173.99 61.38 L175.01 59.64 L175.67 57.66 L175.97 55.44 L175.91 53.1 L175.49 51 L174.53 48.78 L173.81 47.7 L172.52 46.35 L170.84 45.21 L169.16 44.55 L167.18 44.19Z" fill="var(--tk-word, #101820)" fill-rule="evenodd"/>
5945        
5946        <g transform="translate(231.30 6.84) scale(0.216)">
5947            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z"
5948                  fill="#a3d654"/>
5949        </g>
5950    </svg>
5951  </a>
5952  <ul>
5953    <li class="nav-drop" data-nav-drop>
5954      <button type="button" class="nav-drop-btn "
5955              aria-expanded="false" aria-controls="nav-agents-menu" aria-haspopup="true">
5956        <span class="dot"></span>Agents
5957        <svg class="nav-drop-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
5958      </button>
5959
5960      
5961      <div class="nav-drop-panel" id="nav-agents-menu">
5962        <div class="nav-drop-col">
5963          <span class="nav-drop-hd">Answering calls</span>
5964          <a href="https://talkify.nz/reception"><span>Reception</span><em>Answers every call, books the job</em></a>
5965          <a href="https://talkify.nz/personal-assistant"><span>Personal Assistant</span><em>Your own PA on the phone</em></a>
5966          <a href="https://talkify.nz/booking-service"><span>Booking Service</span><em>Fills the diary while you work</em></a>
5967          <a href="https://talkify.nz/front-counter"><span>Front Counter</span><em>Orders and bookings on a screen by the till</em></a>
5968          <a href="https://talkify.nz/ai-call-centre"><span>AI Call Centre</span><em>5, 10 or 15 lines at once</em></a>
5969          <span class="nav-drop-hd" style="margin-top:18px">Other channels</span>
5970          <a href="https://talkify.nz/website-chat"><span>Website Chat</span><em>The same agent, in a chat box on your site</em></a>
5971          <a href="https://talkify.nz/calendar"><span>Calendar</span><em>The diary the agent books into</em></a>
5972          <a href="https://talkify.nz/lead-management"><span>Leads</span><em>Every enquiry on one board, whatever door it came through</em></a>
5973                    <a href="https://talkify.nz/agent-coach"><span>Coach</span><em>Your agent listens back to its own calls</em></a>
5974                  </div>
5975        <div class="nav-drop-col">
5976          <span class="nav-drop-hd">Ringing out</span>
5977          <a href="https://talkify.nz/sales-agent"><span>Sales Agent</span><em>Qualifies and follows up leads</em></a>
5978          <a href="https://talkify.nz/outbound-calls"><span>Outbound Calls</span><em>Campaigns, reminders, win-backs</em></a>
5979          <a href="https://talkify.nz/ai-marketing-campaigns"><span>Marketing Campaigns</span><em>Offers, launches and reviews, by phone</em></a>
5980          <a href="https://talkify.nz/ai-phone-surveys"><span>Campaign Agent</span><em>Rings your list, asks your questions, reports back</em></a>
5981          <a href="https://talkify.nz/debt-collection"><span>Debt Collection</span><em>Chases overdue invoices from Xero</em></a>
5982          <a href="https://talkify.nz/ai-wellness-checks"><span>Wellness Checks</span><em>Rings to check somebody is alright</em></a>
5983          
5984          <a href="https://talkify.nz/dialler"><span>Dialler</span><em>Your own team ringing out, from the browser</em></a>
5985          <a href="https://talkify.nz/agents" class="nav-drop-all">See all agents <span class="arr">&rarr;</span></a>
5986        </div>
5987      </div>
5988    </li>
5989    
5990    <li class="nav-drop" data-nav-drop>
5991      <button type="button" class="nav-drop-btn "
5992              aria-expanded="false" aria-controls="nav-industries-menu" aria-haspopup="true">
5993        <span class="dot"></span>Industries
5994        <svg class="nav-drop-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
5995      </button>
5996
5997      
5998      <div class="nav-drop-panel nav-drop-panel--industries" id="nav-industries-menu">
5999        <div class="nav-drop-col">
6000          <span class="nav-drop-hd">Trades</span>
6001          <a href="https://talkify.nz/tradesman">All Trades</a>
6002          <a href="https://talkify.nz/builder">Builders</a>
6003          <a href="https://talkify.nz/electrician">Electricians</a>
6004          <a href="https://talkify.nz/hvac">Heat Pump &amp; HVAC</a>
6005          <a href="https://talkify.nz/landscaping">Landscaping</a>
6006          <a href="https://talkify.nz/automotive">Mechanics</a>
6007          <a href="https://talkify.nz/pest-control">Pest Control</a>
6008          <a href="https://talkify.nz/plumber">Plumbing</a>
6009        </div>
6010        <div class="nav-drop-col">
6011          <span class="nav-drop-hd">Health &amp; beauty</span>
6012          <a href="https://talkify.nz/barber">Barbers</a>
6013          <a href="https://talkify.nz/beauty">Beauty &amp; Wellness</a>
6014          <a href="https://talkify.nz/gym">Gyms &amp; Studios</a>
6015          <a href="https://talkify.nz/personal-trainer">Personal Trainers</a>
6016          <a href="https://talkify.nz/physio">Physio &amp; Clinics</a>
6017          <span class="nav-drop-hd" style="margin-top:18px">Office &amp; property</span>
6018          <a href="https://talkify.nz/accountant">Accountants</a>
6019          <a href="https://talkify.nz/professional-services">Professional Services</a>
6020          <a href="https://talkify.nz/real-estate">Real Estate</a>
6021          <a href="https://talkify.nz/retail">Retail</a>
6022        </div>
6023        <div class="nav-drop-col">
6024          <span class="nav-drop-hd">Food &amp; hospitality</span>
6025          <a href="https://talkify.nz/cafe">Cafes</a>
6026          <a href="https://talkify.nz/chinese-takeaway">Chinese Takeaways</a>
6027          <a href="https://talkify.nz/fish-and-chip-shop">Fish &amp; Chip Shops</a>
6028          <a href="https://talkify.nz/hotel">Hotels &amp; Motels</a>
6029          <a href="https://talkify.nz/pizza-shop">Pizza Shops</a>
6030          <a href="https://talkify.nz/restaurant-bookings">Restaurants</a>
6031          <a href="https://talkify.nz/industries" class="nav-drop-all">See all industries <span class="arr">&rarr;</span></a>
6032        </div>
6033      </div>
6034    </li>
6035    <li class="nav-drop" data-nav-drop>
6036      <button type="button" class="nav-drop-btn "
6037              aria-expanded="false" aria-controls="nav-integrations-menu" aria-haspopup="true">
6038        <span class="dot"></span>Integrations
6039        <svg class="nav-drop-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
6040      </button>
6041
6042      <div class="nav-drop-panel nav-drop-panel--single" id="nav-integrations-menu">
6043        <div class="nav-drop-col">
6044          <span class="nav-drop-hd">Plugs into</span>
6045          <a href="https://talkify.nz/integrations"><span>All integrations</span><em>The software the agent already talks to</em></a>
6046          <a href="https://talkify.nz/business-phone-lines"><span>Phone Lines</span><em>Numbers, porting and how calls reach us</em></a>
6047        </div>
6048      </div>
6049    </li>
6050    <li><a href="https://talkify.nz/pricing" class=""><span class="dot"></span>Pricing</a></li>
6051    <li><a href="https://talkify.nz/blog" class=""><span class="dot"></span>Journal</a></li>
6052        <li><a href="https://talkify.nz/signup" class=""><span class="dot"></span>Get started</a></li>
6053      </ul>
6054  <div class="actions">
6055    <button type="button" class="theme-toggle" data-theme-toggle aria-label="Switch between light and dark theme" title="Switch theme">
6056      <svg class="icon-sun" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></svg>
6057      <svg class="icon-moon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
6058    </button>
6059            
6060        <a href="https://talkify.nz/signup" class="num num-signup" title="Sign up online, or ring 0800 002 967">Sign up · <b>0800 002 967</b></a>
6061        <a href="tel:+64800002967" class="num num-call" title="Call us on 0800 002 967" aria-label="Call us on 0800 002 967">
6062      <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07 19.5 19.5 0 01-6-6 19.79 19.79 0 01-3.07-8.67A2 2 0 014.11 2h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L8.09 9.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z"/></svg>
6063    </a>
6064              <a href="https://talkify.nz/login" class="num" style="font-family:var(--sans);font-size:13px;color:var(--bone)">Sign in</a>
6065      <a href="https://talkify.nz/signup" class="btn btn-primary">Start free <span class="arr">→</span></a>
6066        <button class="menu-btn" aria-label="Open menu">
6067      <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 7h16M4 12h16M4 17h16"/></svg>
6068    </button>
6069  </div>
6070</nav>
6071
6072    
6073        <section class="hero">
6074        <div class="hero-bg">
6075            
6076            <div class="photo"
6077                 style="--shot-dark:image-set(url('https://talkify.nz/media/frontend/hero-phone-night.webp') type('image/webp'), url('https://talkify.nz/media/frontend/hero-phone-night.jpg') type('image/jpeg'));--shot-light:image-set(url('https://talkify.nz/media/frontend/hero-phone-day.webp') type('image/webp'), url('https://talkify.nz/media/frontend/hero-phone-day.jpg') type('image/jpeg'))"></div>
6078            <div class="glow1"></div>
6079            <div class="glow2"></div>
6080            <div class="grid-lines"></div>
6081        </div>
6082
6083        <div class="hero-shell">
6084            <div>
6085                
6086                
6087                <h1 class="display">
6088                    <span class="ln"><span>The AI receptionist</span></span>
6089                    <span class="ln"><span class="out">built for</span></span>
6090                    <span class="ln"><span class="it">New Zealand.</span></span>
6091                </h1>
6092
6093                <p class="hero-sub">
6094                    Talkify answers your business phone 24/7 in a real Kiwi voice. It greets callers in your tone,
6095                    answers their questions, qualifies leads, books straight into your calendar, and escalates to a
6096                    human when it should. The phone is the last unsolved interface, and this is a
6097                    <b>voice operating system</b> sitting across it. It works while you don't.
6098                </p>
6099
6100                <div class="hero-cta">
6101                    <a href="https://talkify.nz/contact" class="btn btn-primary btn-lg">Start your agent free <span
6102                            class="arr">→</span></a>
6103                    <a href="tel:+6432421262" data-talkify-agent="default" class="btn btn-ghost btn-lg">Or hear it live ·
6104                        03 242 1262</a>
6105                    <a href="sms:+64272048827" class="btn btn-ghost btn-lg"
6106       title="Text us instead of ringing">
6107        <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2"
6108             stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="flex:none">
6109            <path d="M21 11.5a8.4 8.4 0 01-9 8.4 9.5 9.5 0 01-2.6-.4L3 21l1.6-4.2A8.2 8.2 0 013 11.5 8.4 8.4 0 0112 3a8.4 8.4 0 019 8.5z"/>
6110        </svg>
6111        Text our agent · 027 204 8827    </a>
6112                </div>
6113
6114                <dl class="hero-meta">
6115                    <div>
6116                        <dt>Pickup latency</dt>
6117                        <dd><b>from 0.4s</b></dd>
6118                    </div>
6119                    
6120                    <div>
6121                        <dt>Voices</dt>
6122                        <dd>80+ <small>30+ NZ &amp; AU</small></dd>
6123                    </div>
6124                    
6125                    <div>
6126                        <dt>Languages</dt>
6127                        <dd>30+ <small>detected on the call</small></dd>
6128                    </div>
6129                    
6130                    <div>
6131                        <dt>Reception from</dt>
6132                        <dd>$129<small>/mo · or pay as you go</small></dd>
6133                    </div>
6134                    
6135                    <div>
6136                        <dt>Answering NZ calls since</dt>
6137                        <dd>2024<small>built in Christchurch</small></dd>
6138                    </div>
6139                </dl>
6140            </div>
6141
6142            
6143            
6144            <div class="hero-demo">
6145                            <aside class="deck od-deck" style="padding:28px" aria-label="Live demo dialler">
6146    <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;padding-bottom:18px;border-bottom:1px solid var(--line)">
6147        
6148        <span class="od-title">Hear it for yourself</span>
6149        <span style="font-family:var(--mono);font-size:11px;color:var(--signal)" id="odStatus">● Online</span>
6150    </div>
6151
6152            <p style="margin:-6px 0 20px;color:var(--bone);font-size:14px;line-height:1.55">Enter your name and mobile, verify the code we text you, and our AI agent rings you within seconds. Free, about two minutes.</p>
6153    
6154    
6155    <div id="odSteps"
6156         style="display:flex;align-items:center;gap:10px;margin-bottom:20px;font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute)">
6157        <span data-step="details">1 · Details</span>
6158        <span style="flex:0 0 18px;height:1px;background:var(--line)"></span>
6159        <span data-step="verify">2 · Verify</span>
6160        <span style="flex:0 0 18px;height:1px;background:var(--line)"></span>
6161        <span data-step="call">3 · Your call</span>
6162    </div>
6163
6164    <div id="odErr" hidden
6165         style="margin-bottom:18px;padding:14px 16px;border:1px solid var(--coral);background:rgba(255,94,58,.08);border-radius:10px;font-family:var(--mono);font-size:12px;color:var(--paper);letter-spacing:.04em"></div>
6166
6167    
6168    <form class="form od-panel" id="odDetails" method="POST" action="https://talkify.nz/demo" autocomplete="on">
6169        <div class="field">
6170            <label>Your first name</label>
6171            <input type="text" name="name" id="od-name" required minlength="2" maxlength="80"
6172                   placeholder="Your first name" autocomplete="given-name">
6173        </div>
6174
6175        <div class="field">
6176            
6177            <label>NZ or AU mobile number</label>
6178            <input type="tel" name="mobile" id="od-mobile" required
6179                   placeholder="Your mobile"
6180                   autocomplete="tel" inputmode="tel"
6181                   pattern="^((\+?64|0)\s?2[0127]\s?[0-9 \-]{6,11}|(\+?61|0)\s?4[0-9 \-]{7,11})$"
6182                   title="A New Zealand mobile starting 020, 021, 022 or 027, or an Australian mobile starting 04">
6183            <span style="font-family:var(--mono);font-size:10px;color:var(--mute);letter-spacing:.06em;margin-top:4px">020, 021, 022, 027, or AU 04 · We text a code, then call you.</span>
6184        </div>
6185
6186        
6187        <div style="position:absolute;left:-9999px;top:-9999px;height:0;width:0;overflow:hidden" aria-hidden="true">
6188            <label>Leave blank</label>
6189            <input type="text" name="company_reference" id="od-company-reference" tabindex="-1" autocomplete="off">
6190        </div>
6191
6192        
6193        <div class="actions">
6194            <span class="note">● NZ &amp; AU mobiles · 3 calls per number</span>
6195            <button type="submit" disabled class="btn btn-primary btn-lg" id="odSendBtn">Text me my code
6196                <span class="arr">→</span></button>
6197        </div>
6198    </form>
6199
6200    
6201    <form class="form od-panel" id="odVerify" hidden autocomplete="off">
6202        <p style="font-family:var(--mono);font-size:12px;color:var(--bone);letter-spacing:.04em;margin:0 0 6px">
6203            Code sent to <b id="odMobileShown" style="color:var(--paper)">your mobile</b>.
6204            Enter it below and the call starts straight away.</p>
6205
6206        <div class="field">
6207            <label>6 digit verification code</label>
6208            <input type="text" name="code" id="od-code" required inputmode="numeric"
6209                   autocomplete="one-time-code" pattern="\d{6}" maxlength="6" placeholder="••••••"
6210                   style="font-family:var(--mono);font-size:24px;letter-spacing:.4em;text-align:center">
6211            <span style="font-family:var(--mono);font-size:10px;color:var(--mute);letter-spacing:.06em;margin-top:4px">Expires in 10 minutes.</span>
6212        </div>
6213
6214        <div class="actions">
6215            <span class="note" style="display:flex;gap:14px">
6216                <button type="button" id="odChangeBtn"
6217                        style="appearance:none;background:none;border:none;cursor:pointer;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--mute);padding:0">← Change details</button>
6218                <button type="button" id="odResendBtn" disabled
6219                        style="appearance:none;background:none;border:none;cursor:pointer;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--bone);padding:0">Resend (<span
6220                        id="odResendCount">30</span>)</button>
6221            </span>
6222            <button type="submit" disabled class="btn btn-primary btn-lg" id="odVerifyBtn">Verify + call me
6223                <span class="arr">→</span></button>
6224        </div>
6225    </form>
6226
6227    
6228    <div class="od-panel" id="odCalling" hidden style="text-align:center;padding:12px 0 6px">
6229        <div class="od-ringwrap">
6230            <span class="od-ring"></span><span class="od-ring od-r2"></span><span class="od-ring od-r3"></span>
6231            <span class="od-core"><svg width="26" height="26" viewBox="0 0 24 24" fill="none"
6232                                       stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path
6233                        d="M3 5a2 2 0 012-2h2.5a1 1 0 01.96.73l1.2 4.2a1 1 0 01-.5 1.16l-1.94.97a11 11 0 005.7 5.7l.97-1.94a1 1 0 011.16-.5l4.2 1.2a1 1 0 01.73.96V19a2 2 0 01-2 2A16 16 0 013 5z"/></svg></span>
6234        </div>
6235        <div style="font-family:var(--mono);font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--signal);margin:18px 0 8px">
6236            Calling you now<span class="od-dots"></span></div>
6237        <p style="color:var(--bone);font-size:14px;line-height:1.55;margin:0">Pick up your phone, <b
6238                id="odCallingName" style="color:var(--paper)">there</b>. Say hello and the agent takes it from there.</p>
6239    </div>
6240
6241    
6242    <div class="od-panel" id="odDone" hidden style="text-align:center;padding:12px 0 6px">
6243        <div class="od-check">
6244            <svg width="30" height="30" viewBox="0 0 24 24" fill="none" stroke="currentColor"
6245                 stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round">
6246                <path d="M4 12.5l5 5L20 6"/>
6247            </svg>
6248        </div>
6249        <div style="font-family:var(--mono);font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--signal);margin:18px 0 8px">
6250            Call complete
6251        </div>
6252        <p style="color:var(--bone);font-size:14px;line-height:1.55;margin:0 0 14px">Thanks <b id="odDoneName"
6253                style="color:var(--paper)">there</b>. That agent, and ones like it, can be working your phones within
6254            days.</p>
6255        <div id="odSummary" hidden
6256             style="text-align:left;margin:0 0 18px;padding:14px 16px;border:1px solid var(--line);background:var(--ink-2);border-radius:10px;font-size:13px;line-height:1.6;color:var(--bone)"></div>
6257        <div style="display:flex;flex-direction:column;gap:10px;align-items:center">
6258            <a href="https://talkify.nz/pricing" class="btn btn-primary btn-lg"
6259               style="width:100%;justify-content:center">
6259See plans + pricing <span class="arr">→</span></a>
6260            <button type="button" id="odAgainBtn"
6261                    style="appearance:none;background:none;border:none;cursor:pointer;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--mute);padding:4px">Run
6262                another demo
6263            </button>
6264        </div>
6265    </div>
6266</aside>
6267
6268
6269                        
6270                            <a href="#film" class="hero-film" data-play-film="film">
6271                    <span class="hero-film__thumb" style="background-image:url('https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-224afe26.jpg')" aria-hidden="true">
6272                        <svg viewBox="0 0 24 24"><path fill="currentColor" d="M8 5.14v13.72a1 1 0 0 0 1.52.85l10.92-6.86a1 1 0 0 0 0-1.7L9.52 4.29A1 1 0 0 0 8 5.14z"/></svg>
6273                    </span>
6274                    <span class="hero-film__text"><b>Watch a day of calls</b><small>1 min, with sound</small></span>
6275                </a>
6276                        </div>
6277        </div>
6278    </section>
6279
6280    <div class="strip">
6281  <div class="strip-track">
6282                                    <a href="https://talkify.nz/reception" class="strip-link" >
6283            Reception <span class="pip">●</span>          </a>
6284                                        <a href="https://talkify.nz/personal-assistant" class="strip-link it" >
6285            Personal Assistant          </a>
6286                                        <a href="https://talkify.nz/booking-service" class="strip-link" >
6287            Booking Service <span class="pip">●</span>          </a>
6288                                        <a href="https://talkify.nz/sales-agent" class="strip-link it" >
6289            Sales Qualification          </a>
6290                                        <a href="https://talkify.nz/tradesman" class="strip-link it" >
6291            Tradesman Dispatcher          </a>
6292                                        <a href="https://talkify.nz/real-estate" class="strip-link" >
6293            Real Estate Enquiry <span class="pip">●</span>          </a>
6294                                        <a href="https://talkify.nz/beauty" class="strip-link it" >
6295            Beauty &amp; Wellness          </a>
6296                                        <a href="https://talkify.nz/plumber" class="strip-link" >
6297            Plumbing Dispatch <span class="pip">●</span>          </a>
6298                                        <a href="https://talkify.nz/retail" class="strip-link it" >
6299            Retail          </a>
6300                                        <a href="https://talkify.nz/professional-services" class="strip-link" >
6301            Professional Services <span class="pip">●</span>          </a>
6302                                                  <a href="https://talkify.nz/reception" class="strip-link"  aria-hidden="true" tabindex="-1" >
6303            Reception <span class="pip">●</span>          </a>
6304                                        <a href="https://talkify.nz/personal-assistant" class="strip-link it"  aria-hidden="true" tabindex="-1" >
6305            Personal Assistant          </a>
6306                                        <a href="https://talkify.nz/booking-service" class="strip-link"  aria-hidden="true" tabindex="-1" >
6307            Booking Service <span class="pip">●</span>          </a>
6308                                        <a href="https://talkify.nz/sales-agent" class="strip-link it"  aria-hidden="true" tabindex="-1" >
6309            Sales Qualification          </a>
6310                                        <a href="https://talkify.nz/tradesman" class="strip-link it"  aria-hidden="true" tabindex="-1" >
6311            Tradesman Dispatcher          </a>
6312                                        <a href="https://talkify.nz/real-estate" class="strip-link"  aria-hidden="true" tabindex="-1" >
6313            Real Estate Enquiry <span class="pip">●</span>          </a>
6314                                        <a href="https://talkify.nz/beauty" class="strip-link it"  aria-hidden="true" tabindex="-1" >
6315            Beauty &amp; Wellness          </a>
6316                                        <a href="https://talkify.nz/plumber" class="strip-link"  aria-hidden="true" tabindex="-1" >
6317            Plumbing Dispatch <span class="pip">●</span>          </a>
6318                                        <a href="https://talkify.nz/retail" class="strip-link it"  aria-hidden="true" tabindex="-1" >
6319            Retail          </a>
6320                                        <a href="https://talkify.nz/professional-services" class="strip-link"  aria-hidden="true" tabindex="-1" >
6321            Professional Services <span class="pip">●</span>          </a>
6322                    </div>
6323</div>
6324
6325    
6326    <section class="shell tight pv" id="film" aria-labelledby="pv-hd-homepage-b"  data-pv-autoplay >
6327  <div class="section-hd">
6328    <h2 class="r" id="pv-hd-homepage-b">
6328A day of calls, <span class="blue">all answered.</span></h2>
6329          <p class="lede r r-1">From the six o&#039;clock class to the two in the morning burst pipe: what Talkify does with every call, in just over a minute.</p>
6330      </div>
6331  <div class="pv-frame r">
6332    <video controls preload="none" playsinline
6333           data-video-id="PROMO-home-b" data-video-kind="promo" data-video-title="Talkify: a day of calls"
6334            poster="https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-224afe26.jpg"            width="1920" height="1080"
6335           aria-label="Talkify: a day of calls, 1 minute 20 second video">
6336      <source src="https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-d7aa3f1f.mp4" type="video/mp4">
6337              <track kind="captions" src="https://talkify.nz/videos/promos/homepage-b/captions.vtt" srclang="en" label="English">
6338            <p>Your browser cannot play this video. <a href="https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-d7aa3f1f.mp4">Download it</a>.</p>
6339    </video>
6340          <button type="button" class="pv-sound" hidden>
6341        <svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05A4.5 4.5 0 0 0 16.5 12zM14 3.23v2.06a7 7 0 0 1 0 13.42v2.06a9 9 0 0 0 0-17.54z"/></svg>
6342        Tap for sound
6343      </button>
6344      </div>
6345  </section>
6346<script>
6347    (() => {
6348        if (window.__tkVideoTracking) return;
6349        window.__tkVideoTracking = true;
6350
6351        const endpoint = "\/videos\/plays";
6352        const uuid = () => (window.crypto && crypto.randomUUID)
6353            ? crypto.randomUUID()
6354            : 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
6355                const r = Math.random() * 16 | 0;
6356                return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
6357            });
6358        // A random id for this browser, so anonymous plays can be told apart.
6359        const visitor = (() => {
6360            try {
6361                let v = localStorage.getItem('tk-visitor');
6362                if (!v) { v = uuid(); localStorage.setItem('tk-visitor', v); }
6363                return v;
6364            } catch (_) { return null; }
6365        })();
6366
6367        const plays = new WeakMap();
6368
6369        const report = (s) => {
6370            const body = new FormData();
6371            body.append('play_id', s.play);
6372            body.append('video_id', s.id);
6373            body.append('kind', s.kind);
6374            body.append('percent', String(s.percent));
6375            body.append('watched', String(Math.round(s.watched)));
6376            if (s.duration) body.append('duration', String(Math.round(s.duration)));
6377            body.append('page', location.pathname);
6378            if (visitor) body.append('visitor', visitor);
6379            if (s.autoplay) body.append('autoplay', '1');
6380            s.dirty = false;
6381            try {
6382                if (navigator.sendBeacon && navigator.sendBeacon(endpoint, body)) return;
6383            } catch (_) {}
6384            fetch(endpoint, { method: 'POST', body, keepalive: true, credentials: 'same-origin' }).catch(() => {});
6385        };
6386
6387        const analytics = (name, s, percent) => {
6388            const params = {
6389                video_title: s.title,
6390                video_url: s.src,
6391                video_provider: 'talkify',
6392                video_percent: percent,
6393                video_id: s.id,
6394                video_kind: s.kind,
6395                video_autoplay: s.autoplay,
6396            };
6397            if (typeof window.gtag === 'function') window.gtag('event', name, params);
6398            else if (Array.isArray(window.dataLayer)) window.dataLayer.push({ event: name, ...params });
6399        };
6400
6401        const current = (v) => {
6402            if (!(v instanceof HTMLMediaElement) || !v.dataset.videoId) return null;
6403            let s = plays.get(v);
6404            const nonce = v.dataset.playNonce || '';
6405            if (!s || s.nonce !== nonce || s.ended || s.src !== v.currentSrc || (s.autoplay && v.dataset.autoplay !== '1' && v.paused)) {
6406                s = {
6407                    play: uuid(), nonce, id: v.dataset.videoId, kind: v.dataset.videoKind || 'help',
6408                    title: v.dataset.videoTitle || '', src: v.currentSrc, percent: 0, milestones: new Set(),
6409                    watched: 0, last: null, duration: 0, ended: false, started: false, dirty: false,
6410                    // Started silently by the page, not by the viewer (promo-video autoplay-on-view).
6411                    autoplay: v.dataset.autoplay === '1',
6412                };
6413                plays.set(v, s);
6414            }
6415            return s;
6416        };
6417
6418        document.addEventListener('play', (e) => {
6419            const s = current(e.target);
6420            if (!s || s.started) return;
6421            s.started = true;
6422            s.duration = isFinite(e.target.duration) ? e.target.duration : 0;
6423            report(s);
6424            analytics('video_start', s, 0);
6425        }, true);
6426
6427        document.addEventListener('timeupdate', (e) => {
6428            const v = e.target;
6429            const s = v instanceof HTMLMediaElement ? plays.get(v) : null;
6430            if (!s || !s.started || s.ended) return;
6431            const t = v.currentTime;
6432            // Seconds actually watched: small forward steps only, so a seek
6433            // does not count as watching what it skipped.
6434            if (s.last !== null && t > s.last && t - s.last < 2) { s.watched += t - s.last; s.dirty = true; }
6435            s.last = t;
6436            if (isFinite(v.duration) && v.duration > 0) {
6437                s.duration = v.duration;
6438                const pct = Math.floor((t / v.duration) * 100);
6439                for (const m of [25, 50, 75]) {
6440                    if (pct >= m && !s.milestones.has(m)) {
6441                        s.milestones.add(m);
6442                        s.percent = Math.max(s.percent, m);
6443                        report(s);
6444                        analytics('video_progress', s, m);
6445                    }
6446                }
6447            }
6448        }, true);
6449
6450        document.addEventListener('seeking', (e) => {
6451            const s = e.target instanceof HTMLMediaElement ? plays.get(e.target) : null;
6452            if (s) s.last = null;
6453        }, true);
6454
6455        document.addEventListener('ended', (e) => {
6456            const s = e.target instanceof HTMLMediaElement ? plays.get(e.target) : null;
6457            if (!s || s.ended) return;
6458            s.percent = 100;
6459            s.ended = true;
6460            report(s);
6461            analytics('video_complete', s, 100);
6462        }, true);
6463
6464        // Leaving mid-play: send the seconds watched since the last report.
6465        const flush = () => {
6466            document.querySelectorAll('video[data-video-id], audio[data-video-id]').forEach((v) => {
6467                const s = plays.get(v);
6468                if (s && s.started && s.dirty) report(s);
6469            });
6470        };
6471        document.addEventListener('pause', (e) => {
6472            const s = e.target instanceof HTMLMediaElement ? plays.get(e.target) : null;
6473            if (s && s.started && s.dirty && !s.ended) report(s);
6474        }, true);
6475        addEventListener('pagehide', flush);
6476        document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') flush(); });
6477    })();
6478</script>
6478
6479
6480
6481    <section class="shell" id="agents">
6482  <div class="section-hd">
6483    <h2 class="r">Meet everyone <span class="it">who answers.</span></h2>
6484    <p class="lede r r-1">Each Talkify agent ships with its own persona, knowledge base, calendar bindings and
6485      escalation rules. Run one, or run the set: they share a dashboard, and every call lands in the same place.</p>
6486  </div>
6487
6488  <div class="roster r">
6489          
6490      <article class="ag"  data-agent-voice >
6491        <div class="ag-shot">
6492                      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest">
6493  <title>Talkify Reception</title>
6494  <defs>
6495    <linearGradient id="tkGround-reception" x1="0" y1="1" x2="1" y2="0">
6496      <stop offset="0" stop-color="#1b2a33"></stop>
6497      <stop offset="0.55" stop-color="#2c3f4a"></stop>
6498      <stop offset="1" stop-color="#3e5460"></stop>
6499    </linearGradient>
6500    <linearGradient id="tkHot-reception" x1="0" y1="1" x2="1" y2="0">
6501      <stop offset="0" stop-color="#22648c"></stop>
6502      <stop offset="0.55" stop-color="#318abe"></stop>
6503      <stop offset="1" stop-color="#63aed3"></stop>
6504    </linearGradient>
6505  </defs>
6506  <rect width="100" height="100" fill="url(#tkGround-reception)"></rect>
6507  <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-reception)" opacity="0"></rect>
6508  <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3">
6509    <path d="M6 72 A20 20 0 0 1 26 92"></path>
6510    <path d="M6 63 A29 29 0 0 1 35 92"></path>
6511    <path d="M6 54 A38 38 0 0 1 44 92"></path>
6512  </g>
6513  <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle>
6514  <g class="tk-figure">
6515    <g fill="#ffffff">
6516      <circle cx="50" cy="42" r="13"></circle>
6517      <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path>
6518    </g>
6519    <circle cx="74" cy="72" r="16" fill="#ffffff"></circle>
6520    <g transform="translate(61 59) scale(0.26)"><path d="M22 30 H78 A10 10 0 0 1 88 40 V64 A10 10 0 0 1 78 74 H50 L34 88 V74 H22 A10 10 0 0 1 12 64 V40 A10 10 0 0 1 22 30 Z" fill="#318abe"></path></g>
6521  </g>
6522</svg>
6523                                <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
6524            
6525            <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Kia</span> <span class="w" data-at="0.54">ora!</span> <span class="w" data-at="1.16">I&#039;m</span> <span class="w" data-at="1.3">one</span> <span class="w" data-at="1.46">of</span> <span class="w" data-at="1.56">the</span> <span class="w" data-at="1.74">voices</span> <span class="w" data-at="1.96">you</span> <span class="w" data-at="2.2">can</span> <span class="w" data-at="2.42">choose</span> <span class="w" data-at="2.64">for</span> <span class="w" data-at="2.86">your</span> <span class="w" data-at="3.12">Talkify</span> <span class="w" data-at="3.44">receptionist.</span> <span class="w" data-at="4.74">I&#039;ll</span> <span class="w" data-at="5.02">answer</span> <span class="w" data-at="5.22">every</span> <span class="w" data-at="5.78">call</span> <span class="w" data-at="6.02">in</span> <span class="w" data-at="6.14">your</span> <span class="w" data-at="6.3">business&#039;s</span> <span class="w" data-at="7.08">name,</span> <span class="w" data-at="7.4">day</span> <span class="w" data-at="7.64">or</span> <span class="w" data-at="7.92">night,</span> <span class="w" data-at="8.4">and</span> <span class="w" data-at="8.62">get</span> <span class="w" data-at="8.76">the</span> <span class="w" data-at="8.96">job</span> <span class="w" data-at="9.18">booked</span> <span class="w" data-at="9.4">in.</span></span>
6526                  </div>
6527
6528        
6529        <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/reception">Reception</a></h3>
6530        <p class="ag-role">Answers the business line</p>
6531        <p class="ag-bio">Greets, qualifies, books the job and escalates what cannot wait, exactly how you would train a good receptionist. Then does it at 3am on a public holiday.</p>
6532        <p class="ag-said">We are, eight till two. I can get someone out to you at nine, what is the address?</p>
6533
6534        <div class="ag-foot">
6535                      <button type="button" class="ag-hear" aria-pressed="false"
6536                    aria-label="Hear a Reception agent voice: Kia ora! I&#039;m one of the voices you can choose for your Talkify receptionist. I&#039;ll answer every call in your business&#039;s name, day or night, and get the job booked in.">
6537              <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6538              <span class="ag-hear-label">Hear it</span>
6539              <small>NZ voice</small>
6540            </button>
6541            <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/reception-nz-59e303a0.mp3"
6542                   data-video-id="VOICE-reception-nz" data-video-kind="voice"
6543                   data-video-title="Reception agent voice"></audio>
6544                    <span class="ag-price">From <b>$129</b>/mo</span>
6545          <span class="ag-go">See the reception agent <em class="arr">&rarr;</em></span>
6546        </div>
6547      </article>
6548          
6549      <article class="ag"  data-agent-voice >
6550        <div class="ag-shot">
6551                      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest">
6552  <title>Talkify Personal Assistant</title>
6553  <defs>
6554    <linearGradient id="tkGround-personal-assistant" x1="0" y1="1" x2="1" y2="0">
6555      <stop offset="0" stop-color="#1b2a33"></stop>
6556      <stop offset="0.55" stop-color="#2c3f4a"></stop>
6557      <stop offset="1" stop-color="#3e5460"></stop>
6558    </linearGradient>
6559    <linearGradient id="tkHot-personal-assistant" x1="0" y1="1" x2="1" y2="0">
6560      <stop offset="0" stop-color="#22648c"></stop>
6561      <stop offset="0.55" stop-color="#318abe"></stop>
6562      <stop offset="1" stop-color="#63aed3"></stop>
6563    </linearGradient>
6564  </defs>
6565  <rect width="100" height="100" fill="url(#tkGround-personal-assistant)"></rect>
6566  <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-personal-assistant)" opacity="0"></rect>
6567  <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3">
6568    <path d="M6 72 A20 20 0 0 1 26 92"></path>
6569    <path d="M6 63 A29 29 0 0 1 35 92"></path>
6570    <path d="M6 54 A38 38 0 0 1 44 92"></path>
6571  </g>
6572  <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle>
6573  <g class="tk-figure">
6574    <g fill="#ffffff">
6575      <circle cx="50" cy="42" r="13"></circle>
6576      <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path>
6577    </g>
6578    <circle cx="74" cy="72" r="16" fill="#ffffff"></circle>
6579    <g transform="translate(61 59) scale(0.26)"><g fill="none" stroke="#318abe" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"><rect x="34" y="20" width="32" height="60" rx="9"></rect><path d="M50 68 H50.5"></path></g></g>
6580  </g>
6581</svg>
6582                                <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
6583            
6584            <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Kia</span> <span class="w" data-at="0.38">ora.</span> <span class="w" data-at="1.26">I&#039;m</span> <span class="w" data-at="1.38">one</span> <span class="w" data-at="1.52">of</span> <span class="w" data-at="1.6">the</span> <span class="w" data-at="1.78">voices</span> <span class="w" data-at="2.04">you</span> <span class="w" data-at="2.28">can</span> <span class="w" data-at="2.48">pick</span> <span class="w" data-at="2.68">for</span> <span class="w" data-at="2.9">your</span> <span class="w" data-at="3.12">Talkify</span> <span class="w" data-at="3.6">personal</span> <span class="w" data-at="4.16">assistant.</span> <span class="w" data-at="5.24">I&#039;ll</span> <span class="w" data-at="5.44">screen</span> <span class="w" data-at="5.66">your</span> <span class="w" data-at="5.9">calls,</span> <span class="w" data-at="6.7">take</span> <span class="w" data-at="6.76">proper</span> <span class="w" data-at="7.08">messages,</span> <span class="w" data-at="7.88">and</span> <span class="w" data-at="8.1">text</span> <span class="w" data-at="8.28">you</span> <span class="w" data-at="8.44">the</span> <span class="w" data-at="8.6">ones</span> <span class="w" data-at="8.8">that</span> <span class="w" data-at="9.08">really</span> <span class="w" data-at="9.52">need</span> <span class="w" data-at="9.74">
6584you.</span></span>
6585                  </div>
6586
6587        
6588        <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/personal-assistant">Personal Assistant</a></h3>
6589        <p class="ag-role">Screens your own mobile</p>
6590        <p class="ag-bio">Stands between you and the ninety calls a week that are not worth your time. Screens by your rules, remembers everyone who has ever rung, and texts you the two that need you.</p>
6591        <p class="ag-said">She is on site till three, Marcus. I will get her to call you straight after.</p>
6592
6593        <div class="ag-foot">
6594                      <button type="button" class="ag-hear" aria-pressed="false"
6595                    aria-label="Hear a Personal Assistant agent voice: Kia ora. I&#039;m one of the voices you can pick for your Talkify personal assistant. I&#039;ll screen your calls, take proper messages, and text you the ones that really need you.">
6596              <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6597              <span class="ag-hear-label">Hear it</span>
6598              <small>NZ voice</small>
6599            </button>
6600            <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/personal-assistant-nz-6a183642.mp3"
6601                   data-video-id="VOICE-personal-assistant-nz" data-video-kind="voice"
6602                   data-video-title="Personal Assistant agent voice"></audio>
6603                    <span class="ag-price">From <b>$89</b>/mo</span>
6604          <span class="ag-go">See the personal assistant <em class="arr">&rarr;</em></span>
6605        </div>
6606      </article>
6607          
6608      <article class="ag"  data-agent-voice >
6609        <div class="ag-shot">
6610                      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest">
6611  <title>Talkify Booking Service</title>
6612  <defs>
6613    <linearGradient id="tkGround-booking-service" x1="0" y1="1" x2="1" y2="0">
6614      <stop offset="0" stop-color="#1b2a33"></stop>
6615      <stop offset="0.55" stop-color="#2c3f4a"></stop>
6616      <stop offset="1" stop-color="#3e5460"></stop>
6617    </linearGradient>
6618    <linearGradient id="tkHot-booking-service" x1="0" y1="1" x2="1" y2="0">
6619      <stop offset="0" stop-color="#22648c"></stop>
6620      <stop offset="0.55" stop-color="#318abe"></stop>
6621      <stop offset="1" stop-color="#63aed3"></stop>
6622    </linearGradient>
6623  </defs>
6624  <rect width="100" height="100" fill="url(#tkGround-booking-service)"></rect>
6625  <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-booking-service)" opacity="0"></rect>
6626  <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3">
6627    <path d="M6 72 A20 20 0 0 1 26 92"></path>
6628    <path d="M6 63 A29 29 0 0 1 35 92"></path>
6629    <path d="M6 54 A38 38 0 0 1 44 92"></path>
6630  </g>
6631  <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle>
6632  <g class="tk-figure">
6633    <g fill="#ffffff">
6634      <circle cx="50" cy="42" r="13"></circle>
6635      <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path>
6636    </g>
6637    <circle cx="74" cy="72" r="16" fill="#ffffff"></circle>
6638    <g transform="translate(61 59) scale(0.26)"><g fill="none" stroke="#318abe" stroke-width="7" stroke-linecap="round" stroke-linejoin="round"><rect x="22" y="30" width="56" height="48" rx="12"></rect><path d="M22 46 H78"></path><path d="M36 22 V36"></path><path d="M64 22 V36"></path></g></g>
6639  </g>
6640</svg>
6641                                <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
6642            
6643            <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Hi</span> <span class="w" data-at="0.4">there!</span> <span class="w" data-at="1.1">I&#039;m</span> <span class="w" data-at="1.28">one</span> <span class="w" data-at="1.42">of</span> <span class="w" data-at="1.52">the</span> <span class="w" data-at="1.66">voices</span> <span class="w" data-at="1.96">you</span> <span class="w" data-at="2.18">can</span> <span class="w" data-at="2.4">choose</span> <span class="w" data-at="2.64">for</span> <span class="w" data-at="2.84">your</span> <span class="w" data-at="3.06">Talkify</span> <span class="w" data-at="3.4">booking</span> <span class="w" data-at="3.74">agent.</span> <span class="w" data-at="4.78">I&#039;ll</span> <span class="w" data-at="4.98">check</span> <span class="w" data-at="5.14">your</span> <span class="w" data-at="5.4">diary,</span> <span class="w" data-at="6.04">then</span> <span class="w" data-at="6.22">book,</span> <span class="w" data-at="7.08">move</span> <span class="w" data-at="7.08">or</span> <span class="w" data-at="7.36">cancel</span> <span class="w" data-at="7.72">appointments</span> <span class="w" data-at="8.24">while</span> <span class="w" data-at="8.54">your</span> <span class="w" data-at="8.68">customer&#039;s</span> <span class="w" data-at="9.26">still</span> <span class="w" data-at="9.42">on</span> <span class="w" data-at="9.6">the</span> <span class="w" data-at="9.66">line.</span></span>
6644                  </div>
6645
6646        
6647        <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/booking-service">Booking Service</a></h3>
6648        <p class="ag-role">Keeps the diary</p>
6649        <p class="ag-bio">Reads your live availability before it speaks, so every time it offers is a time that exists. Books, moves and cancels without ever double-booking you.</p>
6650        <p class="ag-said">No trouble. Same time on the fourteenth? I will text you the new booking.</p>
6651
6652        <div class="ag-foot">
6653                      <button type="button" class="ag-hear" aria-pressed="false"
6654                    aria-label="Hear a Booking Service agent voice: Hi there! I&#039;m one of the voices you can choose for your Talkify booking agent. I&#039;ll check your diary, then book, move or cancel appointments while your customer&#039;s still on the line.">
6655              <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6656              <span class="ag-hear-label">Hear it</span>
6657              <small>NZ voice</small>
6658            </button>
6659            <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/booking-service-nz-de40d0e6.mp3"
6660                   data-video-id="VOICE-booking-service-nz" data-video-kind="voice"
6661                   data-video-title="Booking Service agent voice"></audio>
6662                    <span class="ag-price">From <b>$129</b>/mo</span>
6663          <span class="ag-go">See the booking agent <em class="arr">&rarr;</em></span>
6664        </div>
6665      </article>
6666          
6667      <article class="ag"  data-agent-voice >
6668        <div class="ag-shot">
6669                      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest">
6670  <title>Talkify Accounts</title>
6671  <defs>
6672    <linearGradient id="tkGround-accounts" x1="0" y1="1" x2="1" y2="0">
6673      <stop offset="0" stop-color="#1b2a33"></stop>
6674      <stop offset="0.55" stop-color="#2c3f4a"></stop>
6675      <stop offset="1" stop-color="#3e5460"></stop>
6676    </linearGradient>
6677    <linearGradient id="tkHot-accounts" x1="0" y1="1" x2="1" y2="0">
6678      <stop offset="0" stop-color="#22648c"></stop>
6679      <stop offset="0.55" stop-color="#318abe"></stop>
6680      <stop offset="1" stop-color="#63aed3"></stop>
6681    </linearGradient>
6682  </defs>
6683  <rect width="100" height="100" fill="url(#tkGround-accounts)"></rect>
6684  <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-accounts)" opacity="0"></rect>
6685  <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3">
6686    <path d="M6 72 A20 20 0 0 1 26 92"></path>
6687    <path d="M6 63 A29 29 0 0 1 35 92"></path>
6688    <path d="M6 54 A38 38 0 0 1 44 92"></path>
6689  </g>
6690  <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle>
6691  <g class="tk-figure">
6692    <g fill="#ffffff">
6693      <circle cx="50" cy="42" r="13"></circle>
6694      <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path>
6695    </g>
6696    <circle cx="74" cy="72" r="16" fill="#ffffff"></circle>
6697    <g transform="translate(61 59) scale(0.26)"><g fill="none" stroke="#318abe" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"><rect x="28" y="20" width="44" height="60" rx="10"></rect><path d="M40 42 H60"></path><path d="M40 58 H60"></path></g></g>
6698  </g>
6699</svg>
6700                                <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
6701            
6702            <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Hi!</span> <span class="w" data-at="0.9">I&#039;m</span> <span class="w" data-at="1.18">one</span> <span class="w" data-at="1.32">of</span> <span class="w" data-at="1.4">the</span> <span class="w" data-at="1.6">voices</span> <span class="w" data-at="1.84">you</span> <span class="w" data-at="2.1">can</span> <span class="w" data-at="2.3">choose</span> <span class="w" data-at="2.58">for</span> <span class="w" data-at="2.78">your</span> <span class="w" data-at="2.98">Talkify</span> <span class="w" data-at="3.38">accounts</span> <span class="w" data-at="3.8">agent.</span> <span class="w" data-at="4.88">When</span> <span class="w" data-at="4.92">a</span> <span class="w" data-at="5.16">customer</span> <span class="w" data-at="5.38">rings</span> <span class="w" data-at="5.7">about</span> <span class="w" data-at="5.98">their</span> <span class="w" data-at="6.2">account,</span> <span class="w" data-at="6.96">I</span> <span class="w" data-at="7.08">can</span> <span class="w" data-at="7.28">tell</span> <span class="w" data-at="7.44">them</span> <span class="w" data-at="7.6">what&#039;s</span> <span class="w" data-at="7.88">outstanding,</span> <span class="w" data-at="8.88">straight</span> <span class="w" data-at="9.04">from</span> <span class="w" data-at="9.24">your</span> <span class="w" data-at="9.46">Xero.</span></span>
6703                  </div>
6704
6705        
6706        <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/debt-collection">Accounts</a><em>New</em></h3>
6707        <p class="ag-role">Answers on the account</p>
6708        <p class="ag-bio">Connected to your Xero, it knows the caller from your contacts and can say what is outstanding and how much has gone overdue. It will not discuss an account with a number it does not recognise.</p>
6709        <p class="ag-said">You are sitting at $1,240, and $380 of that went overdue on Tuesday.</p>
6710
6711        <div class="ag-foot">
6712                      <button type="button" class="ag-hear" aria-pressed="false"
6713                    aria-label="Hear a Accounts agent voice: Hi! I&#039;m one of the voices you can choose for your Talkify accounts agent. When a customer rings about their account, I can tell them what&#039;s outstanding, straight from your Xero.">
6714              <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6715              <span class="ag-hear-label">Hear it</span>
6716              <small>NZ voice</small>
6717            </button>
6718            <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/accounts-nz-7547196b.mp3"
6719                   data-video-id="VOICE-accounts-nz" data-video-kind="voice"
6720                   data-video-title="Accounts agent voice"></audio>
6721                    <span class="ag-price">Add-on <b>$10</b>/mo</span>
6722          <span class="ag-go">See overdue invoice calls <em class="arr">&rarr;</em></span>
6723        </div>
6724      </article>
6725          
6726      <article class="ag"  data-agent-voice >
6727        <div class="ag-shot">
6728                      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest">
6729  <title>Talkify Sales Agent</title>
6730  <defs>
6731    <linearGradient id="tkGround-sales-agent" x1="0" y1="1" x2="1" y2="0">
6732      <stop offset="0" stop-color="#1b2a33"></stop>
6733      <stop offset="0.55" stop-color="#2c3f4a"></stop>
6734      <stop offset="1" stop-color="#3e5460"></stop>
6735    </linearGradient>
6736    <linearGradient id="tkHot-sales-agent" x1="0" y1="1" x2="1" y2="0">
6737      <stop offset="0" stop-color="#22648c"></stop>
6738      <stop offset="0.55" stop-color="#318abe"></stop>
6739      <stop offset="1" stop-color="#63aed3"></stop>
6740    </linearGradient>
6741  </defs>
6742  <rect width="100" height="100" fill="url(#tkGround-sales-agent)"></rect>
6743  <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-sales-agent)" opacity="0"></rect>
6744  <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3">
6745    <path d="M6 72 A20 20 0 0 1 26 92"></path>
6746    <path d="M6 63 A29 29 0 0 1 35 92"></path>
6747    <path d="M6 54 A38 38 0 0 1 44 92"></path>
6748  </g>
6749  <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle>
6750  <g class="tk-figure">
6751    <g fill="#ffffff">
6752      <circle cx="50" cy="42" r="13"></circle>
6753      <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path>
6754    </g>
6755    <circle cx="74" cy="72" r="16" fill="#ffffff"></circle>
6756    <g transform="translate(61 59) scale(0.26)"><g fill="none" stroke="#318abe" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"><path d="M24 64 L44 44 L56 54 L76 30"></path><path d="M60 30 H76 V46"></path></g></g>
6757  </g>
6758</svg>
6759                                <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
6760            
6761            <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Kia</span> <span class="w" data-at="0.44">ora!</span> <span class="w" data-at="1.12">I&#039;m</span> <span class="w" data-at="1.22">one</span> <span class="w" data-at="1.34">of</span> <span class="w" data-at="1.42">the</span> <span class="w" data-at="1.6">voices</span> <span class="w" data-at="1.8">you</span> <span class="w" data-at="2.02">can</span> <span class="w" data-at="2.2">pick</span> <span class="w" data-at="2.36">for</span> <span class="w" data-at="2.54">your</span> <span class="w" data-at="2.76">Talkify</span> <span class="w" data-at="3.1">sales</span> <span class="w" data-at="3.54">agent.</span> <span class="w" data-at="4.42">I&#039;ll</span> <span class="w" data-at="4.64">answer</span> <span class="w" data-at="4.8">every</span> <span class="w" data-at="5.51">enquiry,</span> <span class="w" data-at="6.22">ask</span> <span class="w" data-at="6.22">the</span> <span class="w" data-at="6.4">right</span> <span class="w" data-at="6.7">questions,</span> <span class="w" data-at="7.36">and</span> <span class="w" data-at="7.6">tell</span> <span class="w" data-at="7.68">you</span> <span class="w" data-at="7.88">which</span> <span class="w" data-at="8.12">leads</span> <span class="w" data-at="8.4">are</span> <span class="w" data-at="8.68">hot.</span></span>
6762                  </div>
6763
6764        
6765        <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/sales-agent">Sales Agent</a></h3>
6766        <p class="ag-role">Works the enquiry</p>
6767        <p class="ag-bio">Every enquiry gets the same pitch, the same questions and the same follow-through, whether it lands at 9am or 9pm. Scores the lead while the conversation is still happening.</p>
6768        <p class="ag-said">Yes, it suits a busy salon well. How many calls a week are you missing at the moment?</p>
6769
6770        <div class="ag-foot">
6771                      <button type="button" class="ag-hear" aria-pressed="false"
6772                    aria-label="Hear a Sales Agent agent voice: Kia ora! I&#039;m one of the voices you can pick for your Talkify sales agent. I&#039;ll answer every enquiry, ask the right questions, and tell you which leads are hot.">
6773              <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6774              <span class="ag-hear-label">Hear it</span>
6775              <small>NZ voice</small>
6776            </button>
6777            <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/sales-agent-nz-a755d497.mp3"
6778                   data-video-id="VOICE-sales-agent-nz" data-video-kind="voice"
6779                   data-video-title="Sales Agent agent voice"></audio>
6780                    <span class="ag-price">From <b>$129</b>/mo</span>
6781          <span class="ag-go">See the sales agent <em class="arr">&rarr;</em></span>
6782        </div>
6783      </article>
6784      </div>
6785</section>
6786
6787
6788
6789<script>
6790  // "Hear it": one voice at a time. While it plays, the profile is marked
6791  // speaking (the portrait wakes, the waveform runs) and what it is saying
6792  // lights up word by word over the portrait, on the clip's own timings.
6793  document.addEventListener('DOMContentLoaded', () => {
6794    const cards = [...document.querySelectorAll('.ag[data-agent-voice]')];
6795    cards.forEach((card) => {
6796      const btn = card.querySelector('.ag-hear');
6797      const audio = card.querySelector('audio');
6798      const label = btn.querySelector('.ag-hear-label');
6799      const words = [...card.querySelectorAll('.ag-cap .w')];
6800      let raf = 0;
6801
6802      const update = () => {
6803        const t = audio.currentTime;
6804        words.forEach((w) => w.classList.toggle('on', t >= Number(w.dataset.at)));
6805      };
6806      // Every frame for a smooth light-up; timeupdate as well, because a tab
6807      // the browser treats as hidden stops animation frames.
6808      const tick = () => { update(); raf = requestAnimationFrame(tick); };
6809      audio.addEventListener('timeupdate', update);
6810      const stop = () => {
6811        cancelAnimationFrame(raf);
6812        card.classList.remove('speaking');
6813        words.forEach((w) => w.classList.remove('on'));
6814        btn.setAttribute('aria-pressed', 'false');
6815        label.textContent = 'Hear it';
6816      };
6817
6818      btn.addEventListener('click', (e) => {
6819        e.preventDefault();
6820        if (!audio.paused) { audio.pause(); audio.currentTime = 0; return; }
6821        cards.forEach((other) => {
6822          const a = other.querySelector('audio');
6823          if (a !== audio && !a.paused) { a.pause(); a.currentTime = 0; }
6824        });
6825        audio.currentTime = 0;
6826        audio.play().catch(stop);
6827      });
6828      audio.addEventListener('play', () => {
6829        card.classList.add('speaking');
6830        btn.setAttribute('aria-pressed', 'true');
6831        label.textContent = 'Stop';
6832        cancelAnimationFrame(raf);
6833        tick();
6834      });
6835      audio.addEventListener('pause', stop);
6836      audio.addEventListener('ended', stop);
6837    });
6838  });
6839</script>
6839
6840
6841
6842    
6843    <section class="shell tight" id="how" style="padding-top:0">
6844        <div class="spot r">
6845        <div class="spot-glow" aria-hidden="true"></div>
6846        <div class="rcta">
6847            <div class="rcta-copy">
6848                
6849                <h2 class="r">Reception that books<br><span class="it">straight into your system.</span></h2>
6850
6851                <p class="lede r r-1">The agent answers your business line, works out what the caller needs, checks
6852                    what is actually free, and writes the job into the software your team already opens every
6853                    morning. Not a message to action later: the booking, made.</p>
6854
6855                <p class="lede r r-1">Forward your existing number and it is live. No port-out, no hardware, and
6856                    reversible the moment you want it back.</p>
6857
6858                <ul class="rcta-points r r-2">
6859                    <li><strong>Books into your diary.</strong> Google Calendar, Outlook, Calendly and the trade
6860                        systems below, checked live before anything is promised.</li>
6861                    <li><strong>Writes the job up.</strong> Site address, the fault, the caller, attached to the
6862                        job rather than typed in again on Monday.</li>
6863                    <li><strong>Escalates what cannot wait.</strong> Burst pipes and gas leaks reach a person by
6864                        text inside a minute.</li>
6865                </ul>
6866
6867                <div class="rcta-cta r r-3">
6868                    <a href="https://talkify.nz/reception" class="btn btn-primary btn-lg">See the reception agent
6869                        <span class="arr">&rarr;</span></a>
6870                    <a href="tel:+6432421262" data-talkify-agent="default"
6871                       class="btn btn-ghost btn-lg">Hear it live · 03 242 1262</a>
6872                </div>
6873            </div>
6874
6875            <div class="rcta-phone r r-1">
6876                <div class="hphone agent-phone agent-phone--left" data-agent-phone="reception"
6877          aria-label="A phone showing the jobs the reception agent booked into the systems this business runs">
6878  <div class="hphone-frame">
6879    <div class="hphone-screen">
6880      <div class="hphone-notch" aria-hidden="true"></div>
6881
6882      <div class="hphone-clock" data-agent-clock>
6883        <div class="t" data-agent-time></div>
6884        <div class="d" data-agent-date></div>
6885      </div>
6886
6887      <div class="hphone-stack">
6888                  <article class="hpn">
6889            <header>
6890              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
6891              <span class="hpn-app">Talkify</span>
6892              <span class="hpn-ago" data-agent-ago="9"></span>
6893            </header>
6894            <h4>Booked into Fergus</h4>
6895            <p>Hot water cylinder · Thu 8:00am</p>
6896          </article>
6897                  <article class="hpn">
6898            <header>
6899              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
6900              <span class="hpn-app">Talkify</span>
6901              <span class="hpn-ago" data-agent-ago="38"></span>
6902            </header>
6903            <h4>Quote logged in Simpro</h4>
6904            <p>Bathroom reline · 14 Ngatai Rd</p>
6905          </article>
6906                  <article class="hpn">
6907            <header>
6908              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
6909              <span class="hpn-app">Talkify</span>
6910              <span class="hpn-ago" data-agent-ago="74"></span>
6911            </header>
6912            <h4>Job sent to ServiceM8</h4>
6913            <p>RCD tripping · today, 2:00pm</p>
6914          </article>
6915                  <article class="hpn">
6916            <header>
6917              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
6918              <span class="hpn-app">Talkify</span>
6919              <span class="hpn-ago" data-agent-ago="133"></span>
6920            </header>
6921            <h4>Added to your calendar</h4>
6922            <p>Site visit · Fri 11:30am</p>
6923          </article>
6924              </div>
6925
6926      <div class="hphone-bar" aria-hidden="true"></div>
6927    </div>
6928  </div>
6929</div>
6930
6931                <p class="rcta-cap">Booked, written up, <span class="it">already in the system.</span>
6932                    <em>Reception · from $129/mo</em></p>
6933            </div>
6934        </div>
6935        </div>
6936    </section>
6937
6938
6939    <style>
6940        /* The services marquee is off on a phone. It is a decorative band that
6941           scrolls sideways under a thumb that is trying to scroll down, it
6942           costs a row of the fold on the smallest screens, and every n
6942ame in
6943           it is a tap away in the Agents and Industries menus anyway. This
6944           rule lives on the homepage rather than in the layout because the
6945           strip is on 36 pages and only this one is being changed.
6946
6947           640px is the breakpoint the hero already uses. */
6948        @media (max-width: 640px) {
6949            .strip {
6950                display: none
6951            }
6952        }
6953
6954        /* The showcase panel. Reception and the PA are both this shape: one
6955           rounded surface with a soft brand glow behind the device. They are
6956           the deliberate exception to the site's "ruled, not boxed" rule,
6957           because they are the page's two arguments rather than furniture, and
6958           they are the only two blocks allowed to wear it. */
6959        .spot {
6960            position: relative;
6961            border: 1px solid var(--line);
6962            border-radius: 24px;
6963            overflow: hidden;
6964            background: var(--panel-grad);
6965            padding: 80px
6966        }
6967
6968        .spot-glow {
6969            position: absolute;
6970            top: -30%;
6971            right: -15%;
6972            width: 60%;
6973            height: 160%;
6974            background: radial-gradient(closest-side, rgba(49, 138, 190, .18), transparent 70%);
6975            pointer-events: none;
6976            z-index: 0
6977        }
6978
6979        /* The same track as .rcta below it, so the phone lands in the same
6980           place in both panels. It used to be 1.2fr 1fr, which gave the PA a
6981           590px right column for a 300px phone: the device floated in the
6982           middle of its column while reception's sat hard right, and the pair
6983           did not line up. */
6984        .spot-cols {
6985            display: grid;
6986            grid-template-columns: 1fr minmax(0, 330px);
6987            gap: clamp(36px, 6vw, 90px);
6988            align-items: center
6989        }
6990
6991        /* After hours is the third .spot panel, and the only one that is not
6992           blue. An emergency at a quarter to midnight is the one thing on this
6993           page with a colour of its own, so the glow, the eyebrow pin and the
6994           first notification on the phone are all --coral. Nothing else on the
6995           site uses red at panel scale, which is what makes it read as urgent
6996           rather than as decoration. */
6997        .spot--urgent {
6998            border-color: color-mix(in srgb, var(--coral) 20%, var(--line))
6999        }
7000
7001        .spot-glow--urgent {
7002            background: radial-gradient(closest-side,
7003                color-mix(in srgb, var(--coral) 15%, transparent), transparent 70%)
7004        }
7005
7006        .ah-copy,
7007        .ah-phone {
7008            position: relative;
7009            z-index: 1
7010        }
7011
7012        /* the live dot on the eyebrow goes red with the rest of it */
7013        #after-hours .eyebrow .pin {
7014            background: var(--coral);
7015            box-shadow: 0 0 8px var(--coral)
7016        }
7017
7018        /* The emergency is the first notification to land, and the only one
7019           marked. The three under it are the ladder doing its job, which is
7020           reassurance rather than alarm, so they stay as they are. */
7021        #after-hours .hpn:first-child {
7022            box-shadow: inset 3px 0 0 var(--coral)
7023        }
7024
7025        #after-hours .hpn:first-child h4 {
7026            color: var(--coral)
7027        }
7028
7029        .ah-copy h2 {
7030            margin-top: 22px;
7031            font-size: var(--t-h2);
7032            font-weight: 600;
7033            letter-spacing: var(--ls-head);
7034            line-height: 1.05
7035        }
7036
7037        /* The guide's accent is weight AND colour, Outfit 600 in --signal.
7038           Without the colour the span is 600 against a 700 heading, so the
7039           accent reads lighter than the words it is meant to lift. */
7040        .ah-copy h2 .it {
7041            color: var(--signal)
7042        }
7043
7044        .ah-copy .lede {
7045            margin-top: 20px;
7046            max-width: 54ch
7047        }
7048
7049        .ah-points {
7050            margin-top: 32px;
7051            list-style: none;
7052            display: flex;
7053            flex-direction: column;
7054            max-width: 54ch
7055        }
7056
7057        .ah-points li {
7058            padding: 15px 0;
7059            border-top: 1px solid var(--line);
7060            font-size: var(--t-small);
7061            color: var(--bone);
7062            line-height: 1.55
7063        }
7064
7065        .ah-points li:last-child {
7066            border-bottom: 1px solid var(--line)
7067        }
7068
7069        .ah-points strong {
7070            color: var(--paper);
7071            font-weight: 600
7072        }
7073
7074        .ah-cta {
7075            margin-top: 32px;
7076            display: flex;
7077            flex-wrap: wrap;
7078            gap: 14px
7079        }
7080
7081        /* Only the label is mono caps. A whole sentence set in uppercase mono
7082           is a shout and three lines of it is hard to read; the guide uses
7083           that face for eyebrows and labels, not running copy. */
7084        .ah-price {
7085            margin-top: 22px;
7086            max-width: 54ch;
7087            font-size: var(--t-small);
7088            color: var(--mute);
7089            line-height: 1.6
7090        }
7091
7092        .ah-price .lbl {
7093            font-family: var(--mono);
7094            font-size: var(--t-label);
7095            letter-spacing: var(--ls-label);
7096            text-transform: uppercase;
7097            color: var(--mute);
7098            margin-right: 4px
7099        }
7100
7101        .ah-price b {
7102            font-family: var(--serif);
7103            font-size: 16px;
7104            font-weight: 600;
7105            letter-spacing: -.01em;
7106            color: var(--paper);
7107            text-transform: none
7108        }
7109
7110        @media (max-width: 1100px) {
7111            .ah-phone {
7112                display: flex;
7113                flex-direction: column;
7114                align-items: center
7115            }
7116        }
7117
7118        .rcta {
7119            position: relative;
7120            z-index: 1;
7121            display: grid;
7122            grid-template-columns: 1fr minmax(0, 330px);
7123            gap: clamp(36px, 6vw, 90px);
7124            align-items: center
7125        }
7126
7127        .rcta-copy h2 {
7128            margin-top: 22px;
7129            font-size: var(--t-h2);
7130            letter-spacing: var(--ls-head);
7131            line-height: 1.05
7132        }
7133
7134        .rcta-copy .lede {
7135            margin-top: 20px;
7136            max-width: 54ch
7137        }
7138
7139        .rcta-points {
7140            margin-top: 32px;
7141            list-style: none;
7142            display: flex;
7143            flex-direction: column;
7144            max-width: 54ch
7145        }
7146
7147        .rcta-points li {
7148            padding: 15px 0;
7149            border-top: 1px solid var(--line);
7150            font-size: var(--t-small);
7151            color: var(--bone);
7152            line-height: 1.55
7153        }
7154
7155        .rcta-points li:last-child {
7156            border-bottom: 1px solid var(--line)
7157        }
7158
7159        .rcta-points strong {
7160            color: var(--paper);
7161            font-weight: 600
7162        }
7163
7164        .rcta-cta {
7165            margin-top: 32px;
7166            display: flex;
7167            flex-wrap: wrap;
7168            gap: 14px
7169        }
7170
7171        .rcta-cap {
7172            margin: 26px auto 0;
7173            max-width: 320px;
7174            text-align: center;
7175            font-family: var(--serif);
7176            font-size: 20px;
7177            font-weight: 600;
7178            letter-spacing: -.01em;
7179            line-height: 1.25;
7180            color: var(--paper)
7181        }
7182
7183        .rcta-cap em {
7184            display: block;
7185            margin-top: 8px;
7186            font-family: var(--mono);
7187            font-style: normal;
7188            font-size: var(--t-label);
7189            letter-spacing: .13em;
7190            text-transform: uppercase;
7191            color: var(--mute)
7192        }
7193
7194        @media (max-width: 1100px) {
7195            .spot {
7196                padding: 48px 28px
7197            }
7198
7199            .spot-cols {
7200                grid-template-columns: 1fr;
7201                gap: 40px
7202            }
7203        }
7204
7205        @media (max-width: 1000px) {
7206            .rcta {
7207                grid-template-columns: 1fr;
7208                gap: 44px
7209            }
7210
7211            .rcta-phone {
7212                display: flex;
7213                flex-direction: column;
7214                align-items: center
7215            }
7216        }
7217    </style>
7218
7219
7220    
7221    <section class="shell" id="why-talkify" aria-labelledby="apart-heading" style="padding-top:0">
7222    <div class="apart">
7223        <div class="apart-intro r">
7224            <span class="eyebrow"><span class="pin"></span>The Talkify difference</span>
7225            <h2 id="apart-heading">Built <span class="it">here.</span><br>Not badged here.</h2>
7226                        <p class="apart-lede">
7227                Most AI answering services sold in New Zealand are overseas platforms with a local logo.
7228                Talkify runs on our own local SIP network, keeps data in New Zealand and Australian data
7229                centres, and answers in voices your callers actually recognise. That changes how every
7230                call sounds, and where every recording lives.
7231            </p>
7232                        <div class="apart-proof" aria-hidden="true">
7233                <div><b>from 0.4s</b><span>pickup on the local network</span></div>
7234                <div><b>NZ + AU</b><span>regional numbers &amp; accents</span></div>
7235                <div><b>NZ + AU</b><span>data centres only</span></div>
7236                <div><b>te reo</b><span>greetings, plus 31 languages</span></div>
7237            </div>
7238
7239            
7240            
7241                        <div class="apart-try">
7242                <span class="apart-try-k">Judge it yourself</span>
7243                <a class="apart-try-no" href="tel:+6432421262" data-talkify-agent="default">03 242 1262</a>
7244                <p>Our own agent answers this line, around the clock. No form, no sales call, no card. Listen for the
7245                    accent, interrupt it, ask it something awkward.</p>
7246            </div>
7247
7248            <a href="https://talkify.nz/contact" class="btn btn-primary" style="align-self:flex-start">Hear the difference <span class="arr">→</span></a>
7249                        <p class="apart-fine">Flat NZD <a href="https://talkify.nz/pricing">pricing, published on the site</a>. No setup fee. No lock-in.
7250                Built in Ōtautahi Christchurch and operated by Talkify Limited.</p>
7251        </div>
7252
7253        <ol class="apart-ledger r r-1">
7254            <li>
7255                <a class="row" href="https://talkify.nz/ai-answering-service">
7256                    <span class="idx">01</span>
7257                    <div class="body">
7258                        <h3>Calls never leave the neighbourhood.</h3>
7259                        <p>We run our own local SIP carrier network, so your calls connect close to home. Less lag, no talking over each other, and the clear, close sound of a local call.</p>
7260                    </div>
7261                    <span class="spec">Local SIP · pickup from 0.4s</span>
7262                </a>
7263            </li>
7264            <li>
7265                <a class="row" href="https://talkify.nz/demo">
7266                    <span class="idx">02</span>
7267                    <div class="body">
7268                        <h3>Voices from here, for callers from here.</h3>
7269                        <p>A full range of Kiwi and Aussie voices, not an American accent doing its best. Callers relax when the voice sounds like them, and relaxed callers book.</p>
7270                    </div>
7271                    <span class="spec">EN-NZ · EN-AU · 32 voices</span>
7272                </a>
7273            </li>
7274            <li>
7275                <div class="row">
7276                    <span class="idx">03</span>
7277                    <div class="body">
7278                        <h3>A local number in every region.</h3>
7279                        <p>Regional phone numbers across New Zealand and Australia, so a Christchurch caller rings 03 and an Auckland caller rings 09. Local numbers get answered; unknown ones get screened.</p>
7280                    </div>
7281                    <span class="spec">NZ &amp; AU regional DDIs</span>
7282                </div>
7283            </li>
7284            <li>
7285                <a class="row" href="https://talkify.nz/privacy">
7286                    <span class="idx">04</span>
7287                    <div class="body">
7288                        <h3>Your data stays on this side of the world.</h3>
7289                        <p>For data sovereignty, everything is stored in New Zealand and Australian data centres: recordings, transcripts and customer details held close to home under local privacy law.</p>
7290                    </div>
7291                    <span class="spec">NZ + AU data centres · AES-256</span>
7292                </a>
7293            </li>
7294            <li>
7295                <a class="row" href="https://talkify.nz/outbound-calls">
7296                    <span class="idx">05</span>
7297                    <div class="body">
7298                        <h3>Agents that make the call, too.</h3>
7299                        <p>Full outbound service, not just answering. Your agents confirm bookings, chase missing details and run marketing call campaigns, with every conversation transcribed.</p>
7300                    </div>
7301                    <span class="spec">Confirmations · Campaigns</span>
7302                </a>
7303            </li>
7304            <li>
7305                <a class="row" href="https://talkify.nz/ai-phone-surveys">
7306                    <span class="idx">06</span>
7307                    <div class="body">
7308                        <h3>Campaigns that actually get answered.</h3>
7309                        <p>Load a contact list and the agent rings through it, asks your questions, and hands back transcripts with the answers extracted and analysed. Offers, follow-ups or a straight survey, at a scale no clipboard reaches.</p>
7310                    </div>
7311                    <span class="spec">AI phone campaigns</span>
7312                </a>
7313            </li>
7314            <li>
7315                <a class="row" href="https://talkify.nz/ai-call-centre">
7316                    <span class="idx">07</span>
7317                    <div class="body">
7318                        <h3>Call centre scale without the call centre.</h3>
7319                        <p>One agent or a whole fleet answering unlimited simultaneous calls. Overflow, after-hours or the entire front line, with warm transfer to a human whenever it matters.</p>
7320                    </div>
7321                    <span class="spec">∞ concurrent lines</span>
7322                </a>
7323            </li>
7324            <li>
7325                <a class="row" href="https://talkify.nz/integrations">
7326                    <span class="idx">08</span>
7327                    <div class="body">
7328                        <h3>Plugged into the tools you already run.</h3>
7329                        <p>Calendars, CRMs like HubSpot and GoHighLevel, gym platforms, WhatsApp and SMS, plus Zapier and a full REST API when you want to wire up something custom.</p>
7330                    </div>
7331                    <span class="spec">CRM · Calendar · Zapier · API</span>
7332                </a>
7333            </li>
7334            <li>
7335                <a class="row" href="https://talkify.nz/contact">
7336                    <span class="idx">09</span>
7337                    <div class="body">
7338                        <h3>We set it up. Personally.</h3>
7339                        <p>No DIY prompt wrangling. We build your agent around your business, brief it on your services and pricing, tune it with you, and keep tuning after you're live.</p>
7340                    </div>
7341                    <span class="spec">Done-for-you setup</span>
7342                </a>
7343            </li>
7344            <li>
7345                <a class="row" href="#app">
7346                    <span class="idx">10</span>
7347                    <div class="body">
7348                        <h3>Every call in your pocket.</h3>
7349                        <p>Native apps for iPhone and Android push you each call summary the moment it ends: who rang, what they wanted, what the agent did about it.</p>
7350                    </div>
7351                    <span class="spec">iOS · Android</span>
7352                </a>
7353            </li>
7354            <li>
7355                <div class="row">
7356                    <span class="idx">11</span>
7357                    <div class="body">
7358                        <h3>Reporting that reads the room.</h3>
7359                        <p>Full transcripts, sentiment, outcomes and intent on every call, rolled into dashboards that show what your callers actually want, not just how many rang.</p>
7360                    </div>
7361                    <span class="spec">Transcripts · Sentiment · Intent</span>
7362                </div>
7363            </li>
7364        </ol>
7365    </div>
7366
7367    <style>
7368        .apart {
7369            display: grid;
7370            grid-template-columns: minmax(320px, 5fr) 7fr;
7371            gap: 72px;
7372            align-items: start;
7373        }
7374
7375        .apart-intro {
7376            position: sticky;
7377            top: 96px;
7378            display: flex;
7379            flex-direction: column;
7380            gap: 26px;
7381        }
7382
7383        .apart-intro h2 {
7384            font-family: var(--serif);
7385            font-weight: 300;
7386            font-size: clamp(40px, 5vw, 68px);
7387            line-height: .96;
7388            letter-spacing: -.025em;
7389            font-variation-settings: "opsz" 96, "SOFT" 30;
7390        }
7391
7392        .apart-intro h2 .it {
7393            font-weight:600;
7394            color: var(--signal);
7395        }
7396
7397        .apart-lede {
7398            color: var(--mute);
7399            font-size: 16px;
7400            line-height: 1.65;
7401            max-width: 46ch;
7402        }
7403
7404        .apart-proof {
7405            display: flex;
7406            gap: 28px;
7407            flex-wrap: wrap;
7408            padding: 18px 0;
7409            border-top: 1px solid var(--line);
7410            border-bottom: 1px solid var(--line);
7411        }
7412
7413        .apart-proof > div {
7414            display: flex;
7415            flex-direction: column;
7416            gap: 4px;
7417        }
7418
7419        .apart-proof b {
7420            font-family: var(--mono);
7421            font-weight: 500;
7422            font-size: 18px;
7423            color: var(--paper);
7424        }
7425
7426        .apart-proof span {
7427            font-family: var(--mono);
7428            font-size: 10px;
7429            text-transform: uppercase;
7430            letter-spacing: .14em;
7431            color: var(--mute);
7432            max-width: 20ch;
7433        }
7434
7435        /* V2 design language: a top-ruled block rather than a filled, rounded
7436           card. It is a number to ring, so it gets the same shape as the
7437           closing call to action and the price blocks. */
7438        .apart-try {
7439            display: flex;
7440            flex-direction: column;
7441            gap: 8px;
7442            padding: 24px 0 0;
7443            border-top: 1px solid var(--line-2);
7444        }
7445
7446        .apart-try-k {
7447            font-family: var(--mono);
7448            font-size: 10px;
7449            letter-spacing: .16em;
7450            text-transform: uppercase;
7451            color: var(--mute);
7452        }
7453
7454        .apart-try-no {
7455            font-family: var(--serif);
7456            font-weight: 300;
7457            font-size: 30px;
7458            letter-spacing: -.02em;
7459            color: var(--paper);
7460            transition: color .3s var(--ease);
7461        }
7462
7463        .apart-try-no:hover {
7464            color: var(--signal);
7465        }
7466
7467        .apart-try p {
7468            font-size: 13.5px;
7469            line-height: 1.55;
7470            color: var(--mute);
7471            margin: 0;
7472        }
7473
7474        .apart-fine {
7475            font-family: var(--mono);
7476            font-size: 10.5px;
7477            text-transform: uppercase;
7478            letter-spacing: .14em;
7479            color: var(--mute);
7480        }
7481
7482        .apart-fine a {
7483            color: var(--bone);
7484            text-decoration: underline;
7485            text-underline-offset: 3px;
7486        }
7487
7488        .apart-fine a:hover {
7489            color: var(--signal);
7490        }
7491
7492        .apart-ledger {
7493            list-style: none;
7494            margin: 0;
7495            padding: 0;
7496            border-top: 1px solid var(--line);
7497            counter-reset: apart;
7498        }
7499
7500        .apart-ledger li {
7501            padding: 7px 0;
7502        }
7503
7504        .apart-ledger .row {
7505            position: relative;
7506            display: grid;
7507            grid-template-columns: 56px 1fr auto;
7508            gap: 24px;
7509            align-items: baseline;
7510            padding: 26px 18px 26px 8px;
7511            color: inherit;
7512            text-decoration: none;
7513            transition: background .25s ease;
7514        }
7515
7516        .apart-ledger .row::after {
7517            content: "";
7518            position: absolute;
7519            left: 0;
7520            top: 0;
7521            bottom: 0;
7522            width: 2px;
7523            background: linear-gradient(180deg, var(--signal), var(--plasma));
7524            opacity: 0;
7525            transition: opacity .25s ease;
7526        }
7527
7528        .apart-ledger .row:hover {
7529            background: color-mix(in srgb, var(--signal) 4%, transparent);
7530        }
7531
7532        html[data-theme="light"] .apart-ledger .row:hover {
7533            background: rgba(111, 158, 63, .06);
7534        }
7535
7536        .apart-ledger .row:hover::after {
7537            opacity: 1;
7538        }
7539
7540        .apart-ledger .idx {
7541            font-family: var(--mono);
7542            font-size: 12px;
7543            color: var(--mute);
7544            transition: color .25s ease;
7545        }
7546
7547        .apart-ledger .row:hover .idx {
7548            color: var(--signal);
7549        }
7550
7551        .apart-ledger h3 {
7552            font-family: var(--serif);
7553            font-weight: 400;
7554            font-size: 22px;
7555            letter-spacing: -.01em;
7556            color: var(--paper);
7557            margin: 0 0 8px;
7558        }
7559
7560        .apart-ledger a.row:hover h3 {
7561            color: var(--signal);
7562        }
7563
7564        .apart-ledger a.row h3::after {
7565            content: "→";
7566            display: inline-block;
7567            margin-left: 10px;
7568            font-family: var(--mono);
7569            font-size: 15px;
7570            color: var(--signal);
7571            opacity: 0;
7572            transform: translateX(-6px);
7573            transition: opacity .25s ease, transform .25s ease;
7574        }
7575
7576        .apart-ledger a.row:hover h3::after {
7577            opacity: 1;
7578            transform: translateX(0);
7579        }
7580
7581        .apart-ledger p {
7582            color: var(--mute);
7583            font-size: 14.5px;
7584            line-height: 1.6;
7585            max-width: 58ch;
7586            margin: 0;
7587        }
7588
7589        .apart-ledger .spec {
7590            font-family: var(--mono);
7591            font-size: 10px;
7592            text-transform: uppercase;
7593            letter-spacing: .16em;
7594            color: var(--mute);
7595            white-space: nowrap;
7596            padding-top: 2px;
7597        }
7598
7599        @media (max-width: 1180px) {
7600            .apart-ledger .spec { display: none; }
7601            .apart-ledger .row { grid-template-columns: 48px 1fr; }
7602        }
7603
7604        @media (min-width: 1180px) {
7605            .apart-ledger {
7606                columns: 2;
7607                column-gap: 44px
7608            }
7609
7610            .apart-ledger li {
7611                break-inside: avoid
7612            }
7613
7614            .apart-ledger .row {
7615                grid-template-columns: 44px 1fr;
7616                gap: 4px 18px;
7617                align-items: start;
7618                padding: 22px 14px 22px 4px
7619            }
7620
7621            .apart-ledger .spec {
7622                grid-column: 2;
7623                white-space: normal;
7624                padding-top: 10px
7625            }
7626        }
7627
7628        @media (max-width: 960px) {
7629            .apart {
7630                grid-template-columns: 1fr;
7631                gap: 48px;
7632            }
7633
7634            .apart-intro {
7635                position: static;
7636            }
7637        }
7638
7639        @media (max-width: 560px) {
7640            .apart-ledger .row {
7641                grid-template-columns: 1fr;
7642                gap: 8px;
7643                padding: 22px 12px 22px 6px;
7644            }
7645        }
7646    </style>
7647</section>
7648
7649    <!-- PA SPOTLIGHT -->
7650    <section class="shell tight" id="pa-spotlight" style="padding-top:0">
7651        <div class="spot spot-cols r">
7652            <div class="spot-glow" aria-hidden="true"></div>
7653
7654            <div style="position:relative;z-index:1">
7655                
7656                <h2 style="margin-top:24px;font-family:var(--serif);font-weight:300;font-size:clamp(40px,5.4vw,72px);line-height:.96;letter-spacing:-.025em;font-variation-settings:'opsz' 144,'SOFT' 30">
7657                    A <span class="italic plasma-text">personal assistant</span><br>
7658                    that picks up<br>
7659                    <span class="signal-text" style="font-weight:600;">at $89 a month.</span>
7660                </h2>
7661                <p style="margin-top:24px;color:var(--bone);font-size:17px;line-height:1.6;max-width:52ch">
7662                    Most of our customers start here. The PA agent is the answer to "I can't afford a receptionist, but
7663                    I can't afford to miss another call either." It learns your callers, screens by importance, takes
7664                    structured messages, and texts you only what matters.
7665                </p>
7666                <p style="margin-top:14px;color:var(--mute);font-size:14px;line-height:1.55;max-width:52ch">
7667                                            <b style="color:var(--paper);font-weight:500">$89 a month</b>, flat.
7668                                        No setup fee, no lock-in. The PA answers your
7669                    own mobile or landline; for a business line with a 24/7
7670                    <a href="https://talkify.nz/reception" style="color:var(--bone);text-decoration:underline">AI receptionist</a>,
7671                    business agents are $129 a month, or from
7672                    $10 plus $1 a minute on pay as you go.
7673                </p>
7674
7675                <div style="margin-top:36px;display:flex;flex-wrap:wrap;gap:14px">
7676                    <a href="https://talkify.nz/personal-assistant" class="btn btn-primary btn-lg">See the PA in detail <span
7677                            class="arr">→</span></a>
7678                    <a href="https://talkify.nz/contact?plan=shortwave" class="btn btn-ghost btn-lg">Start mine ·
7679                        $89/mo</a>
7680                </div>
7681
7682                <ul style="margin-top:36px;list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:14px;color:var(--bone);font-size:14px;max-width:560px">
7683                    <li style="display:flex;gap:10px;align-items:flex-start"><span
7684                            style="flex:0 0 6px;width:6px;height:6px;border-radius:50%;background:var(--signal);margin-top:8px;box-shadow:0 0 8px var(--signal)"></span>Caller
7685                        memory across every interaction
7686                    </li>
7687                    <li style="display:flex;gap:10px;align-items:flex-start"><span
7688                            style="flex:0 0 6px;width:6px;height:6px;border-radius:50%;background:var(--plasma);margin-top:8px;box-shadow:0 0 8px var(--plasma)"></span>VIP
7689                        routing straight to your mobile
7690                    </li>
7691                    <li style="display:flex;gap:10px;align-items:flex-start"><span
7692                            style="flex:0 0 6px;width:6px;height:6px;border-radius:50%;background:var(--signal);margin-top:8px;box-shadow:0 0 8px var(--signal)"></span>Polite
7693                        vendor screening, no spam
7694                    </li>
7695                    <li style="display:flex;gap:10px;align-items:flex-start"><span
7696                            style="flex:0 0 6px;width:6px;height:6px;border-radius:50%;background:var(--plasma);margin-top:8px;box-shadow:0 0 8px var(--plasma)"></span>Daily
7697                        SMS digest at 5pm if you'd prefer
7698                    </li>
7699                </ul>
7700            </div>
7701            <div style="position:relative;z-index:1">
7702                
7703                <div class="hphone agent-phone agent-phone--right" data-agent-phone="pa"
7704          aria-label="A phone showing the messages and meetings the personal assistant handled while you were out">
7705  <div class="hphone-frame">
7706    <div class="hphone-screen">
7707      <div class="hphone-notch" aria-hidden="true"></div>
7708
7709      <div class="hphone-clock" data-agent-clock>
7710        <div class="t" data-agent-time></div>
7711        <div class="d" data-agent-date></div>
7712      </div>
7713
7714      <div class="hphone-stack">
7715                  <article class="hpn">
7716            <header>
7717              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
7718              <span class="hpn-app">Talkify</span>
7719              <span class="hpn-ago" data-agent-ago="12"></span>
7720            </header>
7721            <h4>Message taken</h4>
7722            <p>Priya Anand · call back about the lease</p>
7723          </article>
7724                  <article class="hpn">
7725            <header>
7726              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
7727              <span class="hpn-app">Talkify</span>
7728              <span class="hpn-ago" data-agent-ago="47"></span>
7729            </header>
7730            <h4>Meeting booked</h4>
7731            <p>Thu 10:00am · Ben Whitfield, 30 min</p>
7732          </article>
7733                  <article class="hpn">
7734            <header>
7735              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
7736              <span class="hpn-app">Talkify</span>
7737              <span class="hpn-ago" data-agent-ago="96"></span>
7738            </header>
7739            <h4>Message taken</h4>
7740            <p>Your accountant · GST return question</p>
7741          </article>
7742                  <article class="hpn">
7743            <header>
7744              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
7745              <span class="hpn-app">Talkify</span>
7746              <span class="hpn-ago" data-agent-ago="154"></span>
7747            </header>
7748            <h4>Screened out</h4>
7749            <p>4 cold callers, none put through</p>
7750          </article>
7751              </div>
7752
7753      <div class="hphone-bar" aria-hidden="true"></div>
7754    </div>
7755  </div>
7756</div>
7757
7758                <p class="pa-cap">Three bookings taken. <span class="it">One message worth reading.</span>
7759                    <em>Solo founder · $89/mo</em></p>
7760            </div>
7761            <style>
7762                .pa-cap {
7763                    margin: 26px auto 0;
7764                    max-width: 340px;
7765                    text-align: center;
7766                    font-family: var(--serif);
7767                    font-size: 20px;
7768                    font-weight: 600;
7769                    letter-spacing: -.01em;
7770                    line-height: 1.25;
7771                    color: var(--paper)
7772                }
7773
7774                .pa-cap em {
7775                    display: block;
7776                    margin-top: 8px;
7777                    font-family: var(--mono);
7778                    font-style: normal;
7779                    font-size: var(--t-label);
7780                    letter-spacing: .13em;
7781                    text-transform: uppercase;
7782                    color: var(--mute)
7783                }
7784            </style>
7785
7786        </div>
7787
7788    </section>
7789
7790    <section class="shell" id="industries">
7791  <div class="section-hd">
7792    <h2 class="r">Trained for <span class="blue">your trade.</span></h2>
7793    <p class="lede r r-1">Twenty-two recipes. Each one already knows the vocabulary, the escalation rules and the calendar plumbing for the job, so the only thing left is the edges.</p>
7794  </div>
7795
7796  <h3 class="trade-sector">Trades</h3>
7797  <div class="trade-plate cols-4 r">
7798
7799    <a class="trade" href="https://talkify.nz/tradesman">
7800      <div class="shot" role="img" aria-label="Tradesman's ute with a Talkify job booked notification">
7801        <i style="--pos:center 58%;--shot-dark:url('https://talkify.nz/media/frontend/tradesman-day.webp')"></i>
7802        <span class="shot-alert at-top-left" aria-hidden="true">
7803    <span class="shot-alert-hd">
7804        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
7805     width="20" height="20"
7806     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
7807            <defs>
7808            <linearGradient id="tkgbZ95sm" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
7809                <stop offset="0" stop-color="#318abe"/>
7810                <stop offset="1" stop-color="#a3d654"/>
7811            </linearGradient>
7812        </defs>
7813        <circle cx="50" cy="50" r="50" fill="url(#tkgbZ95sm)"/>
7814    
7815    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
7816        <path d="M34 26 V54 C34 74 62 80 76 62"/>
7817        <path d="M20 40 H46"/>
7818    </g>
7819    
7820    <g transform="translate(56 20) scale(0.30)">
7821        <g class="">
7822            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
7823        </g>
7824    </g>
7825    </svg>
7826        <span class="shot-alert-app">Talkify</span>
7827        <span class="shot-alert-stamp">now</span>
7828    </span>
7829    <strong class="shot-alert-title">Job booked</strong>
7830            <span class="shot-alert-body">Ngatai Rd, roof leak, tomorrow 8am</span>
7831    </span>
7832      </div>
7833      <div class="body">
7834        <div class="hd">
7835          <h3>Multi-trade <span class="it">contractors.</span></h3>
7836          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2.5 17.5h19v2.6h-19z"/><path d="M5.5 17.5v-3.8a6.5 6.5 0 0 1 13 0v3.8"/><path d="M9.8 7.9V4.6a.9.9 0 0 1 .9-.9h2.6a.9.9 0 0 1 .9.9v3.3"/></svg>
7837        </div>
7838        <p>Roofers, painters, gib-stoppers and drainlayers. One agent carrying every keyword your crew runs on.</p>
7839        <span class="go">See the recipe <em>&rarr;</em></span>
7840      </div>
7841    </a>
7842
7843    <a class="trade" href="https://talkify.nz/builder">
7844      <div class="shot" role="img" aria-label="Builder on a partly framed house reading a Talkify job enquiry">
7845        <i style="--pos:center 3%;--shot-dark:url('https://talkify.nz/media/frontend/builder-day.webp')"></i>
7846        <span class="shot-alert at-top-left" aria-hidden="true">
7847    <span class="shot-alert-hd">
7848        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
7849     width="20" height="20"
7850     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
7851            <defs>
7852            <linearGradient id="tkgbnauU1" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
7853                <stop offset="0" stop-color="#318abe"/>
7854                <stop offset="1" stop-color="#a3d654"/>
7855            </linearGradient>
7856        </defs>
7857        <circle cx="50" cy="50" r="50" fill="url(#tkgbnauU1)"/>
7858    
7859    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
7860        <path d="M34 26 V54 C34 74 62 80 76 62"/>
7861        <path d="M20 40 H46"/>
7862    </g>
7863    
7864    <g transform="translate(56 20) scale(0.30)">
7865        <g class="">
7866            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
7867        </g>
7868    </g>
7869    </svg>
7870        <span class="shot-alert-app">Talkify</span>
7871        <span class="shot-alert-stamp">now</span>
7872    </span>
7873    <strong class="shot-alert-title">New job enquiry</strong>
7874            <span class="shot-alert-body">Quote requested, Ngatai Rd</span>
7875    </span>
7876      </div>
7877      <div class="body">
7878        <div class="hd">
7879          <h3>Builders.</h3>
7880          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 3.5h4v12.5h12v4H4z"/><path d="M11.5 16v2M15 16v2"/></svg>
7881        </div>
7882        <p>Budget, consent status and timeline all asked for while you are still up on the frame.</p>
7883        <span class="go">See the recipe <em>&rarr;</em></span>
7884      </div>
7885    </a>
7886
7887    <a class="trade" href="https://talkify.nz/electrician">
7888      <div class="shot" role="img" aria-label="Electrician testing a switchboard while Talkify books a fault callout">
7889        <i style="--pos:center 8%;--shot-dark:url('https://talkify.nz/media/frontend/electrician-day.webp')"></i>
7890        <span class="shot-alert at-top-right" aria-hidden="true">
7891    <span class="shot-alert-hd">
7892        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
7893     width="20" height="20"
7894     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
7895            <defs>
7896            <linearGradient id="tkgwvs6v1" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
7897                <stop offset="0" stop-color="#318abe"/>
7898                <stop offset="1" stop-color="#a3d654"/>
7899            </linearGradient>
7900        </defs>
7901        <circle cx="50" cy="50" r="50" fill="url(#tkgwvs6v1)"/>
7902    
7903    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
7904        <path d="M34 26 V54 C34 74 62 80 76 62"/>
7905        <path d="M20 40 H46"/>
7906    </g>
7907    
7908    <g transform="translate(56 20) scale(0.30)">
7909        <g class="">
7910            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
7911        </g>
7912    </g>
7913    </svg>
7914        <span class="shot-alert-app">Talkify</span>
7915        <span class="shot-alert-stamp">now</span>
7916    </span>
7917    <strong class="shot-alert-title">Missed call answered</strong>
7918            <span class="shot-alert-body">Fault callout booked, 2pm, Ngatai Rd</span>
7919    </span>
7920      </div>
7921      <div class="body">
7922        <div class="hd">
7923          <h3>Electricians &amp; <span class="it">sparkies.</span></h3>
7924          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3v4M16 3v4"/><path d="M5 7h14v3.5a7 7 0 0 1-14 0z"/><path d="M12 17.5V21"/></svg>
7925        </div>
7926        <p>Fault triage on the call: power out, RCD tripping, burning smell. Jobs land in your calendar and your CRM.</p>
7927        <span class="go">See the recipe <em>&rarr;</em></span>
7928      </div>
7929    </a>
7930
7931    <a class="trade" href="https://talkify.nz/hvac">
7932      <div class="shot" role="img" aria-label="Technician mounting a heat pump head unit while Talkify books an assessment">
7933        <i style="--pos:center 22%;--shot-dark:url('https://talkify.nz/media/frontend/hvac-day.webp')"></i>
7934        <span class="shot-alert at-top-left" aria-hidden="true">
7935    <span class="shot-alert-hd">
7936        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
7937     width="20" height="20"
7938     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
7939            <defs>
7940            <linearGradient id="tkgcyXUWN" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
7941                <stop offset="0" stop-color="#318abe"/>
7942                <stop offset="1" stop-color="#a3d654"/>
7943            </linearGradient>
7944        </defs>
7945        <circle cx="50" cy="50" r="50" fill="url(#tkgcyXUWN)"/>
7946    
7947    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
7948        <path d="M34 26 V54 C34 74 62 80 76 62"/>
7949        <path d="M20 40 H46"/>
7950    </g>
7951    
7952    <g transform="translate(56 20) scale(0.30)">
7953        <g class="">
7954            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
7955        </g>
7956    </g>
7957    </svg>
7958        <span class="shot-alert-app">Talkify</span>
7959        <span class="shot-alert-stamp">now</span>
7960    </span>
7961    <strong class="shot-alert-title">Install quote booked</strong>
7962            <span class="shot-alert-body">Heat pump assessment, Thursday 9am</span>
7963    </span>
7964      </div>
7965      <div class="body">
7966        <div class="hd">
7967          <h3>Heat pump &amp; <span class="blue">HVAC.</span></h3>
7968          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4.5h18v6.5H3z"/><path d="M6 8.8h12"/><path d="M6 16c1.2-1.5 2.4 1.5 3.6 0s2.4 1.5 3.6 0 2.4 1.5 3.6 0"/><path d="M7.5 19.6c1.2-1.5 2.4 1.5 3.6 0s2.4 1.5 3.6 0"/></svg>
7969        </div>
7970        <p>Every call in a cold snap answered at once. Installs quoted, assessments booked, nobody ringing out.</p>
7971        <span class="go">See the recipe <em>&rarr;</em></span>
7972      </div>
7973    </a>
7974
7975    <a class="trade" href="https://talkify.nz/landscaping">
7976      <div class="shot" role="img" aria-label="Landscaper in a garden while Talkify sends a hedge trim quote">
7977        <i style="--pos:center 9%;--shot-dark:url('https://talkify.nz/media/frontend/landscaper-day.webp')"></i>
7978        <span class="shot-alert at-top-left" aria-hidden="true">
7979    <span class="shot-alert-hd">
7980        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
7981     width="20" height="20"
7982     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
7983            <defs>
7984            <linearGradient id="tkgBu3HT3" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
7985                <stop offset="0" stop-color="#318abe"/>
7986                <stop offset="1" stop-color="#a3d654"/>
7987            </linearGradient>
7988        </defs>
7989        <circle cx="50" cy="50" r="50" fill="url(#tkgBu3HT3)"/>
7990    
7991    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
7992        <path d="M34 26 V54 C34 74 62 80 76 62"/>
7993        <path d="M20 40 H46"/>
7994    </g>
7995    
7996    <g transform="translate(56 20) scale(0.30)">
7997        <g class="">
7998            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
7999        </g>
8000    </g>
8001    </svg>
8002        <span class="shot-alert-app">Talkify</span>
8003        <span class="shot-alert-stamp">now</span>
8004    </span>
8005    <strong class="shot-alert-title">New enquiry</strong>
8006            <span class="shot-alert-body">Hedge trim, Karaka St, quote sent</span>
8007    </span>
8008      </div>
8009      <div class="body">
8010        <div class="hd">
8011          <h3>Landscapers.</h3>
8012          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2.5v10"/><path d="M9.5 2.5h5"/><path d="M8 12.5h8V16a4 4 0 0 1-8 0z"/></svg>
8013        </div>
8014        <p>Quotes given on the call, rounds filled, storm work escalated, all from the seat of the mower.</p>
8015        <span class="go">See the recipe <em>&rarr;</em></span>
8016      </div>
8017    </a>
8018
8019    <a class="trade" href="https://talkify.nz/automotive">
8020      <div class="shot" role="img" aria-label="Mechanic in a workshop while Talkify books a WOF">
8021        <i style="--pos:center 12%;--shot-dark:url('https://talkify.nz/media/frontend/mechanic-day.webp')"></i>
8022        <span class="shot-alert at-top-right" aria-hidden="true">
8023    <span class="shot-alert-hd">
8024        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8025     width="20" height="20"
8026     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8027            <defs>
8028            <linearGradient id="tkgr5Z6py" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8029                <stop offset="0" stop-color="#318abe"/>
8030                <stop offset="1" stop-color="#a3d654"/>
8031            </linearGradient>
8032        </defs>
8033        <circle cx="50" cy="50" r="50" fill="url(#tkgr5Z6py)"/>
8034    
8035    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8036        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8037        <path d="M20 40 H46"/>
8038    </g>
8039    
8040    <g transform="translate(56 20) scale(0.30)">
8041        <g class="">
8042            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8043        </g>
8044    </g>
8045    </svg>
8046        <span class="shot-alert-app">Talkify</span>
8047        <span class="shot-alert-stamp">now</span>
8048    </span>
8049    <strong class="shot-alert-title">WOF booked</strong>
8050            <span class="shot-alert-body">Thursday 9am, Rachel Tuinui</span>
8051    </span>
8052      </div>
8053      <div class="body">
8054        <div class="hd">
8055          <h3>Mechanics &amp; <span class="it">workshops.</span></h3>
8056          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M16.9 3.3a5 5 0 0 0-6.2 6.2l-7 7a2.4 2.4 0 0 0 3.4 3.4l7-7a5 5 0 0 0 6.2-6.2l-2.9 2.9-3.4-3.4z"/></svg>
8057        </div>
8058        <p>WOFs and services booked hands free. Breakdowns arrive as a text while you are still under a car.</p>
8059        <span class="go">See the recipe <em>&rarr;</em></span>
8060      </div>
8061    </a>
8062
8063    <a class="trade" href="https://talkify.nz/pest-control">
8064      <div class="shot" role="img" aria-label="NZ pest control technician in coveralls and a respirator treating a weatherboard house while Talkify books the next treatment">
8065        <i style="--pos:center 45%;--shot-dark:url('https://talkify.nz/media/frontend/pest-control-day.webp')"></i>
8066        <span class="shot-alert at-top-left" aria-hidden="true">
8067    <span class="shot-alert-hd">
8068        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8069     width="20" height="20"
8070     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8071            <defs>
8072            <linearGradient id="tkgYYays0" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8073                <stop offset="0" stop-color="#318abe"/>
8074                <stop offset="1" stop-color="#a3d654"/>
8075            </linearGradient>
8076        </defs>
8077        <circle cx="50" cy="50" r="50" fill="url(#tkgYYays0)"/>
8078    
8079    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8080        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8081        <path d="M20 40 H46"/>
8082    </g>
8083    
8084    <g transform="translate(56 20) scale(0.30)">
8085        <g class="">
8086            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8087        </g>
8088    </g>
8089    </svg>
8090        <span class="shot-alert-app">Talkify</span>
8091        <span class="shot-alert-stamp">now</span>
8092    </span>
8093    <strong class="shot-alert-title">Treatment booked</strong>
8094            <span class="shot-alert-body">Thu 8am, rodent programme</span>
8095    </span>
8096      </div>
8097      <div class="body">
8098        <div class="hd">
8099          <h3>Pest <span class="it">control.</span></h3>
8100          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="8" y="11" width="8" height="10" rx="1.5"/><path d="M10.5 11V8h3v3M13.5 8.5h3l2.2-2.2"/><path d="M20.2 4.6l1.2-1.2M19 3.2l.4-1.4M21.3 5.7l1.4-.4"/></svg>
8101        </div>
8102        <p>Wasp nests and rodents in a commercial kitchen reach you by text. Everything else is quoted and booked while you are under the house.</p>
8103        <span class="go">See the recipe <em>&rarr;</em></span>
8104      </div>
8105    </a>
8106
8107    <a class="trade" href="https://talkify.nz/plumber">
8108      <div class="shot" role="img" aria-label="Plumber under a kitchen sink while Talkify flags a burst pipe">
8109        <i style="--pos:center 4%;--shot-dark:url('https://talkify.nz/media/frontend/plumber-day.webp')"></i>
8110        <span class="shot-alert at-top-right" aria-hidden="true">
8111    <span class="shot-alert-hd">
8112        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8113     width="20" height="20"
8114     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8115            <defs>
8116            <linearGradient id="tkgqhOzwt" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8117                <stop offset="0" stop-color="#318abe"/>
8118                <stop offset="1" stop-color="#a3d654"/>
8119            </linearGradient>
8120        </defs>
8121        <circle cx="50" cy="50" r="50" fill="url(#tkgqhOzwt)"/>
8122    
8123    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8124        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8125        <path d="M20 40 H46"/>
8126    </g>
8127    
8128    <g transform="translate(56 20) scale(0.30)">
8129        <g class="">
8130            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8131        </g>
8132    </g>
8133    </svg>
8134        <span class="shot-alert-app">Talkify</span>
8135        <span class="shot-alert-stamp">now</span>
8136    </span>
8137    <strong class="shot-alert-title">Missed call answered</strong>
8138            <span class="shot-alert-body">Burst pipe, Sarah Henderson, urgent</span>
8139    </span>
8140      </div>
8141      <div class="body">
8142        <div class="hd">
8143          <h3>Plumbers &amp; <span class="it">gas-fitters.</span></h3>
8144          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3.5 6.5h6.5v4H3.5z"/><path d="M10 8.5h4.6a2.9 2.9 0 0 1 2.9 2.9v2.4"/><path d="M19 18.6c0 .9-.7 1.6-1.5 1.6S16 19.5 16 18.6c0-1 1.5-2.9 1.5-2.9s1.5 1.9 1.5 2.9z"/></svg>
8145        </div>
8146        <p>Burst pipes and gas leaks read as emergencies and reach you by text inside a minute.</p>
8147        <span class="go">See the recipe <em>&rarr;</em></span>
8148      </div>
8149    </a>
8150
8151  </div>
8152
8153  <h3 class="trade-sector">Health &amp; beauty</h3>
8154  <div class="trade-plate cols-4 r">
8155
8156    <a class="trade" href="https://talkify.nz/barber">
8157      <div class="shot" role="img" aria-label="NZ barber part way through a fade while Talkify books the next customer">
8158        <i style="--pos:center 45%;--shot-dark:url('https://talkify.nz/media/frontend/barber-day.webp')"></i>
8159        <span class="shot-alert at-top-right" aria-hidden="true">
8160    <span class="shot-alert-hd">
8161        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8162     width="20" height="20"
8163     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8164            <defs>
8165            <linearGradient id="tkgXQRvKo" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8166                <stop offset="0" stop-color="#318abe"/>
8167                <stop offset="1" stop-color="#a3d654"/>
8168            </linearGradient>
8169        </defs>
8170        <circle cx="50" cy="50" r="50" fill="url(#tkgXQRvKo)"/>
8171    
8172    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8173        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8174        <path d="M20 40 H46"/>
8175    </g>
8176    
8177    <g transform="translate(56 20) scale(0.30)">
8178        <g class="">
8179            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8180        </g>
8181    </g>
8182    </svg>
8183        <span class="shot-alert-app">Talkify</span>
8184        <span class="shot-alert-stamp">now</span>
8185    </span>
8186    <strong class="shot-alert-title">Booked in</strong>
8187            <span class="shot-alert-body">Sat 10:30, skin fade, Mikaere</span>
8188    </span>
8189      </div>
8190      <div class="body">
8191        <div class="hd">
8192          <h3>Barbers.</h3>
8193          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="6.5" cy="18" r="2.6"/><circle cx="17.5" cy="18" r="2.6"/><path d="M8.4 16.1 19 4M15.6 16.1 5 4"/></svg>
8194        </div>
8195        <p>Live walk-in wait times, bookings taken mid-fade, and no-shows chased before they cost you a chair.</p>
8196        <span class="go">See the recipe <em>&rarr;</em></span>
8197      </div>
8198    </a>
8199
8200    <a class="trade" href="https://talkify.nz/beauty">
8201      <div class="shot" role="img" aria-label="Stylist colouring a client's hair in an NZ salon">
8202        <i style="--pos:center 31%;--shot-dark:url('https://talkify.nz/media/frontend/salon-day.webp')"></i>
8203        <span class="shot-alert at-top-left" aria-hidden="true">
8204    <span class="shot-alert-hd">
8205        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8206     width="20" height="20"
8207     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8208            <defs>
8209            <linearGradient id="tkgtxCUDX" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8210                <stop offset="0" stop-color="#318abe"/>
8211                <stop offset="1" stop-color="#a3d654"/>
8212            </linearGradient>
8213        </defs>
8214        <circle cx="50" cy="50" r="50" fill="url(#tkgtxCUDX)"/>
8215    
8216    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8217        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8218        <path d="M20 40 H46"/>
8219    </g>
8220    
8221    <g transform="translate(56 20) scale(0.30)">
8222        <g class="">
8223            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8224        </g>
8225    </g>
8226    </svg>
8227        <span class="shot-alert-app">Talkify</span>
8228        <span class="shot-alert-stamp">now</span>
8229    </span>
8230    <strong class="shot-alert-title">Booked in</strong>
8231            <span class="shot-alert-body">Fri 2pm, half head foils, Anahera</span>
8232    </span>
8233      </div>
8234      <div class="body">
8235        <div class="hd">
8236          <h3>Beauty &amp; <span class="blue">wellness.</span></h3>
8237          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2.5a5.5 5.5 0 0 1 5.5 5.5c0 3-2.5 5-5.5 8.5C9 13 6.5 11 6.5 8A5.5 5.5 0 0 1 12 2.5z"/><path d="M12 16.5V21"/></svg>
8238        </div>
8239        <p>Treatment-menu aware, and books into Zenoti or your own calendar long after you have locked up.</p>
8240        <span class="go">See the recipe <em>&rarr;</em></span>
8241      </div>
8242    </a>
8243
8244    <a class="trade" href="https://talkify.nz/gym">
8245      <div class="shot" role="img" aria-label="NZ gym floor while Talkify holds a class seat over the phone">
8246        <i style="--pos:center 55%;--shot-dark:url('https://talkify.nz/media/frontend/gym-day.webp')"></i>
8247        <span class="shot-alert at-top-left" aria-hidden="true">
8248    <span class="shot-alert-hd">
8249        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8250     width="20" height="20"
8251     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8252            <defs>
8253            <linearGradient id="tkg3Ywc4t" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8254                <stop offset="0" stop-color="#318abe"/>
8255                <stop offset="1" stop-color="#a3d654"/>
8256            </linearGradient>
8257        </defs>
8258        <circle cx="50" cy="50" r="50" fill="url(#tkg3Ywc4t)"/>
8259    
8260    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8261        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8262        <path d="M20 40 H46"/>
8263    </g>
8264    
8265    <g transform="translate(56 20) scale(0.30)">
8266        <g class="">
8267            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8268        </g>
8269    </g>
8270    </svg>
8271        <span class="shot-alert-app">Talkify</span>
8272        <span class="shot-alert-stamp">now</span>
8273    </span>
8274    <strong class="shot-alert-title">Class seat held</strong>
8275            <span class="shot-alert-body">6am HIIT, one spot left</span>
8276    </span>
8277      </div>
8278      <div class="body">
8279        <div class="hd">
8280          <h3>Gyms &amp; <span class="blue">studios.</span></h3>
8281          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.5 9v6M17.5 9v6M3.5 10.5v3M20.5 10.5v3M6.5 12h11"/></svg>
8282        </div>
8283        <p>Reads your GymMaster timetable for live class seats, and turns joining enquiries into booked trials.</p>
8284        <span class="go">See the recipe <em>&rarr;</em></span>
8285      </div>
8286    </a>
8287
8288    <a class="trade" href="https://talkify.nz/personal-trainer">
8289      <div class="shot" role="img" aria-label="NZ personal trainer coaching a client while Talkify books a consult">
8290        <i style="--pos:center 55%;--shot-dark:url('https://talkify.nz/media/frontend/trainer-day.webp')"></i>
8291        <span class="shot-alert at-top-left" aria-hidden="true">
8292    <span class="shot-alert-hd">
8293        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8294     width="20" height="20"
8295     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8296            <defs>
8297            <linearGradient id="tkgQGVkzw" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8298                <stop offset="0" stop-color="#318abe"/>
8299                <stop offset="1" stop-color="#a3d654"/>
8300            </linearGradient>
8301        </defs>
8302        <circle cx="50" cy="50" r="50" fill="url(#tkgQGVkzw)"/>
8303    
8304    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8305        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8306        <path d="M20 40 H46"/>
8307    </g>
8308    
8309    <g transform="translate(56 20) scale(0.30)">
8310        <g class="">
8311            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8312        </g>
8313    </g>
8314    </svg>
8315        <span class="shot-alert-app">Talkify</span>
8316        <span class="shot-alert-stamp">now</span>
8317    </span>
8318    <strong class="shot-alert-title">New enquiry</strong>
8319            <span class="shot-alert-body">Consult booked, Tue 6:30pm</span>
8320    </span>
8321      </div>
8322      <div class="body">
8323        <div class="hd">
8324          <h3>Personal <span class="it">trainers.</span></h3>
8325          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="4.6" r="2.1"/><path d="M12 7.5v6M12 13.5 8 21M12 13.5 16 21M7.5 10h9"/></svg>
8326        </div>
8327        <p>Answers mid-session, qualifies on goals and budget, books the consult before they ring anyone else.</p>
8328        <span class="go">See the recipe <em>&rarr;</em></span>
8329      </div>
8330    </a>
8331
8332  </div>
8333
8334  <h3 class="trade-sector">Office &amp; property</h3>
8335  <div class="trade-plate cols-4 r">
8336
8337    <a class="trade" href="https://talkify.nz/accountant">
8338      <div class="shot" role="img" aria-label="NZ accountant working through client files while Talkify answers the practice phone">
8339        <i style="--pos:center 71%;--shot-dark:url('https://talkify.nz/media/frontend/accountant-day.webp')"></i>
8340        
8341        <span class="shot-alert at-top-left" aria-hidden="true">
8342    <span class="shot-alert-hd">
8343        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8344     width="20" height="20"
8345     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8346            <defs>
8347            <linearGradient id="tkgQvvvUL" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8348                <stop offset="0" stop-color="#318abe"/>
8349                <stop offset="1" stop-color="#a3d654"/>
8350            </linearGradient>
8351        </defs>
8352        <circle cx="50" cy="50" r="50" fill="url(#tkgQvvvUL)"/>
8353    
8354    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8355        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8356        <path d="M20 40 H46"/>
8357    </g>
8358    
8359    <g transform="translate(56 20) scale(0.30)">
8360        <g class="">
8361            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8362        </g>
8363    </g>
8364    </svg>
8365        <span class="shot-alert-app">Talkify</span>
8366        <span class="shot-alert-stamp">now</span>
8367    </span>
8368    <strong class="shot-alert-title">Client call handled</strong>
8369            <span class="shot-alert-body">GST deadline, no callback needed</span>
8370    </span>
8371      </div>
8372      <div class="body">
8373        <div class="hd">
8374          <h3>Accountants.</h3>
8375          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3h9l4 4v14H6z"/><path d="M15 3v4h4M9 12h6M9 16h6"/></svg>
8376        </div>
8377        <p>Deadline questions and invoice answers straight from Xero, so tax season stops eating the chargeable hour.</p>
8378        <span class="go">See the recipe <em>&rarr;</em></span>
8379      </div>
8380    </a>
8381
8382    <a class="trade" href="https://talkify.nz/professional-services">
8383      <div class="shot" role="img" aria-label="Barrister's chambers while Talkify routes a client call">
8384        <i style="--pos:center 65%;--shot-dark:url('https://talkify.nz/media/frontend/pro-services-day.webp')"></i>
8385        <span class="shot-alert at-top-right" aria-hidden="true">
8386    <span class="shot-alert-hd">
8387        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8388     width="20" height="20"
8389     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8390            <defs>
8391            <linearGradient id="tkgJbnNCM" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8392                <stop offset="0" stop-color="#318abe"/>
8393                <stop offset="1" stop-color="#a3d654"/>
8394            </linearGradient>
8395        </defs>
8396        <circle cx="50" cy="50" r="50" fill="url(#tkgJbnNCM)"/>
8397    
8398    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8399        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8400        <path d="M20 40 H46"/>
8401    </g>
8402    
8403    <g transform="translate(56 20) scale(0.30)">
8404        <g class="">
8405            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8406        </g>
8407    </g>
8408    </svg>
8409        <span class="shot-alert-app">Talkify</span>
8410        <span class="shot-alert-stamp">now</span>
8411    </span>
8412    <strong class="shot-alert-title">Client call routed</strong>
8413            <span class="shot-alert-body">Ms Reid to Mark, encrypted</span>
8414    </span>
8415      </div>
8416      <div class="body">
8417        <div class="hd">
8418          <h3>Professional <span class="blue">services.</span></h3>
8419          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2.5 6 12l6 9 6-9z"/><path d="M12 21v-8.4"/><circle cx="12" cy="11" r="1.6"/></svg>
8420        </div>
8421        <p>Confidentiality-first triage for law and consulting. Nothing sensitive read out to an unverified caller.</p>
8422        <span class="go">See the recipe <em>&rarr;</em></span>
8423      </div>
8424    </a>
8425
8426    <a class="trade" href="https://talkify.nz/real-estate">
8427      <div class="shot" role="img" aria-label="For sale sign outside an NZ villa inviting buyers to call the Talkify agent to book a viewing">
8428        <i style="--pos:center 55%;--shot-dark:url('https://talkify.nz/media/frontend/real-estate-sign.webp')"></i>
8429      </div>
8430      <div class="body">
8431        <div class="hd">
8432          <h3>Real <span class="it">estate.</span></h3>
8433          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="16" cy="8" r="3.8"/><path d="M13.3 10.7 4.5 19.5M6.8 17.2l2.2 2.2M9.4 14.6l2.2 2.2"/></svg>
8434        </div>
8435        <p>Put the number on the sign. Buyers driving past at nine at night book their own viewing.</p>
8436        <span class="go">See the recipe <em>&rarr;</em></span>
8437      </div>
8438    </a>
8439
8440    <a class="trade" href="https://talkify.nz/retail">
8441      <div class="shot" role="img" aria-label="NZ retail staff serving a customer while Talkify holds a pair of shoes">
8442        <i style="--pos:center 10%;--shot-dark:url('https://talkify.nz/media/frontend/retail-day.webp')"></i>
8443        <span class="shot-alert at-top-left" aria-hidden="true">
8444    <span class="shot-alert-hd">
8445        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8446     width="20" height="20"
8447     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8448            <defs>
8449            <linearGradient id="tkgtVxfjy" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8450                <stop offset="0" stop-color="#318abe"/>
8451                <stop offset="1" stop-color="#a3d654"/>
8452            </linearGradient>
8453        </defs>
8454        <circle cx="50" cy="50" r="50" fill="url(#tkgtVxfjy)"/>
8455    
8456    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8457        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8458        <path d="M20 40 H46"/>
8459    </g>
8460    
8461    <g transform="translate(56 20) scale(0.30)">
8462        <g class="">
8463            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8464        </g>
8465    </g>
8466    </svg>
8467        <span class="shot-alert-app">Talkify</span>
8468        <span class="shot-alert-stamp">now</span>
8469    </span>
8470    <strong class="shot-alert-title">Held for pickup</strong>
8471            <span class="shot-alert-body">Hoka Bondi 8, size 10, 24h</span>
8472    </span>
8473      </div>
8474      <div class="body">
8475        <div class="hd">
8476          <h3>Retail &amp; <span class="it">e-com.</span></h3>
8477          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3.5 3.5h9l8 8-9 9-8-8z"/><circle cx="7.6" cy="7.6" r="1.4"/></svg>
8478        </div>
8479        <p>Stock checks, returns and shipping questions handled without pulling anyone off the floor.</p>
8480        <span class="go">See the recipe <em>&rarr;</em></span>
8481      </div>
8482    </a>
8483
8484  </div>
8485
8486  <h3 class="trade-sector">Food &amp; hospitality</h3>
8487  <div class="trade-plate cols-4 r">
8488
8489    <a class="trade" href="https://talkify.nz/cafe">
8490      <div class="shot" role="img" aria-label="NZ busy cafe counter with the machine running while an order arrives on a screen">
8491        <i style="--pos:center 50%;--shot-dark:url('https://talkify.nz/media/frontend/cafe-counter.jpg')"></i>
8492      </div>
8493      <div class="body">
8494        <div class="hd">
8495          <h3>Cafes &amp; <span class="it">coffee shops.</span></h3>
8496          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 8h13v5a5 5 0 01-5 5H9a5 5 0 01-5-5z"/><path d="M17 9h2.5a2.5 2.5 0 010 5H17"/><path d="M6 3v2M10 3v2M14 3v2"/></svg>
8497        </div>
8498        <p>The office coffee run taken with the right milk on every cup, while nobody behind the machine looks up.</p>
8499        <span class="go">See the recipe <em>&rarr;</em></span>
8500      </div>    </a>
8501
8502    <a class="trade" href="https://talkify.nz/chinese-takeaway">
8503      <div class="shot" role="img" aria-label="NZ Chinese takeaway counter on a Friday night while an order lands on a screen">
8504        <i style="--pos:center 50%;--shot-dark:url('https://talkify.nz/media/frontend/chinese-takeaway.jpg')"></i>
8505      </div>
8506      <div class="body">
8507        <div class="hd">
8508          <h3>Chinese <span class="it">takeaways.</span></h3>
8509          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 8h14l-1.5 11a2 2 0 01-2 2h-7a2 2 0 01-2-2z"/><path d="M9 8V5a3 3 0 016 0v3"/></svg>
8510        </div>
8511        <p>Twelve dishes, every question about what is in them, and the allergy in red where nobody can miss it.</p>
8512        <span class="go">See the recipe <em>&rarr;</em></span>
8513      </div>
8514    </a>
8515
8516    <a class="trade" href="https://talkify.nz/fish-and-chip-shop">
8517      <div class="shot" role="img" aria-label="NZ fish and chip shop counter at teatime while Talkify takes an order on the phone">
8518        <i style="--pos:center 55%;--shot-dark:url('https://talkify.nz/media/frontend/fish-and-chips.jpg')"></i>
8519      </div>
8520      <div class="body">
8521        <div class="hd">
8522          <h3>Fish &amp; <span class="it">chip shops.</span></h3>
8523          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12c3-4 7-6 11-6l6 6-6 6c-4 0-8-2-11-6z"/><circle cx="16" cy="10.5" r="1"/></svg>
8524        </div>
8525        <p>Every call answered through the teatime rush, and the chicken salt written on the chips rather than lost.</p>
8526        <span class="go">See the recipe <em>&rarr;</em></span>
8527      </div>
8528    </a>
8529
8530    <a class="trade" href="https://talkify.nz/hotel">
8531      <div class="shot" role="img" aria-label="NZ motel reception desk in the evening while Talkify takes a late booking">
8532        <i style="--pos:center 35%;--shot-dark:url('https://talkify.nz/media/frontend/hotel-day.webp')"></i>
8533        <span class="shot-alert at-top-right" aria-hidden="true">
8534    <span class="shot-alert-hd">
8535        <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100"
8536     width="20" height="20"
8537     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
8538            <defs>
8539            <linearGradient id="tkgAurpd9" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8">
8540                <stop offset="0" stop-color="#318abe"/>
8541                <stop offset="1" stop-color="#a3d654"/>
8542            </linearGradient>
8543        </defs>
8544        <circle cx="50" cy="50" r="50" fill="url(#tkgAurpd9)"/>
8545    
8546    <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round">
8547        <path d="M34 26 V54 C34 74 62 80 76 62"/>
8548        <path d="M20 40 H46"/>
8549    </g>
8550    
8551    <g transform="translate(56 20) scale(0.30)">
8552        <g class="">
8553            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/>
8554        </g>
8555    </g>
8556    </svg>
8557        <span class="shot-alert-app">Talkify</span>
8558        <span class="shot-alert-stamp">now</span>
8559    </span>
8560    <strong class="shot-alert-title">Room booked</strong>
8561            <span class="shot-alert-body">2 nights, late check-in sent</span>
8562    </span>
8563      </div>
8564      <div class="body">
8565        <div class="hd">
8566          <h3>Hotels &amp; <span class="blue">motels.</span></h3>
8567          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 18V9a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v9"/><path d="M3 18h18M7 7V5h10v2M7 12h4"/></svg>
8568        </div>
8569        <p>Rooms quoted and sold at 11pm, late check-in explained, anything urgent rung through to the duty phone.</p>
8570        <span class="go">See the recipe <em>&rarr;</em></span>
8571      </div>
8572    </a>
8573
8574    <a class="trade" href="https://talkify.nz/pizza-shop">
8575      <div class="shot" role="img" aria-label="NZ pizza shop bench beside the oven while an order arrives on a screen">
8576        <i style="--pos:center 50%;--shot-dark:url('https://talkify.nz/media/frontend/pizza-shop.jpg')"></i>
8577      </div>
8578      <div class="body">
8579        <div class="hd">
8580          <h3>Pizza <span class="it">shops.</span></h3>
8581          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l9 17H3z"/><circle cx="12" cy="11" r="1"/><circle cx="9.5" cy="16" r="1"/><circle cx="14.5" cy="16" r="1"/></svg>
8582        </div>
8583        <p>Ninety minutes of calls at once, with the half-and-half written on the pizza it belongs to.</p>
8584        <span class="go">See the recipe <em>&rarr;</em></span>
8585      </div>
8586    </a>
8587
8588    <a class="trade" href="https://talkify.nz/restaurant-bookings">
8589      <div class="shot" role="img" aria-label="NZ restaurant host stand during service while a table booking arrives on a screen">
8590        <i style="--pos:center 45%;--shot-dark:url('https://talkify.nz/media/frontend/restaurant-bookings.jpg')"></i>
8591      </div>
8592      <div class="body">
8593        <div class="hd">
8594          <h3>Restaurant <span class="it">bookings.</span></h3>
8595          <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3v9a3 3 0 003 3v6M6 7h3M18 3c-1.5 2-2 4-2 6a2 2 0 002 2v10"/></svg>
8596        </div>
8597        <p>The Saturday table booked at eleven on a Wednesday night, when your phone would otherwise ring out.</p>
8598        <span class="go">See the recipe <em>&rarr;</em></span>
8599      </div>
8600    </a>
8601
8602  </div>
8603</section>
8604
8605
8606    
8607    <section class="shell tight" id="after-hours" style="padding-top:0">
8608        <div class="spot spot--urgent spot-cols r">
8609            <div class="spot-glow spot-glow--urgent" aria-hidden="true"></div>
8610            <div class="ah-copy">
8611                <span class="eyebrow"><span class="pin"></span>Nights, weekends and public holidays</span>
8612                <h2 class="r">The 11pm call <span class="it">that cannot wait.</span></h2>
8613
8614                <p class="lede r r-1">A burst pipe does not check your opening hours. The agent answers, works out
8615                    whether it is an emergency or a Monday job, and if it cannot wait it starts working down your
8616                    on-call list until an actual person picks up.</p>
8617
8618                <ul class="ah-points r r-2">
8619                    <li><strong>Triages first.</strong> Emergencies get escalated. Everything else is taken as a
8620                        message and lands with the rest of your morning.</li>
8621                    <li><strong>Chases a human.</strong> Notification, then text, then a phone call, and on to the
8622                        next person on the roster if the first does not accept.</li>
8623                    <li><strong>Hands over the job.</strong> Address, fault, caller and number, so whoever accepts is
8624                        driving rather than ringing back to ask.</li>
8625                </ul>
8626
8627                <div class="ah-cta r r-3">
8628                    <a href="https://talkify.nz/on-call-roster" class="btn btn-primary btn-lg">See the on-call roster
8629                        <span class="arr">&rarr;</span></a>
8630                    <a href="https://talkify.nz/after-hours-answering" class="btn btn-ghost btn-lg">After-hours answering</a>
8631                </div>
8632
8633                
8634                <p class="ah-price r r-3"><span class="lbl">On-call roster</span>
8635                    <b>$19.95</b>/mo, on top of an agent. Escalation texts
8636                    and calls at the usual rates.</p>
8637            </div>
8638
8639            <div class="ah-phone r r-1">
8640                <div class="hphone agent-phone agent-phone--right" data-agent-phone="afterhours"
8641      data-agent-at="23:42"      aria-label="A phone at a quarter to midnight showing Talkify triaging a burst pipe and escalating it down the on-call roster until somebody accepted">
8642  <div class="hphone-frame">
8643    <div class="hphone-screen">
8644      <div class="hphone-notch" aria-hidden="true"></div>
8645
8646      <div class="hphone-clock" data-agent-clock>
8647        <div class="t" data-agent-time></div>
8648        <div class="d" data-agent-date></div>
8649      </div>
8650
8651      <div class="hphone-stack">
8652                  <article class="hpn">
8653            <header>
8654              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
8655              <span class="hpn-app">Talkify</span>
8656              <span class="hpn-ago" data-agent-ago="4"></span>
8657            </header>
8658            <h4>Emergency · burst pipe</h4>
8659            <p>Ngatai Rd · water through the ceiling</p>
8660          </article>
8661                  <article class="hpn">
8662            <header>
8663              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
8664              <span class="hpn-app">Talkify</span>
8665              <span class="hpn-ago" data-agent-ago="3"></span>
8666            </header>
8667            <h4>Ringing Sam</h4>
8668            <p>No answer · moving to the next on the roster</p>
8669          </article>
8670                  <article class="hpn">
8671            <header>
8672              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
8673              <span class="hpn-app">Talkify</span>
8674              <span class="hpn-ago" data-agent-ago="2"></span>
8675            </header>
8676            <h4>Dave accepted</h4>
8677            <p>On the way, ETA 25 minutes</p>
8678          </article>
8679                  <article class="hpn">
8680            <header>
8681              <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
8682              <span class="hpn-app">Talkify</span>
8683              <span class="hpn-ago" data-agent-ago="1"></span>
8684            </header>
8685            <h4>Caller told</h4>
8686            <p>Texted the ETA and the name of who is coming</p>
8687          </article>
8688              </div>
8689
8690      <div class="hphone-bar" aria-hidden="true"></div>
8691    </div>
8692  </div>
8693</div>
8694            </div>
8695        </div>
8696    </section>
8697
8698    <section class="shell" id="testimonials">
8699    <div class="section-hd">
8700        <h2 class="r">What customers <span class="it">actually say.</span></h2>
8701        <p class="lede r r-1">Reviews from our Google profile, in full. The only change is our own name in place of the
8702            owner's, and surnames shortened.</p>
8703    </div>
8704
8705    
8706    <div class="tst r" data-tst>
8707        <div class="tst-track" data-tst-track role="list">
8708                                            <article class="tst-card" role="listitem" aria-roledescription="review"
8709                         aria-label="Review 1 of 6">
8710                    <div class="tst-top">
8711                        <div class="tst-stars" aria-label="5 out of 5">&#9733;&#9733;&#9733;&#9733;&#9733;</div>
8712                        <span class="tst-badge">Google</span>
8713                    </div>
8714
8715                    <blockquote class="tst-quote" data-tst-quote>
8716                        "Thanks Talkify, love the AI Assistant phone service since we have implemented it at SUB10 to take the pressure off our reception staff and after hours phone handling. Its ability to answer most members and prospects questions has been a real game changer and most don&#039;t even know its AI, even though the voice states it is! Thank you!"
8717                    </blockquote>
8718
8719                    
8720                    <footer class="tst-foot">
8721                        <div class="tst-init" aria-hidden="true">DW</div>
8722                        <div>
8723                            <div class="tst-name">Dean W.</div>
8724                            <div class="tst-role">SUB10</div>
8725                        </div>
8726                    </footer>
8727                </article>
8728                                            <article class="tst-card" role="listitem" aria-roledescription="review"
8729                         aria-label="Review 2 of 6">
8730                    <div class="tst-top">
8731                        <div class="tst-stars" aria-label="5 out of 5">&#9733;&#9733;&#9733;&#9733;&#9733;</div>
8732                        <span class="tst-badge">Google</span>
8733                    </div>
8734
8735                    <blockquote class="tst-quote is-clamped" data-tst-quote>
8736                        "Awesome! I&#039;m so busy with my little tech support business I&#039;ve been waiting so long for something like this to at least answer my calls when I&#039;m onsite or with a customer, which is all day as per bookings etc, now <mark>instead of a missed call they can at least talk to someone</mark> and pass on their info plus how urgent it is, then I can filter through asap after my jobs are done and get back to people already knowing the problem, contact details, address and urgency level already. My customers love it! So far most of them do not know if she&#039;s real or not, it&#039;s amazing."
8737                    </blockquote>
8738
8739                                            <button type="button" class="tst-more-btn" data-tst-expand aria-expanded="false">
8740                            <span>Read the full review</span>
8741                        </button>
8742                    
8743                    <footer class="tst-foot">
8744                        <div class="tst-init" aria-hidden="true">DB</div>
8745                        <div>
8746                            <div class="tst-name">Dylan B.</div>
8747                            <div class="tst-role">Tech support, onsite all day</div>
8748                        </div>
8749                    </footer>
8750                </article>
8751                                            <article class="tst-card" role="listitem" aria-roledescription="review"
8752                         aria-label="Review 3 of 6">
8753                    <div class="tst-top">
8754                        <div class="tst-stars" aria-label="5 out of 5">&#9733;&#9733;&#9733;&#9733;&#9733;</div>
8755                        <span class="tst-badge">Google</span>
8756                    </div>
8757
8758                    <blockquote class="tst-quote is-clamped" data-tst-quote>
8759                        "Talkify Delivers! Highly Recommended. As a busy motorhome and caravan dealership, missing customer calls simply isn&#039;t an option. For years, we used traditional answering services, but the costs kept increasing while the service remained much the same. We knew there had to be a better way. Before Talkify, we tried another AI phone agent provider, but when Talkify came looking for a caravan for the family and reached out, we decided to give them a chance. We&#039;re glad we did. After several months of using Talkify AI Phone Agents, we can honestly say the system has exceeded our expectations. The AI handles customer enquiries professionally, captures leads effectively, and ensures our customers always have someone available to speak with. It has helped streamline our operations while reducing costs at the same time. What really impressed us, however, wasn&#039;t just the technology. In a world where many companies disappear after making the sale, Talkify is the complete opposite. Whether it&#039;s during business hours, after hours, or on weekends, they&#039;re always available to help. If we leave a message, <mark>we usually hear back within 8 minutes</mark>. That kind of service is almost unheard of these days. More importantly, they genuinely care about helping businesses succeed, constantly coming up with ideas, improvements, and solutions that go beyond the AI receptionist itself. Rather than simply selling software, they become part of your team and work with you to improve your customer experience and business processes. Talkify has become an important part of our operation today, and the support we receive is second to none. If you&#039;re considering a receptionist or phone answering solution, seriously stop looking."
8760                    </blockquote>
8761
8762                                            <button type="button" class="tst-more-btn" data-tst-expand aria-expanded="false">
8763                            <span>Read the full review</span>
8764                        </button>
8765                    
8766                    <footer class="tst-foot">
8767                        <div class="tst-init" aria-hidden="true">IR</div>
8768                        <div>
8769                            <div class="tst-name">Infinity RV</div>
8770                            <div class="tst-role">Motorhome &amp; caravan dealership</div>
8771                        </div>
8772                    </footer>
8773                </article>
8774                                            <article class="tst-card" role="listitem" aria-roledescription="review"
8775                         aria-label="Review 4 of 6">
8776                    <div class="tst-top">
8777                        <div class="tst-stars" aria-label="5 out of 5">&#9733;&#9733;&#9733;&#9733;&#9733;</div>
8778                        <span class="tst-badge">Google</span>
8779                    </div>
8780
8781                    <blockquote class="tst-quote" data-tst-quote>
8782                        "Amazing agent. Very good with natural conversation and accurate. <mark>Dictates the information back</mark> to make sure it gets everything correct."
8783                    </blockquote>
8784
8785                    
8786                    <footer class="tst-foot">
8787                        <div class="tst-init" aria-hidden="true">AI</div>
8788                        <div>
8789                            <div class="tst-name">Anton I.</div>
8790                            <div class="tst-role">Local Guide, 25 reviews</div>
8791                        </div>
8792                    </footer>
8793                </article>
8794                                            <article class="tst-card" role="listitem" aria-roledescription="review"
8795                         aria-label="Review 5 of 6">
8796                    <div class="tst-top">
8797                        <div class="tst-stars" aria-label="5 out of 5">&#9733;&#9733;&#9733;&#9733;&#9733;</div>
8798                        <span class="tst-badge">Google</span>
8799                    </div>
8800
8801                    <blockquote class="tst-quote is-clamped" data-tst-quote>
8802                        "Highly Recommended, Outstanding AI Phone Agent Service. For more than 19 years, we relied on traditional answering services to manage our customer calls. However, with rising operating costs and continual price increases from traditional providers, we knew it was time to look for a smarter and more cost-effective solution. Before Talkify, we worked with another AI phone agent company. When Talkify approached us, we decided to give this local company an opportunity. Looking back, it has been one of the best business decisions we&#039;ve made. We have now been using Talkify AI Phone Agents for around two months, and the results have been outstanding. Their technology, reliability, and overall performance have exceeded our expectations. The AI handles our calls professionally and consistently, helping us improve customer service while significantly reducing our monthly costs. However, great technology is only part of the equation. What truly sets Talkify apart is the exceptional support. No matter what time we contact them, they are always willing to help. If they miss a call, they typically get back to us within 10 to 15 minutes. That level of responsiveness and commitment is extremely rare these days. More importantly, they don&#039;t just provide support for the existing system. They are constantly looking for ways to improve our business operations and often come up with new ideas and solutions that add real value. It feels like having a technology partner rather than just another service provider."
8803                    </blockquote>
8804
8805                                            <button type="button" class="tst-more-btn" data-tst-expand aria-expanded="false">
8806                            <span>Read the full review</span>
8807                        </button>
8808                    
8809                    <footer class="tst-foot">
8810                        <div class="tst-init" aria-hidden="true">DY</div>
8811                        <div>
8812                            <div class="tst-name">Dan Y.</div>
8813                            <div class="tst-role">Local Guide, 370 reviews</div>
8814                        </div>
8815                    </footer>
8816                </article>
8817                                            <article class="tst-card" role="listitem" aria-roledescription="review"
8818                         aria-label="Review 6 of 6">
8819                    <div class="tst-top">
8820                        <div class="tst-stars" aria-label="5 out of 5">&#9733;&#9733;&#9733;&#9733;&#9733;</div>
8821                        <span class="tst-badge">Google</span>
8822                    </div>
8823
8824                    <blockquote class="tst-quote" data-tst-quote>
8825                        "Great system! <mark>Highly recommend</mark>"
8826                    </blockquote>
8827
8828                    
8829                    <footer class="tst-foot">
8830                        <div class="tst-init" aria-hidden="true">LB</div>
8831                        <div>
8832                            <div class="tst-name">Lance B.</div>
8833                            <div class="tst-role">Google review</div>
8834                        </div>
8835                    </footer>
8836                </article>
8837                    </div>
8838
8839        <div class="tst-controls">
8840            <button type="button" class="tst-arrow" data-tst-prev aria-label="Previous reviews">&larr;</button>
8841            <div class="tst-dots" data-tst-dots role="tablist" aria-label="Review pages"></div>
8842            <button type="button" class="tst-arrow" data-tst-next aria-label="Next reviews">&rarr;</button>
8843        </div>
8844    </div>
8845
8846    
8847    <p class="r tst-more">
8848        <a href="https://g.page/r/CXXh1vkRspV_EAE" target="_blank" rel="noopener">Read them on Google <span class="arr">&rarr;</span></a>
8849    </p>
8850</section>
8851
8852
8853
8854    <section class="shell" id="journal-strip">
8855  <div class="section-hd">
8856    <h2 class="r">Latest from the <span class="it">journal.</span></h2>
8857    <p class="lede r r-1">Real numbers, real call recordings, and plain-English playbooks. One useful piece a week, no fluff.</p>
8858  </div>
8859  <div class="r" style="display:grid;grid-template-columns:repeat(3,1fr);gap:24px" id="home-journal-grid">
8860          <a href="https://talkify.nz/blog/where-does-your-ai-receptionist-send-your-calls" class="post-card">
8861        <div class="post-hero" style="background-image:url('https://talkify.nz/media/frontend/blog/where-does-your-ai-receptionist-send-your-calls.jpg')"></div>
8862        <div class="post-body">
8863          <div class="post-meta">Guides · 7 min</div>
8864          <h3 class="post-title">Where does your AI receptionist actually send your calls?</h3>
8865          <p class="post-excerpt">The AI receptionist market is being flooded, and most of the flood is thin. Here is what actually sits underneath these things, wh...</p>
8866          <div class="post-foot">13 Sep 2026 <span>Read →</span></div>
8867        </div>
8868      </a>
8869          <a href="https://talkify.nz/blog/one-calendar-for-your-whole-team" class="post-card">
8870        <div class="post-hero" style="background-image:url('https://talkify.nz/media/frontend/blog/one-calendar-for-your-whole-team.jpg')"></div>
8871        <div class="post-body">
8872          <div class="post-meta">Product · 5 min</div>
8873          <h3 class="post-title">One calendar for your whole team, and proof of where every booking went</h3>
8874          <p class="post-excerpt">Talkify now has a Calendar. Every diary in your business on one screen, what your agent booked while you were on the tools, and pr...</p>
8875          <div class="post-foot">4 Sep 2026 <span>Read →</span></div>
8876        </div>
8877      </a>
8878          <a href="https://talkify.nz/blog/best-ai-receptionist-nz" class="post-card">
8879        <div class="post-hero" style="background-image:url('https://talkify.nz/media/frontend/blog/best-ai-receptionist-nz.jpg')"></div>
8880        <div class="post-body">
8881          <div class="post-meta">Guides · 7 min</div>
8882          <h3 class="post-title">The best AI receptionists in New Zealand (2026), ranked by one of them</h3>
8883          <p class="post-excerpt">Every &quot;best AI receptionist NZ&quot; ranking is either an overseas content farm recommending American services or a vendor putt
8883ing itse...</p>
8884          <div class="post-foot">25 Aug 2026 <span>Read →</span></div>
8885        </div>
8886      </a>
8887      </div>
8888  <div class="r" style="text-align:center;margin-top:36px">
8889    <a href="https://talkify.nz/blog" class="btn btn-ghost btn-lg">Read the whole journal <span class="arr">→</span></a>
8890  </div>
8891  <style>
8892    /* V2 design language: top-ruled columns with the photograph under the rule,
8893       rather than filled cards that lift on hover. The rule fills with the
8894       brand gradient on hover, which is the whole affordance. */
8895    #home-journal-grid .post-card{position:relative;display:flex;flex-direction:column;padding-top:22px;text-decoration:none;color:inherit}
8896    #home-journal-grid .post-card::before,
8897    #home-journal-grid .post-card::after{content:"";position:absolute;top:0;left:0;right:0;height:1px}
8898    #home-journal-grid .post-card::before{background:var(--line-2)}
8899    #home-journal-grid .post-card::after{background:var(--grad);transform:scaleX(0);transform-origin:left;transition:transform .5s var(--ease-out)}
8900    #home-journal-grid .post-card:hover::after{transform:scaleX(1)}
8901    #home-journal-grid .post-card:hover .post-title{color:var(--signal)}
8902    #home-journal-grid .post-hero{aspect-ratio:16/10;background-size:cover;background-position:center}
8903    #home-journal-grid .post-body{padding:20px 0 0;display:flex;flex-direction:column;gap:12px;flex:1}
8904    #home-journal-grid .post-title{transition:color .3s var(--ease)}
8905    #home-journal-grid .post-meta{font-family:var(--mono);font-size:10px;color:var(--mute);letter-spacing:.16em;text-transform:uppercase}
8906    #home-journal-grid .post-title{font-family:var(--serif);font-weight:400;font-size:22px;line-height:1.15;letter-spacing:-.01em;color:var(--paper)}
8907    #home-journal-grid .post-excerpt{color:var(--bone);font-size:14px;line-height:1.55;flex:1}
8908    #home-journal-grid .post-foot{font-family:var(--mono);font-size:11px;color:var(--mute);letter-spacing:.06em;border-top:1px dashed var(--line);padding-top:14px;display:flex;justify-content:space-between;align-items:center}
8909    #home-journal-grid .post-foot span{color:var(--signal)}
8910    @media (max-width:1100px){ #home-journal-grid{grid-template-columns:1fr !important} }
8911  </style>
8912</section>
8913
8914    <section class="shell" id="faq">
8915  <div class="section-hd">
8916    <h2 class="r">Frequently <span class="it">asked.</span></h2>
8917    
8918        <p class="lede r r-1">The questions we hear most. If yours isn't here, ring our live demo agent on 03 242 1262, it'll either answer or queue a callback from a human.</p>
8919      </div>
8920
8921  <div class="r faq-list" id="faq-grid">
8922          <details class="faq-q">
8923        <summary>
8924          <span class="faq-n" aria-hidden="true">01</span>
8925          <span class="faq-t">What is an AI receptionist?</span>
8926          <span class="faq-icon" aria-hidden="true">+</span>
8927        </summary>
8928        <div class="faq-a">An AI receptionist is software that answers your business phone in a natural human voice. It greets callers, answers questions about your business, books appointments into your calendar, takes detailed messages and transfers urgent calls to a real person. Unlike voicemail it holds a real conversation, and unlike a person it answers every call at once, 24 hours a day. Talkify is an AI receptionist built in Christchurch for New Zealand businesses.</div>
8929      </details>
8930          <details class="faq-q">
8931        <summary>
8932          <span class="faq-n" aria-hidden="true">02</span>
8933          <span class="faq-t">What is an AI Phone Agent?</span>
8934          <span class="faq-icon" aria-hidden="true">+</span>
8935        </summary>
8936        <div class="faq-a">An AI Phone Agent is a voice-powered AI that answers your business calls 24/7. It sounds natural and human-like, can answer questions about your business, book appointments, qualify leads, and forward messages via SMS or email. Think of it as a virtual receptionist that never sleeps.</div>
8937      </details>
8938          <details class="faq-q">
8939        <summary>
8940          <span class="faq-n" aria-hidden="true">03</span>
8941          <span class="faq-t">Is Talkify a voice assistant for business?</span>
8942          <span class="faq-icon" aria-hidden="true">+</span>
8943        </summary>
8944        <div class="faq-a">Yes. Talkify is an AI voice assistant that answers your business phone 24/7, in real New Zealand and Australian voices. It books callers straight into your calendar and texts you the summary the moment the call ends. There is no hardware and no new handset: it works by forwarding your existing business number, so you are running in minutes.</div>
8945      </details>
8946          <details class="faq-q">
8947        <summary>
8948          <span class="faq-n" aria-hidden="true">04</span>
8949          <span class="faq-t">How does Talkify work with my existing phone number?</span>
8950          <span class="faq-icon" aria-hidden="true">+</span>
8951        </summary>
8952        <div class="faq-a">Talkify works via call forwarding. You set up your existing business number to forward to your Talkify number when you can&#039;t answer (busy, after-hours, or always). No hardware changes, no number porting, no IT project.</div>
8953      </details>
8954          <details class="faq-q">
8955        <summary>
8956          <span class="faq-n" aria-hidden="true">05</span>
8957          <span class="faq-t">Can the AI agent book appointments into my calendar?</span>
8958          <span class="faq-icon" aria-hidden="true">+</span>
8959        </summary>
8960        <div class="faq-a">Yes. Talkify books into Google Calendar, Microsoft Outlook, Calendly, Zenoti, GymMaster and Cliniko and sends booking requests into MechanicDesk and Workshop Software for the workshop to accept. It syncs contacts and outcomes to HubSpot and GoHighLevel. Other systems can be wired up on a custom setup. The agent checks live availability, books, reschedules, and texts confirmation to the caller automatically.</div>
8961      </details>
8962          <details class="faq-q">
8963        <summary>
8964          <span class="faq-n" aria-hidden="true">06</span>
8965          <span class="faq-t">How much does Talkify cost?</span>
8966          <span class="faq-icon" aria-hidden="true">+</span>
8967        </summary>
8968        <div class="faq-a">Business agents are on the Broadcast plan: $129/month at the founding rate for your first 3 months, then $199. The Personal Assistant (Shortwave) is different: it answers one person&#039;s own mobile or landline, not a business, and is $89/month. Fleet is custom-priced for multi-location and contact-centre operators. Shortwave includes 50 minutes a month and Broadcast 200; extra minutes are 10c each for your first 3 months, then 20c. The first 20 texts every month are free, then 9c each. No setup fee, no lock-in.</div>
8969      </details>
8970          <details class="faq-q">
8971        <summary>
8972          <span class="faq-n" aria-hidden="true">07</span>
8973          <span class="faq-t">Does the AI sound robotic?</span>
8974          <span class="faq-icon" aria-hidden="true">+</span>
8975        </summary>
8976        <div class="faq-a">Not at all. Talkify uses state-of-the-art voice AI that sounds remarkably natural. Most callers don&#039;t realise they&#039;re speaking with an AI. You can choose from 32 voices, clone your own voice (Broadcast/Fleet plans), and tune the tone (corporate, warm, playful) to match your brand.</div>
8977      </details>
8978          <details class="faq-q">
8979        <summary>
8980          <span class="faq-n" aria-hidden="true">08</span>
8981          <span class="faq-t">What languages does Talkify support?</span>
8982          <span class="faq-icon" aria-hidden="true">+</span>
8983        </summary>
8984        <div class="faq-a">Talkify handles 32 languages out of the box including English (NZ, AU, US, GB), te reo Māori, Mandarin, Spanish, Hindi, Japanese, German and French. Agents detect the caller&#039;s language and switch on the fly, useful for New Zealand&#039;s diverse customer base.</div>
8985      </details>
8986          <details class="faq-q">
8987        <summary>
8988          <span class="faq-n" aria-hidden="true">09</span>
8989          <span class="faq-t">Can I train the AI on my specific business information?</span>
8990          <span class="faq-icon" aria-hidden="true">+</span>
8991        </summary>
8992        <div class="faq-a">Absolutely. Drop in your services, hours, pricing, FAQs and escalation rules and the agent learns it all. The dashboard ships a live prompt editor, tweak any wording, escalation rule or opening hour and it goes live in seconds.</div>
8993      </details>
8994          <details class="faq-q">
8995        <summary>
8996          <span class="faq-n" aria-hidden="true">10</span>
8997          <span class="faq-t">How much does an AI receptionist cost in NZ?</span>
8998          <span class="faq-icon" aria-hidden="true">+</span>
8999        </summary>
9000        <div class="faq-a">Talkify business agents are $129/month at the founding rate for your first 3 months, then $199, including 200 minutes of calls, with extra minutes from 10c. There is no setup fee and no lock-in. For comparison, an employed receptionist in NZ costs roughly $55,000 to $65,000 a year before KiwiSaver, ACC and leave, and human answering services typically run $200 to $500 a month at real call volumes once per-call charges are counted.</div>
9001      </details>
9002          <details class="faq-q">
9003        <summary>
9004          <span class="faq-n" aria-hidden="true">11</span>
9005          <span class="faq-t">What is the difference between an AI receptionist and a virtual receptionist?</span>
9006          <span class="faq-icon" aria-hidden="true">+</span>
9007        </summary>
9008        <div class="faq-a">A virtual receptionist is usually a person in a call centre answering for many businesses during business hours, billed per call or per minute. An AI receptionist answers instantly at any hour, handles every caller at once, never bills you more because you had a busy week, and books the job while the caller is still on the line instead of handing you a message to chase. We compare the two honestly, including when a human service is the better fit, on our virtual receptionist page.</div>
9009      </details>
9010          <details class="faq-q">
9011        <summary>
9012          <span class="faq-n" aria-hidden="true">12</span>
9013          <span class="faq-t">What happens when a call is too complex for the AI?</span>
9014          <span class="faq-icon" aria-hidden="true">+</span>
9015        </summary>
9016        <div class="faq-a">It transfers the call to you or your team, with context. You set the rules: emergencies, VIP clients or anything you flag gets warm-transferred or texted to your mobile within seconds, with the caller&#039;s name, number and the gist of what they need. Everything else is handled without interrupting you.</div>
9017      </details>
9018          <details class="faq-q">
9019        <summary>
9020          <span class="faq-n" aria-hidden="true">13</span>
9021          <span class="faq-t">Where is my data stored?</span>
9022          <span class="faq-icon" aria-hidden="true">+</span>
9023        </summary>
9024        <div class="faq-a">All audio, transcripts and call metadata are stored in NZ data centres, encrypted at rest with AES-256. Detailed compliance documentation available on request. Built for operators (legal, accounting, healthcare) where data residency matters.</div>
9025      </details>
9026          <details class="faq-q">
9027        <summary>
9028          <span class="faq-n" aria-hidden="true">14</span>
9029          <span class="faq-t">Is there a free trial or demo?</span>
9030          <span class="faq-icon" aria-hidden="true">+</span>
9031        </summary>
9032        <div class="faq-a">Yes, three ways. Ring us on 03 242 1262 any time and one of our own agents answers, so you can hear exactly how it handles a real caller. Click the chat widget on this page to talk to Talky right now. Or sign up at the form below and we&#039;ll wire up a dedicated demo number for your business, no card needed.</div>
9033      </details>
9034      </div>
9035
9036  <style>
9037    /* V2 design language: a ruled list, not a grid of boxed cards. Each row is
9038       a hairline, a mono index, the question in serif, and a bare + opposite.
9039       The old version was two columns of rounded, filled panels each with the
9040       + in a circular badge, which is the card furniture the V2 homepage does
9041       without. One column because a ruled list has to read down a single
9042       measure; two columns of rules would fight each other across the gutter. */
9043    .faq-list { margin-top: 44px; border-bottom: 1px solid var(--line-2) }
9044
9045    .faq-q { border-top: 1px solid var(--line-2) }
9046
9047    .faq-q summary {
9048      display: grid;
9049      grid-template-columns: 54px 1fr auto;
9050      align-items: center;
9051      gap: clamp(12px, 2vw, 24px);
9052      padding: 24px clamp(4px, 1vw, 12px);
9053      cursor: pointer;
9054      list-style: none;
9055      transition: background .3s var(--ease)
9056    }
9057
9058    .faq-q::-webkit-details-marker, .faq-q summary::-webkit-details-marker { display: none }
9059    .faq-q summary::marker { content: "" }
9060
9061    .faq-n {
9062      font-family: var(--mono);
9063      font-size: 11px;
9064      letter-spacing: .14em;
9065      color: var(--mute-2)
9066    }
9067
9068    .faq-t {
9069      font-family: var(--serif);
9070      font-weight: 400;
9071      font-size: clamp(17px, 1.7vw, 22px);
9072      line-height: 1.28;
9073      letter-spacing: -.01em;
9074      color: var(--paper);
9075      transition: color .3s var(--ease)
9076    }
9077
9078    .faq-icon {
9079      font-family: var(--mono);
9080      font-size: 17px;
9081      line-height: 1;
9082      color: var(--mute);
9083      transition: transform .3s var(--ease-out), color .3s var(--ease)
9084    }
9085
9086    .faq-q:hover summary { background: var(--surface-2) }
9087    .faq-q:hover .faq-t { color: var(--signal) }
9088    .faq-q:hover .faq-icon { color: var(--signal) }
9089
9090    .faq-q[open] .faq-icon { transform: rotate(45deg); color: var(--signal) }
9091    .faq-q[open] .faq-n { color: var(--signal) }
9092
9093    .faq-a {
9094      padding: 0 clamp(4px, 1vw, 12px) 28px calc(54px + clamp(12px, 2vw, 24px));
9095      max-width: 76ch;
9096      color: var(--bone);
9097      font-size: 14.5px;
9098      line-height: 1.68
9099    }
9100
9101    .faq-q summary:focus { outline: none }
9102    .faq-q summary:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px }
9103
9104    @media (prefers-reduced-motion: reduce) {
9105      .faq-q summary, .faq-t, .faq-icon { transition: none }
9106    }
9107
9108    @media (max-width: 640px) {
9109      .faq-q summary { grid-template-columns: 34px 1fr auto }
9110      .faq-a { padding-left: calc(34px + 12px) }
9111    }
9112  </style>
9113</section>
9114
9115    
9116    <section class="shell" id="how-it-works" style="padding-top:0">
9117        <div class="section-hd">
9118            <h2 class="r">Plug in. Forward calls. <span class="it">Go quiet.</span></h2>
9119            <p class="lede r r-1">No hardware, no port-out, no IT project. Forward your existing line and the
9120                agent goes live fully briefed and fully on-brand, usually the same afternoon.</p>
9121        </div>
9122
9123        <div class="ruled-index r">
9124            <div class="ruled-row">
9125                <span class="num">01</span>
9126                <span class="name">Brief it</span>
9127                <span class="desc">Drop in your business knowledge: opening hours, services, pricing, FAQs and
9128                    escalation paths. We bake it into your agent's voice, in your words.</span>
9129            </div>
9130            <div class="ruled-row">
9131                <span class="num">02</span>
9132                <span class="name">Forward your number</span>
9133                <span class="desc">Point your existing business number at the Talkify number we issue. It is call
9134                    forwarding, so there is no port-out, no hardware and no new handset, and it is reversible any
9135                    time you want the line back.</span>
9136            </div>
9137            <div class="ruled-row">
9138                <span class="num">03</span>
9139                <span class="name">Operate</span>
9140                <span class="desc">Watch calls happen in real time on the dashboard, edit the prompt on the fly, and
9141                    read the transcript and summary of every call the moment it ends.</span>
9142            </div>
9143        </div>
9144    </section>
9145
9146    <section class="endcta endcta-has-form" id="endcta">
9147    <div class="endcta-photo" aria-hidden="true"></div>
9148
9149    
9150    <div class="endcta-wrap" id="signup">
9151        <div class="endcta-pitch">
9152            <div class="stamp">TWO WAYS TO HEAR THE AGENT</div>
9153            <h2>Don&#039;t read about it.<br><span class="it">Talk to it.</span></h2>
9154
9155            <div class="endcta-numbers">
9156                                <a href="tel:+6432421262" class="num-big" data-talkify-agent="default"
9157                   title="Hear the agent yourself">
9158      <span class="ic ic-demo">
9159        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"
9160             stroke-linecap="round"><path
9161                d="M3 5a2 2 0 012-2h2.5a1 1 0 01.96.73l1.2 4.2a1 1 0 01-.5 1.16l-1.94.97a11 11 0 005.7 5.7l.97-1.94a1 1 0 011.16-.5l4.2 1.2a1 1 0 01.73.96V19a2 2 0 01-2 2A16 16 0 013 5z"/></svg>
9162      </span>
9163                    <span>
9164        <small>Hear it yourself · our AI agent, 24/7 · ask it anything</small>
9165        03 242 1262
9166      </span>
9167                </a>
9168                
9169                                    <a href="tel:+64800002967" class="num-big num-blue" title="Sign up, sales and support">
9170      <span class="ic ic-signup">
9171        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"
9172             stroke-linecap="round"><path
9173                d="M16 21v-2a4 4 0 00-4-4H6a4 4 0 00-4 4v2M9 11a4 4 0 100-8 4 4 0 000 8zM19 8v6M22 11h-6"/></svg>
9174      </span>
9175                        <span>
9176        <small>Sign up, sales &amp; support · we'll set you up</small>
9177        0800 002 967
9178      </span>
9179                    </a>
9180                            </div>
9181
9182            <div class="endcta-meta">
9183                                    <span>● No card</span><span>● No lock-in</span><span>● Free to call</span><span>● The demo line can sign you up too</span>                            </div>
9184
9185            
9186                        <div class="endcta-alt">
9187                <a href="sms:+64272048827" class="btn btn-ghost btn-lg"
9188       title="Text us instead of ringing">
9189        <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2"
9190             stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="flex:none">
9191            <path d="M21 11.5a8.4 8.4 0 01-9 8.4 9.5 9.5 0 01-2.6-.4L3 21l1.6-4.2A8.2 8.2 0 013 11.5 8.4 8.4 0 0112 3a8.4 8.4 0 019 8.5z"/>
9192        </svg>
9193        Text our agent · 027 204 8827    </a>
9194            </div>
9195            
9196            
9197                            <p class="endcta-app-line">Or run it from your pocket</p>
9198                <div class="app-stores" style="--app-badge-h: 46px">
9199    <a class="app-badge" href="https://apps.apple.com/nz/app/talkify-mobile/id6766709308"
9200       target="_blank" rel="noopener">
9201        <img src="https://talkify.nz/media/branding/apple-app-store.svg"
9202             alt="Download Talkify Mobile on the App Store"
9203             width="137.6" height="46" loading="lazy">
9204    </a>
9205    <a class="app-badge" href="https://play.google.com/store/apps/details?id=com.talkifynz.app"
9206       target="_blank" rel="noopener">
9207        <img src="https://talkify.nz/media/branding/google-app-store.svg"
9208             alt="Get Talkify Mobile on Google Play"
9209             width="155.3" height="46" loading="lazy">
9210    </a>
9211</div>
9212                    </div>
9213
9214                    <div class="endcta-form">
9215                
9216                <span class="eyebrow"><span class="pin"></span>Get your first agent ·  No card needed </span>
9217
9218                <form method="POST" action="https://talkify.nz/contact" class="form">
9219                    <input type="hidden" name="_token" value="2cZHQjhlrpDk2bAxkNOtWyU4l8TAY6RFoVgytF3j" autocomplete="off">                                        <div class="row">
9220                        <div class="field">
9221                            <label>Your name</label>
9222                            <input type="text" name="name" required placeholder="Your full name" autocomplete="name" value="">
9223                        </div>
9224                        <div class="field">
9225                            <label>Company</label>
9226                            <input type="text" name="company" required placeholder="Your company" autocomplete="organization" value="">
9227                        </div>
9228                    </div>
9229                    <div class="row">
9230                        <div class="field">
9231                            <label>Email</label>
9232                            <input type="email" name="email" required placeholder="Your email" autocomplete="email" value="">
9233                        </div>
9234                        <div class="field">
9235                            <label>Mobile (NZ)</label>
9236                            <input type="tel" name="phone" required placeholder="Your mobile" autocomplete="tel" value="">
9237                        </div>
9238                    </div>
9239                    <div class="field">
9240  <label for="country-signup">Country</label>
9241  <select name="country" id="country-signup" required data-country-select autocomplete="country">
9242    <option value="" disabled selected>Select your country</option>
9243    <option value="NZ" >New Zealand</option>
9244    <option value="AU" >Australia</option>
9245  </select>
9246  <p style="margin-top:8px;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--mute)">
9247    Talkify is currently available to businesses in New Zealand &amp; Australia only.
9248  </p>
9249</div>
9250
9251
9252<div aria-hidden="true" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0">
9253  <input type="text" name="company_reference" tabindex="-1" autocomplete="off" value="" aria-hidden="true">
9254</div>
9255
9256<script>
9257(function () {
9258  var script = document.currentScript;
9259  var form = script && script.closest('form');
9260  if (!form) return;
9261  var select = form.querySelector('select[name="country"]');
9262  if (!select || select.value) return; // respect old() / a choice already made
9263
9264  try {
9265    var tz = (Intl.DateTimeFormat().resolvedOptions().timeZone || '').toLowerCase();
9266    var lang = (navigator.language || '').toLowerCase();
9267    var code = null;
9268
9269    if (tz.indexOf('auckland') >= 0 || tz.indexOf('chatham') >= 0 || lang === 'en-nz' || lang === 'mi') {
9270      code = 'NZ';
9271    } else if (tz.indexOf('australia/') >= 0 || lang === 'en-au') {
9272      code = 'AU';
9273    }
9274
9275    if (code) select.value = code;
9276  } catch (e) { /* detection is best-effort */ }
9277})();
9278</script>
9278
9279                    <div class="field">
9280                        <label>Pick your agent</label>
9281                        <div class="radios">
9282                                                        <label class="radio"><input type="radio" name="agent_type" value="assistant"  data-plan-key="assistant"><span class="dot"></span><div><div class="ttl">Personal Assistant</div><div class="sub">One mobile or landline. Personal use.</div></div></label>
9283                            <label class="radio"><input type="radio" name="agent_type" value="reception" checked data-plan-key="reception"><span class="dot"></span><div><div class="ttl">Reception</div><div class="sub">24/7 call answering for a business</div></div></label>
9284                            <label class="radio"><input type="radio" name="agent_type" value="sales"  data-plan-key="sales"><span class="dot"></span><div><div class="ttl">Sales Agent</div><div class="sub">Inbound qualifier, CRM-synced</div></div></label>
9285                            <label class="radio"><input type="radio" name="agent_type" value="booking"  data-plan-key="booking"><span class="dot"></span><div><div class="ttl">Booking Service</div><div class="sub">Live calendar, conflict-aware</div></div></label>
9286                            <label class="radio"><input type="radio" name="agent_type" value="outgoing"  data-plan-key="outgoing"><span class="dot"></span><div><div class="ttl">Outgoing Agent</div><div class="sub">Your agent does the ringing, billed per call</div></div></label>
9287                            <label class="radio"><input type="radio" name="agent_type" value="survey"  data-plan-key="survey"><span class="dot"></span><div><div class="ttl">Campaign Agent</div><div class="sub">Rings your list, asks your questions, billed per call</div></div></label>
9288                            <label class="radio"><input type="radio" name="agent_type" value="wellness"  data-plan-key="wellness"><span class="dot"></span><div><div class="ttl">Wellness Checks</div><div class="sub">Rings someone daily to check they're alright</div></div></label>
9289                        </div>
9290                        <p class="plan-recommend" data-plan-recommend style="display:none">
9291                            We recommend running an incoming agent alongside an outgoing or campaign agent. People you ring will often ring you
9292                            back, and an incoming agent makes sure those return calls are answered rather than missed. If you would
9293                            rather not add one, we can clone your business caller ID so return calls come straight back to your
9294                            existing phone.
9295                        </p>
9296                    </div>
9297
9298                    <div class="field">
9299                        <label>How you want to pay</label>
9300                        <div class="radios">
9301                            <label class="radio">
9302                                <input type="radio" name="plan" value="broadcast" checked>
9303                                <span class="dot"></span>
9304                                <div><div class="ttl">Monthly plan</div><div class="sub">A set monthly price with included minutes. Most people choose this. Cancel anytime.</div></div>
9305                            </label>
9306                            <label class="radio">
9307                                <input type="radio" name="plan" value="payg" >
9308                                <span class="dot"></span>
9309                                <div><div class="ttl">Pay as you go</div><div class="sub">$1 a minute and 15c a text, prepaid from a balance. $10/month covers your phone number, and you start with $10 of free credit on top. Cancel anytime.</div></div>
9310                            </label>
9311                        </div>
9312                    </div>
9313
9314                    <div class="plan-display" data-plan-display>
9315                        <div class="plan-display-left">
9316                            <div class="plan-display-label" data-plan-label>Personal Assistant</div>
9317                            <div class="plan-display-sub" data-plan-sub>Single mobile or landline. Built for one person, not a business.</div>
9318                        </div>
9319                        <div class="plan-display-right">
9320                            <div class="plan-display-price" data-plan-price>$89<small>/mo</small></div>
9321                            <div class="plan-display-tier" data-plan-tier>Shortwave plan</div>
9322                                                        <div class="plan-display-note" data-plan-note  style="display:none" ></div>
9323                        </div>
9324                    </div>
9325                    <p class="founding-line">
9326                                                    <span class="fl-tag">Founding rate</span> On a monthly plan your price is locked in at the founding rate for your first 3 months, then the standard rate applies. Pay as you go has no founding step: the rate is just the rate.
9327                                                Plans include 50 to 200 minutes a month, then 10c a minute. The first 20 texts each month are free, then 9c each.
9328                    </p>
9329                    <p class="plan-asterisk" data-plan-asterisk style="display:none">
9330                        <span>*</span> Subject to your CRM or booking system. Additional implementation cost may apply for non-standard integrations.
9331                    </p>
9332
9333                    <div class="actions">
9334                        <span class="note">● Your data stays in NZ.</span>
9335                        <button type="submit" class="btn btn-primary btn-lg">Create your first agent <span class="arr">→</span></button>
9336                    </div>
9337                </form>
9338
9339                
9339<script>
9340                    (function () {
9341                        // A plan only carries a crossed-out "was" price and a founding note while
9342                        // its intro price is genuinely below its standard price; when the two
9343                        // match in the pricing table both come through blank and the picker
9344                        // shows a plain price. Per-call plans never have a founding step.
9345                        const PA_NOTE = "";
9346                        const BIZ_NOTE = "Founding rate for your first 3 months, then $199/mo";
9347                        const PA_WAS = "";
9348                        const BIZ_WAS = "$199";
9349
9350                        const PLANS = {
9351                            assistant: { label: 'Personal Assistant', sub: 'Single mobile or landline. Built for one person, not a business.', was: PA_WAS, price: '$89', suffix: '/mo', tier: 'Shortwave plan · personal use only', note: PA_NOTE, asterisk: false },
9352                            reception: { label: 'Reception',         sub: '24/7 AI call answering for your business. Bundled with Sales on the Broadcast plan.', was: BIZ_WAS, price: '$129', suffix: '/mo', tier: 'Broadcast plan · includes Sales Agent', note: BIZ_NOTE, asterisk: false },
9353                            sales:     { label: 'Sales Agent',       sub: 'Inbound lead qualification with CRM sync. Bundled with Reception on the Broadcast plan.', was: BIZ_WAS, price: '$129', suffix: '/mo', tier: 'Broadcast plan · includes Reception *', note: BIZ_NOTE, asterisk: true },
9354                            booking:   { label: 'Booking Service',   sub: 'Live calendar booking into your booking system, with custom API integration where needed.', was: '', price: 'from $499', suffix: '/mo', tier: 'Custom setup · 12-month contract *', note: 'Quoted per build, on a 12-month term.', asterisk: true },
9355                            outgoing:  { label: 'Outgoing Agent',    sub: 'Your agent makes the calls: follow-ups, appointment reminders, confirmations and callbacks. It rings out on a Talkify number, or we can show your own business caller ID instead.', was: '', price: '$59', suffix: '/mo', tier: 'Outgoing campaigns · 20 minutes included, then 50c/min', note: 'Charged only in months you run campaigns. One-off calls outside a campaign are just 50c a minute, no monthly fee.', asterisk: false, recommend: true },
9356                            survey:    { label: 'Campaign Agent',    sub: 'Import your list and the agent rings everyone, asks your questions and reads each conversation against your goal, so you get answers, sentiment and hot leads by name.', was: '', price: '$59', suffix: '/mo', tier: 'Outgoing campaigns · 20 minutes included, then 50c/min', note: 'Marketing runs and phone surveys are the same plan, charged only in months you run one.', asterisk: false, recommend: true },
9357                            wellness:  { label: 'Wellness Checks',   sub: 'Scheduled or randomly timed check-in calls to somebody living alone. The agent asks how they are, gives medication and appointment reminders, texts you after every call and escalates down your contact list when nobody answers.', was: '', price: 'from $59', suffix: '/mo', tier: 'Family Member (one person) · $599 for as many as you like', note: 'Includes 20 call minutes, or 200 pooled minutes on Providers. Priced by how many people are rung, not by features.', asterisk: false },
9358                        };
9359                        // The pay-as-you-go face of the same picker: whatever agent they chose,
9360                        // the money side is the per-minute wallet, so the price panel follows
9361                        // the payment choice rather than quoting a monthly plan.
9362                        const PAYG = {
9363                            price: '$1',
9364                            suffix: '/min',
9365                            tier: 'Pay as you go · $10/month covers your phone number',
9366                            note: '$10 free credit to start, on top of the number. Calls and texts come off your prepaid balance.',
9367                        };
9368                        const form = document.currentScript.closest('.endcta-form') || document;
9369                        const radios = form.querySelectorAll('input[name="agent_type"]');
9370                        const payRadios = form.querySelectorAll('input[name="plan"]');
9371                        const labelEl = form.querySelector('[data-plan-label]');
9372                        const subEl = form.querySelector('[data-plan-sub]');
9373                        const priceEl = form.querySelector('[data-plan-price]');
9374                        const tierEl = form.querySelector('[data-plan-tier]');
9375                        const noteEl = form.querySelector('[data-plan-note]');
9376                        const astEl = form.querySelector('[data-plan-asterisk]');
9377                        const recEl = form.querySelector('[data-plan-rec
9377ommend]');
9378
9379                        function update(){
9380                            const checked = form.querySelector('input[name="agent_type"]:checked');
9381                            if (!checked) return;
9382                            const plan = PLANS[checked.value];
9383                            if (!plan) return;
9384                            const pay = form.querySelector('input[name="plan"]:checked');
9385                            const payg = pay && pay.value === 'payg';
9386                            labelEl.textContent = plan.label;
9387                            subEl.textContent = plan.sub;
9388                            priceEl.innerHTML = payg
9389                                ? PAYG.price + '<small>' + PAYG.suffix + '</small>'
9390                                : (plan.was ? '<s class="was-price">'+plan.was+'</s> ' : '') + plan.price + (plan.suffix ? '<small>'+plan.suffix+'</small>' : '');
9391                            tierEl.textContent = payg ? PAYG.tier : plan.tier;
9392                            if (noteEl) {
9393                                const note = payg ? PAYG.note : (plan.note || '');
9394                                noteEl.textContent = note;
9395                                noteEl.style.display = note ? 'block' : 'none';
9396                            }
9397                            astEl.style.display = (!payg && plan.asterisk) ? 'block' : 'none';
9398                            if (recEl) recEl.style.display = plan.recommend ? 'block' : 'none';
9399                        }
9400                        radios.forEach(r => r.addEventListener('change', update));
9401                        payRadios.forEach(r => r.addEventListener('change', update));
9402                        update();
9403                    })();
9404                </script>
9404
9405            </div>
9406            </div>
9407
9408            <style>
9409            /* Two top-ruled columns rather than two pills side by side. The pair is
9410               held to a readable measure and centred under the headline, so the
9411               block still reads as the close of the page even though the section
9412               itself is centred and these two are ruled and left-aligned. */
9413            .endcta-numbers {
9414                display: grid;
9415                grid-template-columns: 1fr 1fr;
9416                gap: clamp(24px, 4vw, 56px);
9417                margin: 56px auto 0;
9418                max-width: 780px;
9419                text-align: left
9420            }
9421
9422            @media (max-width: 800px) {
9423                .endcta-numbers {
9424                    grid-template-columns: 1fr;
9425                    gap: 30px;
9426                    max-width: 460px
9427                }
9428            }
9429
9430            .endcta-alt {
9431                margin-top: 36px;
9432                display: flex;
9433                flex-wrap: wrap;
9434                gap: 12px;
9435                justify-content: center
9436            }
9437
9438            /* The app line sits under the two ways to reach us and quieter than
9439               either, because it is aimed at people who have already signed up. */
9440            .endcta-app-line {
9441                margin-top: 40px;
9442                font-family: var(--mono);
9443                font-size: 10px;
9444                letter-spacing: .18em;
9445                text-transform: uppercase;
9446                color: var(--mute)
9447            }
9448
9449            .endcta .app-stores {
9450                margin-top: 14px;
9451                justify-content: center
9452            }
9453
9454            /* ── With the form in it ───────────────────────────────────────────
9455               The pitch stops being a centred banner and becomes the left half
9456               of one closing block, with the get-started form on the right. No
9457               panel and no rounding: the two columns simply share the page. */
9458            .endcta-has-form .endcta-wrap {
9459                display: grid;
9460                grid-template-columns: 1fr 1.05fr;
9461                gap: clamp(40px, 5vw, 76px);
9462                align-items: start;
9463                max-width: 1240px;
9464                margin: 0 auto;
9465                text-align: left
9466            }
9467
9468            /* The skyline sits behind a short centred banner comfortably. Behind
9469               a block three times as tall it runs up under the form fields and
9470               the price panel, where a photograph is just noise, so it is held
9471               well back and the scrim is carried the whole way down instead of
9472               fading out in the middle. */
9473            .endcta.endcta-has-form .endcta-photo {
9474                opacity: .12;
9475                background-position: center bottom
9476            }
9477
9478            html[data-theme="light"] .endcta.endcta-has-form .endcta-photo {
9479                opacity: .16
9480            }
9481
9482            .endcta.endcta-has-form .endcta-photo::after {
9483                background: linear-gradient(180deg, var(--scrim-mid) 0%, var(--scrim-strong) 30%, var(--scrim-strong) 100%)
9484            }
9485
9486            .endcta-has-form .endcta-numbers {
9487                grid-template-columns: 1fr;
9488                gap: 26px;
9489                margin: 44px 0 0;
9490                max-width: none
9491            }
9492
9493            .endcta-has-form .endcta-meta {
9494                justify-content: flex-start;
9495                gap: 22px
9496            }
9497
9498            .endcta-has-form .endcta-alt,
9499            .endcta-has-form .app-stores {
9500                justify-content: flex-start
9501            }
9502
9503            .endcta-form .eyebrow {
9504                display: inline-flex;
9505                margin-bottom: 20px
9506            }
9507
9508            @media (max-width: 1000px) {
9509                .endcta-has-form .endcta-wrap {
9510                    grid-template-columns: 1fr;
9511                    gap: 48px
9512                }
9513
9514                .endcta-has-form .endcta-numbers {
9515                    max-width: 460px
9516                }
9517            }
9518
9519            /* Carried over from the signup section this block absorbed: that
9520               partial's styles only ship on the page that includes it, and it
9521               is now only included by /v2. */
9522            .signup-errors {
9523                margin-bottom: 18px;
9524                padding: 14px 0 14px 16px;
9525                border-left: 2px solid var(--coral);
9526                font-family: var(--mono);
9527                font-size: 12px;
9528                line-height: 1.6;
9529                color: var(--paper)
9530            }
9531
9532            .was-price {
9533                font-size: .55em;
9534                color: var(--mute-2);
9535                text-decoration: line-through;
9536                text-decoration-color: var(--coral);
9537                margin-right: 4px;
9538                font-weight: 300
9539            }
9540
9541            .founding-line {
9542                margin-top: 14px;
9543                font-family: var(--sans);
9544                font-size: 12px;
9545                line-height: 1.55;
9546                color: var(--mute)
9547            }
9548
9549            .founding-line .fl-tag {
9550                font-family: var(--mono);
9551                font-size: 10px;
9552                letter-spacing: .14em;
9553                text-transform: uppercase;
9554                color: var(--signal);
9555                margin-right: 8px
9556            }
9557        </style>
9558    </section>
9559
9560<style>
9561    .foot-social {
9562        display: inline-flex;
9563        align-items: center;
9564        gap: 8px;
9565        padding: 6px 0;
9566        font-family: var(--mono);
9567        font-size: 11px;
9568        color: var(--mute);
9569        letter-spacing: .06em;
9570        transition: color .25s var(--ease);
9571    }
9572
9573    .foot-social:hover { color: var(--paper); }
9574
9575    /* The badges sit tighter than the marketing rows and wrap rather than
9576       squeeze, because this column is the narrowest place they appear. */
9577    .foot-apps {
9578        margin-top: 22px;
9579        gap: 10px;
9580    }
9581</style>
9582<footer class="foot">
9583    <div class="foot-grid">
9584        <div class="foot-brand">
9585            
9586            <a class="logo" href="https://talkify.nz" aria-label="Talkify, home"
9587               style="display:flex;align-items:center;gap:14px;color:inherit;text-decoration:none">
9588                <svg class="tk-logo" viewBox="-3 -3 317.81 106"
9589     width="125.92" height="42"
9590     xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false">
9591        <circle cx="50" cy="50" r="50" fill="var(--tk-word, #101820)"/>
9592    
9593    <g fill="none" stroke="var(--tk-ground, #ffffff)" stroke-width="10" stroke-linecap="round">
9594        <path d="M34 26 V54 C34 74 62 80 76 62"/>
9595        <path d="M20 40 H46"/>
9596    </g>
9597    
9598    <g transform="translate(56 20) scale(0.30)">
9599        <g class="tk-eye">
9600            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="var(--tk-ground, #ffffff)"/>
9601        </g>
9602    </g>
9603            <path d="M271.37 19.44 L274.1 19.47 L276.98 20.13 L279.56 21.51 L281.93 23.58 L276.86 28.65 L275.24 27.45 L274.04 26.97 L273.32 26.85 L270.62 26.97 L269.6 27.27 L268.28 28.05 L267.23 29.28 L266.57 30.96 L266.39 32.28 L266.39 37.38 L284.84 37.41 L293.66 59.85 L302.99 37.5 L311.81 37.44 L289.55 86.04 L289.34 86.37 L288.98 86.37 L280.61 86.34 L289.25 68.4 L276.89 39.18 L276.8 44.61 L266.39 44.64 L266.36 71.97 L258.47 71.94 L258.47 44.64 L250.19 44.58 L250.19 37.44 L258.44 37.41 L258.47 32.28 L258.71 30 L259.49 27.36 L260.69 25.14 L262.52 23.01 L264.98 21.21 L267.8 20.01 L270.08 19.53ZM190.01 20.16 L197.93 20.16 L197.93 71.94 L190.01 71.94ZM204.53 20.16 L212.45 20.16 L212.48 53.61 L226.46 37.41 L235.85 37.44 L221.33 53.94 L230.24 64.47 L236.57 71.94 L226.52 71.97 L212.48 55.05 L212.45 71.94 L204.53 71.94ZM131.63 23.04 L139.55 23.04 L139.58 37.41 L147.83 37.44 L147.8 44.61 L139.55 44.64 L139.55 71.94 L131.63 71.94 L131.63 44.64 L123.35 44.58 L123.38 37.41 L131.63 37.38ZM164.09 36.72 L167.06 36.81 L170.24 37.59 L171.92 38.37 L173.42 39.33 L175.4 41.19 L175.52 37.41 L183.41 37.44 L183.41 71.94 L175.52 71.97 L175.46 68.25 L174.08 69.57 L172.85 70.44 L170.84 71.55 L169.34 72.09 L167.84 72.45 L165.8 72.69 L163.76 72.69 L161.84 72.45 L159.92 71.97 L158.48 71.43 L156.44 70.35 L154.76 69.15 L152.27 66.66 L150.47 63.96 L149.57 62.04 L148.91 60.06 L148.55 58.5 L148.25 55.86 L148.37 52.2 L148.79 49.86 L149.39 47.88 L149.93 46.56 L151.01 44.58 L152.33 42.72 L153.65 41.28 L156.5 39.03 L158.54 37.95 L159.98 37.41 L161.9 36.93ZM239.21 37.44 L247.13 37.44 L247.13 71.94 L239.21 71.94ZM165.2 44.19 L163.04 44.61 L161.48 45.27 L159.98 46.29 L158.51 47.82 L157.73 49.02 L156.83 51.18 L156.41 53.52 L156.41 55.86 L156.65 57.48 L157.31 59.52 L158.51 61.56 L160.04 63.15 L161.48 64.11 L163.46 64.89 L165.32 65.19 L167.12 65.13 L169.34 64.77 L171.14 63.99 L172.34 63.15 L173.99 61.38 L175.01 59.64 L175.67 57.66 L175.97 55.44 L175.91 53.1 L175.49 51 L174.53 48.78 L173.81 47.7 L172.52 46.35 L170.84 45.21 L169.16 44.55 L167.18 44.19Z" fill="var(--tk-word, #101820)" fill-rule="evenodd"/>
9604        
9605        <g transform="translate(231.30 6.84) scale(0.216)">
9606            <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z"
9607                  fill="var(--tk-word, #101820)"/>
9608        </g>
9609    </svg>
9610            </a>
9611                                        <p>The voice operating system for New Zealand business. Built in Aotearoa, hosted in Aotearoa, working while
9612                    you don't.</p>
9613                        <div
9614                style="margin-top:20px;font-family:var(--mono);font-size:12px;color:var(--mute);letter-spacing:.06em;line-height:1.7">
9615                                <span style="color:var(--mute);font-size:10px;text-transform:uppercase;letter-spacing:.18em">Sign up by phone</span><br>
9616                <a href="tel:+64800002967" style="color:var(--bone);transition:.25s">0800 002 967</a><br>
9617                                <span
9618                    style="color:var(--mute);font-size:10px;text-transform:uppercase;letter-spacing:.18em;margin-top:8px;display:inline-block">Hear an agent demo</span><br>
9619                <a href="tel:+6432421262" data-talkify-agent="default" style="color:var(--bone);transition:.25s">03 242 1262</a>
9620                                    <br>
9621                    <span
9622                        style="color:var(--mute);font-size:10px;text-transform:uppercase;letter-spacing:.18em;margin-top:8px;display:inline-block">Text our agent</span><br>
9623                    <a href="sms:+64272048827" style="color:var(--bone);transition:.25s">027 204 8827</a>
9624                            </div>
9625            <div style="margin-top:20px;
9625display:flex;flex-wrap:wrap;gap:8px 22px;align-items:center">
9626                <a href="https://www.facebook.com/profile.php?id=61572226258048" target="_blank"
9627                   rel="noopener noreferrer" aria-label="Facebook"
9628                   class="foot-social">
9629                    <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
9630                        <path
9631                            d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
9632                    </svg>
9633                    Facebook
9634                </a>
9635                <a href="https://www.instagram.com/talkifynz/" target="_blank"
9636                   rel="noopener noreferrer" aria-label="Instagram"
9637                   class="foot-social">
9638                    <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
9639                        <path
9640                            d="M12 2.16c3.2 0 3.58.012 4.85.07 1.17.054 1.805.25 2.227.415.56.217.96.477 1.38.896.42.42.68.82.897 1.38.164.423.36 1.058.413 2.228.058 1.27.07 1.65.07 4.85s-.012 3.58-.07 4.85c-.054 1.17-.25 1.805-.413 2.227a3.72 3.72 0 0 1-.897 1.382c-.42.42-.82.68-1.38.896-.423.165-1.058.36-2.228.414-1.27.058-1.65.07-4.85.07s-3.58-.012-4.85-.07c-1.17-.054-1.805-.25-2.227-.414a3.72 3.72 0 0 1-1.38-.896 3.72 3.72 0 0 1-.897-1.382c-.164-.422-.36-1.057-.414-2.227C2.173 15.58 2.16 15.2 2.16 12s.013-3.58.07-4.85c.055-1.17.25-1.805.415-2.228.217-.56.477-.96.896-1.38.42-.42.82-.68 1.38-.896.423-.165 1.058-.36 2.228-.414C8.42 2.173 8.8 2.16 12 2.16zM12 0C8.74 0 8.333.014 7.053.072 5.775.13 4.905.333 4.14.63a5.88 5.88 0 0 0-2.126 1.384A5.88 5.88 0 0 0 .63 4.14C.333 4.905.13 5.775.072 7.053.014 8.333 0 8.74 0 12s.014 3.667.072 4.947c.058 1.277.261 2.148.558 2.913a5.88 5.88 0 0 0 1.384 2.126 5.88 5.88 0 0 0 2.126 1.384c.765.296 1.635.499 2.913.558C8.333 23.986 8.74 24 12 24s3.667-.014 4.947-.072c1.277-.06 2.148-.262 2.913-.558a5.88 5.88 0 0 0 2.126-1.384 5.88 5.88 0 0 0 1.384-2.126c.296-.765.499-1.636.558-2.913C23.986 15.667 24 15.26 24 12s-.014-3.667-.072-4.947c-.06-1.278-.262-2.148-.558-2.913a5.88 5.88 0 0 0-1.384-2.126A5.88 5.88 0 0 0 19.86.63c-.765-.297-1.636-.5-2.913-.558C15.667.014 15.26 0 12 0zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm7.846-10.405a1.44 1.44 0 1 1-2.88 0 1.44 1.44 0 0 1 2.88 0z"/>
9641                    </svg>
9642                    Instagram
9643                </a>
9644                <a href="https://www.linkedin.com/company/talkify-nz/" target="_blank"
9645                   rel="noopener noreferrer" aria-label="LinkedIn"
9646                   class="foot-social">
9647                    <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
9648                        <path
9649                            d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
9650                    </svg>
9651                    LinkedIn
9652                </a>
9653            </div>
9654
9655            
9656            <div class="app-stores foot-apps" style="--app-badge-h: 38px">
9657    <a class="app-badge" href="https://apps.apple.com/nz/app/talkify-mobile/id6766709308"
9658       target="_blank" rel="noopener">
9659        <img src="https://talkify.nz/media/branding/apple-app-store.svg"
9660             alt="Download Talkify Mobile on the App Store"
9661             width="113.7" height="38" loading="lazy">
9662    </a>
9663    <a class="app-badge" href="https://play.google.com/store/apps/details?id=com.talkifynz.app"
9664       target="_blank" rel="noopener">
9665        <img src="https://talkify.nz/media/branding/google-app-store.svg"
9666             alt="Get Talkify Mobile on Google Play"
9667             width="128.3" height="38" loading="lazy">
9668    </a>
9669</div>
9670        </div>
9671        <div>
9672            <h4>Agents</h4>
9673            <ul>
9674                <li><a href="https://talkify.nz/reception">Reception</a></li>
9675                <li><a href="https://talkify.nz/personal-assistant">Personal Assistant</a></li>
9676                <li><a href="https://talkify.nz/booking-service">Booking Service</a></li>
9677                <li><a href="https://talkify.nz/sales-agent">Sales Agent</a></li>
9678                <li><a href="https://talkify.nz/ai-phone-surveys">Campaign Agent</a></li>
9679                <li><a href="https://talkify.nz/debt-collection">Debt Collection</a></li>
9680                <li><a href="https://talkify.nz/ai-wellness-checks">Wellness Checks</a></li>
9681                <li>
9681<a href="https://talkify.nz/outbound-calls">Outbound Calls</a></li>
9682                <li><a href="https://talkify.nz/ai-marketing-campaigns">Marketing Campaigns</a></li>
9683                <li><a href="https://talkify.nz/website-chat">Website Chat</a></li>
9684                <li><a href="https://talkify.nz/calendar">Team Calendar</a></li>
9685                <li><a href="https://talkify.nz/dialler">Dialler</a></li>
9686                <li><a href="https://talkify.nz/agents">All agents &rarr;</a></li>
9687            </ul>
9688        </div>
9689        
9690        <div>
9691            <h4>Trades</h4>
9692            <ul>
9693                <li><a href="https://talkify.nz/plumber">Plumbing</a></li>
9694                <li><a href="https://talkify.nz/electrician">Electricians</a></li>
9695                <li><a href="https://talkify.nz/builder">Builders</a></li>
9696                <li><a href="https://talkify.nz/hvac">Heat Pump &amp; HVAC</a></li>
9697                <li><a href="https://talkify.nz/automotive">Mechanics &amp; Workshops</a></li>
9698                <li><a href="https://talkify.nz/landscaping">Landscaping</a></li>
9699                <li><a href="https://talkify.nz/pest-control">Pest Control</a></li>
9700                <li><a href="https://talkify.nz/tradesman">All Trades</a></li>
9701            </ul>
9702        </div>
9703        <div>
9704            <h4>Industries</h4>
9705            <ul>
9706                <li><a href="https://talkify.nz/beauty">Beauty &amp; Wellness</a></li>
9707                <li><a href="https://talkify.nz/real-estate">Real Estate</a></li>
9708                <li><a href="https://talkify.nz/retail">Retail</a></li>
9709                <li><a href="https://talkify.nz/professional-services">Professional Services</a></li>
9710                <li><a href="https://talkify.nz/barber">Barbers</a></li>
9711                <li><a href="https://talkify.nz/gym">Gyms &amp; Studios</a></li>
9712                <li><a href="https://talkify.nz/personal-trainer">Personal Trainers</a></li>
9713                <li><a href="https://talkify.nz/hotel">Hotels &amp; Motels</a></li>
9714                <li><a href="https://talkify.nz/accountant">Accountants</a></li>
9715                <li><a href="https://talkify.nz/industries">All industries &rarr;</a></li>
9716            </ul>
9717        </div>
9718        <div>
9719            
9720            <h4>Call answering</h4>
9721            <ul>
9722                <li><a href="https://talkify.nz">AI receptionist NZ</a></li>
9723                <li><a href="https://talkify.nz/ai-phone-agent">AI phone agent NZ</a></li>
9724                <li><a href="https://talkify.nz/virtual-receptionist">Virtual receptionist NZ</a></li>
9725                <li><a href="https://talkify.nz/ai-answering-service">AI answering service NZ</a></li>
9726                <li><a href="https://talkify.nz/after-hours-answering">After hours answering NZ</a></li>
9727                <li><a href="https://talkify.nz/on-call-roster">On-Call Roster</a></li>
9728                <li><a href="https://talkify.nz/ai-call-centre">AI Call Centre Agents</a></li>
9729                <li><a href="https://talkify.nz/business-phone-lines">Business Phone Lines</a></li>
9730                
9731                <li style="margin-top:6px;color:var(--mute);line-height:1.8">
9732                    By city:
9733                    <a
9734                            href="https://talkify.nz/ai-receptionist-auckland">Auckland</a><span
9735                            style="color:var(--line-2)"> · </span><a
9736                            href="https://talkify.nz/ai-receptionist-wellington">Wellington</a><span
9737                            style="color:var(--line-2)"> · </span><a
9738                            href="https://talkify.nz/ai-receptionist-christchurch">Christchurch</a><span
9739                            style="color:var(--line-2)"> · </span><a
9740                            href="https://talkify.nz/ai-receptionist-hamilton">Hamilton</a><span
9741                            style="color:var(--line-2)"> · </span><a
9742                            href="https://talkify.nz/ai-receptionist-tauranga">Tauranga</a><span
9743                            style="color:var(--line-2)"> · </span><a
9744                            href="https://talkify.nz/ai-receptionist-dunedin">Dunedin</a>                </li>
9745            </ul>
9746        </div>
9747        <div>
9748            
9749            <h4>Company</h4>
9750            <ul>
9751                <li><a href="https://talkify.nz/pricing">Pricing</a></li>
9752                <li><a href="https://talkify.nz/integrations">Integrations</a></li>
9753                
9754                <li><a href="https://talkify.nz/compare">Compare Providers</a><span
9755                        style="color:var(--line-2)"> · </span><a
9756                        href="https://talkify.nz/alternatives">Alternatives</a></li>
9757                <li><a href="https://talkify.nz/missed-call-calculator">Missed Call Calculator</a></li>
9758                <li><a href="https://talkify.nz/blog">Journal</a></li>
9759                
9760                <li><a href="https://talkify.nz/help">Help centre</a><span
9761                        style="color:var(--line-2)"> · </span><a
9762                        href="https://talkify.nz/contact-us">Contact us</a></li>
9763                <li><a href="https://talkify.nz/demo">Live demo</a></li>
9764                <li><a href="https://talkify.nz/signup">Get started</a></li>
9765            </ul>
9766        </div>
9767    </div>
9768    <div class="foot-bot">
9769                    <span>© <span id="year">2026</span> · Talkify Limited · NZ owned and hosted</span>
9770                <span>
9771            
9772                            <span aria-current="page">New Zealand</span> · <a href="https://talkify.nz/au" style="color:var(--bone)">Australia</a> ·
9773                        <a href="https://talkify.nz/privacy" style="color:var(--bone)">Privacy</a> ·
9774            <a href="https://talkify.nz/terms" style="color:var(--bone)">Terms</a> ·
9775            <a href="https://talkify.nz/support" style="color:var(--bone)">Support</a> ·
9776                            <a href="https://talkify.nz/login" style="color:var(--bone)">Sign in</a>
9777                        · <a href="https://d3v.nz" style="color:var(--bone)">Made by D3V</a>
9778        </span>
9779    </div>
9780</footer>
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791<script>
9792    function tick() {
9793        const d = new Date();
9794        const f = new Intl.DateTimeFormat('en-NZ', {
9795            timeZone: 'Pacific/Auckland',
9796            hour: '2-digit',
9797            minute: '2-digit',
9798            second: '2-digit',
9799            hour12: false
9800        });
9801        const el = document.getElementById('clock');
9802        if (el) el.textContent = f.format(d);
9803    }
9804
9805    tick();
9806    setInterval(tick, 1000);
9807    const yEl = document.getElementById('year');
9808    if (yEl) yEl.textContent = new Date().getFullYear();
9809
9810    /* Scroll reveal. Fires once per block. Anybody who has asked for less
9811       motion, and any browser without IntersectionObserver, gets the lot
9812       revealed immediately rather than a page of invisible sections. */
9813    (function () {
9814        const blocks = document.querySelectorAll('.r');
9815        if (!blocks.length) return;
9816        const reduce = window.matchMedia
9817            && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
9818        if (reduce || !('IntersectionObserver' in window)) {
9819            blocks.forEach(el => el.classList.add('in'));
9820            return;
9821        }
9822        const io = new IntersectionObserver((entries) => {
9823            entries.forEach(e => {
9824                if (e.isIntersecting) {
9825                    e.target.classList.add('in');
9826                    io.unobserve(e.target);
9827                }
9828            });
9829        }, {rootMargin: '-8% 0px -5% 0px'});
9830        blocks.forEach(el => io.observe(el));
9831    })();
9832
9833    /* Agent phones. Each opens on a plain lock screen, then the clock drops to
9834       its compact size and the notifications land on top of it, which is the
9835       order an iPhone does it in. Plays once, when the panel is on screen.
9836
9837       The clock is the VISITOR'S OWN time and every stamp is counted back from
9838       it, so a screen can never show a notification that arrived after the time
9839       printed above it. Nothing is written into the markup, so a cached page
9840       cannot go stale either.
9841
9842       The tilt and the sheen are a couple of degrees and a highlight eased
9843       across the viewport. Both are off on coarse pointers, where there is no
9844       hover to reward them and the scroll handler is pure cost, and the whole
9845       thing collapses to "already arrived" under prefers-reduced-motion. */
9846    (function () {
9847        const phones = [...document.querySelectorAll('[data-agent-phone]')];
9848        if (!phones.length) return;
9849
9850        const clockOf = d => d.toLocaleTimeString('en-NZ', {hour: 'numeric', minute: '2-digit', hour12: false});
9851        const stampOf = d => d.toLocaleTimeString('en-NZ', {hour: 'numeric', minute: '2-digit', hour12: true})
9852            .replace(/\s/g, '').toLowerCase();
9853        const dateOf = d => d.toLocaleDateString('en-NZ', {weekday: 'long', day: 'numeric', month: 'long'});
9854
9855        const still = matchMedia('(prefers-reduced-motion: reduce)').matches;
9856        const coarse = matchMedia('(pointer: coarse)').matches;
9857
9858        phones.forEach(phone => {
9859            // A phone may pin its own clock with data-agent-at="HH:MM". The
9860            // after-hours story is an escalation at a quarter to midnight, and
9861            // stamped 2pm on a daytime visitor's own clock it reads as
9862            // nonsense. Everything else still shows the visitor's real time,
9863            // counted back from, so nothing arrives after the clock above it.
9864            const now = new Date();
9865            const pinned = (phone.dataset.agentAt || '').match(/^(\d{1,2}):(\d{2})$/);
9866            if (pinned) now.setHours(+pinned[1], +pinned[2], 0, 0);
9867
9868            const t = phone.querySelector('[data-agent-time]');
9869            const dt = phone.querySelector('[data-agent-date]');
9870            if (t) t.textContent = clockOf(now);
9871            if (dt) dt.textContent = dateOf(now);
9872
9873            phone.querySelectorAll('[data-agent-ago]').forEach(el => {
9874                const mins = parseInt(el.dataset.agentAgo, 10);
9875                if (!Number.isFinite(mins)) return;
9876                el.textContent = stampOf(new Date(now.getTime() - mins * 60000));
9877            });
9878
9879            const clock = phone.querySelector('[data-agent-clock]');
9880            const notes = [...phone.querySelectorAll('.hpn')];
9881            if (!clock || !notes.length) return;
9882
9883            if (still) {
9884                clock.classList.add('is-compact');
9885                notes.forEach(n => n.classList.add('is-in'));
9886                return;
9887            }
9888
9889            let played = false;
9890            const play = () => {
9891                if (played) return;
9892                played = true;
9893                setTimeout(() => clock.classList.add('is-compact'), 420);
9894                notes.forEach((n, i) => setTimeout(() => n.classList.add('is-in'), 780 + i * 380));
9895            };
9896
9897            const io = new IntersectionObserver(entries => {
9898                entries.forEach(e => {
9899                    if (!e.isIntersecting) return;
9900                    play();
9901                    io.unobserve(phone);
9902                });
9903            }, {threshold: .35});
9904            io.observe(phone);
9905
9906            if (coarse) return;
9907
9908            const lean = phone.classList.contains('agent-phone--left') ? -1 : 1;
9909            let queued = false;
9910            const tilt = () => {
9911                queued = false;
9912                const r = phone.getBoundingClientRect();
9913                if (r.bottom < 0 || r.top > innerHeight) return;
9914                // -0.5 above the fold, +0.5 below it
9915                const p = (r.top + r.height / 2 - innerHeight / 2) / innerHeight;
9916                phone.style.setProperty('--ag-tilt', (lean * (3 - p * 4.5)).toFixed(2) + 'deg');
9917                phone.style.setProperty('--ag-sheen', (p * -150).toFixed(1) + '%');
9918            };
9919            addEventListener('scroll', () => {
9920                if (queued) return;
9921                queued = true;
9922                requestAnimationFrame(tilt);
9923            }, {passive: true});
9924            tilt();
9925        });
9926    })();
9927
9928
9929    /* Hero phone. The chips are the data source, so the markup stays the one
9930       place the copy lives. Cycling pauses the moment the visitor takes over,
9931       and never starts at all under prefers-reduced-motion. */
9932    (function () {
9933        const root = document.querySelector('[data-hp-stack]');
9934        if (!root) return;
9935        const chips = [...document.querySelectorAll('[data-hp-chip]')];
9936        if (!chips.length) return;
9937
9938        const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
9939        const icon = document.querySelector('.hpn header img');
9940        const iconSrc = icon ? icon.getAttribute('src') : '';
9941        let i = 0, timer = null, taken = false;
9942
9943        // the phone shows the viewer's own clock, so it reads as their phone
9944        // rather than a screenshot taken at some other time
9945        const clock = () => {
9946            const now = new Date();
9947            const t = document.querySelector('[data-hp-time]');
9948            const d = document.querySelector('[data-hp-date]');
9949            if (t) t.textContent = now.toLocaleTimeString('en-NZ', {hour: 'numeric', minute: '2-digit'})
9950                .replace(/\s?(am|pm)$/i, '');
9951            if (d) d.textContent = now.toLocaleDateString('en-NZ', {weekday: 'long', day: 'numeric', month: 'long'});
9952        };
9953
9954        const AGO = ['now', '2m ago', '8m ago'];
9955
9956        const build = (chip) => {
9957            const frag = document.createDocumentFragment();
9958            // two or three per screen: one card at a time made the phone look
9959            // idle, and a digest is the thing being sold
9960            [['title', 'body'], ['title2', 'body2'], ['title3', 'body3']].forEach((keys, i) => {
9961                const title = chip.dataset[keys[0]], body = chip.dataset[keys[1]];
9962                if (!title) return;
9963                const n = document.createElement('article');
9964                n.className = 'hpn';
9965                n.style.transitionDelay = (i * 620) + 'ms';
9966                n.innerHTML =
9967                    '<header><img src="' + iconSrc + '" alt="" width="18" height="18">' +
9968                    '<span class="hpn-app">Talkify</span><span class="hpn-ago"></span></header>' +
9969                    '<h4></h4><p></p>';
9970                n.querySelector('.hpn-ago').textContent = AGO[i] || 'earlier';
9971                n.querySelector('h4').textContent = title;
9972                n.querySelector('p').textContent = body;
9973                frag.appendChild(n);
9974            });
9975            return frag;
9976        };
9977
9978        const show = (idx) => {
9979            i = (idx + chips.length) % chips.length;
9980            chips.forEach((c, n) => c.classList.toggle('is-on', n === i));
9981            chips.forEach((c, n) => c.setAttribute('aria-selected', n === i ? 'true' : 'false'));
9982            root.replaceChildren(build(chips[i]));
9983            // let the browser paint the start state before transitioning in
9984            requestAnimationFrame(() => requestAnimationFrame(() =>
9985                root.querySelectorAll('.hpn').forEach(n => n.classList.add('is-in'))));
9986        };
9987
9988        const stop = () => { if (timer) { clearInterval(timer); timer = null; } };
9989        const start = () => { if (!reduce && !taken && !timer) timer = setInterval(() => show(i + 1), 7000); };
9990
9991        chips.forEach((chip, n) => {
9992            const take = () => { taken = true; stop(); show(n); };
9993            chip.addEventListener('click', take);
9994            chip.addEventListener('mouseenter', () => { stop(); show(n); });
9995            chip.addEventListener('mouseleave', () => { if (!taken) start(); });
9996        });
9997
9998        // do not animate a phone nobody is looking at
9999        const vis = new IntersectionObserver((es) => {
10000            es.forEach(e => e.isIntersecting ? start() : stop());
10001        }, {threshold: 0.2});
10002        vis.observe(root);
10003
10004        clock();
10005        setInterval(clock, 30000);
10006        show(0);
10007    })();
10008
10009    (function () {
10010        const hero = document.querySelector('.hero-bg');
10011        if (!hero) return;
10012        // Pointer parallax is a mouse affordance: a finger cannot hover, and
10013        // it is exactly the sort of movement prefers-reduced-motion is for.
10014        const mq = (q) => window.matchMedia && window.matchMedia(q).matches;
10015        if (mq('(prefers-reduced-motion: reduce)') || mq('(pointer: coarse)')) return;
10016
10017        let x = 0, y = 0, queued = false;
10018        const paint = () => {
10019            queued = false;
10020            hero.style.transform = `translate(${x}px,${y}px)`;
10021        };
10022        document.addEventListener('mousemove', (e) => {
10023            x = (e.clientX / window.innerWidth - .5) * 24;
10024            y = (e.clientY / window.innerHeight - .5) * 24;
10025            if (!queued) {
10026                queued = true;
10027                requestAnimationFrame(paint);
10028            }
10029        }, {passive: true});
10030    })();
10031
10032    // ─── Live call deck, messages animate in as if the call is happening now ───
10033    (function () {
10034        document.querySelectorAll('.deck').forEach(deck => {
10035            const rows = Array.from(deck.querySelectorAll('.deck-row'));
10036            if (!rows.length) return;
10037
10038            // Insert a typing indicator before each agent row
10039            rows.forEach(row => {
10040                if (row.classList.contains('agent')) {
10041                    const ts = row.querySelector('.ts')?.textContent || '';
10042                    const typing = document.createElement('div');
10043                    typing.className = 'deck-typing';
10044                    typing.innerHTML = `<span class="ts">${ts}</span><span class="who">Talkify</span><span class="dotset"><i></i><i></i><i></i></span>`;
10045                    row.parentNode.insertBefore(typing, row);
10046                }
10047            });
10048
10049            let started = false;
10050            const start = () => {
10051                if (started) return;
10052                started = true;
10053                let t = 400;
10054                rows.forEach(row => {
10055                    if (row.classList.contains('agent')) {
10056                        const typing = row.previousElementSibling;
10057                        if (typing && typing.classList.contains('deck-typing')) {
10058                            setTimeout(() => typing.classList.add('on'), t);
10059                            t += 900;
10060                            setTimeout(() => typing.classList.remove('on'), t);
10061                            t += 200;
10062                        }
10063                    }
10064                    setTimeout(() => row.classList.add('in'), t);
10065                    t += 1200;
10066                });
10067
10068                // After the prepared script plays, optionally append a follow-up exchange
10069                const followup = deck.dataset.followup;
10070                if (followup === 'on') {
10071                    setTimeout(() => {
10072                        appendDeckExchange(deck);
10073                    }, t + 1500);
10074                }
10075            };
10076
10077            const io = new IntersectionObserver(entries => {
10078                entries.forEach(e => {
10079                    if (e.isIntersecting) {
10080                        start();
10081                        io.unobserve(deck);
10082                    }
10083                });
10084            }, {threshold: 0.25});
10085            io.observe(deck);
10086        });
10087
10088        function appendDeckExchange(deck) {
10089            // Append one extra caller + agent exchange to the home hero deck
10090            const followups = [
10091                {
10092                    caller: "One more thing, can my partner come too?",
10093                    agent: "Of course. I'll add them to the appointment. Anything else?"
10094                },
10095                {
10096                    caller: "Is there parking?",
10097                    agent: "Yep, two-hour free parking on Vivian Street, or paid building parking off the lobby."
10098                },
10099            ];
10100            const ex = followups[Math.floor(Math.random() * followups.length)];
10101            const wave = deck.querySelector('.wave');
10102            const insertBefore = wave || deck.querySelector('.deck-foot');
10103
10104            const lastTs = deck.querySelectorAll('.deck-row .ts');
10105            const baseSec = parseInt((lastTs[lastTs.length - 1]?.textContent || '00:14').split(':')[1]) + 6;
10106            const fmtTs = s => `00:${String(s).padStart(2, '0')}`;
10107
10108            const callerRow = document.createElement('div');
10109            callerRow.className = 'deck-row caller';
10110            callerRow.innerHTML = `<span class="ts">${fmtTs(baseSec)}</span><span class="who">Caller</span><span class="msg">${ex.caller}</span>`;
10111            deck.insertBefore(callerRow, insertBefore);
10112
10113            const typingRow = document.createElement('div');
10114            typingRow.className = 'deck-typing';
10115            typingRow.innerHTML = `<span class="ts">${fmtTs(baseSec + 2)}</span><span class="who">Talkify</span><span class="dotset"><i></i><i></i><i></i></span>`;
10116            deck.insertBefore(typingRow, insertBefore);
10117
10118            const agentRow = document.createElement('div');
10119            agentRow.className = 'deck-row agent';
10120            agentRow.innerHTML = `<span class="ts">${fmtTs(baseSec + 3)}</span><span class="who">Talkify</span><span class="msg">${ex.agent}</span>`;
10121            deck.insertBefore(agentRow, insertBefore);
10122
10123            requestAnimationFrame(() => callerRow.classList.add('in'));
10124            setTimeout(() => typingRow.classList.add('on'), 1100);
10125            setTimeout(() => typingRow.classList.remove('on'), 2400);
10126            setTimeout(() => agentRow.classList.add('in'), 2500);
10127        }
10128    })();
10129
10130    // ─── Real conversations, bubbles type into existence as user scrolls in ───
10131    (function () {
10132        document.querySelectorAll('.convo').forEach(convo => {
10133            const bubs = Array.from(convo.querySelectorAll('.bub'));
10134            if (!bubs.length) return;
10135
10136            let started = false;
10137            const start = () => {
10138                if (started) return;
10139                started = true;
10140
10141                let t = 200;
10142                bubs.forEach((bub) => {
10143                    // Show typing indicator with the same alignment + colour, then swap to bubble
10144                    const typing = document.createElement('div');
10145                    typing.className = 'convo-typing' + (bub.classList.contains('caller') ? ' caller' : '');
10146                    const who = bub.classList.contains('caller') ? 'Caller' : 'Talkify';
10147                    typing.innerHTML = `<span class="lbl">${who}</span><span class="dotset"><i></i><i></i><i></i></span>`;
10148                    convo.insertBefore(typing, bub);
10149
10150                    const typingMs = bub.classList.contains('caller') ? 500 : 800;
10151                    setTimeout(() => typing.classList.add('on'), t);
10152                    t += typingMs;
10153                    setTimeout(() => {
10154                        typing.classList.remove('on');
10155                        typing.remove();
10156                    }, t);
10157                    setTimeout(() => bub.classList.add('in'), t + 50);
10158                    t += 450; // settle time before next message
10159                });
10160            };
10161
10162            /* Watch the transcript's wrapper where it has one. On the home page
10163               the transcript sits inside a phone, and a clipped flex child that
10164               deep gets no intersection entries at all, so a threshold against
10165               the transcript itself never fires and the conversation never
10166               starts. The wrapper is an ordinary block in normal flow. */
10167            const target = convo.closest('.convo-device') || convo;
10168            const io = new IntersectionObserver(entries => {
10169                entries.forEach(e => {
10170                    if (e.isIntersecting) {
10171                        start();
10172                        io.unobserve(target);
10173                    }
10174                });
10175            }, {threshold: 0.2});
10176            io.observe(target);
10177        });
10178    })();
10179
10180    // ─── Live PA digest, notifications drop in on scroll, more arrive as you watch ───
10181    (function () {
10182        document.querySelectorAll('.pa-floater').forEach(floater => {
10183            const initialRows = Array.from(floater.querySelectorAll('.row'));
10184            if (!initialRows.length) return;
10185
10186            const queue = [
10187                {
10188                    lbl: 'Returning client · routed',
10189                    name: 'Liam, message taken for Tom',
10190                    meta: '<span class="vip" style="color:var(--mute)">● Routine</span>'
10191                },
10192                {
10193                    lbl: 'New booking',
10194                    name: 'Te Aroha · Saturday haircut',
10195                    meta: '<span class="vip" style="color:var(--signal)">● Booked</span>'
10196                },
10197                {
10198                    lbl: 'Urgent · escalated to mobile',
10199                    name: 'Maria @ Hartwell, sent to your phone',
10200                    meta: '<span class="vip" style="color:var(--coral)">● VIP</span>'
10201                },
10202                {lbl: 'Quietly handled', name: '14 vendors politely declined', meta: ''},
10203            ];
10204            let qIdx = 0;
10205            let started = false;
10206
10207            const start = () => {
10208                if (started) return;
10209                started = true;
10210                initialRows.forEach((row, i) => {
10211                    setTimeout(() => {
10212                        row.classList.add('in', 'ping');
10213                        setTimeout(() => row.classList.remove('ping'), 1400);
10214                    }, i * 1200 + 400);
10215                });
10216
10217                // After initial settle, push a new notification every 9 seconds
10218                const settled = initialRows.length * 1200 + 2000;
10219                setTimeout(() => {
10220                    const interval = setInterval(() => {
10221                        if (!floater.isConnected) {
10222                            clearInterval(interval);
10223                            return;
10224                        }
10225                        const item = queue[qIdx % queue.length];
10226                        qIdx++;
10227                        const newRow = document.createElement('div');
10228                        newRow.className = 'row in fresh ping';
10229                        newRow.innerHTML = `
10230            <span class="lbl">${item.lbl}</span>
10231            <span class="name">${item.name}</span>
10232            ${item.meta ? '<span>' + item.meta + '</span>' : ''}
10233          `;
10234                        floater.insertBefore(newRow, floater.firstChild);
10235
10236                        // Drop the oldest if we have too many, keep card from growing
10237                        const all = floater.querySelectorAll('.row');
10238                        if (all.length > 4) {
10239                            const oldest = all[all.length - 1];
10240                            oldest.style.transition = 'opacity .5s ease, transform .5s ease, max-height .5s ease, margin .5s ease, padding .5s ease';
10241                            oldest.style.opacity = '0';
10242                            oldest.style.transform = 'translateY(8px)';
10243                            setTimeout(() => oldest.remove(), 600);
10244                        }
10245
10246                        setTimeout(() => newRow.classList.remove('ping'), 1400);
10247                    }, 9000);
10248                }, settled);
10249            };
10250
10251            const io = new IntersectionObserver(entries => {
10252                entries.forEach(e => {
10253                    if (e.isIntersecting) {
10254                        start();
10255                        io.unobserve(floater);
10256                    }
10257                });
10258            }, {threshold: 0.3});
10259            io.observe(floater);
10260        });
10261    })();
10262
10263    // ─── Conversion + engagement events → GA4 / GTM dataLayer ───
10264    // Every tel: tap, CTA click and lead form submit lands in the dataLayer so
10265    // GTM/GA4 can build conversions without touching the templates again.
10266    (function () {
10267        const page = "home";
10268        const push = (event, params) => {
10269            window.dataLayer = window.dataLayer || [];
10270            window.dataLayer.push(Object.assign({event: event, page_key: page}, params || {}));
10271        };
10272
10273        // Phone taps: the demo line and the sign-up lines are separate conversions.
10274        // The demo lines come from App\Services\Market (they differ by country
10275        // and by how a visitor has to dial them), matched on their last eight
10276        // digits so the local and the international form are the same line.
10277                const demoTails = ["32421262","92420020"];
10278        document.querySelectorAll('a[href^="tel:"]').forEach(a => {
10279            a.addEventListener('click', () => {
10280                const num = (a.getAttribute('href') || '').replace('tel:', '');
10281                const digits = num.replace(/\D/g, '');
10282                const isDemo = demoTails.some(t => t && digits.endsWith(t));
10283                push(isDemo ? 'demo_call_click' : 'phone_signup_click', {
10284                    phone_number: num,
10285                    link_text: (a.textContent || '').trim().slice(0, 80),
10286                });
10287            });
10288        });
10289
10290        // CTA buttons (primary/blue/ghost), which CTA, on which page
10291        document.querySelectorAll('a.btn').forEach(a => {
10292            a.addEventListener('click', () => {
10293                push('cta_click', {
10294                    cta_text: (a.textContent || '').trim().slice(0, 80),
10295                    cta_style: a.classList.contains('btn-primary') ? 'primary'
10296                        : a.classList.contains('btn-blue') ? 'blue' : 'ghost',
10297                    cta_href: a.getAttribute('href') || '',
10298                });
10299            });
10300        });
10301
10302        // Lead forms: signup/contact, live demo call, support
10303        document.querySelectorAll('form').forEach(form => {
10304            const action = form.getAttribute('action') || '';
10305            let event = null;
10306            if (action.includes('/signup/verify')) event = 'sign_up';
10307            else if (action.includes('/signup/send-code')) event = 'sign_up_start';
10308            else if (action.includes('/contact')) event = 'generate_lead';
10309            else if (action.includes('/demo')) event = 'demo_call_request';
10310            else if (action.includes('/support')) event = 'support_request';
10311            if (!event) return;
10312            form.addEventListener('submit', () => {
10313                const agent = form.querySelector('input[name="agent_type"]:checked');
10314                push(event, {
10315                    form_action: action,
10316                    agent_type: agent ? agent.value : undefined,
10317                });
10318            });
10319        });
10320    })();
10321
10322    /* Agents mega-menu. Desktop opens it on hover/focus via CSS; this handles
10323       the click path, which is the only way in on touch, plus Escape and
10324       click-outside. */
10325    (function () {
10326        const drops = document.querySelectorAll('[data-nav-drop]');
10327        if (!drops.length) return;
10328
10329        const closeAll = (except) => drops.forEach((drop) => {
10330            if (drop === except) return;
10331            drop.classList.remove('is-open');
10332            drop.querySelector('.nav-drop-btn')?.setAttribute('aria-expanded', 'false');
10333        });
10334
10335        drops.forEach((drop) => {
10336            const trigger = drop.querySelector('.nav-drop-btn');
10337            if (!trigger) return;
10338
10339            trigger.addEventListener('click', (event) => {
10340                event.preventDefault();
10341                event.stopPropagation();
10342                const open = drop.classList.toggle('is-open');
10343                trigger.setAttribute('aria-expanded', open ? 'true' : 'false');
10344                closeAll(drop);
10345            });
10346        });
10347
10348        document.addEventListener('click', (event) => {
10349            if (!event.target.closest('[data-nav-drop]')) closeAll();
10350        });
10351
10352        document.addEventListener('keydown', (event) => {
10353            if (event.key === 'Escape') closeAll();
10354        });
10355
10356        window.talkifyCloseNavDrops = closeAll;
10357    })();
10358
10359    (function () {
10360        const btn = document.querySelector('.menu-btn');
10361        const nav = document.querySelector('.nav ul');
10362        if (!btn || !nav) return;
10363        btn.addEventListener('click', () => {
10364            const open = nav.style.display === 'flex';
10365            // Collapsing the menu should not leave the Agents accordion open
10366            // behind it, or it reappears expanded next time.
10367            if (open && window.talkifyCloseNavDrops) window.talkifyCloseNavDrops();
10368            nav.style.display = open ? 'none' : 'flex';
10369            nav.style.position = 'fixed';
10370            nav.style.top = '92px';
10371            nav.style.left = '20px';
10372            nav.style.right = '20px';
10373            nav.style.flexDirection = 'column';
10374            nav.style.background = 'var(--ink-2)';
10375            nav.style.border = '1px solid var(--line)';
10376            nav.style.borderRadius = '14px';
10377            nav.style.padding = '12px';
10378            nav.style.zIndex = '85';
10379        });
10380    })();
10381
10382    /* Theme toggle, persist choice, flip data-theme on <html> */
10383    (function () {
10384        var toggles = document.querySelectorAll('[data-theme-toggle]');
10385        if (!toggles.length) return;
10386        toggles.forEach(function (btn) {
10387            btn.addEventListener('click', function () {
10388                var current = document.documentElement.getAttribute('data-theme') === 'light' ? 'light' : 'dark';
10389                var next = current === 'light' ? 'dark' : 'light';
10390                document.documentElement.setAttribute('data-theme', next);
10391                try {
10392                    localStorage.setItem('talkify-theme', next);
10393                } catch (e) {
10394                }
10395            });
10396        });
10397    })();
10398</script>
10398
10399        
10399<script>
10400        (function () {
10401            var CSRF = "2cZHQjhlrpDk2bAxkNOtWyU4l8TAY6RFoVgytF3j";
10402            var SITE_KEY = null;
10403            var INITIAL_STEP = "details";
10404            var ROUTES = {
10405                send: "https:\/\/talkify.nz\/outbound-demo\/send-code",
10406                verify: "https:\/\/talkify.nz\/outbound-demo\/verify",
10407                resend: "https:\/\/talkify.nz\/outbound-demo\/resend",
10408                reset: "https:\/\/talkify.nz\/outbound-demo\/reset",
10409                status: "https:\/\/talkify.nz\/demo-call\/status"            };
10410            var panels = {
10411                details: document.getElementById('odDetails'),
10412                verify: document.getElementById('odVerify'),
10413                calling: document.getElementById('odCalling'),
10414                done: document.getElementById('odDone')
10415            };
10416            var stepFor = {details: 'details', verify: 'verify', calling: 'call', done: 'call'};
10417            var err = document.getElementById('odErr');
10418            var nameEl = document.getElementById('od-name');
10419            var mobileEl = document.getElementById('od-mobile');
10420            var codeEl = document.getElementById('od-code');
10421            var sendBtn = document.getElementById('odSendBtn');
10422            var verifyBtn = document.getElementById('odVerifyBtn');
10423            var resendBtn = document.getElementById('odResendBtn');
10424            var conversationId = null, pollTimer = null, pollStart = 0, callSafety = null, resendTimer = null;
10425
10426            function show(state) {
10427                for (var k in panels) {
10428                    panels[k].hidden = (k !== state);
10429                }
10430                document.querySelectorAll('#odSteps [data-step]').forEach(function (el) {
10431                    el.classList.toggle('on', el.getAttribute('data-step') === stepFor[state]);
10432                });
10433            }
10434
10435            function setErr(msg) {
10436                if (msg) {
10437                    err.textContent = '● ' + msg;
10438                    err.hidden = false;
10439                } else {
10440                    err.hidden = true;
10441                }
10442            }
10443
10444            function refreshDetails() {
10445                sendBtn.disabled = !(nameEl.value.trim().length >= 2 && mobileEl.value.replace(/\D/g, '').length >= 8);
10446            }
10447
10448            function refreshVerify() {
10449                verifyBtn.disabled = !/^\d{6}$/.test(codeEl.value.trim());
10450            }
10451
10452            nameEl.addEventListener('input', refreshDetails);
10453            mobileEl.addEventListener('input', refreshDetails);
10454            codeEl.addEventListener('input', function () {
10455                codeEl.value = codeEl.value.replace(/\D/g, '').slice(0, 6);
10456                refreshVerify();
10457            });
10458            refreshDetails();
10459            refreshVerify();
10460
10461            function getToken() {
10462                return new Promise(function (res) {
10463                    if (SITE_KEY && window.grecaptcha) {
10464                        grecaptcha.ready(function () {
10465                            grecaptcha.execute(SITE_KEY, {action: 'demo_call'}).then(res, function () {
10466                                res('');
10467                            });
10468                        });
10469                    } else res('');
10470                });
10471            }
10472
10473            function post(url, params) {
10474                var body = new URLSearchParams();
10475                for (var k in params) {
10476                    if (params[k] !== null && params[k] !== undefined) body.set(k, params[k]);
10477                }
10478                return fetch(url, {
10479                    method: 'POST',
10480                    headers: {
10481                        'Accept': 'application/json',
10482                        'X-CSRF-TOKEN': CSRF,
10483                        'X-Requested-With': 'XMLHttpRequest',
10484                        'Content-Type': 'application/x-www-form-urlencoded'
10485                    },
10486                    body: body.toString()
10487                }).then(function (r) {
10488                    return r.json().then(function (j) {
10489                        return {ok: r.ok, j: j};
10490                    }).catch(function () {
10491                        return {ok: false, j: {}};
10492                    });
10493                });
10494            }
10495
10496            function firstError(j) {
10497                if (j && j.message) return j.message;
10498                if (j && j.errors) {
10499                    for (var k in j.errors) {
10500                        if (j.errors[k] && j.errors[k].length) return j.errors[k][0];
10501                    }
10502                }
10503                return 'Something went wrong. Please try again.';
10504            }
10505
10506            // -------- Step 1: send the code --------
10507            panels.details.addEventListener('submit', function (e) {
10508                e.preventDefault();
10509                setErr(null);
10510                if (sendBtn.disabled) return;
10511                if (!nameEl.checkValidity() || !mobileEl.checkValidity()) {
10512                    setErr('Please enter your name and a valid mobile: NZ starting 020, 021, 022 or 027, or AU starting 04.');
10513                    return;
10514                }
10515                sendBtn.disabled = true;
10516                sendBtn.querySelector('.arr').textContent = '…';
10517                getToken().then(function (token) {
10518                    return post(ROUTES.send, {
10519                        name: nameEl.value.trim(),
10520                        mobile: mobileEl.value.trim(),
10521                        company_reference: document.getElementById('od-company-reference').value,
10522                        'g-recaptcha-response': token || null
10523                    });
10524                }).then(function (o) {
10525                    sendBtn.querySelector('.arr').textContent = '→';
10526                    refreshDetails();
10527                    if (o.ok && o.j && o.j.ok) {
10528                        document.getElementById('odMobileShown').textContent = o.j.mobile || mobileEl.value.trim();
10529                        document.getElementById('odCallingName').textContent = nameEl.value.trim();
10530                        document.getElementById('odDoneName').textContent = nameEl.value.trim();
10531                        codeEl.value = '';
10532                        refreshVerify();
10533                        show('verify');
10534                        startResendCountdown();
10535                        codeEl.focus();
10536                    } else {
10537                        setErr(firstError(o.j));
10538                    }
10539                }).catch(function () {
10540                    sendBtn.querySelector('.arr').textContent = '→';
10541                    refreshDetails();
10542                    setErr('Network error. Please try again.');
10543                });
10544            });
10545
10546            // -------- Step 2: verify + place the call --------
10547            panels.verify.addEventListener('submit', function (e) {
10548                e.preventDefault();
10549                setErr(null);
10550                if (verifyBtn.disabled) return;
10551                verifyBtn.disabled = true;
10552                verifyBtn.querySelector('.arr').textContent = '…';
10553                post(ROUTES.verify, {code: codeEl.value.trim()}).then(function (o) {
10554                    verifyBtn.querySelector('.arr').textContent = '→';
10555                    refreshVerify();
10556                    if (o.ok && o.j && o.j.ok) {
10557                        conversationId = o.j.conversation_id || null;
10558                        // The agent is dialling: somebody is about to hear the
10559                        // product. Fired here rather than through a session
10560                        // flash because this deck never navigates.
10561                        if (window.talkifyTrack) {
10562                            window.talkifyTrack("demo_call_started", {
10563                                source_form: 'outbound_demo'
10564                            });
10565                        }
10566                        show('calling');
10567                        startCallSafety();
10568                        if (conversationId) startPolling(); else finishSoon();
10569                    } else if (o.j && o.j.expired) {
10570                        setErr(firstError(o.j));
10571                        show('details');
10572                    } else {
10573                        setErr(firstError(o.j));
10574                    }
10575                }).catch(function () {
10576                    verifyBtn.querySelector('.arr').textContent = '→';
10577                    refreshVerify();
10578                    setErr('Network error. Please try again.');
10579                });
10580            });
10581
10582            document.getElementById('odChangeBtn').addEventListener('click', function () {
10583                post(ROUTES.reset, {});
10584                clearInterval(resendTimer);
10585                setErr(null);
10586                show('details');
10587            });
10588
10589            resendBtn.addEventListener('click', function () {
10590                if (resendBtn.disabled) return;
10591                resendBtn.disabled = true;
10592                post(ROUTES.resend, {}).then(function (o) {
10593                    if (o.ok && o.j && o.j.ok) {
10594                        setErr(null);
10595                        startResendCountdown();
10596                    } else if (o.j && o.j.expired) {
10597                        show('details');
10598                    } else {
10599                        setErr(firstError(o.j));
10600                        resendBtn.disabled = false;
10601                        resendBtn.textContent = 'Resend';
10602                    }
10603                });
10604            });
10605
10606            function startResendCountdown() {
10607                clearInterval(resendTimer);
10608                var left = 30;
10609                resendBtn.disabled = true;
10610                resendBtn.innerHTML = 'Resend (<span id="odResendCount">' + left + '</span>)';
10611                resendTimer = setInterval(function () {
10612                    left--;
10613                    var c = document.getElementById('odResendCount');
10614                    if (c) c.textContent = Math.max(0, left);
10615                    if (left <= 0) {
10616                        clearInterval(resendTimer);
10617                        resendBtn.disabled = false;
10618                        resendBtn.textContent = 'Resend';
10619                    }
10620                }, 1000);
10621            }
10622
10623            // -------- Step 3: follow the live call --------
10624            function startCallSafety() {
10625                clearTimeout(callSafety);
10626                callSafety = setTimeout(function () {
10627                    done(null);
10628                }, 360000);
10629            }
10630
10631            function startPolling() {
10632                pollStart = Date.now();
10633                clearInterval(pollTimer);
10634                pollTimer = setInterval(function () {
10635                    fetch(ROUTES.status + '?c=' + encodeURIComponent(conversationId), {headers: {'Accept': 'application/json'}})
10636                        .then(function (r) {
10637                            return r.json();
10638                        })
10639                        .then(function (j) {
10640                            if (j.status === 'finished') {
10641                                done(j.summary);
10642                            } else if (j.status === 'failed') {
10643                                done(null);
10644                            } else if (Date.now() - pollStart > 360000) {
10645                                done(null);
10646                            }
10647                        }).catch(function () {
10648                    });
10649                }, 4000);
10650            }
10651
10652            function finishSoon() {
10653                clearTimeout(callSafety);
10654                callSafety = setTimeout(function () {
10655                    done(null);
10656                }, 150000);
10657            }
10658
10659            function done(summary) {
10660                clearInterval(pollTimer);
10661                clearTimeout(callSafety);
10662                var s = document.getElementById('odSummary');
10663                if (summary) {
10664                    s.textContent = summary;
10665                    s.hidden = false;
10666                } else {
10667                    s.hidden = true;
10668                }
10669                show('done');
10670            }
10671
10672            document.getElementById('odAgainBtn').addEventListener('click', function () {
10673                conversationId = null;
10674                nameEl.value = '';
10675                mobileEl.value = '';
10676                codeEl.value = '';
10677                setErr(null);
10678                refreshDetails();
10679                refreshVerify();
10680                show('details');
10681            });
10682
10683            show(INITIAL_STEP === 'verify' ? 'verify' : 'details');
10684            if (INITIAL_STEP === 'verify') startResendCountdown();
10685        })();
10686    </script>
vendor: 1 bytes, line 10686
10686
10687<script>
10688  (() => {
10689    const captions = (v, on) => { const tr = v.textTracks && v.textTracks[0]; if (tr) tr.mode = on ? 'showing' : 'disabled'; };
10690
10691    // With sound, from the start: a chosen play (a fresh nonce makes it a new
10692    // play for the tracker, not the tail of the silent one).
10693    const withSound = (section) => {
10694      const v = section.querySelector('video');
10695      const btn = section.querySelector('.pv-sound');
10696      section.dataset.pvChosen = '1';
10697      if (btn) btn.hidden = true;
10698      // Paused first, so play() below fires a fresh play event.
10699      v.pause();
10700      v.dataset.autoplay = '';
10701      v.dataset.playNonce = String(Date.now());
10702      captions(v, false);
10703      v.muted = false;
10704      try { v.currentTime = 0; } catch (_) {}
10705      v.play().catch(() => {});
10706    };
10707
10708    // "Watch the film" links anywhere on the page. play() runs inside the
10709    // click, which is what lets it start with sound.
10710    document.addEventListener('click', (e) => {
10711      const link = e.target.closest('[data-play-film]');
10712      if (!link) return;
10713      const section = document.getElementById(link.dataset.playFilm);
10714      if (!section) return;
10715      e.preventDefault();
10716      withSound(section);
10717      section.scrollIntoView({ behavior: 'smooth', block: 'center' });
10718    });
10719
10720    const quiet = matchMedia('(prefers-reduced-motion: reduce)').matches
10721      || (navigator.connection && navigator.connection.saveData)
10722      || !('IntersectionObserver' in window);
10723
10724    document.querySelectorAll('.pv[data-pv-autoplay]').forEach((section) => {
10725      const v = section.querySelector('video');
10726      const btn = section.querySelector('.pv-sound');
10727      btn.addEventListener('click', () => withSound(section));
10728      // Unmuting from the player's own controls carries on from where it is;
10729      // that play stays marked autoplay, since the page started it.
10730      v.addEventListener('volumechange', () => {
10731        if (!v.muted && v.dataset.autoplay === '1') { v.dataset.autoplay = ''; btn.hidden = true; section.dataset.pvChosen = '1'; captions(v, false); }
10732      });
10733      if (quiet) return;
10734      new IntersectionObserver((entries) => {
10735        for (const entry of entries) {
10736          if (section.dataset.pvChosen === '1') return;
10737          if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {
10738            if (!v.paused) continue;
10739            v.muted = true;
10740            v.dataset.autoplay = '1';
10741            captions(v, true);
10742            v.play().then(() => { btn.hidden = false; }).catch(() => {});
10743          } else if (!v.paused && v.dataset.autoplay === '1') {
10744            v.pause();
10745          }
10746        }
10747      }, { threshold: [0, 0.5] }).observe(v);
10748    });
10749  })();
10750</script>
10750
10751    
10751<script>
10752        (function () {
10753            const root = document.querySelector('[data-tst]');
10754            if (!root) return;
10755            const track = root.querySelector('[data-tst-track]');
10756            const dots = root.querySelector('[data-tst-dots]');
10757            const cards = [...track.children];
10758            if (!cards.length) return;
10759
10760            const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
10761            let timer = null, taken = false;
10762
10763            // how many fit per view, so the dots page rather than count cards
10764            const perView = () => Math.max(1, Math.round(track.clientWidth / cards[0].offsetWidth));
10765            const pages = () => Math.max(1, Math.ceil(cards.length / perView()));
10766            const current = () => Math.round(track.scrollLeft / (track.clientWidth || 1));
10767
10768            const goto = (page) => {
10769                const total = pages();
10770                const p = ((page % total) + total) % total;
10771                track.scrollTo({left: p * track.clientWidth, behavior: reduce ? 'auto' : 'smooth'});
10772            };
10773
10774            const syncDots = () => {
10775                const c = current();
10776                [...dots.children].forEach((d, i) => d.classList.toggle('is-on', i === c));
10777            };
10778
10779            const buildDots = () => {
10780                dots.replaceChildren();
10781                for (let i = 0; i < pages(); i++) {
10782                    const b = document.createElement('button');
10783                    b.type = 'button';
10784                    b.className = 'tst-dot';
10785                    b.setAttribute('role', 'tab');
10786                    b.setAttribute('aria-label', 'Reviews page ' + (i + 1));
10787                    b.addEventListener('click', () => {
10788                        taken = true;
10789                        stop();
10790                        goto(i);
10791                    });
10792                    dots.appendChild(b);
10793                }
10794                syncDots();
10795            };
10796
10797            const stop = () => {
10798                if (timer) {
10799                    clearInterval(timer);
10800                    timer = null;
10801                }
10802            };
10803            const start = () => {
10804                if (!reduce && !taken && !timer) timer = setInterval(() => goto(current() + 1), 7000);
10805            };
10806
10807            root.querySelector('[data-tst-next]').addEventListener('click', () => {
10808                taken = true;
10809                stop();
10810                goto(current() + 1);
10811            });
10812            root.querySelector('[data-tst-prev]').addEventListener('click', () => {
10813                taken = true;
10814                stop();
10815                goto(current() - 1);
10816            });
10817
10818            // expanding a review must not leave the rail sliding out from under it
10819            root.querySelectorAll('[data-tst-expand]').forEach(btn => {
10820                btn.addEventListener('click', () => {
10821                    taken = true;
10822                    stop();
10823                    const quote = btn.previousElementSibling;
10824                    const open = !quote.classList.toggle('is-clamped');
10825                    btn.setAttribute('aria-expanded', String(open));
10826                    btn.querySelector('span').textContent = open ? 'Show less' : 'Read the full review';
10827                });
10828            });
10829
10830            root.addEventListener('mouseenter', stop);
10831            root.addEventListener('focusin', () => {
10832                taken = true;
10833                stop();
10834            });
10835            root.addEventListener('mouseleave', start);
10836            track.addEventListener('scroll', syncDots, {passive: true});
10837            window.addEventListener('resize', buildDots);
10838
10839            // do not rotate a rail nobody is looking at
10840            new IntersectionObserver(es => es.forEach(e => e.isIntersecting ? start() : stop()), {threshold: 0.25}).observe(root);
10841
10842            buildDots();
10843        })();
10844    </script>
10844
10845
10846</body>
10847</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.