1<!DOCTYPE html><html lang="en" data-theme="company"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width"><!-- Favicons --><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="shortcut icon" href="/favicon.ico"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="manifest" href="/site.webmanifest"><meta name="generator" content="Astro v7.3.3"><title>News category | Nutrient blog</title><meta name="description" content="Read the latest Nutrient news, announcements, and company updates."><!-- Robots meta tag for search engine crawling --><link rel="preload" href="/assets/nutrient-fonts/ABCMonumentGroteskVariable.woff2" as="font" type="font/woff2" crossorigin="anonymous" fetchpriority="high"><link rel="preload" href="/assets/nutrient-fonts/ABCMonumentGroteskMono-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous"><!-- Preconnect to external domains --><link rel="preconnect" href="https://www.googletagmanager.com"><link rel="preconnect" href="https://consent.cookiebot.com"><!-- Convert Experiences --><link rel="preconnect" href="https://cdn-4.convertexperiments.com">
1<script type="text/javascript" src="//cdn-4.convertexperiments.com/v1/js/10019196-10019528.js?environment=production" async></script>
1<!-- End Convert Experiences --><link rel="dns-prefetch" href="https://pa.nutrient.io"><link rel="dns-prefetch" href="https://pa.nutrient-staging.io"><link rel="dns-prefetch" href="https://gtm.nutrient.io"><!-- Canonical URL --><link rel="canonical" href="https://www.nutrient.io/blog/news/"><!-- Hreflang: English-only site with self-referencing tags + x-default --><link rel="alternate" hreflang="en" href="https://www.nutrient.io/blog/news/"><link rel="alternate" hreflang="x-default" href="https://www.nutrient.io/blog/news/"><!-- Feed Discovery Links --><link rel="alternate" type="application/atom+xml" title="Inside Nutrient (Atom)" href="https://www.nutrient.io/blog/feed.atom"><link rel="alternate" type="application/rss+xml" title="Inside Nutrient (RSS)" href="https://www.nutrient.io/blog/feed.xml"><!-- Markdown alternate for AI agents and automation --><!-- Alternate Platform Links --><!-- Open Graph / Facebook --><meta property="og:title" content="News category | Nutrient blog"><meta property="og:type" content="website"><meta property="og:locale" content="en"><meta property="og:description" content="Read the latest Nutrient news, announcements, and company updates."><meta property="og:site_name" content="Nutrient"><meta property="og:url" content="https://www.nutrient.io/blog/news/"><meta property="og:image" content="https://cdn.prod.website-files.com/65fdb7696055f07a05048833/6717c1324bc009b855df63a7_Nutrient.jpg"><!-- Twitter --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="News category | Nutrient blog"><meta name="twitter:description" content="Read the latest Nutrient news, announcements, and company updates."><meta name="twitter:image" content="https://cdn.prod.website-files.com/65fdb7696055f07a05048833/6717c1324bc009b855df63a7_Nutrient.jpg"><!-- Initialize dataLayer early for Plausible and other scripts -->
1<script> 2 window.dataLayer = window.dataLayer || []; 3 </script>
3<script> 4 // Handle theme synchronization 5 const html = document.documentElement; 6 const forcedTheme = html.getAttribute("data-forced-theme"); 7 const currentTheme = html.getAttribute("data-theme"); 8 9 if (forcedTheme) { 10 // If forced theme exists, sync it to data-theme 11 html.setAttribute("data-theme", forcedTheme); 12 } else if (!currentTheme) { 13 // If no theme is set at all, default to company 14 html.setAttribute("data-theme", "company"); 15 } 16 // If data-theme is already set (from server), leave it as is 17 </script>
17<!-- Plausible Analytics - conditionally loaded based on team cookie -->
17<script>(function(){const plausibleDomain = "nutrient.io"; 18const plausibleScript = "https://pa.nutrient.io/js/script.js"; 19 20 (function () { 21 function hasTeamCookie() { 22 return document.cookie.split(";").some(function (c) { 23 return c.trim().startsWith("nutrient_team=true"); 24 }); 25 } 26 if (hasTeamCookie()) { 27 console.log("[Plausible] External script not loaded for team member"); 28 return; 29 } 30 // Same automation check the Plausible script itself applies, with the 31 // same window.__plausible escape hatch (set by the live funnel canary). 32 if (navigator.webdriver === true && !window.__plausible) { 33 console.log( 34 "[Plausible] External script not loaded for automated browser", 35 ); 36 return; 37 } 38 const s = document.createElement("script"); 39 s.defer = true; 40 s.setAttribute("data-domain", plausibleDomain); 41 s.src = plausibleScript; 42 document.head.appendChild(s); 43 })(); 44 })();</script>
44<script> 45// Attribution capture (WWW-1415). Fires on EVERY visit and maintains two 46// halves of the _ntnt_utm cookie: 47// - first_* + utm params: set-once â captured on the first landing (referrer- 48// derived source/medium when no utm/click-id params exist) and never 49// overwritten; missing keys may be added to a pre-v2 cookie. 50// - last_*: overwritten on each new touch â the first page of a session or 51// any page carrying campaign params. Internal navigation never counts. 52// Consent-aware: values buffer in sessionStorage and the cookie is written 53// only once Cookiebot grants marketing consent, or after an 8s fallback when 54// no CMP is present on the page. 55(function captureAttribution() { 56 try { 57 var paramKeys = ["utm_source","utm_medium","utm_campaign","utm_content","utm_term","li_cid","gclid"]; 58 var cookieName = "_ntnt_utm"; 59 var pendingKey = "_ntnt_utm_pending"; 60 var touchKey = "_ntnt_utm_touch"; 61 var searchHosts = {"google.":"google","bing.com":"bing","duckduckgo.com":"duckduckgo","search.yahoo.":"yahoo","ecosia.org":"ecosia","baidu.com":"baidu","yandex.":"yandex","search.brave.com":"brave","startpage.com":"startpage"}; 62 var socialHosts = {"linkedin.com":"linkedin","lnkd.in":"linkedin","facebook.com":"facebook","twitter.com":"x","t.co":"x","x.com":"x","youtube.com":"youtube","reddit.com":"reddit","news.ycombinator.com":"hackernews"}; 63 64 function readCookie() { 65 var row = document.cookie.split(';').find(function(c) { 66 return c.trim().indexOf(cookieName + '=') === 0; 67 }); 68 if (!row) return null; 69 try { 70 var parsed = JSON.parse(decodeURIComponent(row.split('=').slice(1).join('='))); 71 return parsed && typeof parsed === 'object' ? parsed : null; 72 } catch (e) { return null; } 73 } 74 75 function matchHost(host, table) { 76 // Domain-boundary matching only â substring matching mis-tagged e.g. 77 // netflix.com as x.com and restaurant.co as t.co (Dasha's PR review). 78 var hits = Object.keys(table).filter(function(frag) { 79 if (frag.slice(-1) === '.') { 80 // Prefix-style fragment ("google.") â match at a label boundary so 81 // google.com, google.de, and www.google.co.uk all hit, but 82 // fakegoogle.com does not. 83 return host.indexOf(frag) === 0 || host.indexOf('.' + frag) !== -1; 84 } 85 // Domain fragment ("x.com") â exact host or a true subdomain of it. 86 return host === frag || host.slice(-(frag.length + 1)) === '.' + frag; 87 }); 88 return hits.length ? table[hits[0]] : null; 89 } 90 91 function classify(params, referrer) { 92 var utmSource = params.get('utm_source'); 93 if (utmSource) { 94 return { source: utmSource, medium: params.get('utm_medium') || 'campaign' }; 95 } 96 if (params.get('gclid')) return { source: 'google', medium: 'cpc' }; 97 if (params.get('li_cid')) return { source: 'linkedin', medium: 'cpc' }; 98 if (!referrer) return { source: 'direct', medium: 'none' }; 99 var host; 100 try { host = new URL(referrer).hostname.toLowerCase(); } catch (e) { 101 return { source: 'direct', medium: 'none' }; 102 } 103 // Internal referrer: cookie/session expired mid-visit â treat as direct 104 // rather than inventing a fake referral. 105 if (host === window.location.hostname || host.slice(-12) === '.nutrient.io' || host === 'nutrient.io') { 106 return { source: 'direct', medium: 'none' }; 107 } 108 var search = matchHost(host, searchHosts); 109 if (search) return { source: search, medium: 'organic' }; 110 var social = matchHost(host, socialHosts); 111 if (social) return { source: social, medium: 'social' }; 112 return { source: host, medium: 'referral' }; 113 } 114 115 function buildPayload(includeFirst, includeLast) { 116 var params = new URLSearchParams(window.location.search); 117 var referrer = document.referrer || ''; 118 var derived = classify(params, referrer); 119 var now = new Date().toISOString(); 120 // Stored referrer: origin + path only, capped â the cookie rides on 121 // every request, so no query strings/fragments and no 500-char URLs. 122 var storedReferrer = referrer.split('#')[0].split('?')[0].slice(0, 200); 123 var payload = {}; 124 if (includeFirst) { 125 payload.v = 2; 126 payload.first_landing_page = window.location.pathname; 127 payload.first_referrer = storedReferrer; 128 payload.first_source = derived.source; 129 payload.first_medium = derived.medium; 130 payload.first_touch_date = now; 131 paramKeys.forEach(function(k) { 132 var val = params.get(k); 133 if (val) payload[k] = val; 134 }); 135 } 136 if (includeLast) { 137 payload.last_landing_page = window.location.pathname; 138 payload.last_referrer = storedReferrer; 139 payload.last_source = derived.source; 140 payload.last_medium = derived.medium; 141 payload.last_touch_date = now; 142 var campaign = params.get('utm_campaign'); 143 if (campaign) payload.last_campaign = campaign; 144 var content = params.get('utm_content'); 145 if (content) payload.last_content = content; 146 var term = params.get('utm_term'); 147 if (term) payload.last_term = term; 148 } 149 return payload; 150 } 151 152 function writeCookie(payload) { 153 var maxAge = 60 * 60 * 24 * 90; // 90 days 154 var attrs = 'path=/; max-age=' + maxAge + '; SameSite=Lax'; 155 if (window.location.protocol === 'https:') attrs += '; Secure'; 156 if (window.location.hostname.endsWith('nutrient.io')) attrs += '; domain=.nutrient.io'; 157 document.cookie = cookieName + '=' + encodeURIComponent(JSON.stringify(payload)) + '; ' + attrs; 158 } 159 160 // null = consent state not known yet (Cookiebot absent, or present but 161 // the visitor has not responded â consent.method stays null until they 162 // do). Only an actual response counts as a decision; otherwise the 163 // accept listeners must stay registered so accepting the banner on the 164 // SAME page writes the cookie immediately (Dasha's PR review). 165 function consentState() { 166 var cb = window.Cookiebot; 167 if (!cb || !cb.consent) return null; 168 if (!cb.consent.method) return null; 169 return cb.consent.marketing === true; 170 } 171 172 function attemptWrite() {
173 try { 174 var raw = sessionStorage.getItem(pendingKey); 175 if (!raw) return; 176 var pending = JSON.parse(raw); 177 var existing = readCookie(); 178 var merged = existing || {}; 179 var changed = false; 180 Object.keys(pending).forEach(function(k) { 181 // first_* keys (and utm params) are set-once: only fill gaps. 182 // last_* keys are the latest touch: always overwrite. 183 var isLast = k.indexOf('last_') === 0; 184 if (isLast || merged[k] === undefined) { 185 merged[k] = pending[k]; 186 changed = true; 187 } 188 }); 189 if (changed) writeCookie(merged); 190 sessionStorage.removeItem(pendingKey); 191 } catch (e) { /* never break the page */ } 192 } 193 194 // First touch: buffer only if the cookie is absent or predates v2, and 195 // only once per session, so a mid-session page (whose referrer is 196 // internal) can't overwrite the true landing capture. 197 // Latest touch: a "new touch" is the first page of a session, or any 198 // page carrying campaign params (a mid-session ad/email click-through). 199 // Internal navigation never counts as a touch. 200 var existing = readCookie(); 201 var needsFirst = !existing || existing.v !== 2; 202 var params = new URLSearchParams(window.location.search); 203 var hasParams = paramKeys.some(function(k) { return params.get(k); }); 204 var isNewTouch = hasParams || !sessionStorage.getItem(touchKey); 205 if (!sessionStorage.getItem(pendingKey) && (needsFirst || isNewTouch)) { 206 sessionStorage.setItem( 207 pendingKey, 208 JSON.stringify(buildPayload(needsFirst, isNewTouch)) 209 ); 210 sessionStorage.setItem(touchKey, '1'); 211 } 212 213 if (!sessionStorage.getItem(pendingKey)) return; 214 215 // Write immediately when consent is already granted; otherwise wait for 216 // Cookiebot's events. Fail-closed by design (WWW-1415, privacy decision 217 // 2026-08-03): when Cookiebot never appears (blocked or failed to load), 218 // the cookie is NOT written â a blocked banner is indistinguishable from 219 // a missing one, and a marketing cookie needs a real consent signal. The 220 // session buffer stays, so a late-loading Cookiebot still triggers the 221 // write via the events below. 222 if (consentState() === true) { attemptWrite(); return; } 223 if (consentState() === false) return; // declined: keep the session buffer only 224 window.addEventListener('CookiebotOnConsentReady', attemptWrite); 225 window.addEventListener('CookiebotOnAccept', attemptWrite); 226 } catch (e) { 227 // Attribution capture must never break the page. 228 } 229})(); 230 231// Bridge first-party attribution cookie â survey CTA URLs. 232// HubSpot's modern form embed renders in a cross-origin iframe on 233// js-eu1.hsforms.net, so JS in our parent page cannot reach the iframe's 234// hidden inputs and the iframe cannot read our _ntnt_utm cookie. HubSpot 235// auto-fills hidden fields from parent URL params, so on every page we 236// rewrite survey-CTA hrefs to carry the cookie's attribution as URL 237// params. Existing query params on the link (e.g. ?landing_persona=â¦) are 238// preserved. 239(function enrichSurveyCtas() { 240 function readAttributionCookie() { 241 try { 242 var row = document.cookie.split(';').find(function(c) { 243 return c.trim().indexOf("_ntnt_utm" + '=') === 0; 244 }); 245 if (!row) return null; 246 var parsed = JSON.parse(decodeURIComponent(row.split('=').slice(1).join('='))); 247 return parsed && typeof parsed === 'object' ? parsed : null; 248 } catch (e) { return null; } 249 } 250 function enrich() { 251 var values = readAttributionCookie(); 252 if (!values) return; 253 // Only URL params belong in survey CTA links â never the derived 254 // first_* keys or the version marker (WWW-1415). 255 var keys = ["utm_source","utm_medium","utm_campaign","utm_content","utm_term","li_cid","gclid"].filter(function(k) { 256 return values[k]; 257 }); 258 if (keys.length === 0) return; 259 var links = document.querySelectorAll( 260 "a[data-survey-cta], a[href*='/research-study/legal/survey/']" 261 ); 262 links.forEach(function(a) { 263 if (a.hasAttribute('data-survey-cookie-enriched')) return;
264 try { 265 var url = new URL(a.getAttribute('href'), window.location.origin); 266 keys.forEach(function(k) { 267 if (values[k] && !url.searchParams.has(k)) { 268 url.searchParams.set(k, values[k]); 269 } 270 }); 271 a.setAttribute('href', url.pathname + url.search + url.hash); 272 a.setAttribute('data-survey-cookie-enriched', 'true'); 273 } catch (e) { 274 // Bad href â leave it alone. 275 } 276 }); 277 } 278 if (document.readyState === 'loading') { 279 document.addEventListener('DOMContentLoaded', enrich); 280 } else { 281 enrich(); 282 } 283 var observer = new MutationObserver(enrich); 284 observer.observe(document.body || document.documentElement, { 285 childList: true, 286 subtree: true, 287 }); 288})(); 289 290// Skip tracking if team member cookie is set 291function hasTeamCookie() { 292 return document.cookie.split(';').some(function(c) { 293 return c.trim().startsWith('nutrient_team=true'); 294 }); 295} 296 297// Skip the custom wiring in automation-controlled browsers (Playwright, 298// Puppeteer, Selenium, headless Chrome) â internal agents and scrapers, never 299// real users. Mirrors the official Plausible script's own automation check, 300// including its documented window.__plausible escape hatch, which the funnel 301// canary sets in live mode to verify tracking end-to-end. 302function isAutomatedBrowser() { 303 return navigator.webdriver === true && !window.__plausible; 304} 305 306// HubSpot has one portal for every environment, so a CTA click from localhost, 307// a *.npreview.dev preview or staging is indistinguishable from a real one in 308// the Occurrences tab. See src/config/analytics-environment.ts for why this is 309// an allowlist. Plausible stays unguarded â it separates environments by site. 310var NUTRIENT_PRODUCTION_HOSTS = ["nutrient.io"]; 311function isProductionHost() { 312 var host = window.location.hostname.toLowerCase(); 313 return NUTRIENT_PRODUCTION_HOSTS.some(function (root) { 314 return host === root || host.slice(-(root.length + 1)) === '.' + root; 315 }); 316} 317
318if (hasTeamCookie()) { 319 console.log('[Plausible] Tracking disabled for team member'); 320} else if (isAutomatedBrowser()) { 321 console.log('[Plausible] Tracking disabled for automated browser'); 322} else { 323 324window.plausible = 325 window.plausible || 326 function (...args) { 327 (window.plausible.q = window.plausible.q || []).push(args); 328 }; 329 330document.addEventListener("DOMContentLoaded", function () { 331 // Configuration for click tracking 332 // Each entry maps a selector to an event configuration 333 const clickTrackers = [ 334 // Copy buttons tracking 335 // selector-check:ignore .copy is injected by Expressive Code at build time; never in source 336 { 337 selector: "div.copy", 338 eventName: "Copy Code", 339 gtmEvent: "click_copy", 340 idAttribute: "copy-click" 341 }, 342 // CTA Buttons 343 { 344 // Prefix match: header components render ids via nid(), which suffixes 345 // "-<scope>" on dynamicHeaderFooter pages (e.g. /contact-sales). The 346 // marketing headers' own contact button uses id "main-nav-contact-cta", 347 // which is NOT a prefix of "main-nav-contact-sales-cta" (nor vice versa), 348 // so both patterns are needed; both map to "Click Contact Sales CTA". 349 // In-body CTAs opt in via data-analytics-cta (MKT-5648). 350 selector: 351 '[id^="main-nav-contact-sales-cta"], [id^="main-nav-contact-cta"], [data-analytics-cta="contact-sales"]', 352 eventName: "Click Contact Sales CTA", 353 gtmEvent: "click_contact_sales_cta", 354 idAttribute: "main-nav-contact-sales-cta", 355 // Also sent to HubSpot per Kelly's call on the MKT-5648 PR â a 356 // meaningful journey event despite firing on the site-wide nav too. 357 // trial stays Plausible/GTM-only (Kelly left it out). 358 hubspotEvent: "pe145134102_click_contact_sales_cta" 359 }, 360 { 361 selector: '[id^="main-nav-trial-cta"], [data-analytics-cta="trial"]', 362 eventName: "Click Trial CTA", 363 gtmEvent: "click_trial_cta", 364 idAttribute: "main-nav-trial-cta" 365 }, 366 // Data-extraction API page CTAs (MKT-5648). Both dashboard-bound; names 367 // coordinate with DWS-352/DWS-342 for end-to-end tracing. hubspotEvent 368 // additionally sends the click into the HubSpot contact journey. 369 // get-api-key now resolves in check-analytics-selectors.mjs via the 370 // quoted object-key form ("data-analytics-cta": "get-api-key" in 371 // ApiDataExtractionPlan.astro etc.) â no ignore needed. 372 { 373 selector: '[data-analytics-cta="get-api-key"]', 374 eventName: "Click Get API Key CTA", 375 gtmEvent: "click_get_api_key_cta", 376 idAttribute: "get-api-key-cta", 377 hubspotEvent: "pe145134102_click_get_api_key_cta" 378 }, 379 // Data Extraction Credits 2026 promo page 380 // (/api/data-extraction-api/credits-promo/). Its own goal so promo claims 381 // do not inflate the Get API Key CTA metric, and so HubSpot can tell a 382 // promo claim from an ordinary API-key signup (PR #5413). 383 // selector-check:ignore claim-promo-credits is only ever set via prop-name 384 // forms (buttonAnalyticsCta on Hero, analyticsCta on FreeTierBanner) - no 385 // source file spreads the literal object key "data-analytics-cta": 386 // "claim-promo-credits". Remove this ignore if that literal usage appears. 387 { 388 selector: '[data-analytics-cta="claim-promo-credits"]', 389 eventName: "Click Claim Promo Credits CTA", 390 gtmEvent: "click_claim_promo_credits_cta", 391 idAttribute: "claim-promo-credits-cta", 392 hubspotEvent: "pe145134102_click_claim_promo_credits_cta" 393 }, 394 // selector-check:ignore open-studio is only ever set via prop-name forms 395 // (buttonAnalyticsCta/secondButtonAnalyticsCta/analyticsCta on Hero, 396 // TextBlock, FreeTierBanner) â no source file spreads the literal object 397 // key "data-analytics-cta": "open-studio", so even the quoted object-key 398 // form the checker now understands can't verify it. Remove this ignore 399 // if a future page adds that literal object-key usage. 400 { 401 selector: '[data-analytics-cta="open-studio"]', 402 eventName: "Click Open Studio CTA", 403 gtmEvent: "click_open_studio_cta",
404 idAttribute: "open-studio-cta", 405 hubspotEvent: "pe145134102_click_open_studio_cta" 406 }, 407 // AI-skills pages' "Install the skill" hero CTA (MKT-5648, Dasha's PR 408 // review). Scrolls to #install, so it measures intent-to-install, not an 409 // actual install. Page-scoped and low volume, so it also goes to HubSpot. 410 // selector-check:ignore install-skill is only ever set via the 411 // buttonAnalyticsCta prop-name form on the three /ai/skills/ heroes â no 412 // source file spreads the literal object key "data-analytics-cta": 413 // "install-skill". Remove this ignore if that literal usage appears. 414 { 415 selector: '[data-analytics-cta="install-skill"]', 416 eventName: "Click Install Skill CTA", 417 gtmEvent: "click_install_skill_cta", 418 idAttribute: "install-skill-cta", 419 hubspotEvent: "pe145134102_click_install_skill_cta" 420 }, 421 // Demo hero CTAs on /sdk/ocr/ ("LAUNCH DEMO") and /document-ai/ ("See it 422 // in action") â MKT-5648, Dasha's second review round. Page-scoped and 423 // low volume, so it also goes to HubSpot. 424 // selector-check:ignore demo is only ever set via the buttonAnalyticsCta 425 // prop-name form on those two heroes â no source file spreads the literal 426 // object key "data-analytics-cta": "demo". Remove this ignore if that 427 // literal usage appears. 428 { 429 selector: '[data-analytics-cta="demo"]', 430 eventName: "Click Demo CTA", 431 gtmEvent: "click_demo_cta", 432 idAttribute: "demo-cta", 433 hubspotEvent: "pe145134102_click_demo_cta" 434 }, 435 // /sdk/ai-assistant/ "GET STARTED NOW" hero CTA (â getting-started guide) 436 // â MKT-5648, Dasha's second review round. Page-scoped and low volume, so 437 // it also goes to HubSpot. NOTE: trial deliberately carries no HubSpot 438 // event â Kelly left it out of scope (MKT-5648 PR thread). 439 // selector-check:ignore get-started is only ever set via the 440 // buttonAnalyticsCta prop-name form on the ai-assistant hero â no source 441 // file spreads the literal object key "data-analytics-cta": 442 // "get-started". Remove this ignore if that literal usage appears. 443 { 444 selector: '[data-analytics-cta="get-started"]', 445 eventName: "Click Get Started CTA", 446 gtmEvent: "click_get_started_cta", 447 idAttribute: "get-started-cta", 448 hubspotEvent: "pe145134102_click_get_started_cta" 449 }, 450 { 451 selector: '[id^="main-nav-downloads-cta"]', 452 eventName: "Click Downloads CTA", 453 gtmEvent: "click_downloads_cta", 454 idAttribute: "main-nav-downloads-cta" 455 }, 456 { 457 // MarkdownActions renders the copy button as a class, not an id 458 // (two variants: default "Copy page" and aiQuickStart "Copy"). Also track 459 // the dropdown's "Copy page" item, which triggers the same page-copy 460 // action â so the metric counts page copies however they're triggered, 461 // not just the main button. The dropdown item is scoped to 462 // .markdown-actions-option so a future data-action="copy" elsewhere can't 463 // silently join this metric. element_id falls back to idAttribute below. 464 selector: '.copy-page-btn, .markdown-actions-option[data-action="copy"]', 465 eventName: "Click Copy Page CTA", 466 gtmEvent: "click_copy_page_cta", 467 idAttribute: "copy-page-cta" 468 }, 469 { 470 selector: '.markdown-actions-option[data-action="view-markdown"]', 471 eventName: "Click View Markdown CTA", 472 gtmEvent: "click_view_markdown_cta", 473 idAttribute: "view-markdown-cta" 474 }, 475 // AI Chat CTAs â MarkdownActions dropdown items carry data-action attributes. 476 { 477 selector: '.markdown-actions-option[data-action="open-chatgpt"]', 478 eventName: "Click Open with ChatGPT CTA", 479 gtmEvent: "click_open_chatgpt_cta", 480 idAttribute: "open-chatgpt-cta" 481 }, 482 { 483 selector: '.markdown-actions-option[data-action="open-claude"]', 484 eventName: "Click Open with Claude CTA", 485 gtmEvent: "click_open_claude_cta", 486 idAttribute: "open-claude-cta" 487 }, 488 { 489 selector: '.markdown-actions-option[data-action="open-grok"]', 490 eventName: "Click Open with Grok CTA", 491 gtmEvent: "click_open_grok_cta",
492 idAttribute: "open-grok-cta" 493 }, 494 // Survey CTAs â preferred: any element with [data-survey-cta]. Falls 495 // back to the legacy href pattern for the legal landing pages whose 496 // CTAs go through shared Hero/FeaturePictogramList/TextBlock components 497 // and don't carry the data attribute. See docs/reference-surveys-system.md. 498 { 499 selector: "[data-survey-cta], a[href*='/research-study/legal/survey/']", 500 eventName: "Click Survey CTA", 501 gtmEvent: "click_survey_cta", 502 idAttribute: "click-survey-cta" 503 } 504 ]; 505 506 // Generic function to attach click tracking to an element. 507 // matchCount = how many elements the selector matched on the page. Class / 508 // attribute selectors (e.g. .copy-page-btn, [data-action="â¦"]) can match 509 // several elements â writing the same idAttribute onto all of them would 510 // create invalid duplicate ids, so only backfill the id when the selector 511 // matched exactly one element. The element_id prop still falls back to 512 // config.idAttribute in the click handler, so analytics is unchanged either way. 513 function attachClickTracking(element, config, matchCount) { 514 // Avoid adding multiple listeners 515 if (element.hasAttribute("data-plausible-tracked")) return; 516 517 element.setAttribute("data-plausible-tracked", "true"); 518 519 // Set ID if provided in config and this is the only element it matched. 520 // Skip vocabulary-tagged elements: tagged in-body CTAs must not receive a 521 // nav-style backfilled id (e.g. "main-nav-contact-sales-cta") â their 522 // element_id already resolves from the data-analytics-cta attribute below. 523 if ( 524 config.idAttribute && 525 !element.id && 526 matchCount === 1 && 527 !element.hasAttribute("data-analytics-cta") 528 ) { 529 element.setAttribute("id", config.idAttribute); 530 } 531 532 element.addEventListener("click", function () { 533 const elementId = 534 element.id || 535 element.getAttribute("data-analytics-cta") || 536 config.idAttribute || 537 "unknown"; 538 539 // Track with Plausible 540 if (window.plausible) { 541 window.plausible(config.eventName, { 542 props: { 543 location: window.location.pathname, 544 referrer: document.referrer, 545 element_id: elementId 546 }, 547 }); 548 } 549 550 // Send to GTM reliably via dataLayer 551 if (window.dataLayer) { 552 window.dataLayer.push({ 553 event: config.gtmEvent, 554 click_id: elementId, 555 location: window.location.pathname, 556 referrer: document.referrer 557 }); 558 } 559 560 // Send selected CTAs to HubSpot as custom behavioral events so the 561 // click appears in the contact's journey (MKT-5648). _hsq is HubSpot's 562 // pre-load queue; the deferred hs script drains it on load. Guarded by 563 // the same team-cookie gate as everything else in this script, plus a 564 // production-host check the cookie cannot stand in for (see above). 565 if (config.hubspotEvent && isProductionHost()) { 566 window._hsq = window._hsq || []; 567 window._hsq.push([ 568 "trackCustomBehavioralEvent", 569 { 570 name: config.hubspotEvent, 571 properties: { 572 location: window.location.pathname, 573 element_id: elementId 574 } 575 } 576 ]); 577 } 578 }); 579 } 580 581 // Function to process existing and new elements 582 function processElements() { 583 clickTrackers.forEach(function(config) { 584 const elements = document.querySelectorAll(config.selector); 585 elements.forEach(function(element) { 586 attachClickTracking(element, config, elements.length); 587 }); 588 }); 589 } 590 591 // Use MutationObserver to handle dynamically added elements 592 const observer = new MutationObserver(function (mutations) { 593 // Page-wide counts, once per batch. A batch can carry thousands of added 594 // nodes, so counting per node meant scanning the whole document tens of 595 // thousands of times. The DOM already includes every added node here. 596 const pageMatchCounts = clickTrackers.map(function (config) { 597 return document.querySelectorAll(config.selector).length; 598 }); 599 600 mutations.forEach(function (mutation) {
601 mutation.addedNodes.forEach(function (node) { 602 if (node.nodeType === 1) { 603 // Element node - check all configured selectors 604 clickTrackers.forEach(function(config, configIndex) { 605 const pageMatchCount = pageMatchCounts[configIndex]; 606 // Check if the node itself matches 607 if (node.matches && node.matches(config.selector)) { 608 attachClickTracking(node, config, pageMatchCount); 609 } 610 // Check for matching elements within the added node 611 if (node.querySelectorAll) { 612 const matchingElements = node.querySelectorAll(config.selector); 613 matchingElements.forEach(function(element) { 614 attachClickTracking(element, config, pageMatchCount); 615 }); 616 } 617 }); 618 } 619 }); 620 }); 621 }); 622 623 // Track existing elements 624 processElements(); 625 626 // Start observing for new elements 627 observer.observe(document.body, { 628 childList: true, 629 subtree: true, 630 }); 631}); 632 633// Generic "Link Click" tracking (WWW-1284) â a single delegated listener on 634// document fires one Plausible custom event for every qualifying link/button 635// click site-wide, with structured props for funnel + per-page click analysis. 636// Runs alongside the named clickTrackers above; an element with a named 637// tracker emits both its named event and this generic one (accepted). 638(function trackAllLinkClicks() { 639 function getElementLocation(el) { 640 if (el.closest("footer")) return "footer"; 641 if (el.closest("nav, header")) return "nav"; 642 var main = el.closest("main"); 643 if (main) { 644 if (el.closest("[data-hero]")) return "hero"; 645 var firstSection = main.querySelector("section"); 646 if (firstSection && firstSection.contains(el)) return "hero"; 647 return "main"; 648 } 649 return "body"; 650 } 651 652 function getClickText(el) { 653 var text = (el.innerText || el.textContent || "").replace(/\s+/g, " ").trim(); 654 if (!text) { 655 text = el.getAttribute("aria-label") || el.getAttribute("title") || ""; 656 } 657 return text.slice(0, 120); 658 } 659 660 function getDestinationType(el, isLink, rawHref) { 661 if (!isLink) return ""; 662 if (/^mailto:/i.test(rawHref)) return "mailto"; 663 if (/^tel:/i.test(rawHref)) return "tel"; 664 try { 665 var url = new URL(el.href, window.location.origin); 666 return url.host === window.location.host ? "internal" : "external"; 667 } catch (e) { 668 return ""; 669 } 670 } 671 672 // A real <button> is a button; so is an anchor styled as a CTA button. 673 // Our design-system button primitives are the "btn" and "link-button" 674 // classes (plus role="button"), so a "Try for free" / "Contact sales" 675 // anchor reports click_type "button" even though it's an <a>. 676 function getClickType(el, isButton) { 677 if (isButton) return "button"; 678 if (el.matches('[role="button"], .btn, .link-button')) return "button"; 679 return "link"; 680 } 681 682 document.addEventListener( 683 "click", 684 function (event) { 685 try { 686 var target = event.target; 687 if (!target || !target.closest) return; 688 var el = target.closest("a, button"); 689 if (!el) return; 690 691 var isLink = el.tagName === "A"; 692 var isButton = el.tagName === "BUTTON"; 693 694 // Ignore disabled controls. 695 if (el.disabled || el.getAttribute("aria-disabled") === "true") return; 696 697 var rawHref = isLink ? el.getAttribute("href") || "" : ""; 698 699 // Ignore links with no real destination. 700 if (isLink) { 701 if (!rawHref || rawHref === "#" || /^javascript:/i.test(rawHref)) return; 702 } 703 704 if (!window.plausible) return; 705 706 window.plausible("Link Click", { 707 props: { 708 location: window.location.pathname, 709 element_id: el.id || "", 710 element_location: getElementLocation(el), 711 click_text: getClickText(el), 712 click_url: isLink ? el.href : "", 713 click_type: getClickType(el, isButton), 714 destination_type: getDestinationType(el, isLink, rawHref), 715 }, 716 }); 717 } catch (e) { 718 // Tracking must never break a click. 719 } 720 }, 721 true, 722 ); 723})(); 724}
724 // end hasTeamCookie else block 725</script>
725<!-- SoftwareSourceCode Schema for code samples --><!-- Schema script that will be populated after DOM is ready --> <!-- Data attributes for page-specific values (small, varies per page) --> <div id="code-samples-data" data-platform-slug="news" data-current-url="/blog/news/" hidden></div>
725<script type="module">var A="Android",L="DocuVieware",D=".NET",N="Python",k="Java",W="Node.js",T="VR and Spatial",j="Flutter",O="MAUI",M="Cordova",q="Ionic",I="Processor",U="Web Server-Backed";var B="Salesforce",F="SharePoint",R="Microsoft Teams",V="OneDrive",J={web:"Web","document-authoring":"Document Authoring",ios:"iOS",android:A,docuvieware:L,"document-engine":"Document Engine","dws-processor":"DWS Processor","dws-accessibility":"DWS Accessibility","dws-viewer":"DWS Viewer","ai-assistant":"AI Assistant","ai-document-processing":"AI Document Processing",dotnet:D,python:N,java:k,nodejs:W,visionos:T,"mac-catalyst":"Mac Catalyst","document-converter":"Document Converter","document-editor":"Document Editor","salesforce-documents":"Nutrient Documents for Salesforce","document-searchability":"Document Searchability","document-automation-server":"Document Automation Server","workflow-automation":"Workflow Automation","react-native":"React Native",flutter:j,maui:O,"dotnet-for-ios":".NET for iOS","dotnet-for-android":".NET for Android",cordova:M,ionic:q,processor:I,server:U,uwp:"UWP","xamarin-ios":"Xamarin.iOS","xamarin-android":"Xamarin.Android",salesforce:B,sharepoint:F,teams:R,onedrive:V},P=J;function K(s,C){if(!s||s.length===0)return null;const c=new Map;for(const t of s){const o=t.programmingLanguage||"text",i=c.get(o);i?i.push(t):c.set(o,[t])}const v=t=>{const o={"@type":"SoftwareSourceCode",name:t.name||`Code example in ${t.programmingLanguage}`,programmingLanguage:t.programmingLanguage,codeSampleType:t.codeSampleType||"inline",text:t.text};return t.runtimePlatform&&(o.runtimePlatform=t.runtimePlatform),o},d=[];for(const[t,o]of c)o.length===1?d.push(v(o[0])):d.push({"@type":"SoftwareSourceCode",name:`Code examples in ${t}`,programmingLanguage:t,hasPart:o.map(v)});return{"@context":"https://schema.org","@graph":[{"@type":"SoftwareSourceCode",name:"Code samples",programmingLanguage:[...c.keys()],isPartOf:{"@type":"WebPage","@id":C},hasPart:d}]}}function w(){const s=document.getElementById("code-samples-data");if(!s)return;const C=s.dataset.platformSlug||"",c=s.dataset.currentUrl||"",v=P[C]||null,d=document.querySelectorAll("pre[data-language]");if(d.length===0)return;const t=[];if(d.forEach(o=>{const i=o.getAttribute("data-language")||"text",l=o.querySelector("code");if(!l)return;let S=null,y=null,f=o.parentElement;for(;f&&f!==document.body;){const e=f.getAttribute("data-selector-content");if(e){y=e;const n=e.split("-");for(let r=n.length;r>0;r--){for(let a=0;a<=n.length-r;a++){const h=n.slice(a,a+r).join("-");if(P[h]){S=P[h];break}}if(S)break}break}f=f.parentElement}let m=S||v;if(!m&&y){const e=y.split("-"),n=["mobile","server","desktop","cloud","api"];let r=e[0];n.includes(e[0])&&e.length>1&&(r=e[1]),m=r.charAt(0).toUpperCase()+r.slice(1)}let p;const x=l.querySelectorAll(".ec-line");if(x.length>0){const e=[];x.forEach(n=>{const r=n.querySelector(".code");if(r){const a=r.textContent||"";e.push(a)}else if(n.querySelector(".line")){const a=n.cloneNode(!0),h=a.querySelector(".line");h&&h.remove(),e.push(a.textContent||"")}else e.push(n.textContent||"")}),p=e.join(` 726`).replace(/\n{3,}/g,` 727 728`)}else p=l.textContent||"";if(p.length===0||p.length>5e3)return;let b="",g=o.previousElementSibling;for(let e=0;e<5&&g;e++){if(g instanceof HTMLElement){const n=g.tagName.toLowerCase();if(["h1","h2","h3","h4","h5","h6"].includes(n)){b=g.textContent||"";break}}g=g.previousElementSibling}let u;if(b)u=b.trim(),u.length>100&&(u=u.substring(0,97)+"...");else{const e=["Code example"];m&&e.push("for",m),e.push("in",i),u=e.join(" ")}const E={"@type":"SoftwareSourceCode",name:u,description:u,programmingLanguage:i,codeSampleType:"inline",text:p.trim(),isPartOf:{"@type":"WebPage","@id":window.location.origin+c}};m&&(E.runtimePlatform=m),t.push(E)}),t.length>0){const o=document.getElementById("code-samples-schema");if(o){const i=K(t,window.location.origin+c);if(!i)return;let l=JSON.stringify(i,null,2);l=l.split("<").join("\\u003c").split(">").join("\\u003e"),o.textContent=l}}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",w):w();document.addEventListener("astro:page-load",w);</script>
728<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","@id":"https://www.nutrient.io/#organization","name":"Nutrient","alternateName":["Nutrient GmbH","PSPDFKit"],"url":"https://www.nutrient.io","logo":{"@type":"ImageObject","url":"https://www.nutrient.io/android-chrome-512x512.png","width":512,"height":512,"caption":"Nutrient Logo"},"image":["https://www.nutrient.io/android-chrome-512x512.png","https://www.nutrient.io/_astro/nutrient-logo.CJxiofUP.svg"],"description":"Nutrient provides best-in-class PDF SDKs for viewing, editing, and eSigning documents. Build with SDKs that quickly and seamlessly integrate into your web, server, and mobile apps.","foundingDate":"2011","telephone":"+1-888-356-4219","location":{"@type":"Place","@id":"https://www.nutrient.io/#headquarters","name":"Nutrient head office","address":{"@type":"PostalAddress","streetAddress":"4509 Creedmoor Road, Suite 503","addressLocality":"Raleigh","addressRegion":"NC","postalCode":"27612","addressCountry":"US"},"geo":{"@type":"GeoCoordinates","latitude":35.8454,"longitude":-78.7042}},"sameAs":["https://www.linkedin.com/company/nutrientdocs","https://x.com/nutrientdocs","https://www.facebook.com/nutrientdocs/","https://www.youtube.com/channel/UCQFsRxB1vTDJ5N1NaNsZNrw?sub_confirmation=1","https://github.com/PSPDFKit","https://discord.gg/Z754Pfb8bD"],"contactPoint":[{"@type":"ContactPoint","contactType":"sales","url":"https://www.nutrient.io/contact-sales/"},{"@type":"ContactPoint","contactType":"customer support","email":"[email protected]","url":"https://support.nutrient.io/hc/en-us/requests/new"}]}</script>
728<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","@id":"https://www.nutrient.io/#website","url":"https://www.nutrient.io","name":"Nutrient","description":"The #1 PDF SDK Library for Viewing, Editing, eSigning and more","publisher":{"@id":"https://www.nutrient.io/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.nutrient.io/search/?q={search_term_string}"},"query-input":"required name=search_term_string"}}</script>
728<style>.content-wrapper.blog-wrapper{background-color:#0000;flex-direction:column;align-items:stretch;width:100%;height:100%;display:flex}.no-posts-message{text-align:center;color:var(--text-neutral-primary);width:100%;height:100%;grid-column:span 4/span 4;justify-content:center;align-items:center;font-size:1.125rem;font-weight:400;line-height:1.75rem}.content-wrapper.blog-article{background-color:#0000;position:relative}.content-wrapper.blog-article .content-main{max-width:100%;margin:0 auto;padding:4rem 0}@media (min-width:1280px){.content-wrapper.blog-article .content-main{max-width:var(--content-blog);margin-left:0;margin-right:auto}}.content-wrapper.blog-article .right-aside .toc-content{border-radius:1rem;padding-top:.5rem}@media (min-width:1280px){.content-wrapper.blog-article .right-aside .toc-content{padding-top:4rem}}.content-wrapper.blog-article .right-aside .toc-container{width:100%}.content-wrapper.blog-article .article-header-top{justify-content:space-between;align-self:stretch;align-items:center;gap:.75rem;display:flex}.content-wrapper.blog-article .article-title{letter-spacing:-.96px;color:var(--text-neutral-primary);margin-top:2rem;margin-bottom:2rem;font-size:2.5rem;font-weight:400}@media (min-width:768px){.content-wrapper.blog-article .article-title{font-size:3rem;line-height:1}}.content-wrapper.blog-article .article-intro{color:var(--text-neutral-primary);margin-bottom:2rem;font-size:1.125rem;line-height:160%}.content-wrapper.blog-article .article-tags{flex-wrap:wrap;gap:.5rem;display:flex}.content-wrapper.blog-article .authors-box{border-color:#322f2f;border-top-width:1px;border-bottom-width:1px;border-color:var(--border-neutral-default-primary);flex-direction:column;align-items:flex-start;gap:2.5rem;margin-top:3rem;padding-top:1.5rem;padding-bottom:3rem;display:flex}.content-wrapper.blog-article .authors-box .author-box-wrapper{flex-direction:column;align-items:flex-start;gap:1.5rem;width:100%;display:flex}@media (min-width:768px){.content-wrapper.blog-article .authors-box .author-box-wrapper{flex-direction:row}}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-image{border-radius:1rem;width:6rem;height:6rem;margin:0}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info{flex-direction:column;gap:1.5rem;width:100%;display:flex}@media (min-width:768px){.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info{flex-direction:row}}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info .author-overview{flex:1}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info .author-overview .author-name{letter-spacing:-.48px;margin:0;font-size:1.5rem;font-weight:400;line-height:2rem}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info .author-overview .author-role{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-secondary);margin:0;font-size:.75rem;font-weight:400;line-height:130%}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info .author-overview .author-social{margin-top:1rem}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info .author-overview .author-social .author-social-list{gap:.25rem;display:flex}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info .author-overview .author-social .author-social-list a{justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:flex}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-info .author-overview .author-social .author-social-list a svg{width:1.5rem;height:1.5rem}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-bio{flex:1}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-bio p{color:#c2bdae;margin:0;padding:0;font-size:.875rem}@media (min-width:992px){.content-wrapper.blog-article .authors-box .author-box-wrapper .author-bio p{font-size:1rem}}.content-wrapper.blog-article .authors-box .author-box-wrapper .author-bio p{color:var(--text-neutral-secondary)}.article-meta{border-color:#322f2f;border-top-width:1px;border-bottom-width:1px;border-color:var(--border-neutral-default-primary);flex-wrap:wrap;justify-content:space-between;align-self:stretch;align-items:center;gap:.75rem;margin-bottom:0;padding:.5rem 0;display:flex}@media (min-width:1280px){.article-meta{margin-bottom:2.5rem}}.article-meta .authors-wrapper{flex-wrap:wrap;align-items:center;gap:.75rem;display:flex}.article-meta .authors-wrapper .author-info{align-items:center;gap:.5rem;font-style:normal;display:flex}.article-meta .authors-wrapper .author-info img{border-radius:9999px;width:1.5rem;height:1.5rem}.article-meta .authors-wrapper .author-info .author-name{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;margin:0;font-size:.75rem;font-weight:400;line-height:130%}.article-meta .article-date{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-primary);font-size:.75rem;font-weight:400;line-height:130%}.article-preview-wrapper{flex-direction:column;gap:4rem;display:flex}.article-preview-wrapper .article-preview-item{flex-direction:column;display:flex}.article-preview-wrapper .article-preview-item .article-preview-content{flex-direction:column;align-items:center;gap:1.5rem;display:flex}@media (min-width:992px){.article-preview-wrapper .article-preview-item .article-preview-content{flex-direction:row}}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-meta{align-items:center;gap:.5rem;display:flex}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-media{
728width:100%}@media (min-width:992px){.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-media{width:50%}}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-media img{aspect-ratio:2;-o-object-fit:cover;object-fit:cover;border-radius:1rem;width:100%;height:auto}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-media:after{opacity:0;content:"";background-color:#0000;width:100%;height:100%;transition-property:opacity;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);position:absolute;top:0;left:0}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-media:hover{overflow:hidden}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-media:hover:after{opacity:1;background-color:#1a141433;background-color:var(--bg-overlay-dark-secondary)}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-text{flex-direction:column;flex:1;gap:1rem;width:100%;margin:0;padding:0;display:flex;position:relative}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-text .article-preview-tags{flex-wrap:wrap;gap:.5rem;display:flex}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-categories-wrapper{align-items:center;gap:.75rem;display:flex}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-categories-wrapper .article-preview-categories{flex-flow:wrap;align-items:center;gap:.25rem;padding:0;display:flex}.article-preview-wrapper .article-preview-item .article-preview-content .article-preview-categories-wrapper .article-preview-categories li:before{display:none}.article-preview-wrapper .article-preview-item:hover .article-preview-media:after{opacity:1!important;background-color:#1a141433!important;background-color:var(--bg-overlay-dark-secondary)!important}.article-preview-wrapper .article-preview-item:focus-visible .article-preview-media:after,.article-preview-wrapper .article-preview-item:focus .article-preview-media:after{opacity:1!important;background-color:#fff3!important;background-color:var(--bg-overlay-light-secondary)!important}.article-preview-wrapper .label{text-transform:uppercase;letter-spacing:.24px;font-size:.75rem;line-height:130%}.article-preview-wrapper .post-title{text-wrap:balance;overflow-wrap:normal;word-break:normal;font-size:1.875rem;font-weight:400;line-height:100%}.article-preview-wrapper .post-title a{overflow-wrap:normal;word-break:normal;text-decoration-line:none}.article-preview-wrapper .post-title a:hover{text-decoration-line:none}.article-preview-wrapper p{margin:0;padding:0;font-size:1rem;line-height:120%}.latest-posts-wrapper,.blog-post-list{flex-direction:column;display:flex}.latest-posts-wrapper .article-preview-group,.blog-post-list .article-preview-group{flex-flow:wrap;gap:.5rem;margin-bottom:1.5rem;display:flex}.latest-posts-wrapper .author-info,.blog-post-list .author-info{color:var(--text-neutral-primary);width:-moz-fit-content;width:fit-content;max-width:100%;min-height:2rem;background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary);border-radius:.5rem;align-items:center;gap:.5rem;padding:0 .5rem;font-style:normal;display:flex}.latest-posts-wrapper .author-info img,.blog-post-list .author-info img{border-radius:9999px;flex-shrink:0;width:1.5rem;height:1.5rem}.latest-posts-wrapper .author-info .author-name,.blog-post-list .author-info .author-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-primary);font-size:.75rem;font-weight:400;line-height:130%;overflow:hidden}.nut-docs p{font-family:var(--theme-font-sans), system-ui, sans-serif;color:var(--text-neutral-primary);font-size:1rem;line-height:150%}.nut-docs strong{font-weight:490}.nut-docs ul li,.nut-docs ol li{color:var(--text-neutral-secondary)}.nut-docs ul li a,.nut-docs ol li a,.nut-docs ul li code,.nut-docs ol li code{color:inherit}.nut-docs blockquote h1,.nut-docs blockquote h2,.nut-docs blockquote h3,.nut-docs blockquote h4,.nut-docs blockquote h5,.nut-docs blockquote h6{margin:0}.nut-docs blockquote p{margin-bottom:.5rem}.nut-docs blockquote p:last-child{margin-bottom:0}.nut-docs .alert h1,.nut-docs .alert h2,.nut-docs .alert h3,.nut-docs .alert h4,.nut-docs .alert h5,.nut-docs .alert h6,.nut-docs .alert p,.nut-docs .alert a{color:var(--text-neutral-primary)}.nut-docs table thead th,.nut-docs table tbody td{color:var(--text-neutral-secondary);border-color:#322f2f;border-color:var(--border-neutral-default-primary)}.nut-docs table tbody td a{color:inherit}.nut-docs img{border-radius:1rem} 729</style><link rel="stylesheet" href="/_astro/global._BdQ0OwB.css"><link rel="stylesheet" href="/_astro/BlogPostPreview._K85-2Jm.css"><style>.show-more-container{justify-content:center;align-items:center;gap:1rem;margin-top:4rem;display:flex}.show-more-container .nothing-left-message{text-align:center}.show-more-container .nothing-left-message p{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-secondary);padding:0;font-size:.75rem;line-height:100%} 730</style><link rel="stylesheet" href="/_astro/Layout.BMyPAOup.css"><style>.modal-container{z-index:100;background-color:#1a1414b3;background-color:var(--bg-overlay-dark-primary);justify-content:center;align-items:center;padding:1rem;transition-property:opacity;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:flex;position:fixed;inset:0}.modal-container.modal-open{opacity:1}.modal-container.modal-closed{display:none}.modal-container .modal-content{transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;
730--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);background-color:#fff;border-radius:.5rem;transition-property:transform;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden}.modal-container .modal-content.modal-content-open{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-container .modal-content.modal-content-closed{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-container .modal-content .iframe-container{width:100%;height:100%;position:relative;padding-bottom:0!important}.modal-container .modal-content .iframe-container iframe{border-style:none;border-radius:.5rem;width:100%;height:100%;position:absolute;top:0;left:0}.modal-container .modal-content .modal-slot{width:100%;height:100%}.modal-container .modal-close-button{z-index:10;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));--tw-shadow:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
730--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);background-color:#fff;border-radius:9999px;padding:.5rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);position:absolute;top:1rem;right:1rem}.modal-container .modal-close-button:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.modal-container .modal-close-button .modal-close-icon{width:1.5rem;height:1.5rem} 731.featured-post{text-wrap:balance}.featured-post a{text-wrap:balance;overflow-wrap:normal;word-break:normal;text-decoration-line:none}.featured-post a:hover{text-decoration-line:none}.featured-post .featured-post-content{flex-direction:column;order:2;grid-column:span 12/span 12;justify-content:space-between;gap:3rem;height:100%;display:flex}@media (min-width:992px){.featured-post .featured-post-content{order:1;grid-column:span 6/span 6}}@media (min-width:1280px){.featured-post .featured-post-content{grid-column:span 4/span 4}}.featured-post .featured-post-content .post-description{flex-direction:column;gap:1.5rem;display:flex}.featured-post .featured-post-content .post-description p{color:var(--text-neutral-secondary);margin:0;font-size:1rem;line-height:1.25rem}.featured-post .featured-post-content .label{text-transform:uppercase;letter-spacing:.24px;font-size:.75rem;line-height:130%}.featured-post .featured-post-content .post-meta{flex-direction:column;gap:1.5rem;display:flex}.featured-post .featured-post-content .post-meta .article-meta{border-top-width:0;border-bottom-width:0;margin:0;padding:0}.featured-post .featured-post-content .post-meta .author-info{flex-flow:wrap;gap:.5rem;display:flex}.featured-post .featured-post-content .post-meta .author-info-item{color:var(--text-neutral-primary);width:-moz-fit-content;width:fit-content;max-width:max-content;min-height:2rem;background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary);border-radius:.5rem;align-items:center;gap:.5rem;padding:0 .5rem;font-style:normal;display:flex}.featured-post .featured-post-content .post-meta .author-info-item img{border-radius:9999px;width:1.5rem;height:1.5rem}.featured-post .featured-post-content .post-meta .author-info-item .author-name{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-primary);margin:0;font-size:.75rem;font-weight:400;line-height:130%}.featured-post .featured-post-content .post-meta .post-title{text-wrap:balance;overflow-wrap:normal;word-break:normal;font-size:3rem;font-weight:400;line-height:100%}.featured-post .featured-post-content .post-meta .featured-post-label{flex-flow:wrap;gap:.5rem;display:flex}.featured-post .featured-post-media{order:1;grid-column:span 12/span 12;position:relative;overflow:hidden}@media (min-width:992px){.featured-post .featured-post-media{order:2;grid-column:span 6/span 6}}@media (min-width:1280px){.featured-post .featured-post-media{grid-column:span 7/span 7}}.featured-post .featured-post-media:after{opacity:0;content:"";background-color:#0000;width:100%;height:100%;transition-property:opacity;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);position:absolute;top:0;left:0}.featured-post .featured-post-media:hover{overflow:hidden}.featured-post .featured-post-media:hover:after{opacity:1;background-color:#1a141433;background-color:var(--bg-overlay-dark-secondary);border-radius:1.5rem}.featured-post-spotlight{padding-top:4rem;padding-bottom:4rem;overflow:hidden}.featured-post-spotlight .featured-post-spotlight-wrapper{grid-template-columns:repeat(1,minmax(0,1fr));gap:3rem;display:grid}@media (min-width:768px){.featured-post-spotlight .featured-post-spotlight-wrapper{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.featured-post-spotlight .featured-post-spotlight-wrapper{grid-template-columns:repeat(4,minmax(0,1fr))}}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post{width:100%;display:flex;position:relative}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post:before{--tw-content:"";content:var(--tw-content);background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary);width:100%;height:1px;position:absolute;top:-1.5rem;left:0}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post:first-child:before{display:none}@media (min-width:768px){.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post:before{--tw-content:"";content:var(--tw-content);background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary);width:1px;height:100%;position:absolute;top:0;left:-1.5rem}}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper{flex-direction:row;justify-content:space-between;gap:1.5rem;width:100%;text-decoration-line:none;display:flex}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper:hover{text-decoration-line:none}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper:hover .
731spotlight-post-media:after{opacity:1;background-color:#1a141433;background-color:var(--bg-overlay-dark-secondary)}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper:hover .spotlight-post-title{text-wrap:balance;overflow-wrap:normal;word-break:normal;color:var(--text-accent-default)}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper .spotlight-post-media{flex-shrink:0;width:6rem;height:-moz-fit-content;height:fit-content;position:relative;overflow:hidden}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper .spotlight-post-media img{aspect-ratio:1;-o-object-fit:cover;object-fit:cover;border-radius:1rem;width:100%;height:auto}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper .spotlight-post-media:after{opacity:0;content:"";background-color:#0000;border-radius:1rem;width:100%;height:100%;transition-property:opacity;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);position:absolute;top:0;left:0}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper .spotlight-post-content{flex-direction:column;gap:.75rem;display:flex}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper .spotlight-post-content .author-info{border-radius:.5rem;align-items:center;gap:.5rem;width:-moz-fit-content;width:fit-content;max-width:max-content;font-style:normal;display:flex}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper .spotlight-post-content .author-info img{border-radius:9999px;width:1.5rem;height:1.5rem}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper .spotlight-post-content .author-info .author-name{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-primary);margin:0;font-size:.75rem;font-weight:400;line-height:130%}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post .spotlight-post-wrapper .spotlight-post-content .spotlight-post-title{text-wrap:balance;overflow-wrap:normal;word-break:normal;font-size:1.25rem;font-weight:400;line-height:120%;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.featured-post-spotlight .featured-post-spotlight-wrapper .spotlight-post-separator{background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary);flex-direction:column;width:1px;min-width:1px;display:flex}.featured-post-media.external-link .external-link-badge,.spotlight-post-media.external-link .external-link-badge{z-index:10;background-color:#ec8fff;background-color:var(--bg-accent-default);border-radius:.5rem;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:flex;position:absolute;bottom:.75rem;left:.75rem}.featured-post-media.external-link .external-link-badge svg,.spotlight-post-media.external-link .external-link-badge svg{width:1.5rem;height:1.5rem;color:var(--icon-on-accent-on-default)} 732.breadcrumbs{margin:0}.breadcrumbs ol{flex-flow:wrap;align-items:center;gap:0;margin:0;padding:0;list-style-type:none;display:flex}.breadcrumbs li{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;align-items:center;font-size:.75rem;line-height:1rem;text-decoration-line:none;display:flex;position:relative}.breadcrumbs li:before,.breadcrumbs li:not(:last-child):after{display:none}.breadcrumbs li a{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-primary);font-size:.75rem;line-height:1rem;text-decoration-line:none;position:relative}.breadcrumbs li a:hover{color:var(--text-neutral-secondary)}.breadcrumbs a{text-decoration-line:none;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.breadcrumbs a:hover{text-decoration-line:none}.breadcrumbs [aria-current=page]{color:var(--text-neutral-tertiary);background-color:#0000;font-weight:500}.breadcrumb-icon{width:1.5rem;height:1.5rem;margin-left:.5rem} 733</style><link rel="stylesheet" href="/_astro/Section.CgluxyYq.css"><style>.blog-filter-dropdown-base{z-index:50;background-color:#1a1414;background-color:var(--bg-neutral-default-primary);border-width:1px;border-color:#322f2f;border-color:var(--border-neutral-default-primary);border-radius:.5rem;width:100%;max-height:20rem;margin-top:.25rem;position:absolute;overflow-y:auto}.blog-filter-dropdown-base.select-dropdown-hidden{display:none}.blog-filter-dropdown-base::-webkit-scrollbar{border-radius:9999px;width:.5rem}.blog-filter-dropdown-base::-webkit-scrollbar-track{background:0 0;border-radius:6px;margin:6px}.blog-filter-dropdown-base::-webkit-scrollbar-thumb{background-color:#c2bdae;background-color:var(--bg-static-light-subtle);background-clip:content-box;border:2px solid #0000;border-radius:6px}.blog-filter-dropdown-base::-webkit-scrollbar-thumb:hover{background-color:#fff;background-color:var(--bg-neutral-alternate-primary)}.blog-filter-option-base{cursor:pointer;color:var(--text-neutral-primary);align-items:center;padding:.75rem 1.5rem;font-size:.875rem;font-weight:400;line-height:1.25rem;display:flex}.blog-filter-option-base:hover{background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary)}.blog-filter-option-base:focus-visible{outline-offset:2px;box-shadow:0 0 0 2px var(--border-state-focused,#de9dcc) inset, 0 0 0 3px var(--border-state-inset,#fff) inset;outline:2px solid #0000}.blog-filters{grid-column:span 1/span 1}@media (min-width:992px){.blog-filters{grid-column:span 8/span 8}}@media (min-width:1440px){.blog-filters{grid-column:span 9/span 9}}.blog-filters .blog-filters-container{width:100%;display:flex}.blog-filters .blog-filters-container .blog-filters-wrapper{grid-auto-columns:100%;justify-content:flex-start;align-items:flex-start;gap:.5rem;width:100%;display:grid}.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-2{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:768px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-3{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:768px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-3{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:992px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-4{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:768px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-4{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:992px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-5{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:768px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-5{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:992px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-6{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:768px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-6{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:992px){.blog-filters .blog-filters-container .blog-filters-wrapper.features-grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:768px){.blog-filters .blog-filters-container .blog-filters-wrapper{flex-direction:row}}@media (min-width:992px){.blog-filters .blog-filters-container .blog-filters-wrapper{grid-auto-columns:50%;grid-auto-flow:column;justify-content:flex-end}}@media (min-width:1280px){.blog-filters .blog-filters-container .blog-filters-wrapper{grid-auto-columns:33.33%;justify-content:flex-end}}@media (min-width:992px){.blog-filters .blog-filters-container .blog-filters-wrapper:has(.browse-tags-button){grid-auto-columns:50% max-content}}@media (min-width:1280px){.blog-filters .blog-filters-container .blog-filters-wrapper:has(.browse-tags-button){grid-auto-columns:33.33% max-content}}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group{align-items:center;height:100%;display:flex;position:relative}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select{background-color:#272121;background-color:var(--bg-neutral-default-secondary);border-radius:.5rem;position:relative}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select .category-select-wrapper{width:100%}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select .category-select-wrapper .category-select-hidden{display:none}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select .category-select-wrapper .category-select-container{cursor:pointer;background-color:#272121;background-color:var(--bg-neutral-default-secondary);border-style:none;border-radius:.5rem;justify-content:space-between;align-items:center;width:100%;min-height:2.5rem;padding:.5rem 1.5rem;display:flex}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select .category-select-wrapper .category-select-container[aria-expanded=true]{box-shadow:0px 0px 0px 2px var(--border-state-focused) inset, 0px 0px 0px 3px var(--border-state-inset) inset}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select .category-select-wrapper .category-select-container:focus-visible{outline-offset:2px;box-shadow:0px 0px 0px 2px var(--border-state-focused) inset, 0px 0px 0px 3px var(--border-state-inset) inset;outline:2px solid #0000}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select .category-select-wrapper .category-select-container .category-selected-text{color:var(--text-neutral-primary);flex:1;font-size:.875rem;font-weight:400;line-height:1.25rem}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select .category-select-wrapper .category-select-container .category-toggle-icon{color:var(--icon-neutral-primary) ;margin-left:.5rem}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group.category-select .category-select-wrapper .category-select-dropdown{left:0}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-filter-select{z-index:10;cursor:pointer;text-indent:0;color:var(--text-neutral-primary);width:100%;max-height:2.5rem;appearance:none;background-color:#0000;background-image:none;border-style:none;border-radius:.5rem;padding:.5rem 2rem .5rem 1.5rem;font-size:.875rem;font-weight:400;line-height:1.25rem}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-filter-select:focus,.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-filter-select:focus-visible{outline-offset:2px;box-shadow:0px 0px 0px 2px var(--border-state-focused) inset, 0px 0px 0px 3px var(--border-state-inset) inset;outline:2px solid #0000}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-filter-select::-ms-expand{display:none}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .nav-arrow-select{z-index:0;color:var(--icon-neutral-primary);cursor:pointer;position:absolute;right:.25rem}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .browse-tags-button{white-space:nowrap;flex-wrap:nowrap;width:auto}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper{width:100%}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-select-container{background-color:#272121;background-color:var(--bg-neutral-default-secondary);border-style:none;border-radius:.5rem;flex-wrap:wrap;align-items:center;width:100%;min-height:2.5rem;display:flex}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-select-container.active{box-shadow:0px 0px 0px 2px var(--border-state-focused) inset, 0px 0px 0px 3px var(--border-state-inset) inset}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-select-container .tag-multi-select-input-container{align-items:center;gap:.25rem;width:100%;padding:.5rem 2rem .5rem 1.5rem;display:flex;container-type:inline-size}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-select-container .tag-multi-select-input-container .tag-multi-select-input{cursor:pointer;padding-top:0;padding-bottom:0;outline-offset:2px;background-color:#0000;border-style:none;outline:2px solid #0000;flex:1;width:100%;padding-inline-start:0;font-size:.875rem;font-weight:400;line-height:1.25rem}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-select-container .tag-multi-select-input-container .tag-multi-select-input::placeholder{color:var(--text-neutral-tertiary)}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-select-container .tag-multi-select-input-container .selected-tag{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;letter-spacing:.24px;color:var(--text-neutral-alternate);background-color:#ec8fff;background-color:var(--bg-accent-default);border-radius:9999px;align-items:center;padding-left:.75rem;padding-right:.25rem;font-size:.75rem;font-weight:400;line-height:130%;display:flex}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-select-container .tag-multi-select-input-container .selected-tag .selected-tag-remove{cursor:pointer}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-select-container .tag-multi-select-input-container .selected-tag .selected-tag-remove:focus-within{outline-offset:2px;box-shadow:0px 0px 0px 2px var(--border-state-focused) inset;outline:2px solid #0000}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-multi-select-dropdown{gap:.5rem;right:0}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-multi-select-dropdown .tag-multi-select-option{text-overflow:ellipsis;white-space:nowrap;text-wrap:wrap;gap:1.5rem;overflow:hidden}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-multi-select-dropdown .tag-multi-select-option .tag-option-checkbox{background-color:#272121;background-color:var(--bg-neutral-default-secondary);border-width:1px;border-color:#322f2f;border-color:var(--border-neutral-default-primary);border-radius:.5rem;justify-content:center;align-items:center;width:1.5rem;min-width:1.5rem;height:1.5rem;display:flex}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-multi-select-dropdown .tag-multi-select-option .tag-option-checkbox .tag-option-check-icon{color:var(--text-neutral-alternate);opacity:0;transition:opacity .2s ease-in-out}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-multi-select-dropdown .tag-multi-select-option.selected{color:var(--text-neutral-primar
733y);background-color:#1a1414;background-color:var(--bg-neutral-default-primary)}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-multi-select-dropdown .tag-multi-select-option.selected:hover{background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary)}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-multi-select-dropdown .tag-multi-select-option.selected .tag-option-checkbox{background-color:#fff;background-color:var(--bg-neutral-alternate-primary);border-color:#fff;border-color:var(--border-neutral-alternate-primary)}.blog-filters .blog-filters-container .blog-filters-wrapper .blog-filter-group .blog-select-tag-wrapper .tag-multi-select-dropdown .tag-multi-select-option.selected .tag-option-checkbox .tag-option-check-icon{opacity:1}.blog-filters .blog-filters-container .multi-select-hidden,.hidden-event{display:none}.blog-header{background-color:#0000;grid-template-columns:repeat(1,minmax(0,1fr));justify-content:space-between;align-items:center;gap:.75rem;padding-top:4rem;padding-bottom:4rem;display:grid;position:relative}@media (min-width:992px){.blog-header{grid-template-columns:repeat(12,minmax(0,1fr))}}.blog-header .blog-header-title{flex-direction:column;grid-column:span 1/span 1;align-items:flex-start;gap:.75rem;display:flex}@media (min-width:992px){.blog-header .blog-header-title{grid-column:span 4/span 4}}@media (min-width:1440px){.blog-header .blog-header-title{grid-column:span 3/span 3}}.blog-header .blog-header-title h1{color:var(--text-neutral-primary);font-size:1.5rem;font-weight:400;line-height:100%} 734.text-block{flex-direction:column;gap:1.5rem;max-width:100%;display:flex}.text-block .text-block-icon{color:var(--icon-accent-default);display:flex}.text-block .text-block-container{flex-direction:column;display:flex}.text-block .text-block-container .text-block-headline-container{flex-direction:column;gap:.75rem;display:flex}.text-block .text-block-container .text-block-headline-container .text-block-supertitle{color:var(--text-neutral-primary);margin:0;padding:0}.text-block .text-block-container .text-block-headline-container .text-block-title{color:var(--text-neutral-primary)}.text-block .text-block-container .text-block-headline-container .text-block-title a{color:var(--text-neutral-primary);font-weight:400;text-decoration-line:none;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.text-block .text-block-container .text-block-headline-container .text-block-title a:hover{color:var(--text-neutral-secondary)}.text-block .text-block-container .text-block-headline-container .text-block-title a:focus-visible{outline-offset:2px;box-shadow:0 0 0 2px var(--border-state-focused,#de9dcc) inset, 0 0 0 3px var(--border-state-inset,#fff) inset;border-radius:.5rem;outline:2px solid #0000}.text-block .text-block-content{flex-direction:column;gap:1.5rem;display:flex}.text-block .text-block-content .text-block-description{color:var(--text-neutral-secondary);margin:0;padding:0}.text-block .text-block-content .text-block-description a{color:inherit}.text-block .text-block-content .text-block-description a:hover{color:var(--text-accent-default)}.text-block .text-block-content .text-block-actions{flex-wrap:wrap;gap:.25rem;display:flex}.text-block.text-block-on-accent .text-block-icon{color:var(--icon-on-accent-on-default)}.text-block.text-block-on-accent .text-block-headline-container .text-block-supertitle,.text-block.text-block-on-accent .text-block-headline-container .text-block-title,.text-block.text-block-on-accent .text-block-content .text-block-description{color:var(--text-on-accent-on-default)}.text-block.text-block-on-accent-alternate .text-block-icon{color:var(--icon-on-accent-on-alternate)}.text-block.text-block-on-accent-alternate .text-block-headline-container .text-block-supertitle,.text-block.text-block-on-accent-alternate .text-block-headline-container .text-block-title,.text-block.text-block-on-accent-alternate .text-block-content .text-block-description{color:var(--text-on-accent-on-alternate)}:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h1:where(.text-block-title){letter-spacing:-.02em;font-size:clamp(3rem,2.0458rem + 4.0712vw,4rem);font-weight:370;line-height:100%}@media (min-width:768px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h1:where(.text-block-title){font-size:clamp(4rem,10.7143vw - 1.1429rem,5.5rem)}}@media (min-width:992px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h1:where(.text-block-title){font-size:5.5rem}}@media (min-width:1280px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h1:where(.text-block-title){font-size:5.5rem}}:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h2:where(.text-block-title){letter-spacing:-.02em;font-size:clamp(2rem,1.0458rem + 4.0712vw,3rem);font-weight:370;line-height:100%}@media (min-width:768px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h2:where(.text-block-title){font-size:clamp(3rem,10.7143vw - 2.1429rem,4.5rem)}}@media (min-width:992px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h2:where(.text-block-title){font-size:4.5rem}}@media (min-width:1280px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h2:where(.text-block-title){font-size:4.5rem}}:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h3:where(.text-block-title){letter-spacing:-.02em;font-size:clamp(1.75rem,1.5115rem + 1.0178vw,2rem);font-weight:370;line-height:100%}@media (min-width:768px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h3:where(.text-block-title){font-size:clamp(2rem,14.2857vw - 4.8571rem,4rem)}}@media (min-width:992px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h3:where(.text-block-title){font-size:4rem}}@media (min-width:1280px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h3:where(.text-block-title){font-size:4rem}}:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h4:where(.text-block-title){letter-spacing:-.02em;font-size:clamp(1.5rem,1.2615rem + 1.0178vw,1.75rem);font-weight:400;line-height:100%}@media (min-width:768px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h4:where(.text-block-title){font-size:clamp(1.75rem,8.9286vw - 2.5357rem,3rem)}}@media (min-width:992px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h4:where(.text-block-title){font-size:3rem}}@media (min-width:1280px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h4:where(.text-block-title){font-size:3rem}}:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h5:where(.text-block-title){letter-spacing:-.02em;font-size:clamp(1.25rem,1.0115rem + 1.0178vw,1.5rem);font-weight:440;line-height:100%}@media (min-width:768px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h5:where(.text-block-title){font-size:clamp(1.5rem,3.5714vw - .2143rem,2rem)}}@media (min-width:992px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h5:where(.text-block-title){font-size:2rem}}@media (min-width:1280px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h5:where(.text-block-title){font-size:2rem}}:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h6:where(.text-block-title){font-family:var(--theme-font-sans), system-ui, sans-serif;text-transform:none;letter-spacing:-.02em;font-size:clamp(1.25rem,1.0115rem + 1.0178vw,1.5rem);font-weight:400;line-height:100%}@media (min-width:768px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h6:where(.text-block-title){font-size:clamp(1.5rem,.6429rem + 1.7857vw,1.75rem)}}@media (min-width:992px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h6:where(.text-block-title){font-size:1.75rem}}@media (min-width:1280px){:where([data-theme=agentic-light],[data-theme=agentic-dark]) div h6:where(.text-block-title){font-size:1.75rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-headline-container{gap:1.5rem}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block :where(.text-block-container):has(:w
734here(h1.text-block-title,h2.text-block-title,.text-block-title.heading-1,.text-block-title.heading-2)){gap:2rem}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block :where(.text-block-container):has(:where(h3.text-block-title,h4.text-block-title,h5.text-block-title,h6.text-block-title,.text-block-title.heading-3,.text-block-title.heading-4,.text-block-title.heading-5,.text-block-title.heading-6)){gap:1.5rem}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-headline-container .text-block-supertitle{font-family:var(--theme-font-sans), system-ui, sans-serif;text-transform:uppercase;color:#fff;letter-spacing:.03em;border-width:1px;border-color:#fff;border-radius:9999px;align-self:flex-start;font-size:.75rem;font-weight:440;line-height:120%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-headline-container .text-block-supertitle{font-size:.75rem}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-headline-container .text-block-supertitle{font-size:.75rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-headline-container .text-block-supertitle{font-size:.75rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-headline-container .text-block-supertitle{color:var(--text-neutral-primary);border-color:var(--border-neutral-alternate-primary);padding-inline:calc(.75rem - 1px);padding-top:calc(.25rem - 1px + .125em);padding-bottom:calc(.25rem - 1px - .125em)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block.text-center .text-block-headline-container .text-block-supertitle{align-self:center}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-description:where(.font-size-text-default){font-size:1rem;font-weight:370;line-height:120%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-description:where(.font-size-text-default){font-size:clamp(1rem,.5714rem + .8929vw,1.125rem)}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-description:where(.font-size-text-default){font-size:1.125rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-description:where(.font-size-text-default){font-size:1.125rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-description:where(.font-size-text-small){font-size:.875rem;font-weight:370;line-height:120%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-description:where(.font-size-text-small){font-size:clamp(.875rem,.4464rem + .8929vw,1rem)}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-description:where(.font-size-text-small){font-size:1rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-description:where(.font-size-text-small){font-size:1rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .text-block-actions{gap:.5rem}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .btn{font-family:var(--theme-font-sans), system-ui, sans-serif;text-transform:none;letter-spacing:0;border-radius:9999px;padding:.5rem 1.5rem;font-size:1rem;font-weight:370;line-height:120%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .btn{font-size:clamp(1rem,.5714rem + .8929vw,1.125rem)}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .btn{font-size:1.125rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .btn{font-size:1.125rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .btn-primary{color:var(--text-neutral-on-alternate-primary);background-color:#fff;background-color:var(--bg-neutral-alternate-primary);border-width:0}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .text-block .btn-secondary{color:var(--text-neutral-primary);border-width:1px;border-color:#fff;border-color:var(--border-neutral-alternate-primary);background-color:#0000} 735.tag{text-align:center;width:-moz-fit-content;width:fit-content;font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-alternate);outline-offset:2px;background-color:#fff;background-color:var(--bg-neutral-alternate-primary);border-radius:9999px;outline:2px solid #0000;flex-direction:row;align-items:center;padding:.25rem .75rem;font-size:.75rem;font-weight:400;line-height:130%;display:inline-flex}.tag:hover{text-decoration-line:none!important}.tag:focus-visible{outline-offset:2px;box-shadow:0 0 0 2px var(--border-state-focused,#de9dcc) inset;outline:2px solid #0000}.tag p{color:var(--text-neutral-alternate);font-size:.75rem;line-height:1rem}.tag.tag-neutral{color:var(--text-on-accent-on-alternate);background-color:#efebe7;background-color:var(--bg-neutral-alternate-secondary)}.tag.tag-accent{color:var(--text-on-accent-on-default);background-color:#ec8fff;background-color:var(--bg-accent-default)}.tag.tag-filter{cursor:pointer;position:relative}.tag.tag-filter.active{background-color:#ec8fff;background-color:var(--bg-accent-default);text-align:center;font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-on-accent-on-default);border-radius:9999px;justify-content:center;align-items:center;gap:.125rem;padding:0 12px 0 4px;font-size:.75rem;font-weight:400;line-height:130%;display:flex}.tag.tag-filter.active:before{content:"";background-color:currentColor;width:1.5rem;height:1.5rem;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20fill='currentColor'%20viewBox='0%200%2024%2024'%3e%3cpath%20fill='currentColor'%20d='M18%207a1%201%200%201%200%200%202%201%201%200%200%200%200-2Zm-2%202a1%201%200%201%200%200%202%201%201%200%200%200%200-2Zm-3%203a1%201%200%201%201%202%200%201%201%200%200%201-2%200Zm-1%201a1%201%200%201%200%200%202%201%201%200%200%200%200-2Zm-3%203a1%201%200%201%201%202%200%201%201%200%200%201-2%200Zm-1-3a1%201%200%201%200%200%202%201%201%200%200%200%200-2Zm-3
735-1a1%201%200%201%201%202%200%201%201%200%200%201-2%200Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20fill='currentColor'%20viewBox='0%200%2024%2024'%3e%3cpath%20fill='currentColor'%20d='M18%207a1%201%200%201%200%200%202%201%201%200%200%200%200-2Zm-2%202a1%201%200%201%200%200%202%201%201%200%200%200%200-2Zm-3%203a1%201%200%201%201%202%200%201%201%200%200%201-2%200Zm-1%201a1%201%200%201%200%200%202%201%201%200%200%200%200-2Zm-3%203a1%201%200%201%201%202%200%201%201%200%200%201-2%200Zm-1-3a1%201%200%201%200%200%202%201%201%200%200%200%200-2Zm-3-1a1%201%200%201%201%202%200%201%201%200%200%201-2%200Z'/%3e%3c/svg%3e");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.tag.tag-filter.tag-neutral:hover{color:var(--text-on-accent-on-alternate);background-color:#fff;background-color:var(--bg-neutral-alternate-primary)}.tag.tag-bullet,.tag.tag-bullet p{color:var(--text-neutral-primary);background-color:#0000;gap:.5rem;padding-left:0;padding-right:0}.tag.tag-bullet:hover,.tag.tag-bullet p:hover{color:var(--text-neutral-primary)}.tag.tag-bullet:before,.tag.tag-bullet p:before{--tw-content:"";content:var(--tw-content);background-color:#ec8fff;background-color:var(--bg-accent-default);border-radius:9999px;width:.25rem;height:.25rem;display:inline-block}.tag.tag-bullet.tag-accent:before,.tag.tag-bullet p.tag-accent:before{color:var(--icon-accent-default)}.tag.tag-outline{color:var(--text-neutral-primary);border-width:1px;border-color:#322f2f;border-color:var(--border-neutral-default-primary);background-color:#0000}.tag.tag-outline p{color:var(--text-neutral-primary)}.tag.tag-text{color:var(--text-neutral-primary);background-color:#0000;padding-left:0;padding-right:0}.tag.tag-text.tag-neutral,.tag.tag-text.tag-nautral p{color:var(--text-neutral-primary)}a.tag{color:var(--text-neutral-alternate)}a.tag:hover{background-color:#efebe7;background-color:var(--bg-neutral-alternate-secondary);text-decoration-line:none!important}a.tag.tag-neutral:hover{color:var(--text-on-accent-on-alternate);background-color:#fff;background-color:var(--bg-neutral-alternate-primary)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag{font-family:var(--theme-font-sans), system-ui, sans-serif;text-transform:none;letter-spacing:0;font-size:.75rem;font-weight:440;line-height:120%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag{font-size:clamp(.75rem,.3214rem + .8929vw,.875rem)}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag{font-size:.875rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag{font-size:.875rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag:not(.tag-bullet,.tag-text,.tag-outline,.tag-filter):hover{background-color:#c2bdae;background-color:var(--bg-neutral-alternate-tertiary)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag:focus-visible{box-shadow:0 0 0 2px var(--border-state-focused,#de9dcc) inset, 0 0 0 3px var(--border-state-inset,#fff) inset}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-outline{border-color:#fff;border-color:var(--border-neutral-alternate-primary);padding-block:calc(.25rem - 1px)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-outline:hover{color:var(--text-neutral-secondary);border-color:#c2bdae;border-color:var(--border-neutral-alternate-secondary)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-bullet,:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-text{text-transform:uppercase;letter-spacing:.03em;padding-top:0;padding-bottom:0;font-size:.75rem;font-weight:440;line-height:120%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-bullet,:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-text{font-size:.75rem}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-bullet,:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-text{font-size:.75rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-bullet,:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-text{font-size:.75rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-bullet:before{background-color:var(--icon-accent-default)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter{text-transform:none;color:#fff;background-color:#0000;border-width:1px;border-color:#fff;padding-left:1.25rem;padding-right:1.25rem;font-size:1rem;font-weight:400;line-height:160%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter{font-size:clamp(1rem,.5714rem + .8929vw,1.125rem)}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter{font-size:1.125rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter{font-size:1.125rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter{color:var(--text-neutral-primary);border-color:var(--border-neutral-alternate-primary);padding-block:calc(.5rem - 1px)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter:hover{background-color:#1a141433;background-color:var(--bg-overlay-dark-secondary)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter.active{font-family:var(--theme-font-sans), system-ui, sans-serif;text-transform:none;letter-spacing:0;
735color:#1a1414;background-color:#fff;border-color:#0000;gap:0;padding-left:1.25rem;padding-right:1.25rem;font-size:1rem;font-weight:400;line-height:160%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter.active{font-size:clamp(1rem,.5714rem + .8929vw,1.125rem)}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter.active{font-size:1.125rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter.active{font-size:1.125rem}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter.active{background-color:var(--bg-neutral-alternate-primary);color:var(--text-neutral-on-alternate-primary);padding-block:calc(.5rem - 1px)}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter.active:before{display:none}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .tag.tag-filter.active:hover{background-color:#c2bdae;background-color:var(--bg-neutral-alternate-tertiary)} 736.article-preview-reading{width:100%}.article-preview-reading .reading-posts-columns{flex-direction:column;gap:1.25rem;display:flex}@media (min-width:992px){.article-preview-reading .reading-posts-columns{-moz-column-gap:3rem;flex-direction:row;column-gap:3rem}}.article-preview-reading .reading-posts-column{flex-direction:column;gap:0;display:flex}@media (min-width:768px){.article-preview-reading .reading-posts-column{flex:1}}.article-preview-reading .reading-post-item{width:100%;margin:0;padding:0}.article-preview-reading .reading-post-separator{background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary);width:100%;height:1px;margin-top:1.25rem;margin-bottom:1.25rem}@media (min-width:992px){.article-preview-reading .reading-post-separator.reading-post-column-separator{width:1px;height:auto}}.article-preview-reading .reading-post-link{border-radius:.5rem;align-items:flex-start;gap:1rem;padding:1rem;text-decoration-line:none;transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:flex}.article-preview-reading .reading-post-link:hover{opacity:.7;text-decoration-line:none}@media (min-width:768px){.article-preview-reading .reading-post-link{gap:1.5rem}}.article-preview-reading .reading-post-number{letter-spacing:-.6px;color:var(--text-neutral-primary);flex-shrink:0;width:2rem;font-size:1.875rem;font-weight:400;line-height:2.25rem}@media (min-width:768px){.article-preview-reading .reading-post-number{width:2.5rem;font-size:2.25rem;line-height:2.5rem}}.article-preview-reading .reading-post-content{flex-direction:column;flex:1;gap:.75rem;display:flex}.article-preview-reading .reading-post-author{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-secondary);font-size:.75rem;font-weight:400;line-height:130%}.article-preview-reading .reading-post-title{letter-spacing:-.32px;margin:0;font-size:1rem;font-weight:400;line-height:120%}@media (min-width:992px){.article-preview-reading .reading-post-title{font-size:1.125rem}}.article-preview-reading .reading-post-image{border-radius:.5rem;flex-shrink:0;width:100px;height:100px;position:relative;overflow:hidden}.article-preview-reading .reading-post-image img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.article-preview-reading .reading-post-image.external-link .external-link-badge{z-index:10;background-color:#ec8fff;background-color:var(--bg-accent-default);border-radius:.5rem;justify-content:center;align-items:center;width:2rem;height:2rem;display:flex;position:absolute;bottom:.5rem;left:.5rem}.article-preview-reading .reading-post-image.external-link .external-link-badge svg{width:1.5rem;height:1.5rem;color:var(--icon-on-accent-on-default)} 737.carousel{width:100%;position:relative}.carousel .carousel-container{width:100%;position:relative;overflow:hidden}.carousel .carousel-container .carousel-item{box-sizing:border-box;flex-direction:column;flex-shrink:0;height:100%;min-height:0;display:flex;overflow:hidden}.carousel .carousel-container .carousel-item>*{flex:1}.carousel .carousel-container .carousel-item img{-o-object-fit:cover;object-fit:cover;border-radius:.5rem;width:100%;height:auto}.carousel .carousel-container .carousel-item video{border-radius:.5rem;width:100%;height:auto}.carousel .carousel-container .carousel-item .card{flex-direction:column;height:100%;display:flex}.carousel.carousel-items-height .carousel-container .carousel-item{height:auto}.carousel .carousel-track{transition:transform var(--carousel-speed,.3s) ease-in-out;will-change:transform;display:flex}.carousel.carousel-vertical .carousel-container{overflow:hidden}.carousel.carousel-vertical .carousel-track{flex-direction:column}.carousel .carousel-track.dragging{cursor:grabbing;-webkit-user-select:none;user-select:none;transition-property:none}.carousel .carousel-track{cursor:auto}.carousel .carousel-track.dragging img{pointer-events:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.carousel .carousel-track img{-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.carousel .carousel-track>*{min-width:0;display:flex}.carousel .carousel-arrow{z-index:10;cursor:pointer;color:var(--text-neutral-alternate);width:2.5rem;height:2.5rem;background-color:#ec8fff;background-color:var(--bg-accent-default);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:.5rem;justify-content:center;align-items:center;transition:all .2s;
737display:flex;position:absolute;top:50%;transform:translateY(-50%)}.carousel .carousel-arrow:not(:disabled):hover{opacity:.6}.carousel .carousel-arrow:disabled{cursor:not-allowed;display:none}.carousel .carousel-arrow-prev{left:1rem}.carousel .carousel-arrow-next{right:1rem}.carousel .carousel-arrow-minimal{color:var(--icon-on-accent-on-default);background-color:#0000}.carousel .carousel-dots{justify-content:center;align-items:center;gap:.5rem;width:100%;display:flex;position:absolute}.carousel .carousel-dots.carousel-dots-minimal{gap:.75rem}.carousel .carousel-dot{cursor:pointer;background-color:#c2bdae;background-color:var(--bg-static-light-subtle);border-style:none;border-radius:9999px;width:.75rem;min-width:.75rem;height:.75rem;min-height:.75rem;transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-flex}.carousel .carousel-dot:hover{background-color:#c2bdae;background-color:var(--bg-static-light-subtle);transform:scale(1.2)}.carousel .carousel-dot.active{background-color:#68594b;background-color:var(--bg-static-dark-subtle);transform:scale(1.2)}.carousel .carousel-dots-minimal .carousel-dot{border:1px solid #fff;border-color:var(--border-neutral-alternate-primary);background-color:#0000;width:6px;min-width:6px;height:6px;min-height:6px;position:relative}.carousel .carousel-dots-minimal .carousel-dot:before{--tw-content:"";content:var(--tw-content);background-color:#0000;position:absolute;inset:-.5rem}.carousel .carousel-dots-minimal .carousel-dot:hover{opacity:.7}.carousel .carousel-dots-minimal .carousel-dot:hover:not(.active){background-color:#0000;transform:none}.carousel .carousel-dots-minimal .carousel-dot:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-sha
737dow,0 0 #0000);--tw-ring-color:var(--border-state-focused)}.carousel .carousel-dots-minimal .carousel-dot.active{background-color:#fff;background-color:var(--bg-neutral-alternate-primary);transform:none}.carousel .carousel-scrollbar{cursor:pointer;border-radius:.5rem;width:100%;height:.5rem;margin-top:1rem;position:absolute}.carousel .carousel-scrollbar-track{border-radius:.5rem;width:100%;height:100%;position:relative}.carousel .carousel-scrollbar-thumb{cursor:grab;background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary);border-radius:.5rem;min-width:1rem;height:100%;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);position:absolute;top:0;left:0}.carousel .carousel-scrollbar-thumb:hover{background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary)}.carousel .carousel-scrollbar-thumb:active{cursor:grabbing;background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary)}.carousel .carousel-track{transition:transform .3s}.carousel .carousel-track.dragging{transition:none}.carousel .carousel.adaptive-height .carousel-container{transition:height var(--carousel-speed,.3s) ease-in-out}.carousel.carousel-arrows-on-hover .carousel-arrow{opacity:0;visibility:hidden;transition:opacity .3s,visibility .3s,transform .2s}.carousel.carousel-arrows-on-hover:hover .carousel-arrow{opacity:1;visibility:visible}@media (min-width:768px){.carousel.carousel-arrows-outside .carousel-arrow-prev{left:-2.5rem}.carousel.carousel-arrows-outside .carousel-arrow-next{right:-2.5rem}}.carousel.carousel-with-dots.carousel-dots-bottom{margin-bottom:2.25rem}.carousel.carousel-with-dots.carousel-dots-bottom .carousel-dots{bottom:-1.5rem;left:0;right:0}.carousel.carousel-with-dots.carousel-dots-left .carousel-dots{flex-direction:column;width:auto;height:auto;top:50%;left:-11px}@media (min-width:768px){.carousel.carousel-with-dots.carousel-dots-left .carousel-dots{left:-15px}}@media (min-width:992px){.carousel.carousel-with-dots.carousel-dots-left .carousel-dots{left:-2.25rem}}.carousel.carousel-with-dots.carousel-dots-left .carousel-dots{transform:translateY(-50%)}.carousel.carousel-with-dots.carousel-dots-right .carousel-dots{flex-direction:column;width:auto;height:auto;top:50%;right:-11px}@media (min-width:768px){.carousel.carousel-with-dots.carousel-dots-right .carousel-dots{right:-15px}}@media (min-width:992px){.carousel.carousel-with-dots.carousel-dots-right .carousel-dots{right:-2rem}}.carousel.carousel-with-dots.carousel-dots-right .carousel-dots{transform:translateY(-50%)}.carousel.carousel-with-dots.carousel-dots-bottom.carousel-dots-align-start .carousel-dots{justify-content:flex-start}.carousel.carousel-with-dots.carousel-dots-bottom.carousel-dots-align-center .carousel-dots{justify-content:center}.carousel.carousel-with-dots.carousel-dots-bottom.carousel-dots-align-end .carousel-dots{justify-content:flex-end}.carousel.carousel-with-dots.carousel-dots-left.carousel-dots-align-start .carousel-dots{--tw-translate-y:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));justify-content:flex-start;top:0}.carousel.carousel-with-dots.carousel-dots-left.carousel-dots-align-center .carousel-dots{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));justify-content:center;top:50%}.carousel.carousel-with-dots.carousel-dots-left.carousel-dots-align-end .carousel-dots{--tw-translate-y:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));justify-content:flex-end;top:auto;bottom:0}.carousel.carousel-with-dots.carousel-dots-right.carousel-dots-align-start .carousel-dots{--tw-translate-y:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));justify-content:flex-start;top:0}.carousel.carousel-with-dots.carousel-dots-right.carousel-dots-align-center .carousel-dots{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));justify-content:center;top:50%}.carousel.carousel-with-dots.carousel-dots-right.carousel-dots-align-en
737d .carousel-dots{--tw-translate-y:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));justify-content:flex-end;top:auto;bottom:0}.carousel.carousel-with-scrollbar{margin-bottom:2.25rem}.carousel.carousel-with-scrollbar .carousel-scrollbar{bottom:-1.5rem}@media (max-width:768px){.carousel-arrow{width:2.5rem;height:2.5rem}.carousel-arrow-prev{left:.5rem}.carousel-arrow-next{right:.5rem}} 738[data-theme=nutrient-flex],[data-forced-theme=nutrient-flex]{--theme-font-sans:"Archivo", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--theme-font-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--theme-font-semi-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace}[data-theme=nutrient-flex] .hero-section .text-block-title,[data-forced-theme=nutrient-flex] .hero-section .text-block-title{letter-spacing:-.02em;font-size:42px}@media (min-width:992px){[data-theme=nutrient-flex] .hero-section .text-block-title,[data-forced-theme=nutrient-flex] .hero-section .text-block-title{font-size:92px}}[data-theme=nutrient-flex] .text-block-title.heading-2,[data-forced-theme=nutrient-flex] .text-block-title.heading-2{font-size:40px}@media (min-width:992px){[data-theme=nutrient-flex] .text-block-title.heading-2,[data-forced-theme=nutrient-flex] .text-block-title.heading-2{font-size:64px}}[data-theme=nutrient-flex] .text-block-description,[data-forced-theme=nutrient-flex] .text-block-description{font-size:1.25rem;line-height:1.6}[data-theme=nutrient-flex] .text-block-supertitle,[data-forced-theme=nutrient-flex] .text-block-supertitle{font-family:var(--theme-font-semi-mono), ui-monospace, monospace}[data-theme=nutrient-flex] .btn,[data-forced-theme=nutrient-flex] .btn{font-family:var(--theme-font-sans), system-ui, sans-serif;text-transform:none;letter-spacing:-.005em;border-radius:9999px;padding:.75rem 1.25rem;font-size:.875rem;font-weight:490}[data-theme=nutrient-flex] .btn.btn-secondary,[data-forced-theme=nutrient-flex] .btn.btn-secondary{color:var(--text-neutral-primary);border-width:1px;border-color:#fff;border-color:var(--border-neutral-alternate-primary)}[data-theme=nutrient-flex] .btn.btn-secondary:hover,[data-forced-theme=nutrient-flex] .btn.btn-secondary:hover{opacity:1;background-color:#272121;background-color:var(--bg-neutral-default-secondary)} 739[data-theme=cloud-light],[data-forced-theme=cloud-light]{--theme-font-sans:"Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif}[data-theme=cloud-light] .text-block-supertitle,[data-forced-theme=cloud-light] .text-block-supertitle{font-family:var(--theme-font-semi-mono), ui-monospace, monospace}[data-theme=cloud-light] .feature-switcher .font-size-text-default.text-neutral-primary,[data-forced-theme=cloud-light] .feature-switcher .font-size-text-default.text-neutral-primary{font-size:14px;font-weight:600}[data-theme=cloud-light] .feature-switcher-progress,[data-forced-theme=cloud-light] .feature-switcher-progress{background-color:var(--bg-accent-default)}[data-theme=cloud-light] .feature-switcher-order-number,[data-forced-theme=cloud-light] .feature-switcher-order-number{color:var(--text-accent-default)}[data-theme=cloud-light] .feature-switcher svg path,[data-forced-theme=cloud-light] .feature-switcher svg path{fill:var(--icon-accent-default)}[data-theme=cloud-light] .feature-switcher .feature-switcher-learn-more svg path,[data-forced-theme=cloud-light] .feature-switcher .feature-switcher-learn-more svg path{fill:var(--icon-neutral-primary)}[data-theme=cloud-light] .processing-mode-card svg path,[data-forced-theme=cloud-light] .processing-mode-card svg path{f
739ill:var(--icon-accent-default)}[data-theme=cloud-light] .pictogram-shape,[data-forced-theme=cloud-light] .pictogram-shape{color:var(--icon-accent-default)}[data-theme=cloud-light] .enterprise-feature svg path,[data-forced-theme=cloud-light] .enterprise-feature svg path,[data-theme=cloud-light] .output-format-card svg path,[data-forced-theme=cloud-light] .output-format-card svg path{fill:var(--icon-accent-default)}[data-theme=cloud-light] .btn,[data-forced-theme=cloud-light] .btn{font-family:var(--theme-font-sans), system-ui, sans-serif;text-transform:none;letter-spacing:-.005em;border-radius:9999px;padding:.75rem 1.25rem;font-size:.875rem;font-weight:490}[data-theme=cloud-light] .btn.btn-secondary,[data-forced-theme=cloud-light] .btn.btn-secondary{color:var(--text-neutral-primary);border-width:1px;border-color:#fff;border-color:var(--border-neutral-alternate-primary)}[data-theme=cloud-light] .feature-switcher .font-size-text-default[data-theme=cloud-light] .btn.btn-secondary,[data-forced-theme=cloud-light] .feature-switcher .font-size-text-default[data-theme=cloud-light] .btn.btn-secondary,[data-theme=cloud-light] .feature-switcher .font-size-text-default [data-forced-theme=cloud-light] .btn.btn-secondary,[data-forced-theme=cloud-light] .feature-switcher .font-size-text-default [data-forced-theme=cloud-light] .btn.btn-secondary{font-size:14px;font-weight:600}[data-theme=cloud-light] .btn.btn-secondary:hover,[data-forced-theme=cloud-light] .btn.btn-secondary:hover{opacity:1;background-color:#272121;background-color:var(--bg-neutral-default-secondary)}[data-theme=cloud-light] .btn.btn-secondary-on-accent,[data-theme=cloud-light] .btn.btn-secondary-on-accent:hover,[data-forced-theme=cloud-light] .btn.btn-secondary-on-accent,[data-forced-theme=cloud-light] .btn.btn-secondary-on-accent:hover{color:var(--border-on-accent-on-default)} 740.link-button{color:var(--text-neutral-primary);width:100%;justify-content:space-between;align-items:center;padding-left:.125rem;padding-right:.125rem;text-decoration-line:none;transition-property:opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:flex}.link-button:hover{opacity:.6;text-decoration-line:none}.link-button:focus-visible{opacity:1;outline-offset:2px;box-shadow:0 0 0 2px var(--border-state-focused,#de9dcc) inset;border-radius:.75rem;outline:2px solid #0000}.link-button.link-button-primary{font-family:var(--theme-font-sans), system-ui, sans-serif;padding-top:1rem;padding-bottom:1rem;font-size:.875rem}@media (min-width:992px){.link-button.link-button-primary{font-size:1rem}}.link-button.link-button-secondary{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;padding-top:.5rem;padding-bottom:.5rem;font-size:.75rem}.link-button .link-button-content{align-items:center;gap:.75rem;display:flex}.link-button .link-button-text{white-space:nowrap}.link-button .link-button-count{white-space:nowrap;font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-tertiary);flex-shrink:0;font-size:.75rem}.link-button:has(.link-button-count) .link-button-content{min-width:0}.link-button:has(.link-button-count) .link-button-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.link-button.link-button-has-helper{justify-content:flex-start;gap:.75rem}.link-button.link-button-has-helper .link-button-content{flex:1}.link-button.link-button-has-helper .link-button-text-stack{flex-direction:column;flex:1;display:flex}.link-button.link-button-has-helper .link-button-helper-text{color:var(--text-neutral-tertiary)}.link-button.link-button-primary.link-button-has-helper .link-button-text-stack{gap:.125rem}.link-button.link-button-primary.link-button-has-helper .link-button-helper-text{font-size:.75rem;line-height:1.2}@media (min-width:992px){.link-button.link-button-primary.link-button-has-helper .link-button-helper-text{font-size:.875rem}}.link-button.link-button-secondary.link-button-has-helper .link-button-text-stack{gap:.25rem;line-height:1}.link-button-list{flex-direction:column;width:100%;display:flex} 741svg[data-astro-cid-7qi5gn3v]{color:var(--icon-color)} 742.illustrated-toolbar{color:var(--icon-bg-neutral-default-tertiary)}.illustrated-page-primary{color:var(--icon-bg-neutral-default-primary)}.illustrated-page-secondary{color:var(--icon-bg-neutral-default-secondary)}.illustrated-page-tertiary{color:var(--icon-bg-neutral-default-tertiary)}.illustrated-dots{color:var(--icon-neutral-primary)} 743.pictogram-shape{color:var(--icon-static-accent-light)}.pictogram-shape-pink{color:var(--icon-static-pink)}.pictogram-shape-yellow{color:var(--icon-static-yellow)}.pictogram-shape-red{color:var(--icon-static-red)}.pictogram-shape-green{color:var(--icon-static-green)}.pictogram-dots,.dot-shape{color:var(--icon-neutral-primary)}.pictogram-stroke{color:var(--icon-static-accent-light);stroke:currentColor}.dot-stroke{color:var(--icon-neutral-primary);stroke:currentColor} 744.nutrient-input-wrapper{flex-direction:column;align-items:flex-start;width:100%;display:flex}.nutrient-input-wrapper:has(textarea){position:relative}.nutrient-input-wrapper:has(textarea) .nutrient-input-helper-container{position:relative}.nutrient-input-wrapper:has(textarea) .nutrient-input-helper-container:before{pointer-events:none;--tw-content:"";content:var(--tw-content);background-color:#fff;background-color:var(--bg-neutral-alternate-primary);border-radius:9999px;width:.25rem;height:.25rem;position:absolute;top:-.75rem;right:.5rem}.nutrient-input-label{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-primary);padding-bottom:.5rem;font-size:.75rem}.nutrient-input{width:100%;min-height:2.5rem;font-family:var(--theme-font-sans), system-ui, sans-serif;color:var(--text-neutral-primary);outline-offset:-1px;background-color:#272121;background-color:var(--bg-neutral-default-secondary);border-width:0;border-radius:.5rem;padding:.75rem 1.5rem;font-size:.875rem;line-height:1.2}.nutrient-input::placeholder{color:var(--text-neutral-tertiary)}.nutrient-input:hover{outline:1px solid var(--border-neutral-default-primary)}.nutrient-input:focus{outline-offset:-2px;outline:2px solid var(--border-state-focused)}.secondary .nutrient-input{background-color:#1a1414;background-color:var(--bg-neutral-default-primary)}.nutrient-input-error{border-width:1px;border-color:#ff4747;border-color:var(--border-state-error)}.nutrient-input-error:hover{outline-offset:2px;border-color:#ff4747;border-color:var(--border-state-error);outline:2px solid #0000}.nutrient-input-error:focus{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-sha
744dow,0 0 #0000);--tw-ring-inset:inset;--tw-ring-color:var(--ring-accent-red);outline:2px solid #0000}.nutrient-input-disabled{cursor:not-allowed;opacity:.5}.nutrient-input-disabled:hover{border-color:#0000}.nutrient-input-disabled.nutrient-input-error:hover{border-color:#ff4747;border-color:var(--border-state-error)}.nutrient-input-helper-container{width:100%}.nutrient-input-helper-text{color:#897e70;font-size:.75rem;line-height:1.3}@media (min-width:992px){.nutrient-input-helper-text{font-size:.875rem}}.nutrient-input-helper-text{color:var(--text-neutral-tertiary)}.nutrient-input-error-text{color:#ff4747;font-size:.75rem;line-height:1.3}@media (min-width:992px){.nutrient-input-error-text{font-size:.875rem}}.nutrient-input-error-text{color:var(--text-state-error)}.nutrient-input-helper-text,.nutrient-input-error-text{margin-top:.5rem}.nutrient-dropdown{cursor:pointer;width:100%;height:42.8px;font-family:var(--theme-font-sans), system-ui, sans-serif;color:var(--text-neutral-primary);background-color:#272121;background-color:var(--bg-neutral-default-secondary);border-width:1px;border-color:#0000;border-radius:.5rem;align-items:center;padding-left:1.5rem;padding-right:3rem;font-size:.875rem;line-height:1.2;display:flex;position:relative}.nutrient-dropdown:hover{border-color:#322f2f;border-color:var(--border-neutral-default-primary)}.secondary .nutrient-dropdown{background-color:#1a1414;background-color:var(--bg-neutral-default-primary)}.nutrient-dropdown select{cursor:pointer;appearance:none;width:100%;height:100%;font-family:var(--theme-font-sans), system-ui, sans-serif;opacity:0;outline-offset:2px;background-color:#0000;border-radius:.25rem;outline:2px solid #0000;font-size:.875rem;line-height:1.25rem;position:absolute;inset:0}.nutrient-dropdown select:focus{outline-offset:2px;outline:2px solid #0000}.nutrient-dropdown:focus-within{outline-offset:-2px;outline:2px solid var(--border-state-focused)}.nutrient-dropdown .selected-text{pointer-events:none;text-overflow:ellipsis;white-space:nowrap;font-family:var(--theme-font-sans), system-ui, sans-serif;color:var(--text-neutral-primary);font-size:.875rem;line-height:1.25rem;overflow:hidden}.nutrient-dropdown .dropdown-icon{pointer-events:none;color:var(--text-neutral-primary);height:100%;align-items:center;display:flex;position:absolute;top:0;bottom:0;right:.25rem}.nutrient-dropdown.white-bg .selected-text,.nutrient-dropdown.white-bg .dropdown-icon{color:var(--text-neutral-primary)}.nutrient-dropdown-error,.nutrient-dropdown-error:hover{border-color:#ff4747;border-color:var(--border-state-error)}.nutrient-dropdown-error:focus{--tw-ring-color:var(--ring-accent-red);border-color:#ff4747;border-color:var(--border-state-error)}.nutrient-dropdown-disabled{cursor:not-allowed;opacity:.5}.nutrient-dropdown-disabled:hover{border-color:#0000}.nutrient-dropdown-disabled.nutrient-dropdown-error:hover{border-color:#ff4747;border-color:var(--border-state-error)}.nutrient-dropdown.is-secondary{background-color:#272121;background-color:var(--bg-neutral-default-secondary)}.nutrient-dropdown.is-inactive{pointer-events:none;opacity:.5} 745.separator{flex-direction:column;flex-shrink:0;justify-content:center;align-items:center;gap:.5rem;width:100%;display:flex}.separator.separator-primary{border-color:#322f2f;border-color:var(--border-neutral-default-primary)}.separator.separator-secondary{border-color:#68594b;border-color:var(--border-neutral-default-secondary)}.separator.separator-alternate.separator-primary{border-color:#efebe7;border-color:var(--border-neutral-on-alternate-primary)}.separator.separator-alternate.separator-secondary{border-color:#c2bdae;border-color:var(--border-neutral-on-alternate-secondary)}.separator.separator-with-text{flex-direction:row;align-items:center;gap:1rem}.separator.separator-with-text hr{border-color:inherit;flex:1}.separator-text{font-family:var(--theme-font-semi-mono), ui-monospace, monospace;text-transform:uppercase;letter-spacing:.24px;color:var(--text-neutral-primary);font-size:.75rem;font-weight:400;line-height:100%}.separator-vertical{background-color:#322f2f;background-color:var(--bg-neutral-default-tertiary);width:100%;height:1px}@media (min-width:992px){.separator-vertical{width:1px;height:100%}}:is([data-theme=agentic-light],[data-theme=agentic-dark]) .separator-text{font-family:var(--theme-font-sans), system-ui, sans-serif;letter-spacing:.03em;font-size:.75rem;font-weight:440;line-height:120%}@media (min-width:768px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .separator-text{font-size:clamp(.75rem,.3214rem + .8929vw,.875rem)}}@media (min-width:992px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .separator-text{font-size:.875rem}}@media (min-width:1280px){:is([data-theme=agentic-light],[data-theme=agentic-dark]) .separator-text{font-size:.875rem}} 746.nutrient-checkbox{cursor:pointer;align-items:center;gap:.5rem;width:-moz-fit-content;width:fit-content;display:flex}.nutrient-checkbox .nutrient-checkbox-input:focus~.nutrient-checkbox-box{outline-offset:1px;outline-width:2px;outline-style:solid;outline-color:var(--border-state-focused);border-radius:.5rem}.nutrient-checkbox .nutrient-checkbox-input[data-status=error]~.
746nutrient-checkbox-box{border-color:var(--border-state-error)}.nutrient-checkbox .nutrient-checkbox-input:checked~.nutrient-checkbox-box{background-color:#fff;background-color:var(--bg-neutral-alternate-primary);border-color:#fff;border-color:var(--border-neutral-alternate-primary);transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.nutrient-checkbox .nutrient-checkbox-input:checked~.nutrient-checkbox-box .nutrient-checkbox-icon-check{display:block}.nutrient-checkbox .nutrient-checkbox-input:checked:hover~.nutrient-checkbox-box{opacity:.8}.nutrient-checkbox .nutrient-checkbox-input:checked[data-status=error]~.nutrient-checkbox-box{border-color:var(--border-state-error)}.nutrient-checkbox .nutrient-checkbox-input[data-indeterminate=true]~.nutrient-checkbox-box{background-color:#fff;background-color:var(--bg-neutral-alternate-primary);border-color:#fff;border-color:var(--border-neutral-alternate-primary);transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.nutrient-checkbox .nutrient-checkbox-input[data-indeterminate=true]~.nutrient-checkbox-box .nutrient-checkbox-icon-check{display:none}.nutrient-checkbox .nutrient-checkbox-input[data-indeterminate=true]~.nutrient-checkbox-box .nutrient-checkbox-icon-indeterminate{display:block}.nutrient-checkbox .nutrient-checkbox-input[data-indeterminate=true]:hover~.nutrient-checkbox-box{opacity:.8}.nutrient-checkbox .nutrient-checkbox-input[data-indeterminate=true][data-status=error]~.nutrient-checkbox-box{border-color:var(--border-state-error)}.nutrient-checkbox .nutrient-checkbox-box{background-color:#1a1414;background-color:var(--bg-neutral-default-primary);border-width:1px;border-color:#322f2f;border-color:var(--border-neutral-default-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;width:1.5rem;min-width:1.5rem;height:1.5rem;min-height:1.5rem;display:flex}.nutrient-checkbox .nutrient-checkbox-box .nutrient-checkbox-box-icon{color:var(--icon-neutral-alternate);display:none}.nutrient-checkbox .nutrient-checkbox-icon{flex-shrink:0}.nutrient-checkbox .nutrient-checkbox-label{color:#fff;overflow-wrap:anywhere;margin-top:0;font-size:.75rem}@media (min-width:992px){.nutrient-checkbox .nutrient-checkbox-label{font-size:.875rem}}.nutrient-checkbox .nutrient-checkbox-label{color:var(--text-neutral-primary)}.nutrient-checkbox .nutrient-checkbox-description{color:#897e70;overflow-wrap:anywhere;margin-top:0;font-size:.75rem}@media (min-width:992px){.nutrient-checkbox .nutrient-checkbox-description{font-size:.875rem}}.nutrient-checkbox .nutrient-checkbox-description{color:var(--text-neutral-tertiary)} 747</style>
747<script type="module" src="/_astro/page.D5kqAwMB.js"></script>
747</head> <body> <!-- Google Tag Manager (noscript) -->
vendor: 67 bytes, line 747
747<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
747GTM-T6LGJJC
vendor: 83 bytes, line 747
747" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
747<!-- End Google Tag Manager (noscript) --> <header class="header"> <div id="top-nav-bar" class> <section class="section-spacing-horizontal-default"> <div class="container-large radius-container !px-0 !py-0 top-bar-container"> <div class="top-bar-items-wrapper"> <a target="_self" rel="noopener noreferrer" class="nav-card-container" href="/"> <div id="tnb-nutrient" class="nav-card"> <div class="nav-card-top"> <img src="/_astro/Home.BHzRH_Lz_1aASBd.webp" alt="Nutrient" loading="lazy" decoding="async" srcset="/_astro/Home.BHzRH_Lz_2gYXg8.webp 480w, /_astro/Home.BHzRH_Lz_1aASBd.webp 660w" sizes="100vw" width="660" height="400" class="nav-card-image">
747<script type="module">document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("[data-modal-trigger]").forEach(e=>{e.addEventListener("click",d=>{d.preventDefault();const t=e.dataset.modalTrigger;t&&window.modalInstances?.get(t)?.open?.()})})});</script>
747 <div class="nav-card-svg"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 70 70" width="70" height="70" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 748 <path d="M35.0003 11.6667C33.7117 11.6667 32.667 12.7113 32.667 14C32.667 15.2887 33.7117 16.3333 35.0003 16.3333C36.289 16.3333 37.3337 15.2887 37.3337 14C37.3337 12.7113 36.289 11.6667 35.0003 11.6667Z" fill="currentColor"/> 749 <path d="M42.0003 23.3333C40.7117 23.3333 39.667 22.2887 39.667 21C39.667 19.7113 40.7117 18.6667 42.0003 18.6667C43.289 18.6667 44.3337 19.7113 44.3337 21C44.3337 22.2887 43.289 23.3333 42.0003 23.3333Z" fill="currentColor"/> 750 <path d="M30.3337 21C30.3337 22.2887 29.289 23.3333 28.0003 23.3333C26.7117 23.3333 25.667 22.2887 25.667 21C25.667 19.7113 26.7117 18.6667 28.0003 18.6667C29.289 18.6667 30.3337 19.7113 30.3337 21Z" fill="currentColor"/> 751 <path d="M14.0003 56C15.289 56 16.3337 54.9553 16.3337 53.6667C16.3337 52.378 15.289 51.3333 14.0003 51.3333C12.7117 51.3333 11.667 52.378 11.667 53.6667C11.667 54.9553 12.7117 56 14.0003 56Z" fill="currentColor"/> 752 <path d="M47.8337 53.6667C47.8337 54.9553 46.789 56 45.5003 56C44.2117 56 43.167 54.9553 43.167 53.6667C43.167 52.378 44.2117 51.3333 45.5003 51.3333C46.789 51.3333 47.8337 52.378 47.8337 53.6667Z" fill="currentColor"/> 753 <path d="M24.5003 56C25.789 56 26.8337 54.9553 26.8337 53.6667C26.8337 52.378 25.789 51.3333 24.5003 51.3333C23.2117 51.3333 22.167 52.378 22.167 53.6667C22.167 54.9553 23.2117 56 24.5003 56Z" fill="currentColor"/> 754 <path d="M37.3337 53.6667C37.3337 54.9553 36.289 56 35.0003 56C33.7117 56 32.667 54.9553 32.667 53.6667C32.667 52.378 33.7117 51.3333 35.0003 51.3333C36.289 51.3333 37.3337 52.378 37.3337 53.6667Z" fill="currentColor"/> 755 <path d="M56.0003 56C57.289 56 58.3337 54.9553 58.3337 53.6667C58.3337 52.378 57.289 51.3333 56.0003 51.3333C54.7117 51.3333 53.667 52.378 53.667 53.6667C53.667 54.9553 54.7117 56 56.0003 56Z" fill="currentColor"/> 756 <path d="M23.3337 28C23.3337 29.2887 22.289 30.3333 21.0003 30.3333C19.7117 30.3333 18.667 29.2887 18.667 28C18.667 26.7113 19.7117 25.6667 21.0003 25.6667C22.289 25.6667 23.3337 26.7113 23.3337 28Z" fill="currentColor"/> 757 <path d="M49.0003 30.3333C50.289 30.3333 51.3337 29.2887 51.3337 28C51.3337 26.7113 50.289 25.6667 49.0003 25.6667C47.7117 25.6667 46.667 26.7113 46.667 28C46.667 29.2887 47.7117 30.3333 49.0003 30.3333Z" fill="currentColor"/> 758 <path d="M16.3337 35C16.3337 36.2887 15.289 37.3333 14.0003 37.3333C12.7117 37.3333 11.667 36.2887 11.667 35C11.667 33.7113 12.7117 32.6667 14.0003 32.6667C15.289 32.6667 16.3337 33.7113 16.3337 35Z" fill="currentColor"/> 759 <path d="M14.0003 46.6667C15.289 46.6667 16.3337 45.622 16.3337 44.3333C16.3337 43.0447 15.289 42 14.0003 42C12.7117 42 11.667 43.0447 11.667 44.3333C11.667 45.622 12.7117 46.6667 14.0003 46.6667Z" fill="currentColor"/> 760 <path d="M58.3337 44.3333C58.3337 45.622 57.289 46.6667 56.0003 46.6667C54.7117 46.6667 53.667 45.622 53.667 44.3333C53.667 43.0447 54.7117 42 56.0003 42C57.289 42 58.3337 43.0447 58.3337 44.3333Z" fill="currentColor"/> 761 <path d="M56.0003 37.3333C57.289 37.3333 58.3337 36.2887 58.3337 35C58.3337 33.7113 57.289 32.6667 56.0003 32.6667C54.7117 32.6667 53.667 33.7113 53.667 35C53.667 36.2887 54.7117 37.3333 56.0003 37.3333Z" fill="currentColor"/> 762 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </div> <div class="nav-card-bottom"> <span class="nav-card-title">Nutrient</span> <span class="nav-card-description">Home</span> </div> </div> </a><a target="_self" rel="noopener noreferrer" class="nav-card-container" href="/sdk/"> <div id="tnb-sdk" class="nav-card"> <div class="nav-card-top"> <img src="/_astro/SDK.DNU_kr-M_1jvypQ.webp" alt="SDK" loading="lazy" decoding="async" srcset="/_astro/SDK.DNU_kr-M_1PImvn.webp 480w, /_astro/SDK.DNU_kr-M_1jvypQ.webp 660w" sizes="100vw" width="660" height="400" class="nav-card-image"> <div class="nav-card-svg"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 70 70" width="70" height="70" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 763 <path d="M46.6667 16.3333C46.6667 17.622 45.622 18.6667 44.3333 18.6667C43.0447 18.6667 42 17.622 42 16.3333C42
76315.0447 43.0447 14 44.3333 14C45.622 14 46.6667 15.0447 46.6667 16.3333Z" fill="currentColor"/> 764 <path d="M18.6667 25.6667C18.6667 26.9553 17.622 28 16.3333 28C15.0447 28 14 26.9553 14 25.6667C14 24.378 15.0447 23.3333 16.3333 23.3333C17.622 23.3333 18.6667 24.378 18.6667 25.6667Z" fill="currentColor"/> 765 <path d="M18.6667 53.6667C18.6667 54.9553 17.622 56 16.3333 56C15.0447 56 14 54.9553 14 53.6667C14 52.378 15.0447 51.3333 16.3333 51.3333C17.622 51.3333 18.6667 52.378 18.6667 53.6667Z" fill="currentColor"/> 766 <path d="M44.3333 28C45.622 28 46.6667 26.9553 46.6667 25.6667C46.6667 24.378 45.622 23.3333 44.3333 23.3333C43.0447 23.3333 42 24.378 42 25.6667C42 26.9553 43.0447 28 44.3333 28Z" fill="currentColor"/> 767 <path d="M44.3333 56C45.622 56 46.6667 54.9553 46.6667 53.6667C46.6667 52.378 45.622 51.3333 44.3333 51.3333C43.0447 51.3333 42 52.378 42 53.6667C42 54.9553 43.0447 56 44.3333 56Z" fill="currentColor"/> 768 <path d="M28 25.6667C28 26.9553 26.9553 28 25.6667 28C24.378 28 23.3333 26.9553 23.3333 25.6667C23.3333 24.378 24.378 23.3333 25.6667 23.3333C26.9553 23.3333 28 24.378 28 25.6667Z" fill="currentColor"/> 769 <path d="M25.6667 18.6667C26.9553 18.6667 28 17.622 28 16.3333C28 15.0447 26.9553 14 25.6667 14C24.378 14 23.3333 15.0447 23.3333 16.3333C23.3333 17.622 24.378 18.6667 25.6667 18.6667Z" fill="currentColor"/> 770 <path d="M28 53.6667C28 54.9553 26.9553 56 25.6667 56C24.378 56 23.3333 54.9553 23.3333 53.6667C23.3333 52.378 24.378 51.3333 25.6667 51.3333C26.9553 51.3333 28 52.378 28 53.6667Z" fill="currentColor"/> 771 <path d="M35 28C36.2887 28 37.3333 26.9553 37.3333 25.6667C37.3333 24.378 36.2887 23.3333 35 23.3333C33.7113 23.3333 32.6667 24.378 32.6667 25.6667C32.6667 26.9553 33.7113 28 35 28Z" fill="currentColor"/> 772 <path d="M37.3333 16.3333C37.3333 17.622 36.2887 18.6667 35 18.6667C33.7113 18.6667 32.6667 17.622 32.6667 16.3333C32.6667 15.0447 33.7113 14 35 14C36.2887 14 37.3333 15.0447 37.3333 16.3333Z" fill="currentColor"/> 773 <path d="M35 56C36.2887 56 37.3333 54.9553 37.3333 53.6667C37.3333 52.378 36.2887 51.3333 35 51.3333C33.7113 51.3333 32.6667 52.378 32.6667 53.6667C32.6667 54.9553 33.7113 56 35 56Z" fill="currentColor"/> 774 <path d="M56 25.6667C56 26.9553 54.9553 28 53.6667 28C52.378 28 51.3333 26.9553 51.3333 25.6667C51.3333 24.378 52.378 23.3333 53.6667 23.3333C54.9553 23.3333 56 24.378 56 25.6667Z" fill="currentColor"/> 775 <path d="M53.6667 56C54.9553 56 56 54.9553 56 53.6667C56 52.378 54.9553 51.3333 53.6667 51.3333C52.378 51.3333 51.3333 52.378 51.3333 53.6667C51.3333 54.9553 52.378 56 53.6667 56Z" fill="currentColor"/> 776 <path d="M18.6667 35C18.6667 36.2887 17.622 37.3333 16.3333 37.3333C15.0447 37.3333 14 36.2887 14 35C14 33.7113 15.0447 32.6667 16.3333 32.6667C17.622 32.6667 18.6667 33.7113 18.6667 35Z" fill="currentColor"/> 777 <path d="M53.6667 37.3333C54.9553 37.3333 56 36.2887 56 35C56 33.7113 54.9553 32.6667 53.6667 32.6667C52.378 32.6667 51.3333 33.7113 51.3333 35C51.3333 36.2887 52.378 37.3333 53.6667 37.3333Z" fill="currentColor"/> 778 <path d="M18.6667 44.3333C18.6667 45.622 17.622 46.6667 16.3333 46.6667C15.0447 46.6667 14 45.622 14 44.3333C14 43.0447 15.0447 42 16.3333 42C17.622 42 18.6667 43.0447 18.6667 44.3333Z" fill="currentColor"/> 779 <path d="M53.6667 46.6667C54.9553 46.6667 56 45.622 56 44.3333C56 43.0447 54.9553 42 53.6667 42C52.378 42 51.3333 43.0447 51.3333 44.3333C51.3333 45.622 52.378 46.6667 53.6667 46.6667Z" fill="currentColor"/> 780 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </div> <div class="nav-card-bottom"> <span class="nav-card-title">SDK</span> <span class="nav-card-description">Software Development Kits</span> </div> </div> </a><a target="_self" rel="noopener noreferrer" class="nav-card-container" href="/api/"> <div id="tnb-cloud" class="nav-card"> <div class="nav-card-top"> <img src="/_astro/Cloud.C8EZjH3W_JWQ9o.webp" alt="Cloud" loading="lazy" decoding="async" srcset="/_astro/Cloud.C8EZjH3W_ZAHdYe.webp 480w, /_astro/Cloud.C8EZjH3W_JWQ9o.webp 660w" sizes="100vw" width="660" height="400" class="nav-card-image"> <div class="nav-card-svg"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 70 70" width="70" height="70" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 781 <path d="M35 18.6667C36.2887 18.6667 37.3333 17.622 37.3333 16.3333C37.3333 15.0447 36.2887 14 35 14C33.7113 14 32.6667 15.0447 32.6667 16.3333C32.6667 17.622 33.7113 18.6667 35 18.6667Z" fill="currentColor"/> 782 <path d="M35 28C36.2887 28 37.3333 26.9553 37.3333 25.6667C37.3333 24.378 36.2887 23.3333 35 23.3333C33.7113 23.3333 32.6667 24.378 32.6667 25.6667C32.6667 26.9553 33.7113 28 35 28Z" fill="currentColor"/> 783 <path d="M37.3333 53.6667C37.3333 54.9553 36.2887 56 35 56C33.7113 56 32.6667 54.9553 32.6667 53.6667C32.6667 52.378 33.7113 51.3333 35 51.3333C36.2887 51.3333 37.3333 52.378 37.3333 53.6667Z" fill="currentColor"/> 784 <path d="M35 46.6667C36.2887 46.6667 37.3333 45.622 37.3333 44.3333C37.3333 43.0447 36.2887 42 35 42C33.7113 42 32.6667 43.0447 32.6667 44.3333C32.6667 45.622 33.7113 46.6667 35 46.6667Z" fill="currentColor"/> 785 <path d="M44.3333 37.3333C43.0447 37.3333 42 36.2887 42 35C42 33.7113 43.0447 32.6667 44.3333 32.6667C45.622 32.6667 46.6667 33.7113 46.6667 35C46.6667 36.2887 45.622 37.3333 44.3333 37.3333Z" fill="currentColor"/> 786 <path d="M51.3333 35C51.3333 36.2887 52.378 37.3333 53.6667 37.3333C54.9553 37.3333 56 36.2887 56 35C56 33.7113 54.9553 32.6667 53.6667 32.6667C52.378 32.6667 51.3333 33.7113 51.3333 35Z" fill="currentColor"/> 787 <path d="M16.3333 37.3333C15.0447 37.3333 14 36.2887 14 35C14 33.7113 15.0447 32.6667 16.3333 32.6667C17.622 32.6667 18.6667 33.7113 18.6667 35C18.6667 36.2887 17.622 37.3333 16.3333 37.3333Z" fill="currentColor"/> 788 <path d="M23.3333 35C23.3333 36.2887 24.378 37.3333 25.6667 37.3333C26.9553 37.3333 28 36.2887 28 35C28 33.7113 26.9553 32.6667 25.6667 32.6667C24.378 32.6667 23.3333 33.7113 23.3333 35Z" fill="currentColor"/> 789 <path d="M42 30.3333C40.7113 30.3333 39.6667 29.2886 39.6667 28C39.6667 26.7113 40.7113 25.6667 42 25.6667C43.2886 25.6667 44.3333 26.7113 44.3333 28C44.3333 29.2886 43.2886 30.3333 42 30.3333Z" fill="currentColor"/> 790 <path d="M46.6667 21.0001C46.6667 22.2888 47.7114 23.3335 49.0001 23.3335C50.2887 23.3335 51.3334 22.2888 51.3334 21.0001C51.3334 19.7115 50.2887 18.6668 49.0001 18.6668C47.7114 18.6668 46.6667 19.7115 46.6667 21.0001Z" fill="currentColor"/> 791 <path d="M21 51.3333C19.7113 51.3333 18.6666 50.2886 18.6666 48.9999C18.6666 47.7113 19.7113 46.6666 21 46.6666C22.2886 46.6666 23.3333 47.7113 23.3333 48.9999C23.3333 50.2886 22.2886 51.3333 21 51.3333Z" fill="currentColor"/> 792 <path d="M25.6666 42C25.6666 43.2887 26.7113 44.3333 28 44.3333C29.2886 44.3333 30.3333 43.2887 30.3333 42C30.3333 40.7113 29.2886 39.6667 28 39.6667C26.7113 39.6667 25.6666 40.7113 25.6666 42Z" fill="currentColor"/> 793 <path d="M39.6667 42C39.6667 40.7113 40.7114 39.6667 42 39.6667C43.2887 39.6667 44.3334 40.7113 44.3334 42C44.3334 43.2887 43.2887 44.3333 42 44.3333C40.7114 44.3333 39.6667 43.2887 39.6667 42Z" fill="currentColor"/> 794 <path d="M49 46.6667C47.7114 46.6667 46.6667 47.7113 46.6667 49C46.6667 50.2887 47.7114 51.3333 49 51.3333C50.2887 51.3333 51.3334 50.2887 51.3334 49C51.3334 47.7113 50.2887 46.6667 49 46.6667Z" fill="currentColor"/> 795 <path d="M18.6667 21.0001C18.6667 19.7114 19.7114 18.6667 21 18.6667C22.2887 18.6667 23.3334 19.7114 23.3334 21.0001C23.3334 22.2887 22.2887 23.3334 21 23.3334C19.7114 23.3334 18.6667 22.2887 18.6667 21.0001Z" fill="currentColor"/> 796 <path d="M28.0001 25.6667C26.7114 25.6667 25.6667 26.7113 25.6667 28C25.6667 29.2887 26.7114 30.3333 28.0001 30.3333C29.2887 30.3333 30.3334 29.2887 30.3334 28C30.3334 26.7113 29.2887 25.6667 28.0001 25.6667Z" fill="currentColor"/> 797 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </div> <div class="nav-card-bottom"> <span class="nav-card-title">Cloud</span> <span class="nav-card-description">Document Web Services</span> </div> </div> </a><a target="_self" rel="noopener noreferrer" class="nav-card-container" href="/workflow-automation/"> <div id="tnb-workflow" class="nav-card"> <div class="nav-card-top"> <img src="/_astro/Workflow.f2atd43K_Z24fh78.webp" alt="Workflow" loading="lazy" decoding="async" srcset="/_astro/Workflow.f2atd43K_Axlpy.webp 480w, /_astro/Workflow.f2atd43K_Z24fh78.webp 660w" sizes="100vw" width="660" height="400" class="nav-card-image"> <div class="nav-card-svg"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 70 70" width="70" height="70" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 798 <path d="M56.0003 27.7667C54.7117 27.7667 53.667 26.7221 53.667 25.4334C53.667 24.1447 54.7117 23.1001 56.0003 23.1001C57.289 23.1001 58.3337 24.1447 58.3337 25.4334C58.3337 26.7221 57.289 27.7667 56.0003 27.7667Z" fill="currentColor"/> 799 <path d="M22.7503 28C24.039 28 25.0837 26.9553 25.0837 25.6667C25.0837 24.378 24.039 23.3333 22.7503 23.3333C21.4617 23.3333 20.417 24.378 20.417 25.6667C20.417 26.9553 21.4617 28 22.7503 28Z" fill="currentColor"/> 800 <path d="M34.7087 37.3333C35.9973 37.3333 37.042 36.2887 37.042 35C37.042 33.7113 35.9973 32.6667 34.7087 32.6667C33.42 32.6667 32.3753 33.7113 32.3753 35C32.3753 36.2887 33.42 37.3333 34.7087 37.3333Z" fill="currentColor"/> 801 <path d="M20.7086 35.0001C20.7086 36.2887 19.664 37.3334 18.3753 37.3334C17.0866 37.3334 16.042 36.2887 16.042 35.0001C16.042 33.7114 17.0866 32.6667 18.3753 32.6667C19.664 32.6667 20.7086 33.7114 20.7086 35.0001Z" fill="currentColor"/> 802 <path d="M16.3337 44.3333C16.3337 45.622 15.289 46.6667 14.0003 46.6667C12.7117 46.6667 11.667 45.622 11.667 44.3333C11.667 43.0447 12.7117 42 14.0003 42C15.289 42 16.3337 43.0447 16.3337 44.3333Z" fill="currentColor"/> 803 <path d="M32.667 44.3333C32.667 45.622 31.6223 46.6667 30.3337 46.6667C29.045 46.6667 28.0003 45.622 28.0003 44.3333C28.0003 43.0447 29.045 42 30.3337 42C31.6223 42 32.667 43.0447 32.667 44.3333Z" fill="currentColor"/> 804 <path d="M46.667 46.6667C47.9557 46.6667 49.0003 45.622 49.0003 44.3333C49.0003 43.0447 47.9557 42 46.667 42C45.3783 42 44.3337 43.0447 44.3337 44.3333C44.3337 45.622 45.3783 46.6667 46.667 46.6667Z" fill="currentColor"/> 805 <path d="M53.667 35C53.667 36.2887 52.6223 37.3333 51.3337 37.3333C50.045 37.3333 49.0003 36.2887 49.0003 35C49.0003 33.7113 50.045 32.6667 51.3337 32.6667C52.6223 32.6667 53.667 33.7113 53.667 35Z" fill="currentColor"/> 806 <path d="M26.542 37.3333C25.2533 37.3333 24.2087 36.2887 24.2087 35C24.2087 33.7113 25.2533 32.6667 26.542 32.6667C27.8307 32.6667 28.8753 33.7113 28.8753 35C28.8753 36.2887 27.8307 37.3333 26.542 37.3333Z" fill="currentColor"/> 807 <path d="M40.542 35C40.542 36.2887 41.5867 37.3333 42.8753 37.3333C44.164 37.3333 45.2087 36.2887 45.2087 35C45.2087 33.7113 44.164 32.6667 42.8753 32.6667C41.5867 32.6667 40.542 33.7113 40.542 35Z" fill="currentColor"/> 808 <path d="M37.3337 25.6667C37.3337 26.9553 38.3783 28 39.667 28C40.9557 28 42.0003 26.9553 42.0003 25.6667C42.0003 24.378 40.9557 23.3333 39.667 23.3333C38.3783 23.3333 37.3337 24.378 37.3337 25.6667Z" fill="currentColor"/> 809 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </div> <div class="nav-card-bottom"> <span class="nav-card-title">Workflow</span> <span class="nav-card-description">Workflow Automation Platform</span> </div> </div> </a><a target="_self" rel="noopener noreferrer" class="nav-card-container" href="/low-code/"> <div id="tnb-low-code" class="nav-card"> <div class="nav-card-top"> <img src="/_astro/Low-Code.Dn4vg-NJ_ZdG5ct.webp" alt="Integrations" loading="lazy" decoding="async" srcset="/_astro/Low-Code.Dn4vg-NJ_2r6xkd.webp 480w, /_astro/Low-Code.Dn4vg-NJ_ZdG5ct.webp 660w" sizes="100vw" width="660" height="400" class="nav-card-image"> <div class="nav-card-svg"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 70 70" width="70" height="70" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 810 <path d="M35.0003 18.6667C36.289 18.6667 37.3337 17.622 37.3337 16.3333C37.3337 15.0447 36.289 14 35.0003 14C33.7117 14 32.667 15.0447 32.667 16.3333C32.667 17.622 33.7117 18.6667 35.0003 18.6667Z" fill="currentColor"/> 811 <path d="M37.3337 25.6667C37.3337 26.9553 36.289 28 35.0003 28C33.7117 28 32.667 26.9553 32.667 25.6667C32.667 24.378 33.7117 23.3333 35.0003 23.3333C36.289 23.3333 37.3337 24.378 37.3337 25.6667Z" fill="currentColor"/> 812 <path d="M37.3337 53.6667C37.3337 54.9553 36.289 56 35.0003 56C33.7117 56 32.667 54.9553 32.667 53.6667C32.667 52.378 33.7117 51.3333 35.0003 51.3333C36.289 51.3333 37.3337 52.378 37.3337 53.6667Z" fill="currentColor"/> 813 <path d="M21.0003 42C22.289 42 23.3337 43.0447 23.3337 44.3333C23.3337 45.622 22.289 46.6667 21.0003 46.6667C19.7117 46.6667 18.667 45.622 18.667 44.3333C18.667 43.0447 19.7117 42 21.0003 42Z" fill="currentColor"/> 814 <path d="M30.217 49.1166C30.217 47.828 29.1724 46.7833 27.8837 46.7833C26.595 46.7833 25.5504 47.828 25.5504 49.1166C25.5504 50.4053 26.595 51.45 27.8837 51.45C29.1724 51.45 30.217 50.4053 30.217 49.1166Z" fill="currentColor"/> 815 <path d="M49.0003 42C47.7117 42 46.667 43.0447 46.667 44.3333C46.667 45.622 47.7117 46.6667 49.0003 46.6667C50.289 46.6667 51.3337 45.622 51.3337 44.3333C51.3337 43.0447 50.289 42 49.0003 42Z" fill="currentColor"/> 816 <path d="M39.7836 49.1166C39.7836 47.828 40.8283 46.7833 42.117 46.7833C43.4056 46.7833 44.4503 47.828 44.4503 49.1166C44.4503 50.4053 43.4056 51.45 42.117 51.45C40.8283 51.45 39.7836 50.4053 39.7836 49.1166Z" fill="currentColor"/> 817 <path d="M35.0003 37.3333C36.289 37.3333 37.3337 36.2887 37.3337 35C37.3337 33.7113 36.289 32.6667 35.0003 32.6667C33.7117 32.6667 32.667 33.7113 32.667 35C32.667 36.2887 33.7117 37.3333 35.0003 37.3333Z" fill="currentColor"/> 818 <path d="M37.217 44.3333C37.217 45.622 36.1724 46.6667 34.8837 46.6667C33.595 46.6667 32.5504 45.622 32.5504 44.3333C32.5504 43.0447 33.595 42 34.8837 42C36.1724 42 37.217 43.0447 37.217 44.3333Z" fill="currentColor"/> 819 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </div> <div class="nav-card-bottom"> <span class="nav-card-title">Integrations</span> <span class="nav-card-description">IT Document Solutions</span> </div> </div> </a> </div> </div> </section> </div>
819<script type="module">document.addEventListener("DOMContentLoaded",()=>{const n=document.querySelector(".header"),a=document.querySelector("#top-nav-bar"),f=document.querySelector("main"),d=document.querySelector(".right-aside"),l=50;let o=!1,r=!1,e=null,v=!0;document.body.setAttribute("data-is-header-expanded","true"),n&&(n.style.transition="transform 0.3s ease-out"),f&&(f.style.transition="transform 0.3s ease-out");const p=a?a.getBoundingClientRect().height:0,h=document.querySelector(".banner-announcement"),y=h?h.getBoundingClientRect().height:0,s=document.querySelector(".header-nav-wrapper");s&&s.classList.add("header-transition");function i(t){if(v===t)return;v=t;const L=p+y;n&&requestAnimationFrame(()=>{n.style.transform=t?"translateY(0)":`translateY(-${L}px)`}),requestAnimationFrame(()=>{s&&(t?(s.classList.add("header-expanded"),s.classList.remove("header-collapsed"),document.body.setAttribute("data-is-header-expanded","true"),requestAnimationFrame(()=>{d&&(d.style.transform="translateY(0)")})):(s.classList.add("header-collapsed"),s.classList.remove("header-expanded"),document.body.setAttribute("data-is-header-expanded","false"),d&&(d.style.transform=`translateY(-${L}px)`)));const u=document.querySelector(".full-logo"),m=document.querySelector(".symbol-logo");u&&m&&setTimeout(()=>{requestAnimationFrame(()=>{t?(u.classList.remove("navbar-hidden"),m.classList.remove("navbar-hidden")):(u.classList.add("navbar-hidden"),m.classList.add("navbar-hidden"))})},150)})}a&&(a.addEventListener("mouseenter",()=>{r=!0,e&&clearTimeout(e),e=setTimeout(()=>{r&&requestAnimationFrame(()=>{a.classList.add("nav-expanded")}),e=null},400)}),a.addEventListener("mouseleave",()=>{r=!1,e&&(clearTimeout(e),e=null),o||requestAnimationFrame(()=>{a.classList.remove("nav-expanded")})})),n&&(n.addEventListener("mouseenter",()=>{o=!0}),n.addEventListener("mouseleave",()=>{o=!1,!r&&a&&(e&&(clearTimeout(e),e=null),requestAnimationFrame(()=>{a.classList.remove("nav-expanded")})),window.scrollY>l&&i(!1)}));let c=null;const g=10;window.addEventListener("scroll",()=>{c&&clearTimeout(c),c=setTimeout(()=>{const t=window.scrollY;if(t===0){i(!0);return}!o&&!r&&t>l&&i(!1)},g)},{passive:!0}),document.addEventListener("click",t=>{t.target?.closest('a[id^="toc-"]')&&(i(!1),setTimeout(()=>{window.scrollY<=l&&!o&&!r&&i(!0)},500))})});</script>
819 <!-- Script to get the active nav card (with the white background) -->
819<script>(function(){const lobType = "nutrient"; 820 821 /* global lobType */ 822 const lob = lobType; 823 824 document.addEventListener("DOMContentLoaded", () => { 825 const activeNavItem = document.getElementById(`tnb-${lob}`); 826 827 if (activeNavItem) { 828 // add is-active to nav-card 829 activeNavItem.classList.add("is-active"); 830 831 // add is-active to nav-card-bottom 832 const navCardBottom = activeNavItem.querySelector(".nav-card-bottom"); 833 navCardBottom?.classList.add("is-active"); 834 } 835 }); 836})();</script>
836 <div class="main-nav-wrapper"> <section class="section-spacing-horizontal-default"> <div class="container-large container-spacing-horizontal-default !py-0"> <div class="header-nav-wrapper header-expanded"> <div class="nav-nutrient-logo-wrapper"> <a href="/" class="nav-nutrient-logo" aria-label="Nutrient Logo"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 208 36" width="100%" height="100%" class="full-logo hidden md:flex" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 837<path d="M4.1524 22.1521C1.8582 22.1521 0 20.2939 0 17.9997C0 15.7055 1.8582 13.8473 4.1524 13.8473C6.44659 13.8473 8.30479 15.7055 8.30479 17.9997C8.30479 20.2939 6.44659 22.1521 4.1524 22.1521ZM45.6763 13.8473C43.3821 13.8473 41.524 15.7055 41.524 17.9997C41.524 20.2939 43.3821 22.1521 45.6763 22.1521C47.9705 22.1521 49.8287 20.2939 49.8287 17.9997C49.8287 15.7055 47.9705 13.8473 45.6763 13.8473ZM6.34071 28.1647C4.58424 29.6388 4.35379 32.259 5.82789 34.0154C7.30199 35.7719 9.92215 36.0024 11.6786 34.5283C13.4351 33.0542 13.6655 30.434 12.1914 28.6775C10.7173 26.9211 8.09717 26.6906 6.34071 28.1647ZM43.488 7.8346C45.2445 6.3605 45.475 3.74033 44.0009 1.98387C42.5268 0.227407 39.9066 -0.0030509 38.1501 1.47105C36.3937 2.94515 36.1632 5.56531 37.6373 7.32177C39.1114 9.07824 41.7316 9.3087 43.488 7.8346ZM11.6786 1.47313C9.92215 -0.000974749 7.30199 0.227407 5.82789 1.98595C4.35379 3.74449 4.58217 6.36257 6.34071 7.83667C8.09925 9.31077 10.7173 9.08239 12.1914 7.32385C13.6655 5.56531 13.4372 2.94723 11.6786 1.47313ZM43.488 28.1647C41.7316 26.6906 39.1114 26.919 37.6373 28.6775C36.1632 30.434 36.3916 33.0542 38.1501 34.5283C39.9066 36.0024 42.5268 35.774 44.0009 34.0154C45.475 32.259 45.2466 29.6388 43.488 28.1647ZM32.8849 19.2661C31.1284 17.792 28.5083 18.0204 27.0342 19.779C25.5601 21.5375 25.7884 24.1556 27.547 25.6297C29.3055 27.1038 31.9236 26.8754 33.3977 25.1169C34.8718 23.3583 34.6434 20.7402 32.8849 19.2661ZM22.2818 10.3696C20.5253 8.89553 17.9051 9.12391 16.431 10.8825C14.9569 12.641 15.1853 15.2591 16.9438 16.7332C18.7024 18.2073 21.3205 17.9789 22.7946 16.2204C24.2687 14.4618 24.0403 11.8437 22.2818 10.3696Z" fill="currentColor"></path> 838<path d="M83.2482 4.00294H86.8124V32.0934H82.7174L73.1011 15.2088C72.579 14.2696 71.494 12.1667 69.849 8.90002H69.8111C69.8636 10.1017 69.9103 11.4113 69.9482 12.8288C69.9861 14.2463 70.0065 15.3079 70.0065 16.0109V32.0934H66.4424V4.00294H70.4382L80.0749 20.6921C80.559 21.5292 81.434 23.1654 82.6999 25.6096L83.4057 26.96H83.4436C83.3911 25.8896 83.3445 24.6559 83.3065 23.2588C83.2686 21.8617 83.2482 20.7388 83.2482 19.89V4.00294ZM104.254 23.2996C104.254 27.4792 102.53 29.5675 99.0828 29.5675C98.3128 29.5675 97.639 29.4975 97.0645 29.3604C96.4899 29.2234 95.9474 28.9054 95.4399 28.4096C95.0607 28.045 94.7865 27.6279 94.6174 27.1671C94.4482 26.7034 94.3461 26.2396 94.314 25.7759C94.282 25.3121 94.2645 24.6617 94.2645 23.8275V12.0354H90.5428V24.0229C90.5428 24.9621 90.572 25.7788 90.6303 26.4729C90.6886 27.1671 90.8374 27.8525 91.0707 28.5409C91.304 29.2292 91.6657 29.8242 92.147 30.3346C92.8645 31.1046 93.7074 31.6734 94.6728 32.0379C95.6382 32.4025 96.7757 32.5863 98.0824 32.5863C99.5203 32.5863 100.772 32.2859 101.842 31.685C102.912 31.0842 103.714 30.2238 104.251 29.0979V32.0963H107.856V12.0354H104.251V23.2996H104.254ZM118.677 6.45294H115.113V12.0354H110.901V15.0513H115.113V27.1584C115.113 28.9725 115.603 30.2821 116.583 31.0871C117.563 31.8921 119.141 32.2917 121.322 32.2917C121.871 32.2917 122.416 32.2625 122.959 32.2042C123.501 32.1459 123.947 32.07 124.3 31.9796L124.222 28.6896C123.215 28.9259 122.346 29.0425 121.617 29.0425C120.888 29.0425 120.275 28.9871 119.864 28.8763C119.453 28.7654 119.152 28.5671 118.963 28.2784C118.773 27.9896 118.68 27.5784 118.68 27.0446V15.0571H124.379V12.0413H118.68V6.45294H118.677ZM134.73 12.9746C133.456 13.7329 132.63 14.6721 132.251 15.795V12.0354H128.646V32.0934H132.251V22.9059C132.251 20.8029 132.563 19.1638 133.19 17.9884C133.817 16.8129 134.666 16.0079 135.737 15.5704C136.807 15.1329 138.108 14.9142 139.633 14.9142C140.246 14.9142 140.666 14.9346 140.887 14.9725L140.966 11.5454C140.103 11.5454 139.5
83854 11.5571 139.321 11.5834C137.53 11.7525 136.002 12.2163 134.727 12.9746H134.73ZM170.287 18.5979C170.588 19.785 170.737 21.0217 170.737 22.2992C170.737 22.6784 170.731 22.9584 170.716 23.1421H155.497C155.535 25.35 156.025 26.9921 156.967 28.0684C157.906 29.1446 159.318 29.6842 161.199 29.6842C162.897 29.6842 164.215 29.3167 165.157 28.5788C166.099 27.8409 166.691 26.715 166.939 25.1984L170.424 25.4725C169.981 27.8088 168.978 29.5792 167.417 30.7809C165.857 31.9825 163.798 32.5834 161.237 32.5834C158.154 32.5834 155.754 31.6034 154.027 29.6463C152.394 27.8175 151.577 25.2771 151.577 22.025C151.577 20.5229 151.79 19.1346 152.213 17.8629C152.636 16.5884 153.269 15.4888 154.103 14.5613C154.978 13.5696 156.016 12.8171 157.218 12.3096C158.419 11.7992 159.744 11.5454 161.193 11.5454C162.812 11.5454 164.32 11.8896 165.717 12.575C167.114 13.2604 168.217 14.2434 169.027 15.5238C169.564 16.3871 169.981 17.4109 170.282 18.5979H170.287ZM167.015 20.2225C167.003 19.6479 166.898 19.0238 166.703 18.3529C166.507 17.6821 166.254 17.1163 165.939 16.6584C165.428 15.9 164.792 15.3488 164.028 15.0017C163.264 14.6546 162.334 14.4825 161.237 14.4825C160.14 14.4825 159.181 14.675 158.358 15.06C157.536 15.445 156.92 15.9788 156.518 16.6554C156.177 17.2038 155.934 17.7929 155.783 18.4171C155.634 19.0442 155.549 19.645 155.538 20.2196H167.018L167.015 20.2225ZM190.672 15.6113C190.444 14.9113 190.094 14.3075 189.625 13.8C188.893 13.03 188.044 12.4613 187.079 12.0967C186.113 11.7321 184.97 11.5484 183.652 11.5484C180.583 11.5484 178.518 12.7354 177.462 15.1125V12.0384H173.857V32.0963H177.462V21.0275C177.462 18.5075 178.005 16.7984 179.087 15.9059C180.172 15.0104 181.371 14.5642 182.692 14.5642C183.436 14.5642 184.089 14.6342 184.652 14.7713C185.212 14.9084 185.749 15.2263 186.259 15.7221C186.638 16.0867 186.915 16.5067 187.09 16.9763C187.265 17.4459 187.37 17.9184 187.402 18.3967C187.434 18.8721 187.452 19.5371 187.452 20.3859V32.0992H191.194V20.1904C191.194 19.2367 191.165 18.4113 191.107 17.7113C191.048 17.0113 190.902 16.3142 190.675 15.6142L190.672 15.6113ZM207.338 15.0513V12.0354H201.639V6.45294H198.074V12.0354H193.863V15.0513H198.074V27.1584C198.074 28.9725 198.564 30.2821 199.544 31.0871C200.524 31.8921 202.102 32.2917 204.284 32.2917C204.832 32.2917 205.378 32.2625 205.92 32.2042C206.463 32.1459 206.909 32.07 207.262 31.9796L207.183 28.6896C206.177 28.9259 205.308 29.0425 204.579 29.0425C203.849 29.0425 203.237 28.9871 202.826 28.8763C202.414 28.7654 202.114 28.5671 201.924 28.2784C201.735 27.9896 201.642 27.5784 201.642 27.0446V15.0571H2
83807.341L207.338 15.0513ZM144.557 32.1225H148.162V12.0646H144.557V32.1225ZM146.359 3.41669C144.904 3.41669 143.725 4.59502 143.725 6.05044C143.725 7.50585 144.904 8.68419 146.359 8.68419C147.814 8.68419 148.993 7.50585 148.993 6.05044C148.993 4.59502 147.814 3.41669 146.359 3.41669Z" fill="currentColor"></path> 839 </svg><!-- Define styles for the SVG element with the provided color and size --> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 50 36" width="50" height="36" class="symbol-logo flex md:hidden" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 840<path d="M4.1524 22.1521C1.8582 22.1521 0 20.2939 0 17.9997C0 15.7055 1.8582 13.8473 4.1524 13.8473C6.44659 13.8473 8.30479 15.7055 8.30479 17.9997C8.30479 20.2939 6.44659 22.1521 4.1524 22.1521ZM45.6763 13.8473C43.3821 13.8473 41.524 15.7055 41.524 17.9997C41.524 20.2939 43.3821 22.1521 45.6763 22.1521C47.9705 22.1521 49.8287 20.2939 49.8287 17.9997C49.8287 15.7055 47.9705 13.8473 45.6763 13.8473ZM6.34071 28.1647C4.58424 29.6388 4.35379 32.259 5.82789 34.0154C7.30199 35.7719 9.92215 36.0024 11.6786 34.5283C13.4351 33.0542 13.6655 30.434 12.1914 28.6775C10.7173 26.9211 8.09717 26.6906 6.34071 28.1647ZM43.488 7.8346C45.2445 6.3605 45.475 3.74033 44.0009 1.98387C42.5268 0.227407 39.9066 -0.0030509 38.1501 1.47105C36.3937 2.94515 36.1632 5.56531 37.6373 7.32177C39.1114 9.07824 41.7316 9.3087 43.488 7.8346ZM11.6786 1.47313C9.92215 -0.000974749 7.30199 0.227407 5.82789 1.98595C4.35379 3.74449 4.58217 6.36257 6.34071 7.83667C8.09925 9.31077 10.7173 9.08239 12.1914 7.32385C13.6655 5.56531 13.4372 2.94723 11.6786 1.47313ZM43.488 28.1647C41.7316 26.6906 39.1114 26.919 37.6373 28.6775C36.1632 30.434 36.3916 33.0542 38.1501 34.5283C39.9066 36.0024 42.5268 35.774 44.0009 34.0154C45.475 32.259 45.2466 29.6388 43.488 28.1647ZM32.8849 19.2661C31.1284 17.792 28.5083 18.0204 27.0342 19.779C25.5601 21.5375 25.7884 24.1556 27.547 25.6297C29.3055 27.1038 31.9236 26.8754 33.3977 25.1169C34.8718 23.3583 34.6434 20.7402 32.8849 19.2661ZM22.2818 10.3696C20.5253 8.89553 17.9051 9.12391 16.431 10.8825C14.9569 12.641 15.1853 15.2591 16.9438 16.7332C18.7024 18.2073 21.3205 17.9789 22.7946 16.2204C24.2687 14.4618 24.0403 11.8437 22.2818 10.3696Z" fill="currentColor"></path> 841 </svg><!-- Define styles for the SVG element with the provided color and size --> <span class="team-badge" style="display: none;">T</span> </a> </div> <nav class="header-main-nav"> <div class="header-main-nav-trigger"> <button data-collapse-toggle="mega-menu" data-mobile-menu-toggle type="button" class="" aria-controls="mega-menu" aria-expanded="false"> <span class="sr-only">Open main menu</span> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="mobile-menu-icon-hamburger" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 842 <path fill="currentColor" d="M6 10.5a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm0 5a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm5-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-1 6a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm5-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-1 6a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm5-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-1 6a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"/> 843 </svg><!-- Define styles for the SVG element with the provided color and size --> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="mobile-menu-icon-close hidden" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 844 <path fill="currentColor" d="M15 8a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-2 2a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm6-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-7-7a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM9 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 845 </svg><!-- Define styles for the SVG element with the provided color and size --> </button> </div>
845 <!-- Global Search Trigger (desktop only, hidden on mobile) --> <div class="header-search-trigger"> <button id="global-search-trigger" type="button" class="btn btn-ghost btn-icon" aria-label="Open search" aria-expanded="false" data-global-search-trigger> <span class="sr-only">Open search</span> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 846 <path fill="currentColor" d="M13 4a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-6 12a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm8-10a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM8 15a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm2-10a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm6 12a1 1 0 1 1 0-2 1 1 0 0 1 0 2ZM8 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm10 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm-5 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm7-5a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM8 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-2 6a1 1 0 1 0 2 0 1 1 0 0 0-2 0Zm-1 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/> 847 </svg><!-- Define styles for the SVG element with the provided color and size --> </button> </div> <div id="mega-menu" class="main-nav-group hidden" data-mega-menu-root> <!-- Mobile Search Trigger (only visible on mobile) --><div class="mobile-search-trigger mt-spacing-md lg:hidden"> <div class="search-input-container-base mobile-search-input-container"> <div class="search-input-icon-base mobile-search-input-icon"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="20" height="20" class width="20" height="20" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 848 <path fill="currentColor" d="M13 4a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-6 12a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm8-10a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM8 15a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm2-10a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm6 12a1 1 0 1 1 0-2 1 1 0 0 1 0 2ZM8 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm10 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm-5 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm7-5a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM8 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-2 6a1 1 0 1 0 2 0 1 1 0 0 0-2 0Zm-1 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/> 849 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <input type="text" class="search-input-base mobile-search-input" placeholder="Search or ask a question" data-global-search-trigger readonly> </div> </div> <!-- Please keep hidden and flex since they are used for dropdown --> <ul class="main-nav-group-list"> <!-- Products Mega Menu --><li class="main-nav-group-list-item"> <div id="products-button" data-dropdown-toggle="products-mega-menu" data-dropdown-trigger="hover" data-dropdown-delay="0" data-dropdown-offset-distance="0" class="main-nav-item"> <span>Products</span> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="nav-arrow" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 850<path d="M8 11C8.55228 11 9 10.5523 9 10C9 9.44772 8.55228 9 8 9C7.44772 9 7 9.44771 7 10C7 10.5523 7.44771 11 8 11Z" fill="currentColor"></path> 851<path d="M17 10C17 10.5523 16.5523 11 16 11C15.4477 11 15 10.5523 15 10C15 9.44771 15.4477 9 16 9C16.5523 9 17 9.44772 17 10Z" fill="currentColor"></path> 852<path d="M15 12C15 12.5523 14.5523 13 14 13C13.4477 13 13 12.5523 13 12C13 11.4477 13.4477 11 14 11C14.5523 11 15 11.4477 15 12Z" fill="currentColor"></path> 853<path d="M12 15C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13C11.4477 13 11 13.4477 11 14C11 14.5523 11.4477 15 12 15Z" fill="currentColor"></path> 854<path d="M11 12C11 12.5523 10.5523 13 10 13C9.44772 13 9 12.5523 9 12C9 11.4477 9.44772 11 10 11C10.5523 11 11 11.4477 11 12Z" fill="currentColor"></path> 855 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div id="products-mega-menu" class="main-nav-dropdown-wrapper hidden" aria-labelledby="products-button"> <div class="main-nav-dropdown-grid min-w-full lg:min-w-[1050px]"> <div class="main-nav-dropdown-grid-column"> <a class="main-nav-dropdown-title" href="/sdk/"> SDK Overview <div class="main-nav-item-icon"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v>
856 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 857 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </a> <div class="main-nav-title-separator-wrapper" role="separator"> <span class="main-nav-title-separator"></span> </div> <ul class="main-nav-dropdown-list"> <li> <a href="/sdk/web/"> Web </a> </li><li> <a href="/sdk/ai-document-processing/"> AI Document Processing </a> </li><li> <a href="/sdk/ai-assistant/"> AI Assistant </a> </li><li> <a href="/sdk/document-authoring/"> Document Authoring </a> </li><li> <a href="/sdk/mobile-overview/"> Mobile </a> </li><li> <a href="/sdk/document-engine/"> Document Engine </a> </li><li> <a href="/sdk/dotnet/"> .NET </a> </li> </ul> </div> <div role="separator"> <span class="main-nav-dropdown-vertical-separator"></span> </div> <div class="main-nav-dropdown-grid-column"> <a class="main-nav-dropdown-title" href="/api/"> Cloud Overview <div class="main-nav-item-icon"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 858 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 859 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </a> <div class="main-nav-title-separator-wrapper" role="separator"> <span class="main-nav-title-separator"></span> </div> <ul class="main-nav-dropdown-list"> <li> <a href="/api/processor-api/"> DWS Processor API </a> </li><li> <a href="/api/data-extraction-api/"> DWS Data Extraction API <span class="tag ml-auto"> New </span>
859<script type="module">document.addEventListener("DOMContentLoaded",()=>{const t=document.querySelectorAll(".tag-filter");t.length>0&&t.forEach(e=>{e.addEventListener("click",n=>{e.getAttribute("href")||(n.preventDefault(),e.classList.toggle("active"))})})});</script>
859 </a> </li><li> <a href="/api/accessibility-api/"> DWS Accessibility API </a> </li><li> <a href="/api/viewer-api/"> DWS Viewer API </a> </li> </ul> </div> <div role="separator"> <span class="main-nav-dropdown-vertical-separator"></span> </div> <div class="main-nav-dropdown-grid-column"> <a class="main-nav-dropdown-title" href="/low-code/"> Integrations Overview <div class="main-nav-item-icon"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 860 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 861 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </a> <div class="main-nav-title-separator-wrapper" role="separator"> <span class="main-nav-title-separator"></span> </div> <ul class="main-nav-dropdown-list"> <li> <a href="/low-code/document-converter/"> Document Converter </a> </li><li> <a href="/low-code/document-editor/"> Document Editor </a> </li><li> <a href="/low-code/document-searchability/"> Document Searchability </a> </li><li> <a href="/low-code/integrations/salesforce/"> Salesforce </a> </li><li> <a href="/low-code/integrations/servicenow/"> ServiceNow </a> </li> </ul> </div> <div role="separator"> <span class="main-nav-dropdown-vertical-separator"></span> </div> <div class="main-nav-dropdown-grid-column"> <a class="main-nav-dropdown-title" href="/workflow-automation/"> Workflow Platform <div class="main-nav-item-icon"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 862 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 863 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> </a> <div class="main-nav-title-separator-wrapper" role="separator"> <span class="main-nav-title-separator"></span> </div> <ul class="main-nav-dropdown-list"> <li> <a href="/workflow-automation/process-builder/"> Process Builder </a> </li><li> <a href="/workflow-automation/form-designer/"> Form Designer </a> </li><li> <a href="/workflow-automation/document-generation/"> Office Templating </a> </li> </ul> </div> </div> </div> </li> <!-- Document AI Dropdown --> <li class="main-nav-group-list-item"> <div id="aisolutions-button" data-dropdown-toggle="aisolutions-dropdown" data-dropdown-trigger="hover" data-dropdown-delay="0" data-dropdown-offset-distance="0" class="main-nav-item"> <span>Document AI</span> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="nav-arrow" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 864<path d="M8 11C8.55228 11 9 10.5523 9 10C9 9.44772 8.55228 9 8 9C7.44772 9 7 9.44771 7 10C7 10.5523 7.44771 11 8 11Z" fill="currentColor"></path> 865<path d="M17 10C17 10.5523 16.5523 11 16 11C15.4477 11 15 10.5523 15 10C15 9.44771 15.4477 9 16 9C16.5523 9 17 9.44772 17 10Z" fill="currentColor"></path> 866<path d="M15 12C15 12.5523 14.5523 13 14 13C13.4477 13 13 12.5523 13 12C13 11.4477 13.4477 11 14 11C14.5523 11 15 11.4477 15 12Z" fill="currentColor"></path> 867<path d="M12 15C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13C11.4477 13 11 13.4477 11 14C11 14.5523 11.4477 15 12 15Z" fill="currentColor"></path> 868<path d="M11 12C11 12.5523 10.5523 13 10 13C9.44772 13 9 12.5523 9 12C9 11.4477 9.44772 11 10 11C10.5523 11 11 11.4477 11 12Z" fill="currentColor"></path> 869 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div id="aisolutions-dropdown" class="main-nav-dropdown-wrapper hidden" aria-labelledby="aisolutions-button"> <div class="main-nav-dropdown-grid lg:min-w-[1100px]"> <div class="main-nav-dropdown-grid-column"> <span class="main-nav-dropdown-title">Start here</span> <div class="main-nav-title-separator-wrapper" role="separator"> <span class="main-nav-title-separator"></span> </div> <ul class="main-nav-dropdown-list"> <li> <a href="/document-ai/"> Document AI overview </a> </li><li> <a href="/api/data-extraction-api/"> Data Extraction API <span class="tag ml-auto"> New </span> </a> </li> </ul> </div> <div role="separator"> <span class="main-nav-dropdown-vertical-separator"></span> </div> <div class="main-nav-dropdown-grid-column"> <span class="main-nav-dropdown-title">Govern and Review</span> <div class="main-nav-title-separator-wrapper" role="separator"> <span class="main-nav-title-separator"></span> </div> <ul class="main-nav-dropdown-list"> <li> <a href="/document-ai/governance/"> Governance and Trust </a> </li><li> <a href="/workflow-automation/ai-agents/"> Workflow Agents </a> </li><li> <a href="/ai/agents/"> Enterprise Document Agents <span class="tag ml-auto"> Early access </span> </a> </li><li> <a href="/sdk/ai-assistant/"> AI Assistant </a> </li> </ul> </div> <div role="separator"> <span class="main-nav-dropdown-vertical-separator"></span> </div> <div class="main-nav-dropdown-grid-column"> <span class="main-nav-dropdown-title">Build with us</span> <div class="main-nav-title-separator-wrapper" role="separator"> <span class="main-nav-title-separator"></span> </div> <ul class="main-nav-dropdown-list"> <li> <a href="/api/mcp-server-pdf-automation-llm/"> MCP Server </a> </li><li>
869 <a href="/ai/infrastructure/"> Build your own agent </a> </li><li> <a href="/ai/models/"> Open models and benchmarks <span class="tag ml-auto"> New </span> </a> </li><li> <a href="/ai/skills/pdf-to-markdown/"> PDF-to-Markdown skill and CLI </a> </li><li> <a href="/ai/skills/make-pdf/"> Make PDF skill <span class="tag ml-auto"> New </span> </a> </li><li> <a href="/ai/skills/remediate-pdf/"> Remediate PDF skill <span class="tag ml-auto"> New </span> </a> </li> </ul> </div> </div> </div> </li> <!-- Developers --> <li class="main-nav-group-list-item"> <a class="main-nav-item" href="/sdk/developers/"> <span>Developers</span> </a> </li> <!-- Company Dropdown --> <li class="main-nav-group-list-item"> <div id="company-button" data-dropdown-toggle="company-dropdown" data-dropdown-trigger="hover" data-dropdown-delay="0" data-dropdown-offset-distance="0" class="main-nav-item"> <span>Company</span> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="nav-arrow" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 870<path d="M8 11C8.55228 11 9 10.5523 9 10C9 9.44772 8.55228 9 8 9C7.44772 9 7 9.44771 7 10C7 10.5523 7.44771 11 8 11Z" fill="currentColor"></path> 871<path d="M17 10C17 10.5523 16.5523 11 16 11C15.4477 11 15 10.5523 15 10C15 9.44771 15.4477 9 16 9C16.5523 9 17 9.44772 17 10Z" fill="currentColor"></path> 872<path d="M15 12C15 12.5523 14.5523 13 14 13C13.4477 13 13 12.5523 13 12C13 11.4477 13.4477 11 14 11C14.5523 11 15 11.4477 15 12Z" fill="currentColor"></path> 873<path d="M12 15C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13C11.4477 13 11 13.4477 11 14C11 14.5523 11.4477 15 12 15Z" fill="currentColor"></path> 874<path d="M11 12C11 12.5523 10.5523 13 10 13C9.44772 13 9 12.5523 9 12C9 11.4477 9.44772 11 10 11C10.5523 11 11 11.4477 11 12Z" fill="currentColor"></path> 875 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div id="company-dropdown" class="main-nav-dropdown-wrapper hidden"> <ul class="main-nav-dropdown-list" aria-labelledby="company-button"> <li> <a href="/company/about/"> About </a> </li><li> <a href="/company/team/"> Team </a> </li><li> <a href="/company/careers/"> Careers </a> </li><li> <a href="/partners/">
875 Partners </a> </li><li> <a href="/company/contact/"> Contact </a> </li><li> <a href="/blog/news/"> News </a> </li> </ul> </div> </li> <!-- Resources Section --> <li class="main-nav-group-list-item"> <div id="resources-button" data-dropdown-toggle="resources" data-dropdown-trigger="hover" data-dropdown-delay="0" data-dropdown-offset-distance="0" class="main-nav-item"> <span>Resources</span> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="nav-arrow" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 876<path d="M8 11C8.55228 11 9 10.5523 9 10C9 9.44772 8.55228 9 8 9C7.44772 9 7 9.44771 7 10C7 10.5523 7.44771 11 8 11Z" fill="currentColor"></path> 877<path d="M17 10C17 10.5523 16.5523 11 16 11C15.4477 11 15 10.5523 15 10C15 9.44771 15.4477 9 16 9C16.5523 9 17 9.44772 17 10Z" fill="currentColor"></path> 878<path d="M15 12C15 12.5523 14.5523 13 14 13C13.4477 13 13 12.5523 13 12C13 11.4477 13.4477 11 14 11C14.5523 11 15 11.4477 15 12Z" fill="currentColor"></path> 879<path d="M12 15C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13C11.4477 13 11 13.4477 11 14C11 14.5523 11.4477 15 12 15Z" fill="currentColor"></path> 880<path d="M11 12C11 12.5523 10.5523 13 10 13C9.44772 13 9 12.5523 9 12C9 11.4477 9.44772 11 10 11C10.5523 11 11 11.4477 11 12Z" fill="currentColor"></path> 881 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div id="resources" class="main-nav-dropdown-wrapper hidden"> <ul class="main-nav-dropdown-list" aria-labelledby="resources-button"> <li role="none"> <a href="/blog/" class="nav-link" role="menuitem"> Blog </a> </li><li role="none"> <a href="/events/" class="nav-link" role="menuitem"> Events </a> </li><li role="none"> <a href="/blog/categories/customer-stories/" class="nav-link" role="menuitem"> Customer stories </a> </li><li role="none"> <a href="/newsletter/" class="nav-link" role="menuitem"> Newsletter </a> </li> <li role="separator"> <span class="main-nav-dropdown-separator"></span> </li> <li role="none"> <span class="main-nav-dropdown-title">Accessibility</span> </li> <li role="none"> <a href="/solutions/pdf-accessibility/" class="nav-link" role="menuitem"> PDF accessibility hub </a> </li><li role="none"> <a href="/blog/pdf-ua-compliance-guide/" class="nav-link" role="menuitem"> PDF/UA compliance guide </a> </li> </ul> </div> </li> </ul> <ul class="main-nav-group-list main-nav-group-wrapper-mobile"> <li class="main-nav-group-list-item flex md:hidden"> <div class="main-nav-item"> <a class="btn btn-secondary" id="main-nav-trial-cta" href="/try/" aria-current="page"> Try for free </a> </div> </li> <li class="main-nav-group-list-item flex sm:hidden"> <div class="main-nav-item"> <a class="btn btn-primary" id="main-nav-contact-cta" href="/contact-sales/" aria-current="page"> Contact Sales </a> </div> </li> </ul> </div> <div class="main-nav-group main-nav-group-wrapper"> <ul class="main-nav-group-list main-nav-group-wrapper-desktop"> <li class="main-nav-group-list-item hidden md:flex"> <div class="main-nav-item"> <a class="btn btn-secondary" id="main-nav-trial-cta" href="/try/" aria-current="page"> Try for free </a> </div> </li> <li class="main-nav-group-list-item hidden sm:flex"> <div class="main-nav-item"> <a class="btn btn-primary" id="main-nav-contact-cta" href="/contact-sales/" aria-current="page"> Contact Sales </a> </div> </li> </ul> </div> </nav> </div> </div> </section> </div> </header> <!-- Global Search Drawer --> <!-- Global Search Drawer --><div id="global-search-drawer-ecm2u5jfe" class="global-search-drawer" role="dialog" aria-modal="true" aria-label="Search" data-drawer-id="global-search-drawer-ecm2u5jfe" data-max-results="50" data-debounce-delay="300" data-current-path="/blog/news/" data-enable-shortcuts="true" data-filters="[{"id":"blog","label":"Blog","value":"blog","selected":false},{"id":"guides","label":"Guides","value":"guides","selected":false},{"id":"api-reference","label":"API Reference","value":"api-reference","selected":false}]"> <section class="section-spacing-horizontal-default !py-0 global-search-drawer-inner !pt-spacing-2xs !lg:pt-0 lg:!my-container-spacing-vertical-medium"> <button type="button" class="close-btn-base focus-ring-base global-search-close-btn-desktop" aria-label="Close search" data-close-btn-desktop> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class width="24" height="24" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v>
882 <path fill="currentColor" d="M15 8a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-2 2a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm6-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-7-7a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM9 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 883 </svg><!-- Define styles for the SVG element with the provided color and size --> </button> <div class="container-large radius-container container-spacing-horizontal-default container-spacing-vertical-large !pt-0 global-search-container"> <div class="global-search-layout"> <!-- Main Content Area --><main class="global-search-main"> <!-- Using div instead of h1 to avoid duplicate H1s across all pages for SEO --><div class="global-search-title heading-1">Search</div> <!-- Search Input with Tags --> <div class="global-search-input-wrapper"> <div class="search-input-container-base global-search-input-container" data-input-container> <div class="search-input-icon-base global-search-input-icon"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="20" height="20" class width="20" height="20" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 884 <path fill="currentColor" d="M13 4a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-6 12a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm8-10a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM8 15a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm2-10a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm6 12a1 1 0 1 1 0-2 1 1 0 0 1 0 2ZM8 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm10 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm-5 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm7-5a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM8 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-2 6a1 1 0 1 0 2 0 1 1 0 0 0-2 0Zm-1 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/> 885 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <!-- Filter tags will be inserted here dynamically --> <div data-tags-container class="contents"></div> <input type="text" id="global-search-drawer-ecm2u5jfe-input" class="search-input-base global-search-input" placeholder="Search or ask a question" autocomplete="off" aria-label="Search" aria-expanded="false" aria-controls="global-search-drawer-ecm2u5jfe-results" aria-autocomplete="list" data-search-input> <button type="button" class="focus-ring-base global-search-clear-btn" aria-label="Clear search" data-clear-btn style="display: none;"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="20" height="20" class width="20" height="20" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 886 <path fill="currentColor" d="M15 8a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-2 2a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm6-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-7-7a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM9 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 887 </svg><!-- Define styles for the SVG element with the provided color and size --> </button> </div> </div> <!-- Action Buttons (UI only) --> <div class="global-search-actions" data-actions> <button type="button" class="focus-ring-base global-search-filter-pill" data-ask-ai-btn> 888ASK AI 889</button> <button type="button" class="focus-ring-base global-search-filter-pill" data-code-examples-btn> 890SEARCH CODE EXAMPLES 891</button> </div> <!-- Results Header (outside scroll container) --> <!-- Using div instead of h2 to avoid repetitive headings across all pages for SEO --> <div class="section-title-base global-search-results-header" data-results-header style="display: none;"> 892RESULTS 893</div> <!-- Scrollable Results + AI Container Wrapper --> <div class="global-search-scroll-wrapper"> <div class="global-search-scroll-container" data-scroll-container> <!-- Results Section --><div id="global-search-drawer-ecm2u5jfe-results" class="global-search-results" role="listbox" aria-label="Search results" data-results-container><!-- Dynamic results will be inserted here --></div> <!-- ASK AI ASSISTANT Section (UI Shell) --> <div class="global-search-ai-section" data-ai-section style="display: none;"> <!-- Using div instead of h2 to avoid repetitive headings across all pages for SEO --><div class="section-title-base global-search-ai-header"> 894ASK AI ASSISTANT 895</div> <div data-ai-suggestions><!-- AI suggestions will be inserted here --></div> </div> </div> </div> <!-- Mobile Navigation (shown when input not focused) --> <div class="global-search-mobile-nav" data-mobile-nav><!-- Mobile navigation will be cloned from header on mobile --></div> </main> <!-- Sidebar (Desktop Only) --> <aside class="global-search-sidebar" data-sidebar> <!-- Suggested Filters (all filter types combined) --><div class="global-search-filters-section"> <!-- Using div instead of h2 to avoid repetitive headings across all pages for SEO --><div class="section-title-base global-search-filters-title"> 896SUGGESTED FILTERS 897</div> <div class="global-search-filters-list" data-filters-container><!-- All filter pills will be inserted here dynamically --></div> </div> <!-- Other Ways to Connect --> <div class="global-search-contact-section"> <!-- Using div instead of h2 to avoid repetitive headings across all pages for SEO --><div class="section-title-base global-search-contact-title"> 898OTHER WAYS TO CONNECT 899</div> <div class="link-button-list link-button-list"> <a href="#" target="_self" data-target="_self" data-modal-trigger="global-search-schedule-modal" tabindex="0" class="link-button link-button-primary border-b border-neutral-default-primary !px-0 !py-s
899pacing-sm" modalTrigger="global-search-schedule-modal"> <div class="link-button-content"> <span class="link-button-text">Schedule a call</span> </div> <span class="shrink-0 text-neutral-primary"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 900 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 901 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a>
901<script type="module" src="/_astro/LinkButton.astro_astro_type_script_index_0_lang.BHoFg1U6.js"></script>
901 <a href="mailto:[email protected]" target="_self" data-url="mailto:[email protected]" data-target="_self" tabindex="0" class="link-button link-button-primary border-b border-neutral-default-primary !px-0 !py-spacing-sm" url="mailto:[email protected]"> <div class="link-button-content"> <span class="link-button-text">Email Sales</span> </div> <span class="shrink-0 text-neutral-primary"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 902 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 903 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a> <a href="https://support.nutrient.io/hc/en-us/requests/new" target="_blank" rel="noopener noreferrer" data-url="https://support.nutrient.io/hc/en-us/requests/new" data-target="_blank" data-rel="noopener noreferrer" tabindex="0" class="link-button link-button-primary border-b border-neutral-default-primary !px-0 !py-spacing-sm" url="https://support.nutrient.io/hc/en-us/requests/new" data-dynamic-link="technical-support"> <div class="link-button-content"> <span class="link-button-text">Technical support</span> </div> <span class="shrink-0 text-neutral-primary"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 904 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 905 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a> </div> <!-- Schedule Call Modal --> <div id="global-search-schedule-modal" class="modal-container modal-closed [&_.modal-close-button]:!hidden" role="dialog" aria-modal="true" aria-label="Schedule a call with our Sales team" data-modal> <div class="modal-content modal-content-closed p-0 !h-auto max-h-[90vh] !overflow-y-auto !radius-container" style="max-width: min(720px, 92vw); max-height: 90vh; width: min(720px, 92vw); height: 90vh;" data-modal-content> <!-- Modal content slot --><div class="modal-slot"> <div class="bg-neutral-default-tertiary px-spacing-sm md:px-spacing-md lg:px-spacing-lg py-spacing-sm md:py-spacing-md lg:py-spacing-lg"> <div class="flex flex-col gap-spacing-2xl"> <div class="flex items-center justify-between w-full gap-spacing-2xl"> <span class="heading-2 text-neutral-primary">Schedule a call</span> <button type="button" class="btn btn-secondary btn-icon-center border-none" data-modal-close aria-label="Close schedule a call modal"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 906 <path fill="currentColor" d="M15 8a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-2 2a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm6-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-7-7a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM9 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 907 </svg><!-- Define styles for the SVG element with the provided color and size --> </button> </div> <form id="global-search-schedule-modal-form" method="POST" novalidate class="flex flex-col gap-spacing-lg" data-hubspot-config="{"portalId":"145134102","formId":"a1391a6c-0e51-43c2-9ce2-3650e4793f83","region":"eu1"}" data-form-type="schedule-call" data-schedule-call-form="true"> <div class="grid grid-cols-2 gap-spacing-md"> <div class="form-field-wrapper secondary" data-hubspot-field="firstname"> <div class="nutrient-input-wrapper"> <label for="input-5ve3a9" class="nutrient-input-label"> FIRST NAME </label> <input required id="input-5ve3a9" name="firstName" type="text" placeholder value class="nutrient-input" autocomplete="given-name"> <div class="nutrient-input-helper-container">
907 <p id="input-5ve3a9-error" class="nutrient-input-error-text hidden"> Please enter your first name </p> </div> </div> </div> <div class="form-field-wrapper secondary" data-hubspot-field="lastname"> <div class="nutrient-input-wrapper"> <label for="input-stri8c" class="nutrient-input-label"> LAST NAME </label> <input required id="input-stri8c" name="lastName" type="text" placeholder value class="nutrient-input" autocomplete="family-name"> <div class="nutrient-input-helper-container"> <p id="input-stri8c-error" class="nutrient-input-error-text hidden"> Please enter your last name </p> </div> </div> </div> </div><div class="form-field-wrapper secondary" data-hubspot-field="email"> <div class="nutrient-input-wrapper"> <label for="input-pgt9e6" class="nutrient-input-label"> EMAIL </label> <input required id="input-pgt9e6" name="email" type="email" placeholder value class="nutrient-input" inputmode="email" autocapitalize="off" autocorrect="off" spellcheck="false" autocomplete="email"> <div class="nutrient-input-helper-container"> <p id="input-pgt9e6-error" class="nutrient-input-error-text hidden"> Please enter your email address </p> </div> </div> </div> <div class="form-field-wrapper secondary" data-hubspot-field="company"> <div class="nutrient-input-wrapper"> <label for="input-ooh52t" class="nutrient-input-label"> COMPANY NAME </label> <input required id="input-ooh52t" name="companyName" type="text" placeholder value class="nutrient-input" autocomplete="organization"> <div class="nutrient-input-helper-container">
907 <p id="input-ooh52t-error" class="nutrient-input-error-text hidden"> Please enter your company name </p> </div> </div> </div> <div class="form-field-wrapper secondary" data-hubspot-field="phone"> <div class="nutrient-input-wrapper"> <label for="input-7ljwp0" class="nutrient-input-label"> PHONE NUMBER </label> <input required id="input-7ljwp0" name="phone" type="tel" placeholder value class="nutrient-input" inputmode="tel" autocomplete="tel"> <div class="nutrient-input-helper-container"> <p id="input-7ljwp0-error" class="nutrient-input-error-text hidden"> Please enter your phone number </p> </div> </div> </div> <div class="form-field-wrapper secondary" data-placeholder="Where is your company headquartered?" data-hubspot-field="country_dropdown" data-required="true"> <div class="nutrient-input-wrapper"> <label for="dropdown-xfeabv" class="nutrient-input-label"> COUNTRY </label> <div class="nutrient-dropdown"> <div class="selected-text">Where is your company headquartered?</div> <select id="dropdown-xfeabv" name="country" data-filter="country" aria-label="COUNTRY" astro-dropdown> <!-- If no option is selected, we do not want tick on any item, so first option is empty and hidden --><!-- "hidden" attribute does not work in safari hence we need to skip rendering it if not needed --><option value="" disabled selected hidden></option> <optgroup label="Where is your company headquartered?"> <option value="United States"> United States </option><option value="United Kingdom"> United Kingdom </option><option value="Canada"> Canada </option><option value="Germany"> Germany </option><option value="France"> France </option><option value="Australia"> Australia </option><option value="Japan"> Japan </option><option value="Afghanistan"> Afghanistan </option><option value="Aland Islands"> Aland Islands </option><option value="Albania"> Albania </option><option value="Algeria"> Algeria </option><option value="Andorra"> Andorra </option><option value="Angola"> Angola </option><option value="Anguilla"> Anguilla </option><option value="Antarctica"> Antarctica </option><option value="Antigua and Barbuda"> Antigua and Barbuda </option><option value="Argentina"> Argentina </option><option value="Armenia"> Armenia </option><option value="Aruba"> Aruba </option><option value="Austria"> Austria </option><option value="Azerbaijan"> Azerbaijan </option><option value="Bahamas"> Bahamas </option><option value="Bahrain"> Bahrain </option><option value="Bangladesh"> Bangladesh </option><option value="Barbados"> Barbados </option><option value="Belarus"> Belarus </option><option value="Belgium"> Belgium </option><option value="Belize"> Belize </option><option value="Benin"> Benin </option><option value="Bermuda"> Bermuda </option><option value="Bhutan"> Bhutan </option><option value="Bolivia, Plurinational State of"> Bolivia, Plurinational State of </option><option value="Bonaire, Sint Eustatius and Saba"> Bonaire, Sint Eustatius and Saba </option><option value="Bosnia and Herzegovina"> Bosnia and Herzegovina </option><option value="Botswana"> Botswana </option><option value="Bouvet Island"> Bouvet Island </option><option value="Brazil"> Brazil </option><option value="British Indian Ocean Territory"> British Indian Ocean Territory </option><option value="Brunei Darussalam"> Brunei Darussalam </option><option value="Bulgaria"> Bulgaria </option><option value="Burkina Faso"> Burkina Faso </option><option value="Burundi"> Burundi </option><option value="Cambodia"> Cambodia </option><option value="Cameroon"> Cameroon </option><option value="Cape Verde"> Cape Verde </option><option value="Cayman Islands"> Cayman Islands </option><option value="Central African Republic"> Central African Republic </option><option value="Chad"> Chad </option><option value="Chile"> Chile </option><option value="China"> China </option><option value="Chinese Taipei"> Chinese Taipei </option><option value="Christmas Island"> Christmas Island </option><option value="Cocos (Keeling) Islands"> Cocos (Keeling) Islands </option><option value="Colombia"> Colombia </option><option value="Comoros"> Comoros </option><option value="Congo"> Congo </option><option value="Congo, the Democratic Republic of the"> Congo, the Democratic Republic of the </option><option value="Cook Islands">
907 Cook Islands </option><option value="Costa Rica"> Costa Rica </option><option value="Cote d'Ivoire"> Cote d'Ivoire </option><option value="Croatia"> Croatia </option><option value="Cuba"> Cuba </option><option value="Curaçao"> Curaçao </option><option value="Cyprus"> Cyprus </option><option value="Czechia"> Czechia </option><option value="Denmark"> Denmark </option><option value="Djibouti"> Djibouti </option><option value="Dominica"> Dominica </option><option value="Dominican Republic"> Dominican Republic </option><option value="Ecuador"> Ecuador </option><option value="Egypt"> Egypt </option><option value="El Salvador"> El Salvador </option><option value="Equatorial Guinea"> Equatorial Guinea </option><option value="Eritrea"> Eritrea </option><option value="Estonia"> Estonia </option><option value="Ethiopia"> Ethiopia </option><option value="Falkland Islands (Malvinas)"> Falkland Islands (Malvinas) </option><option value="Faroe Islands"> Faroe Islands </option><option value="Fiji"> Fiji </option><option value="Finland"> Finland </option><option value="French Guiana"> French Guiana </option><option value="French Polynesia"> French Polynesia </option><option value="French Southern Territories"> French Southern Territories </option><option value="Gabon"> Gabon </option><option value="Gambia"> Gambia </option><option value="Georgia"> Georgia </option><option value="Ghana"> Ghana </option><option value="Gibraltar"> Gibraltar </option><option value="Greece"> Greece </option><option value="Greenland"> Greenland </option><option value="Grenada"> Grenada </option><option value="Guadeloupe"> Guadeloupe </option><option value="Guatemala"> Guatemala </option><option value="Guernsey"> Guernsey </option><option value="Guinea"> Guinea </option><option value="Guinea-Bissau"> Guinea-Bissau </option><option value="Guyana"> Guyana </option><option value="Haiti"> Haiti </option><option value="Heard Island and McDonald Islands"> Heard Island and McDonald Islands </option><option value="Holy See (Vatican City)"> Holy See (Vatican City) </option><option value="Honduras"> Honduras </option><option value="Hong Kong"> Hong Kong </option><option value="Hungary"> Hungary </option><option value="Iceland"> Iceland </option><option value="India"> India </option><option value="Indonesia"> Indonesia </option><option value="Iran, Islamic Republic of">
907 Iran, Islamic Republic of </option><option value="Iraq"> Iraq </option><option value="Ireland"> Ireland </option><option value="Isle of Man"> Isle of Man </option><option value="Israel"> Israel </option><option value="Italy"> Italy </option><option value="Jamaica"> Jamaica </option><option value="Jersey"> Jersey </option><option value="Jordan"> Jordan </option><option value="Kazakhstan"> Kazakhstan </option><option value="Kenya"> Kenya </option><option value="Kiribati"> Kiribati </option><option value="Korea, Democratic People's Republic of"> Korea, Democratic People's Republic of </option><option value="Korea, Republic of"> Korea, Republic of </option><option value="Kosovo"> Kosovo </option><option value="Kuwait"> Kuwait </option><option value="Kyrgyzstan"> Kyrgyzstan </option><option value="Lao People's Democratic Republic"> Lao People's Democratic Republic </option><option value="Latvia"> Latvia </option><option value="Lebanon"> Lebanon </option><option value="Lesotho"> Lesotho </option><option value="Liberia"> Liberia </option><option value="Libyan Arab Jamahiriya"> Libyan Arab Jamahiriya </option><option value="Liechtenstein"> Liechtenstein </option><option value="Lithuania"> Lithuania </option><option value="Luxembourg"> Luxembourg </option><option value="Macao"> Macao </option><option value="Macedonia, the former Yugoslav Republic of"> Macedonia, the former Yugoslav Republic of </option><option value="Madagascar"> Madagascar </option><option value="Malawi"> Malawi </option><option value="Malaysia"> Malaysia </option><option value="Maldives"> Maldives </option><option value="Mali"> Mali </option><option value="Malta"> Malta </option><option value="Martinique"> Martinique </option><option value="Mauritania"> Mauritania </option><option value="Mauritius"> Mauritius </option><option value="Mayotte"> Mayotte </option><option value="Mexico"> Mexico </option><option value="Moldova, Republic of"> Moldova, Republic of </option><option value="Monaco"> Monaco </option><option value="Mongolia"> Mongolia </option><option value="Montenegro"> Montenegro </option><option value="Montserrat"> Montserrat </option><option value="Morocco"> Morocco </option><option value="Mozambique"> Mozambique </option><option value="Myanmar"> Myanmar </option><option value="Namibia"> Namibia </option><option value="Nauru"> Nauru </option><option value="Nepal"> Nepal </option><option value="Netherlands"> Netherlands </option><option value="New Caledonia"> New Caledonia </option><option value="New Zealand"> New Zealand </option><option value="Nicaragua"> Nicaragua </option><option value="Niger"> Niger </option><option value="Nigeria"> Nigeria </option><option value="Niue"> Niue </option><option value="Norfolk Island"> Norfolk Island </option><option value="North Holland"> North Holland </option><option value="Norway"> Norway </option><option value="Oman"> Oman </option><option value="Pakistan"> Pakistan </option><option value="Panama"> Panama </option><option value="Papua New Guinea"> Papua New Guinea </option><option value="Paraguay"> Paraguay </option><option value="Peru"> Peru </option><option value="Philippines"> Philippines </option><option value="Pitcairn"> Pitcairn </option><option value="Poland"> Poland </option><option value="Portugal"> Portugal </option><option value="Qatar"> Qatar </option><option value="Reunion"> Reunion </option><option value="Romania"> Romania </option><option value="Russian Federation"> Russian Federation </option><option value="Rwanda"> Rwanda </option><option value="Saint Barthélemy"> Saint Barthélemy </option><option value="Saint Helena, Ascension and Tristan da Cunha"> Saint Helena, Ascension and Tristan da Cunha </option><option value="Saint Kitts and Nevis"> Saint Kitts and Nevis </option><option value="Saint Lucia"> Saint Lucia </option><option value="Saint Martin (French part)"> Saint Martin (French part) </option><option value="Saint Pierre and Miquelon"> Saint Pierre and Miquelon </option><option value="Saint Vincent and the Grenadines"> Saint Vincent and the Grenadines </option><option value="Samoa"> Samoa </option><option value="San Marino"> San Marino </option><option value="Sao Tome and Principe">
907 Sao Tome and Principe </option><option value="Saudi Arabia"> Saudi Arabia </option><option value="Senegal"> Senegal </option><option value="Serbia"> Serbia </option><option value="Seychelles"> Seychelles </option><option value="Sierra Leone"> Sierra Leone </option><option value="Singapore"> Singapore </option><option value="Sint Maarten (Dutch part)"> Sint Maarten (Dutch part) </option><option value="Slovakia"> Slovakia </option><option value="Slovenia"> Slovenia </option><option value="Solomon Islands"> Solomon Islands </option><option value="Somalia"> Somalia </option><option value="South Africa"> South Africa </option><option value="South Georgia and the South Sandwich Islands"> South Georgia and the South Sandwich Islands </option><option value="South Sudan"> South Sudan </option><option value="Spain"> Spain </option><option value="Sri Lanka"> Sri Lanka </option><option value="Sudan"> Sudan </option><option value="Suriname"> Suriname </option><option value="Svalbard and Jan Mayen"> Svalbard and Jan Mayen </option><option value="Swaziland"> Swaziland </option><option value="Sweden"> Sweden </option><option value="Switzerland"> Switzerland </option><option value="Syrian Arab Republic"> Syrian Arab Republic </option><option value="Taiwan"> Taiwan </option><option value="Tajikistan"> Tajikistan </option><option value="Tanzania, United Republic of"> Tanzania, United Republic of </option><option value="Thailand"> Thailand </option><option value="Timor-Leste"> Timor-Leste </option><option value="Togo"> Togo </option><option value="Tokelau"> Tokelau </option><option value="Tonga"> Tonga </option><option value="Trinidad and Tobago"> Trinidad and Tobago </option><option value="Tunisia"> Tunisia </option><option value="Turkey"> Turkey </option><option value="Turkmenistan"> Turkmenistan </option><option value="Turks and Caicos Islands"> Turks and Caicos Islands </option><option value="Tuvalu"> Tuvalu </option><option value="Uganda"> Uganda </option><option value="Ukraine"> Ukraine </option><option value="United Arab Emirates"> United Arab Emirates </option><option value="Uruguay"> Uruguay </option><option value="Uzbekistan"> Uzbekistan </option><option value="Vanuatu"> Vanuatu </option><option value="Venezuela, Bolivarian Republic of"> Venezuela, Bolivarian Republic of </option><option value="Viet Nam"> Viet Nam </option><option value="Virgin Islands, British"> Virgin Islands, British </option><option value="Wallis and Futuna"> Wallis and Futuna </option><option value="Western Sahara"> Western Sahara </option><option value="Yemen"> Yemen </option><option value="Zambia"> Zambia </option><option value="Zimbabwe"> Zimbabwe </option> </optgroup> </select> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="dropdown-icon" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 908 <path fill="currentColor" d="M8 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm9-1a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-2 2a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-3 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm-1-3a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/> 909 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div class="nutrient-input-helper-container"> <p id="dropdown-xfeabv-error" class="nutrient-input-error-text hidden"> Please select a country </p> </div> </div>
909<script type="module">var d=window;d.__dropdownSelectionInjected||(d.__dropdownSelectionInjected=!0,window.addEventListener("pageshow",()=>{document.querySelectorAll("select[astro-dropdown]").forEach(e=>{const o=e.querySelector("option[selected]");o&&(e.value=o.value)})}));</script>
909 </div> <div class="form-field-wrapper secondary hidden" data-placeholder="Select an option" data-hubspot-field="us_state" data-required="false"> <div class="nutrient-input-wrapper"> <label for="dropdown-16noip" class="nutrient-input-label"> STATE </label> <div class="nutrient-dropdown"> <div class="selected-text">Select an option</div> <select id="dropdown-16noip" name="state" data-filter="state" aria-label="STATE" astro-dropdown> <!-- If no option is selected, we do not want tick on any item, so first option is empty and hidden --><!-- "hidden" attribute does not work in safari hence we need to skip rendering it if not needed --><option value="" disabled selected hidden></option> <optgroup label="Select an option"> <option value="Alabama"> Alabama </option><option value="Alaska"> Alaska </option><option value="Arizona"> Arizona </option><option value="Arkansas"> Arkansas </option><option value="California"> California </option><option value="Colorado"> Colorado </option><option value="Connecticut"> Connecticut </option><option value="Delaware"> Delaware </option><option value="Florida"> Florida </option><option value="Georgia"> Georgia </option><option value="Hawaii"> Hawaii </option><option value="Idaho"> Idaho </option><option value="Illinois"> Illinois </option><option value="Indiana"> Indiana </option><option value="Iowa"> Iowa </option><option value="Kansas"> Kansas </option><option value="Kentucky"> Kentucky </option><option value="Louisiana"> Louisiana </option><option value="Maine"> Maine </option><option value="Maryland"> Maryland </option><option value="Massachusetts"> Massachusetts </option><option value="Michigan"> Michigan </option><option value="Minnesota"> Minnesota </option><option value="Mississippi"> Mississippi </option><option value="Missouri"> Missouri </option><option value="Montana"> Montana </option><option value="Nebraska"> Nebraska </option><option value="Nevada"> Nevada </option><option value="New Hampshire"> New Hampshire </option><option value="New Jersey"> New Jersey </option><option value="New Mexico"> New Mexico </option><option value="New York"> New York </option><option value="North Carolina"> North Carolina </option><option value="North Dakota"> North Dakota </option><option value="Ohio"> Ohio </option><option value="Oklahoma"> Oklahoma </option><option value="Oregon"> Oregon </option><option value="Pennsylvania"> Pennsylvania </option><option value="Rhode Island"> Rhode Island </option><option value="South Carolina"> South Carolina </option><option value="South Dakota"> South Dakota </option><option value="Tennessee"> Tennessee </option><option value="Texas"> Texas </option><option value="Utah"> Utah </option><option value="Vermont"> Vermont </option><option value="Virginia"> Virginia </option><option value="Washington"> Washington </option><option value="West Virginia"> West Virginia </option><option value="Wisconsin"> Wisconsin </option><option value="Wyoming"> Wyoming </option> </optgroup> </select> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="dropdown-icon" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 910 <path fill="currentColor" d="M8 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm9-1a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-2 2a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-3 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm-1-3a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/> 911 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div class="nutrient-input-helper-container"> <p id="dropdown-16noip-error" class="nutrient-input-error-text hidden"> Please select a state </p> </div> </div> </div> <div class="form-field-wrapper secondary hidden" data-placeholder="Select an option" data-hubspot-field="canadian_province_territory" data-required="false"> <div class="nutrient-input-wrapper"> <label for="dropdown-9unuci" class="nutrient-input-label"> CANADIAN PROVINCE/TERRITORY </label> <div class="nutrient-dropdown"> <div class="selected-text">Select an option</div> <select id="dropdown-9unuci" name="province" data-filter="province" aria-label="CANADIAN PROVINCE/TERRITORY" astro-dropdown> <!-- If no option is selected, we do not want tick on any item, so first option is empty and hidden --><!-- "hidden" attribute does not work in safari hence we need to skip rendering it if not needed --><option value="" disabled selected hidden></option> <optgroup label="Select an option"> <option value="Alberta"> Alberta </option><option value="British Columbia"> British Columbia </option><option value="Manitoba"> Manitoba </option><option value="New Brunswick">
911 New Brunswick </option><option value="Newfoundland and Labrador"> Newfoundland and Labrador </option><option value="Nova Scotia"> Nova Scotia </option><option value="Ontario"> Ontario </option><option value="Prince Edward Island"> Prince Edward Island </option><option value="Quebec"> Quebec </option><option value="Saskatchewan"> Saskatchewan </option><option value="Northwest Territories"> Northwest Territories </option><option value="Nunavut"> Nunavut </option><option value="Yukon"> Yukon </option> </optgroup> </select> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="dropdown-icon" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 912 <path fill="currentColor" d="M8 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm9-1a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-2 2a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-3 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm-1-3a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/> 913 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div class="nutrient-input-helper-container"> <p id="dropdown-9unuci-error" class="nutrient-input-error-text hidden"> Please select a province/territory </p> </div> </div> </div> <div class="form-field-wrapper secondary" data-placeholder="What product line are you interested in?" data-hubspot-field="meeting_product_interest" data-required="true"> <div class="nutrient-input-wrapper"> <label for="dropdown-uq7yb6" class="nutrient-input-label"> PRODUCT INTEREST </label> <div class="nutrient-dropdown"> <div class="selected-text">What product line are you interested in?</div> <select id="dropdown-uq7yb6" name="productInterest" data-filter="productInterest" aria-label="PRODUCT INTEREST" astro-dropdown> <!-- If no option is selected, we do not want tick on any item, so first option is empty and hidden --><!-- "hidden" attribute does not work in safari hence we need to skip rendering it if not needed --><option value="" disabled selected hidden></option> <optgroup label="What product line are you interested in?"> <option value="SDK"> SDK </option><option value="Low-Code"> Integrations </option><option value="Workflow"> Workflow Automation </option><option value="DWS API"> Cloud </option> </optgroup> </select> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="dropdown-icon" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 914 <path fill="currentColor" d="M8 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm9-1a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-2 2a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-3 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm-1-3a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/> 915 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div class="nutrient-input-helper-container"> <p id="dropdown-uq7yb6-error" class="nutrient-input-error-text hidden"> Please select a product interest </p> </div> </div> </div> <div class="form-field-wrapper secondary hidden" data-placeholder="Which tool are you primarily using?" data-hubspot-field="meeting_product_interest_other" data-required="false"> <div class="nutrient-input-wrapper"> <label for="dropdown-12wh6o" class="nutrient-input-label"> PRIMARY TOOL </label> <div class="nutrient-dropdown"> <div class="selected-text">Which tool are you primarily using?</div> <select id="dropdown-12wh6o" name="integrationsPlatform" data-filter="integrationsPlatform" aria-label="PRIMARY TOOL" astro-dropdown> <!-- If no option is selected, we do not want tick on any item, so first option is empty and hidden --><!-- "hidden" attribute does not work in safari hence we need to skip rendering it if not needed --><option value="" disabled selected hidden></option> <optgroup label="Which tool are you primarily using?"> <option value="Microsoft 365"> Microsoft 365 </option><option value="Salesforce"> Salesforce </option><option value="Hubspot"> Hubspot </option><option value="ServiceNow"> ServiceNow </option><option value="Nintex"> Nintex </option><option value="Windows Server"> Windows Server </option><option value="Other"> Other </option> </optgroup> </select> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="dropdown-icon" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v>
916 <path fill="currentColor" d="M8 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm9-1a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-2 2a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-3 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm-1-3a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/> 917 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div class="nutrient-input-helper-container"> <p id="dropdown-12wh6o-error" class="nutrient-input-error-text hidden"> Please select an integrations platform </p> </div> </div> </div> <div class="form-field-wrapper secondary" data-hubspot-field="meeting_booking_notes"> <div class="nutrient-input-wrapper"> <label for="textarea-9z9lgz" class="nutrient-input-label"> ANYTHING WE SHOULD KNOW TO HELP PREPARE FOR THE CALL? <span class="text-neutral-secondary"> (OPTIONAL)</span> </label> <textarea id="textarea-9z9lgz" name="callNotes" placeholder rows="3" class="nutrient-input resize-dot"></textarea> <div class="nutrient-input-helper-container"> </div> </div> </div> <input type="hidden" name="utm_term" id="utm_term" value data-hubspot-field="utm_term" data-utm-field="true"> <input type="hidden" name="utm_source" id="utm_source" value data-hubspot-field="utm_source" data-utm-field="true"> <input type="hidden" name="utm_medium" id="utm_medium" value data-hubspot-field="utm_medium" data-utm-field="true"> <input type="hidden" name="utm_content" id="utm_content" value data-hubspot-field="utm_content" data-utm-field="true"> <input type="hidden" name="utm_campaign" id="utm_campaign" value data-hubspot-field="utm_campaign" data-utm-field="true"> <input type="text" name="contact_ref_2" style="position: absolute; left: -9999px; width: 1px; height: 1px;" tabindex="-1" autocomplete="off" aria-hidden="true"> </form>
917<script type="module" src="/_astro/Form.astro_astro_type_script_index_0_lang._Fn6Dq-s.js"></script>
917<script type="module" src="/_astro/ScheduleCallForm.astro_astro_type_script_index_0_lang.Bcq2wQNO.js"></script>
917 <div> <p class="mt-0 text-sm text-neutral-secondary"> 918By submitting this form, you agree to Nutrient's <a href="/legal/privacy/" class="text-neutral-secondary">Privacy Policy</a> and <a href="/legal/terms/" class="text-neutral-secondary">Terms of Service</a>. 919</p> </div> <button type="submit" form="global-search-schedule-modal-form" class="btn btn-primary" tabindex="0" role="button"> Next </button> </div> </div> </div> </div> <!-- Close button --> <button type="button" class="modal-close-button" data-modal-close aria-label="Close modal"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="modal-close-icon" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 920 <path fill="currentColor" d="M15 8a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-2 2a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm6-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-7-7a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM9 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 921 </svg><!-- Define styles for the SVG element with the provided color and size --> </button> </div>
921<script type="module">var e=class{modal;modalContent;closeButton;closeOnBackdrop;closeOnEscape;constructor(o){this.modal=o,this.modalContent=o.querySelector("[data-modal-content]"),this.closeButton=o.querySelector("[data-modal-close]"),this.closeOnBackdrop=o.dataset.closeOnBackdrop!=="false",this.closeOnEscape=o.dataset.closeOnEscape!=="false",this.init()}init(){this.closeButton?.addEventListener("click",()=>this.close()),this.closeOnBackdrop&&this.modal.addEventListener("click",o=>{o.target===this.modal&&this.close()}),this.closeOnEscape&&document.addEventListener("keydown",o=>{o.key==="Escape"&&this.isOpen()&&this.close()})}open(){this.modal.parentElement!==document.body&&document.body.appendChild(this.modal),this.modal.classList.remove("modal-closed"),this.modal.classList.add("modal-open"),this.modalContent.classList.remove("modal-content-closed"),this.modalContent.classList.add("modal-content-open"),this.modal.focus(),document.body.style.overflow="hidden",this.modal.dispatchEvent(new CustomEvent("modal:open",{bubbles:!0,detail:{modalId:this.modal.id}}))}close(){this.modal.classList.add("modal-closed"),this.modal.classList.remove("modal-open"),this.modalContent.classList.add("modal-content-closed"),this.modalContent.classList.remove("modal-content-open"),document.body.style.overflow=""}isOpen(){return this.modal.classList.contains("modal-open")}toggle(){this.isOpen()?this.close():this.open()}};document.addEventListener("DOMContentLoaded",()=>{const o=document.querySelectorAll("[data-modal]"),t=new Map;o.forEach(s=>{const d=new e(s);t.set(s.id,d)}),window.modalInstances=t});window.Modal=e;</script>
921 <div id="global-search-schedule-modal-confirmation" class="modal-container modal-closed [&_.modal-close-button]:!hidden" role="dialog" aria-modal="true" aria-label="Thanks, we'll be in touch" data-modal> <div class="modal-content modal-content-closed p-0 !h-auto max-h-[90vh] !overflow-y-auto !radius-container" style="max-width: min(720px, 92vw); max-height: 90vh; width: min(720px, 92vw); height: 90vh;" data-modal-content> <!-- Modal content slot --><div class="modal-slot"> <div class="bg-neutral-default-tertiary px-spacing-sm md:px-spacing-md lg:px-spacing-lg py-spacing-sm md:py-spacing-md lg:py-spacing-lg"> <div class="flex flex-col gap-spacing-2xl" role="status"> <span class="heading-2 text-neutral-primary">Thanks â we'll be in touch</span> <p class="mt-0 text-neutral-secondary"> 922We've received your request and a member of our team will reach out 923 shortly. If your request is urgent, email <a href="mailto:[email protected]" class="text-neutral-secondary">[email protected]</a>. 924</p> <button type="button" class="btn btn-primary" data-modal-close>Close</button> </div> </div> </div> </div> <!-- Close button --> <button type="button" class="modal-close-button" data-modal-close aria-label="Close modal"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="modal-close-icon" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 925 <path fill="currentColor" d="M15 8a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-2 2a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm6-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-7-7a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM9 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 926 </svg><!-- Define styles for the SVG element with the provided color and size --> </button> </div>
926<script type="module" src="/_astro/ScheduleCallModal.astro_astro_type_script_index_0_lang.CMV0dHeY.js"></script>
926 </div> </aside> </div> </div> </section> </div> <!-- Templates for dynamic content cloning --> <!-- Tag remove icon (X button) - Used in FilterTagsRenderer --><template id="global-search-tag-remove-template"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="20" height="20" class width="20" height="20" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 927 <path fill="currentColor" d="M15 8a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-2 2a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm6-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-7-7a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM9 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 928 </svg><!-- Define styles for the SVG element with the provided color and size --> </template> <!-- Arrow icon for navigation - Used in result items --> <template id="global-search-arrow-template"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="20" height="20" class width="20" height="20" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 929 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 930 </svg><!-- Define styles for the SVG element with the provided color and size --> </template> <!-- Question/bullet icon - Used in AI suggestions --> <template id="global-search-question-template"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="20" height="20" class width="20" height="20" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 931 <path fill="currentColor" d="M12 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm1 2a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm-3 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm3 3a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm3-3a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/> 932 </svg><!-- Define styles for the SVG element with the provided color and size --> </template> <!-- Loading spinner - Used in ResultsRenderer during search --> <template id="global-search-loading-template"> <div class="centered-state-base"> <div class="global-search-loading-spinner"></div> </div> </template>
932<script type="module" src="/_astro/GlobalSearchDrawer.astro_astro_type_script_index_0_lang.YrGcySPm.js"></script>
932<script type="module" src="/_astro/Header.astro_astro_type_script_index_0_lang.DSLjO0VQ.js"></script>
932<!-- Global search trigger wiring lives in `GlobalSearchDrawer.astro` via `[data-global-search-trigger]`. 933 Keeping it there avoids duplicate listeners (double-toggle) across Astro swaps. --> <main> <div class="page-wrapper nutrient-blog"> <section class="section-spacing-horizontal-default !py-0"> <div class="container-large radius-container container-spacing-horizontal-default !py-0"> <div class="container grid gap-6 blog-header"> <div class="blog-header-title"> <nav aria-label="Breadcrumb" class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList"> <ol class="flex flex-wrap items-center"> <li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> <a href="/blog/" class="text-neutral-primary hover:underline" id="breadcrumb-link-blog"> <span itemprop="name">Blog</span> </a> <link itemprop="item" href="https://www.nutrient.io/blog/"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="breadcrumb-icon h-4 w-4 mx-2 icon-neutral-primary" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 934 <path fill="currentColor" d="M11 16a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-9a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"/> 935 </svg><!-- Define styles for the SVG element with the provided color and size --> <meta itemprop="position" content="1"> </li><li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> <link itemprop="item" href="https://www.nutrient.io/blog/news/"> <span class="text-neutral-primary" aria-current="page" itemprop="name"> News </span> <meta itemprop="position" content="2"> </li> </ol>
935<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog","item":"https://www.nutrient.io/blog/"},{"@type":"ListItem","position":2,"name":"News","item":"https://www.nutrient.io/blog/news/"}]}</script>
935 </nav> </div> <div class="blog-filters"> <div class="blog-filters-container"> <h2 class="sr-only">Blog Filters</h2> <div class="blog-filters-wrapper"> <!-- Category Select --><div class="blog-filter-group category-select"> <h3 class="sr-only">Category Filter</h3> <div class="category-select-wrapper" role="group" aria-labelledby="category-select-label"> <span id="category-select-label" class="sr-only">Filter by Category</span> <select id="category-select" class="category-select-hidden" aria-hidden="true" tabindex="-1"> <option value="/blog/">All Categories</option> <option value="/blog/categories/ai/"> AI </option><option value="/blog/categories/api/"> API </option><option value="/blog/cloud/"> Cloud </option><option value="/blog/categories/company/"> Company </option><option value="/blog/categories/customer-stories/"> Customer Stories </option><option value="/blog/categories/design/"> Design </option><option value="/blog/categories/development/"> Development </option><option value="/blog/categories/digital-signatures/"> Digital Signatures </option><option value="/blog/categories/insights/"> Insights </option><option value="/blog/categories/integrations/"> Integrations </option><option value="/blog/categories/learning/"> Learning </option><option value="/blog/low-code/"> Low-Code </option><option value="/blog/news/" selected> News </option><option value="/blog/categories/performance/"> Performance </option><option value="/blog/categories/productivity/"> Productivity </option><option value="/blog/categories/products/"> Products </option><option value="/blog/categories/releases/"> Releases </option><option value="/blog/sdk/"> SDK </option><option value="/blog/categories/security/"> Security </option><option value="/blog/categories/solutions/"> Solutions </option><option value="/blog/categories/tutorials/"> Tutorials </option><option value="/blog/categories/web/"> Web </option><option value="/blog/workflow/"> Workflow </option><option value="/blog/categories/workflow-automation/"> Workflow Automation </option><option value="/blog/categories/visionos/"> visionOS </option> </select> <div id="category-select-container" class="category-select-container" role="combobox" aria-expanded="false" aria-haspopup="listbox" aria-controls="category-select-dropdown" aria-owns="category-select-dropdown" aria-labelledby="category-select-label" tabindex="0"> <span class="category-selected-text"> News </span> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="1.5rem" height="1.5rem" class="nav-arrow nav-arrow-select category-toggle-icon" width="1.5rem" height="1.5rem" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 936<path d="M8 11C8.55228 11 9 10.5523 9 10C9 9.44772 8.55228 9 8 9C7.44772 9 7 9.44771 7 10C7 10.5523 7.44771 11 8 11Z" fill="currentColor"></path> 937<path d="M17 10C17 10.5523 16.5523 11 16 11C15.4477 11 15 10.5523 15 10C15 9.44771 15.4477 9 16 9C16.5523 9 17 9.44772 17 10Z" fill="currentColor"></path> 938<path d="M15 12C15 12.5523 14.5523 13 14 13C13.4477 13 13 12.5523 13 12C13 11.4477 13.4477 11 14 11C14.5523 11 15 11.4477 15 12Z" fill="currentColor"></path> 939<path d="M12 15C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13C11.4477 13 11 13.4477 11 14C11 14.5523 11.4477 15 12 15Z" fill="currentColor"></path> 940<path d="M11 12C11 12.5523 10.5523 13 10 13C9.44772 13 9 12.5523 9 12C9 11.4477 9.44772 11 10 11C10.5523 11 11 11.4477 11 12Z" fill="currentColor"></path> 941 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <div id="category-select-dropdown" class="blog-filter-dropdown-base category-select-dropdown select-dropdown-hidden" role="listbox"> <div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/" tabindex="0"> 942All Categories 943</div> <div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/ai/" tabindex="0"> AI </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/api/" tabindex="0"> API </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/cloud/" tabindex="0"> Cloud </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/company/" tabindex="0"> Company </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/customer-stories/" tabindex="0"> Customer Stories </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/design/" tabindex="0"> Design </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/development/" tabindex="0"> Development </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/digital-signatures/" tabindex="0"> Digital Signatures </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/insights/" tabindex="0"> Insights </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/integrations/" tabindex="0"> Integrations </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/learning/" tabindex="0">
943 Learning </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/low-code/" tabindex="0"> Low-Code </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/news/" tabindex="0"> News </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/performance/" tabindex="0"> Performance </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/productivity/" tabindex="0"> Productivity </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/products/" tabindex="0"> Products </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/releases/" tabindex="0"> Releases </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/sdk/" tabindex="0"> SDK </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/security/" tabindex="0"> Security </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/solutions/" tabindex="0"> Solutions </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/tutorials/" tabindex="0"> Tutorials </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/web/" tabindex="0"> Web </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/workflow/" tabindex="0"> Workflow </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/workflow-automation/" tabindex="0"> Workflow Automation </div><div class="blog-filter-option-base category-select-option" role="option" data-value="/blog/categories/visionos/" tabindex="0"> visionOS </div> </div> </div> </div> <!-- Tags Multi-Select --> <div class="blog-filter-group"> <div class="blog-select-tag-wrapper" role="group" aria-labelledby="tag-select-label"> <span id="tag-select-label" class="sr-only"> 944Filter by Tags 945</span> <select id="tag-select-8t12ntw" multiple class="multi-select-hidden" aria-hidden="true" tabindex="-1"> <option value="Media coverage"> Media coverage </option><option value="Press release"> Press release </option><option value="Security"> Security </option> </select> <div id="tag-select-8t12ntw-container" class="tag-select-container" role="combobox" aria-expanded="false" aria-haspopup="listbox" aria-controls="tag-select-8t12ntw-dropdown" aria-owns="tag-select-8t12ntw-dropdown" aria-labelledby="tag-select-label" aria-activedescendant=""> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="1.5rem" height="1.5rem" class="nav-arrow nav-arrow-select tag-toggle-icon" width="1.5rem" height="1.5rem" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 946<path d="M8 11C8.55228 11 9 10.5523 9 10C9 9.44772 8.55228 9 8 9C7.44772 9 7 9.44771 7 10C7 10.5523 7.44771 11 8 11Z" fill="currentColor"></path> 947<path d="M17 10C17 10.5523 16.5523 11 16 11C15.4477 11 15 10.5523 15 10C15 9.44771 15.4477 9 16 9C16.5523 9 17 9.44772 17 10Z" fill="currentColor"></path> 948<path d="M15 12C15 12.5523 14.5523 13 14 13C13.4477 13 13 12.5523 13 12C13 11.4477 13.4477 11 14 11C14.5523 11 15 11.4477 15 12Z" fill="currentColor"></path> 949<path d="M12 15C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13C11.4477 13 11 13.4477 11 14C11 14.5523 11.4477 15 12 15Z" fill="currentColor"></path> 950<path d="M11 12C11 12.5523 10.5523 13 10 13C9.44772 13 9 12.5523 9 12C9 11.4477 9.44772 11 10 11C10.5523 11 11 11.4477 11 12Z" fill="currentColor"></path> 951 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <template id="tag-remove-icon-template"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="tag-remove-icon" width="24" height="24" aria-label="Remove tag" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v>
952 <path fill="currentColor" d="M15 8a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-2 2a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm6-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-7-7a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM9 8a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 953 </svg><!-- Define styles for the SVG element with the provided color and size --> </template> <template id="tag-check-icon-template"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="tag-option-check-icon" width="24" height="24" aria-hidden="true" role="presentation" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 954 <path fill="currentColor" d="M18 7a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-2 2a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1-3a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3-1a1 1 0 1 1 2 0 1 1 0 0 1-2 0Z"/> 955 </svg><!-- Define styles for the SVG element with the provided color and size --> </template> </div> </div> <!-- Browse Tags button (main blog view only â category pages have the tag multi-select) --> </div> </div>
955<script>(function(){const isOverviewPage = true; 956 957 // Variables passed from Astro component 958 959 const isOverviewPageValue = isOverviewPage; 960 961 // Global dropdown manager to ensure only one dropdown is open at a time 962 const dropdownManager = { 963 activeDropdown: null, 964 categoryDropdown: null, 965 tagsDropdown: null, 966 967 register: function (type, showFn, hideFn) { 968 if (type === "category") { 969 this.categoryDropdown = { show: showFn, hide: hideFn }; 970 } else if (type === "tags") { 971 this.tagsDropdown = { show: showFn, hide: hideFn }; 972 } 973 }, 974 975 show: function (type) { 976 // Close any currently active dropdown 977 if (this.activeDropdown && this.activeDropdown !== type) { 978 if (this.activeDropdown === "category" && this.categoryDropdown) { 979 this.categoryDropdown.hide(); 980 } else if (this.activeDropdown === "tags" && this.tagsDropdown) { 981 this.tagsDropdown.hide(); 982 } 983 } 984 985 // Show the requested dropdown 986 if (type === "category" && this.categoryDropdown) { 987 this.categoryDropdown.show(); 988 this.activeDropdown = "category"; 989 } else if (type === "tags" && this.tagsDropdown) { 990 this.tagsDropdown.show(); 991 this.activeDropdown = "tags"; 992 } 993 }, 994 995 hide: function (type) { 996 if (this.activeDropdown === type) { 997 this.activeDropdown = null; 998 } 999 }, 1000 }; 1001 1002 document.addEventListener("DOMContentLoaded", function () { 1003 // Initialize the category select component 1004 initCategorySelect(); 1005 1006 // Initialize the multi-select component 1007 const multiSelectId = document.querySelector( 1008 ".blog-select-tag-wrapper select", 1009 )?.id; 1010 if (multiSelectId) { 1011 initMultiSelectTag(multiSelectId); 1012 } 1013 }); 1014 1015 // Category select implementation 1016 function initCategorySelect() { 1017 const container = document.getElementById("category-select-container"); 1018 const dropdown = document.getElementById("category-select-dropdown"); 1019 const toggleIcon = container?.querySelector(".category-toggle-icon"); 1020 1021 if (!container || !dropdown) return; 1022 1023 // Handle container click to toggle dropdown 1024 container.addEventListener("click", function (e) { 1025 e.stopPropagation(); 1026 if (container.getAttribute("aria-expanded") === "true") { 1027 hideCategoryDropdown(); 1028 } else { 1029 dropdownManager.show("category"); 1030 } 1031 }); 1032 1033 // Handle keyboard navigation 1034 container.addEventListener("keydown", function (e) { 1035 if (e.key === "Enter" || e.key === " ") { 1036 e.preventDefault(); 1037 if (container.getAttribute("aria-expanded") === "true") { 1038 hideCategoryDropdown(); 1039 } else { 1040 dropdownManager.show("category"); 1041 } 1042 } else if (e.key === "ArrowDown") { 1043 e.preventDefault(); 1044 dropdownManager.show("category"); 1045 const firstOption = dropdown.querySelector(".category-select-option"); 1046 if (firstOption) firstOption.focus(); 1047 } 1048 }); 1049 1050 // Handle option clicks 1051 dropdown.addEventListener("click", function (e) { 1052 const option = e.target.closest(".category-select-option"); 1053 if (option) { 1054 const value = option.getAttribute("data-value"); 1055 const text = option.textContent; 1056 selectCategoryOption(value, text); 1057 } 1058 }); 1059 1060 // Handle option keyboard navigation 1061 dropdown.addEventListener("keydown", function (e) { 1062 const options = Array.from( 1063 dropdown.querySelectorAll(".category-select-option"), 1064 ); 1065 const currentIndex = options.indexOf(document.activeElement); 1066 1067 if (e.key === "Enter" || e.key === " ") { 1068 e.preventDefault(); 1069 const option = e.target; 1070 if (option.classList.contains("category-select-option")) { 1071 const value = option.getAttribute("data-value"); 1072 const text = option.textContent; 1073 selectCategoryOption(value, text); 1074 } 1075 } else if (e.key === "ArrowDown") { 1076 e.preventDefault(); 1077 const nextIndex = (currentIndex + 1) % options.length; 1078 options[nextIndex].focus(); 1079 } else if (e.key === "ArrowUp") { 1080 e.preventDefault(); 1081 if (currentIndex === 0) { 1082 container.focus(); 1083 } else { 1084 const prevIndex = 1085 (currentIndex - 1 + options.length) % options.length; 1086 options[prevIndex].focus(); 1087 } 1088 } else if (e.key === "Escape") { 1089 e.preventDefault(); 1090 hideCategoryDropdown(); 1091 container.focus(); 1092 } 1093 }); 1094 1095 // Handle clicks outside the component 1096 document.addEventListener("click", function (e) { 1097 if (!container.contains(e.target) && !dropdown.contains(e.target)) { 1098 hideCategoryDropdown(); 1099 } 1100 }); 1101 1102 function showCategoryDropdown() { 1103 container.setAttribute("aria-expanded", "true"); 1104 dropdown.classList.remove("select-dropdown-hidden"); 1105 if (toggleIcon) toggleIcon.classList.add("menu-caret-animated"); 1106 } 1107 1108 function hideCategoryDropdown() { 1109 container.setAttribute("aria-expanded", "false"); 1110 dropdown.classList.add("select-dropdown-hidden"); 1111 if (toggleIcon) toggleIcon.classList.remove("menu-caret-animated"); 1112 dropdownManager.hide("category"); 1113 } 1114 1115 // Register this dropdown with the manager 1116 dropdownManager.register( 1117 "category", 1118 showCategoryDropdown, 1119 hideCategoryDropdown, 1120 ); 1121 1122 function selectCategoryOption(value, text) { 1123 // Update the displayed text 1124 const selectedText = container.querySelector(".category-selected-text"); 1125 if (selectedText) { 1126 selectedText.textContent = text; 1127 } 1128 1129 // Hide the dropdown 1130 hideCategoryDropdown(); 1131 container.focus(); 1132 1133 // Navigate to the selected URL 1134 window.location.href = value; 1135 } 1136 } 1137 1138 // Screen reader announcement function 1139 function announceToScreenReader(message) { 1140 const announcement = document.createElement("div"); 1141 announcement.setAttribute("aria-live", "polite"); 1142 announcement.setAttribute("aria-atomic", "true"); 1143 announcement.className = "sr-only"; 1144 announcement.textContent = message; 1145 document.body.appendChild(announcement); 1146 1147 // Remove the announcement element after a brief delay 1148 setTimeout(() => { 1149 document.body.removeChild(announcement); 1150 }, 1000); 1151 } 1152 1153 // Optimized option creation utilities 1154 const OptionCreator = { 1155 // Cache template elements for performance 1156 checkIconTemplate: null, 1157 1158 init() { 1159 this.checkIconTemplate = document.getElementById( 1160 "tag-check-icon-template", 1161 ); 1162 }, 1163 1164 // DRY: Centralized option creation 1165 createOption(option) { 1166 const optionEl = document.createElement("div"); 1167 const optionId = `option-${option.value.replace(/\s+/g, "-").toLowerCase()}`; 1168 1169 // Set all attributes at once for better performance 1170 Object.assign(optionEl, { 1171 className: "blog-filter-option-base tag-multi-select-option", 1172 tabIndex: 0, 1173 }); 1174 1175 optionEl.setAttribute("role", "option"); 1176 optionEl.setAttribute("id", optionId); 1177 optionEl.setAttribute("data-value", option.value); 1178 optionEl.setAttribute( 1179 "aria-selected", 1180 option.selected ? "true" : "false", 1181 ); 1182 1183 if (option.selected) { 1184 optionEl.classList.add("selected"); 1185 optionEl.setAttribute("aria-describedby", `${optionId}-desc`); 1186 } 1187 1188 // Create structured content 1189 this.appendOptionContent(optionEl, option, optionId); 1190 1191 return optionEl; 1192 }, 1193 1194 // DRY: Centralized content creation 1195 appendOptionContent(optionEl, option, optionId) { 1196 // Checkbox container 1197 const checkboxEl = document.createElement("div"); 1198 checkboxEl.className = "tag-option-checkbox"; 1199 1200 // Clone check icon (cached template) 1201 if (this.checkIconTemplate) { 1202 const checkIconClone = document.importNode( 1203 this.checkIconTemplate.content, 1204 true, 1205 ); 1206 checkboxEl.appendChild(checkIconClone); 1207 } 1208 1209 // Text content 1210 const textEl = document.createElement("span"); 1211 textEl.textContent = option.textContent; 1212 1213 // Accessibility description 1214 const descEl = document.createElement("span"); 1215 descEl.id = `${optionId}-desc`; 1216 descEl.className = "sr-only"; 1217 descEl.textContent = option.selected ? "Selected" : "Not selected"; 1218 1219 // Append all content 1220 optionEl.appendChild(checkboxEl); 1221 optionEl.appendChild(textEl); 1222 optionEl.appendChild(descEl); 1223 }, 1224 1225 // DRY: Centralized state update 1226 updateOptionState(optionEl, isSelected) { 1227 const desc = optionEl.querySelector(`#${optionEl.id}-desc`); 1228 1229 if (isSelected) { 1230 optionEl.classList.add("selected"); 1231 optionEl.setAttribute("aria-selected", "true"); 1232 if (desc) desc.textContent = "Selected"; 1233 } else { 1234 optionEl.classList.remove("selected"); 1235 optionEl.setAttribute("aria-selected", "false"); 1236 if (desc) desc.textContent = "Not selected"; 1237 } 1238 }, 1239 }; 1240 1241 // Multi-select tag implementation 1242 function initMultiSelectTag(selectId) { 1243 const select = document.getElementById(selectId); 1244 if (!select) return; 1245 1246 const container = document.getElementById(`${selectId}-container`); 1247 if (!container) return; 1248 1249 // Initialize option creator 1250 OptionCreator.init(); 1251 1252 // Get URL parameters to initialize selected tags 1253 const url = new URL(window.location.href); 1254 const tagsParam = url.searchParams.get("tags"); 1255 1256 // If there are tags in the URL, select them in the select element 1257 if (tagsParam) { 1258 const selectedTags = tagsParam 1259 .split(",") 1260 .map((tag) => { 1261 try { 1262 return decodeURIComponent(tag.trim()); 1263 } catch { 1264 return tag.trim(); 1265 } 1266 }) 1267 .filter((tag) => tag !== ""); 1268 1269 // Update the select element options based on URL parameters
1270 Array.from(select.options).forEach((option) => { 1271 const optionValue = option.value.toLowerCase(); 1272 option.selected = selectedTags.some( 1273 (tag) => tag.toLowerCase() === optionValue, 1274 ); 1275 }); 1276 } 1277 1278 // Create the input field 1279 const inputContainer = document.createElement("div"); 1280 inputContainer.className = "tag-multi-select-input-container"; 1281 container.appendChild(inputContainer); 1282 1283 // Create the selected tags and input field 1284 updateSelectedTags(); 1285 1286 // Create the dropdown 1287 const dropdown = document.createElement("div"); 1288 dropdown.className = 1289 "blog-filter-dropdown-base tag-multi-select-dropdown select-dropdown-hidden"; 1290 dropdown.id = `${selectId}-dropdown`; 1291 dropdown.setAttribute("role", "listbox"); 1292 dropdown.setAttribute("aria-multiselectable", "true"); 1293 container.parentNode.appendChild(dropdown); 1294 1295 // Performance: Use event delegation with passive listeners where possible 1296 dropdown.addEventListener("click", handleDropdownClick, { passive: false }); 1297 dropdown.addEventListener("keydown", handleDropdownKeydown, { 1298 passive: false, 1299 }); 1300 dropdown.addEventListener("focus", handleDropdownFocus, { 1301 passive: true, 1302 capture: true, 1303 }); 1304 1305 // Add click event to container to focus the input 1306 container.addEventListener("click", function (e) { 1307 // Don't process clicks on tags or remove buttons 1308 if ( 1309 e.target.closest(".selected-tag") || 1310 e.target.closest(".selected-tag-remove") 1311 ) { 1312 return; 1313 } 1314 1315 const input = container.querySelector(".tag-multi-select-input"); 1316 if (input) { 1317 input.focus(); 1318 dropdownManager.show("tags"); 1319 } 1320 }); 1321 1322 // Add click event to the arrow icon 1323 const toggleIcon = container.querySelector(".tag-toggle-icon"); 1324 if (toggleIcon) { 1325 toggleIcon.addEventListener("click", function (e) { 1326 e.stopPropagation(); // Prevent container click event 1327 const input = container.querySelector(".tag-multi-select-input"); 1328 if (container.classList.contains("active")) { 1329 hideDropdown(); 1330 input?.blur(); 1331 toggleIcon.classList.remove("menu-caret-animated"); 1332 } else { 1333 dropdownManager.show("tags"); 1334 input?.focus(); 1335 toggleIcon.classList.add("menu-caret-animated"); 1336 } 1337 }); 1338 } 1339 1340 // Handle dropdown display 1341 function showDropdown() { 1342 container.classList.add("active"); 1343 container.setAttribute("aria-expanded", "true"); 1344 dropdown.classList.remove("select-dropdown-hidden"); 1345 const input = container.querySelector(".tag-multi-select-input"); 1346 if (input) input.setAttribute("aria-expanded", "true"); 1347 const toggleIcon = container.querySelector(".tag-toggle-icon"); 1348 if (toggleIcon) toggleIcon.classList.add("menu-caret-animated"); 1349 populateDropdown(); 1350 } 1351 1352 function hideDropdown() { 1353 container.classList.remove("active"); 1354 container.setAttribute("aria-expanded", "false"); 1355 dropdown.classList.add("select-dropdown-hidden"); 1356 const input = container.querySelector(".tag-multi-select-input"); 1357 if (input) input.setAttribute("aria-expanded", "false"); 1358 const toggleIcon = container.querySelector(".tag-toggle-icon"); 1359 if (toggleIcon) toggleIcon.classList.remove("menu-caret-animated"); 1360 dropdownManager.hide("tags"); 1361 } 1362 1363 // Register this dropdown with the manager 1364 dropdownManager.register("tags", showDropdown, hideDropdown); 1365 1366 // Handle clicks outside the component 1367 document.addEventListener("click", function (e) { 1368 if (!container.contains(e.target) && !dropdown.contains(e.target)) { 1369 hideDropdown(); 1370 } 1371 }); 1372 1373 // Update the selected tags UI 1374 function updateSelectedTags() { 1375 // Clear the input container 1376 inputContainer.innerHTML = ""; 1377 1378 const selectedOptions = Array.from(select.selectedOptions); 1379 1380 // Set data attribute for tracking tag count 1381 inputContainer.setAttribute("data-tag-count", selectedOptions.length); 1382 1383 // Reset counter mode when no tags are selected 1384 if (selectedOptions.length === 0) { 1385 inputContainer.removeAttribute("data-was-counter"); 1386 } 1387 1388 // Always start with individual tags layout - let browser do the layout 1389 createIndividualTagsLayout(selectedOptions, setupInputHandlers); 1390 1391 // Only check for space optimization if there are tags selected 1392 if (selectedOptions.length > 0) { 1393 // Use a single requestAnimationFrame after layout is complete 1394 requestAnimationFrame(() => { 1395 checkIfOptimizationNeeded(selectedOptions); 1396 }); 1397 } 1398 1399 // Simple, reliable check: measure actual rendered input width 1400 function checkIfOptimizationNeeded(selectedOptions) { 1401 const input = inputContainer.querySelector(".tag-multi-select-input"); 1402 if (!input) return; 1403 1404 // Simple rule: if input is squeezed below a comfortable width, use counter
1405 const inputWidth = input.getBoundingClientRect().width; 1406 const minComfortableWidth = 50; // Consistent with resize monitoring 1407 1408 if (inputWidth < minComfortableWidth) { 1409 // Switch to counter layout 1410 performLayoutSwitch(() => { 1411 switchToCounterLayout(selectedOptions); 1412 }); 1413 } else { 1414 // Set up monitoring for future changes 1415 setupPersistentResizeMonitoring(); 1416 } 1417 } 1418 1419 // Create counter layout directly 1420 function createCounterLayout(selectedOptions, setupInputHandlers) { 1421 // Mark that we're using counter layout 1422 inputContainer.setAttribute("data-was-counter", "true"); 1423 1424 // Create counter tag 1425 const tag = document.createElement("div"); 1426 tag.className = "selected-tag selected-tag-count"; 1427 1428 const textSpan = document.createElement("span"); 1429 textSpan.textContent = `${selectedOptions.length} tags`; 1430 tag.appendChild(textSpan); 1431 1432 const removeSpan = document.createElement("span"); 1433 removeSpan.className = "selected-tag-remove"; 1434 removeSpan.setAttribute("data-value", "clear-all"); 1435 removeSpan.setAttribute("role", "button"); 1436 removeSpan.setAttribute("tabindex", "0"); 1437 removeSpan.setAttribute("aria-label", "Clear all tags"); 1438 1439 const iconTemplate = document.getElementById( 1440 "tag-remove-icon-template", 1441 ); 1442 if (iconTemplate) { 1443 const iconClone = document.importNode(iconTemplate.content, true); 1444 removeSpan.appendChild(iconClone); 1445 } 1446 1447 removeSpan.addEventListener("click", function (e) { 1448 e.stopPropagation(); 1449 Array.from(select.selectedOptions).forEach((option) => { 1450 option.selected = false; 1451 }); 1452 updateSelectedTags(); 1453 updateURL(); 1454 populateDropdown(); 1455 dropdownManager.show("tags"); 1456 }); 1457 1458 removeSpan.addEventListener("keydown", function (e) { 1459 if (e.key === "Enter" || e.key === " ") { 1460 e.preventDefault(); 1461 e.stopPropagation(); 1462 Array.from(select.selectedOptions).forEach((option) => { 1463 option.selected = false; 1464 }); 1465 updateSelectedTags(); 1466 updateURL(); 1467 populateDropdown(); 1468 dropdownManager.show("tags"); 1469 } 1470 }); 1471 1472 tag.appendChild(removeSpan); 1473 inputContainer.appendChild(tag); 1474 1475 // Add input field 1476 const input = document.createElement("input"); 1477 input.type = "text"; 1478 input.className = "tag-multi-select-input"; 1479 input.setAttribute("role", "combobox"); 1480 input.setAttribute("aria-label", "Search and select tags"); 1481 input.setAttribute("aria-expanded", "false"); 1482 input.setAttribute("aria-controls", `${selectId}-dropdown`); 1483 input.setAttribute("aria-autocomplete", "list"); 1484 input.placeholder = selectedOptions.length ? "" : "Select tags..."; 1485 1486 inputContainer.appendChild(input); 1487 setupInputHandlers(input); 1488 1489 // Set up resize monitoring for counter layout too 1490 setupPersistentResizeMonitoring(); 1491 } 1492 1493 // Global state to prevent resize observer loops - declare outside functions 1494 let globalResizeObserver = null; 1495 let lastLayoutChangeTime = 0; 1496 let isInTransition = false; 1497 1498 // Centralized resize monitoring that persists across layout changes 1499 function setupPersistentResizeMonitoring() { 1500 // Clean up any existing observer 1501 if (globalResizeObserver) { 1502 globalResizeObserver.disconnect(); 1503 } 1504 1505 let resizeTimeout; 1506 1507 globalResizeObserver = new ResizeObserver(() => { 1508 clearTimeout(resizeTimeout); 1509 resizeTimeout = setTimeout(() => { 1510 // Skip if we just changed layouts recently or are in transition 1511 const timeSinceLastChange = Date.now() - lastLayoutChangeTime; 1512 if (timeSinceLastChange < 500 || isInTransition) { 1513 return; 1514 } 1515 1516 const currentSelectedOptions = Array.from(select.selectedOptions); 1517 if (currentSelectedOptions.length === 0) return; 1518 1519 requestAnimationFrame(() => { 1520 const input = inputContainer.querySelector( 1521 ".tag-multi-select-input", 1522 ); 1523 if (!input) return; 1524
1525 const inputWidth = input.getBoundingClientRect().width; 1526 const isCurrentlyCounter = 1527 inputContainer.hasAttribute("data-was-counter"); 1528 1529 // Only switch if there's a significant difference to avoid oscillation 1530 // Use a larger hysteresis gap between thresholds 1531 if (!isCurrentlyCounter && inputWidth < 50) { 1532 // Switch to counter (lower threshold) 1533 performLayoutSwitch(() => { 1534 switchToCounterLayout(currentSelectedOptions); 1535 }); 1536 } else if (isCurrentlyCounter && inputWidth >= 180) { 1537 // Switch back to individual (much larger gap to prevent oscillation) 1538 performLayoutSwitch(() => { 1539 switchToIndividualLayout(currentSelectedOptions); 1540 }); 1541 } 1542 }); 1543 }, 200); // Longer debounce for more stability 1544 }); 1545 1546 globalResizeObserver.observe(inputContainer); 1547 } 1548 1549 // Helper to manage layout transitions 1550 function performLayoutSwitch(switchFunction) { 1551 isInTransition = true; 1552 lastLayoutChangeTime = Date.now(); 1553 1554 switchFunction(); 1555 1556 // Reset transition state after a delay 1557 setTimeout(() => { 1558 isInTransition = false; 1559 }, 300); 1560 } 1561 1562 // Helper function to switch to counter layout 1563 function switchToCounterLayout(selectedOptions) { 1564 inputContainer.setAttribute("data-was-counter", "true"); 1565 inputContainer.innerHTML = ""; 1566 createCounterLayout(selectedOptions, setupInputHandlers); 1567 } 1568 1569 // Helper function to switch to individual layout 1570 function switchToIndividualLayout(selectedOptions) { 1571 inputContainer.removeAttribute("data-was-counter"); 1572 inputContainer.innerHTML = ""; 1573 createIndividualTagsLayout(selectedOptions, setupInputHandlers); 1574 1575 // Set up monitoring in the new layout with a longer delay 1576 // Allow the layout to settle before making decisions 1577 setTimeout(() => { 1578 // Only check if we're not in transition and haven't switched recently 1579 if (isInTransition || Date.now() - lastLayoutChangeTime < 500) { 1580 setupPersistentResizeMonitoring(); 1581 return; 1582 } 1583 1584 const input = inputContainer.querySelector(".tag-multi-select-input"); 1585 if (input && input.getBoundingClientRect().width < 50) { 1586 // If still too tight, go back to counter 1587 performLayoutSwitch(() => { 1588 switchToCounterLayout(selectedOptions); 1589 }); 1590 } else { 1591 setupPersistentResizeMonitoring(); 1592 } 1593 }, 100); // Give layout time to settle 1594 } 1595 1596 // Helper function to create individual tag layout 1597 function createIndividualTagsLayout(selectedOptions, setupInputHandlers) { 1598 // Clear counter layout marker since we're using individual layout 1599 inputContainer.removeAttribute("data-was-counter"); 1600 1601 // Add selected tags directly to container 1602 selectedOptions.forEach((option) => { 1603 const tag = document.createElement("div"); 1604 tag.className = "selected-tag"; 1605 1606 const textSpan = document.createElement("span"); 1607 textSpan.textContent = option.textContent; 1608 tag.appendChild(textSpan); 1609 1610 const removeSpan = document.createElement("span"); 1611 removeSpan.className = "selected-tag-remove"; 1612 removeSpan.setAttribute("data-value", option.value); 1613 removeSpan.setAttribute("role", "button"); 1614 removeSpan.setAttribute("tabindex", "0"); 1615 removeSpan.setAttribute( 1616 "aria-label", 1617 `Remove ${option.textContent} tag`, 1618 ); 1619 1620 const iconTemplate = document.getElementById( 1621 "tag-remove-icon-template", 1622 ); 1623 if (iconTemplate) { 1624 const iconClone = document.importNode(iconTemplate.content, true); 1625 removeSpan.appendChild(iconClone); 1626 } 1627 1628 tag.appendChild(removeSpan); 1629 inputContainer.appendChild(tag); 1630 1631 removeSpan.addEventListener("click", function (e) { 1632 e.stopPropagation(); 1633 removeTag(this.getAttribute("data-value")); 1634 }); 1635 1636 removeSpan.addEventListener("keydown", function (e) { 1637 if (e.key === "Enter" || e.key === " ") { 1638 e.preventDefault(); 1639 e.stopPropagation(); 1640 removeTag(this.getAttribute("data-value")); 1641 } 1642 }); 1643 }); 1644 1645 // Add input field 1646 const input = document.createElement("input"); 1647 input.type = "text"; 1648 input.className = "tag-multi-select-input"; 1649 input.setAttribute("role", "combobox"); 1650 input.setAttribute("aria-label", "Search and select tags"); 1651 input.setAttribute("aria-expanded", "false"); 1652 input.setAttribute("aria-controls", `${selectId}-dropdown`); 1653 input.setAttribute("aria-autocomplete", "list"); 1654 input.placeholder = selectedOptions.length ? "" : "Select tags..."; 1655 1656 inputContainer.appendChild(input); 1657 setupInputHandlers(input); 1658 } 1659 1660 function setupInputHandlers(input) { 1661 // Handle input focus 1662 input.addEventListener("focus", function () { 1663 dropdownManager.show("tags"); 1664 }); 1665 1666 // Handle input for filtering 1667 input.addEventListener("input", function () { 1668 populateDropdown(this.value); 1669 }); 1670 1671 // Handle keyboard navigation 1672 input.addEventListener("keydown", function (e) { 1673 if (e.key === "Backspace" && !this.value) { 1674 if (selectedOptions.length) { 1675 const removedTag = selectedOptions[selectedOptions.length - 1]; 1676 removeTag(removedTag.value); 1677 announceToScreenReader(`${removedTag.textContent} removed`); 1678 1679 // Focus the input after tag removal and position cursor at the end 1680 requestAnimationFrame(() => { 1681 const newInput = inputContainer.querySelector( 1682 ".tag-multi-select-input", 1683 ); 1684 if (newInput) { 1685 newInput.focus(); 1686 // Position cursor at the end of the input 1687 newInput.setSelectionRange( 1688 newInput.value.length, 1689 newInput.value.length, 1690 ); 1691 } 1692 }); 1693 } 1694 } else if (e.key === "ArrowDown") { 1695 e.preventDefault(); 1696 const firstOption = dropdown.querySelector( 1697 ".tag-multi-select-option", 1698 ); 1699 if (firstOption) { 1700 firstOption.focus(); 1701 } 1702 } else if (e.key === "Escape") { 1703 e.preventDefault(); 1704 hideDropdown(); 1705 } 1706 }); 1707 } 1708 } 1709 1710 // Use CSS container queries instead of ResizeObserver to avoid forced reflows 1711 // The layout switching is now handled purely by CSS based on container size 1712 1713 // Event delegation handlers for better performance 1714 function handleDropdownClick(e) { 1715 const optionEl = e.target.closest(".tag-multi-select-option"); 1716 if (!optionEl) return; 1717 1718 e.stopPropagation(); 1719 toggleOptionSelection(optionEl); 1720 1721 // Keep focus on input 1722 const input = document.querySelector(".tag-multi-select-input"); 1723 if (input) input.focus(); 1724 } 1725 1726 function handleDropdownKeydown(e) { 1727 const optionEl = e.target.closest(".tag-multi-select-option"); 1728 if (!optionEl) return; 1729 1730 if (e.key === "Enter" || e.key === " ") { 1731 e.preventDefault(); 1732 toggleOptionSelection(optionEl); 1733 1734 // Announce selection change 1735 const announcement = optionEl.classList.contains("selected") 1736 ? `${optionEl.textContent} selected` 1737 : `${optionEl.textContent} deselected`; 1738 announceToScreenReader(announcement); 1739 } else if (e.key === "ArrowDown") { 1740 e.preventDefault(); 1741 const nextOption = optionEl.nextElementSibling; 1742 if (nextOption) nextOption.focus(); 1743 } else if (e.key === "ArrowUp") { 1744 e.preventDefault(); 1745 const prevOption = optionEl.previousElementSibling; 1746 if (prevOption) { 1747 prevOption.focus(); 1748 } else { 1749 // Focus back on input 1750 const input = document.querySelector(".tag-multi-select-input"); 1751 if (input) { 1752 input.focus(); 1753 container.setAttribute("aria-activedescendant", ""); 1754 } 1755 } 1756 } else if (e.key === "Escape") { 1757 e.preventDefault(); 1758 hideDropdown(); 1759 const input = document.querySelector(".tag-multi-select-input"); 1760 if (input) input.focus(); 1761 } 1762 } 1763 1764 function handleDropdownFocus(e) { 1765 const optionEl = e.target.closest(".tag-multi-select-option"); 1766 if (optionEl) { 1767 container.setAttribute("aria-activedescendant", optionEl.id); 1768 } 1769 } 1770 1771 // DRY: Centralized selection toggle 1772 function toggleOptionSelection(optionEl) { 1773 const value = optionEl.getAttribute("data-value"); 1774 const isCurrentlySelected = optionEl.classList.contains("selected"); 1775 1776 if (isCurrentlySelected) { 1777 removeTag(value); 1778 } else { 1779 addTag(value); 1780 } 1781 1782 // Update visual state 1783 OptionCreator.updateOptionState(optionEl, !isCurrentlySelected); 1784 } 1785 1786 // Populate the dropdown with options (Performance Optimized) 1787 function populateDropdown(filter = "") { 1788 // Use DocumentFragment for better performance 1789 const fragment = document.createDocumentFragment(); 1790 1791 const options = Array.from(select.options); 1792 const filterLower = filter.toLowerCase(); 1793
1794 // Filter options efficiently 1795 const filteredOptions = options.filter((option) => 1796 option.textContent.toLowerCase().includes(filterLower), 1797 ); 1798 1799 if (filteredOptions.length === 0) { 1800 dropdown.innerHTML = 1801 '<div class="p-4" role="status">No matching tags found</div>'; 1802 return; 1803 } 1804 1805 // Batch DOM operations using DocumentFragment and DRY utilities 1806 filteredOptions.forEach((option) => { 1807 const optionEl = OptionCreator.createOption(option); 1808 fragment.appendChild(optionEl); 1809 }); 1810 1811 // Single DOM update for better performance 1812 dropdown.innerHTML = ""; 1813 dropdown.appendChild(fragment); 1814 } 1815 1816 // Add a tag 1817 function addTag(value) { 1818 const option = Array.from(select.options).find( 1819 (opt) => opt.value === value, 1820 ); 1821 if (option) { 1822 option.selected = true; 1823 } 1824 updateSelectedTags(); 1825 updateURL(); 1826 } 1827 1828 // Remove a tag 1829 function removeTag(value) { 1830 const option = Array.from(select.options).find( 1831 (opt) => opt.value === value, 1832 ); 1833 if (option) { 1834 option.selected = false; 1835 } 1836 updateSelectedTags(); 1837 updateURL(); 1838 1839 // Refresh the dropdown to show the newly available tag 1840 populateDropdown( 1841 document.querySelector(".tag-multi-select-input")?.value || "", 1842 ); 1843 1844 // If the input is focused, make sure the dropdown stays visible 1845 const input = document.querySelector(".tag-multi-select-input"); 1846 if (input && document.activeElement === input) { 1847 dropdownManager.show("tags"); 1848 } 1849 } 1850 1851 // Update the URL with selected tags 1852 function updateURL() { 1853 const selectedValues = Array.from(select.selectedOptions).map( 1854 (option) => option.value, 1855 ); 1856 1857 // Get current URL and params 1858 const url = new URL(window.location.href); 1859 const pathParts = url.pathname.split("/").filter(Boolean); 1860 1861 // If we're on an overview page and tags are selected, redirect to the category page 1862 if (isOverviewPageValue && selectedValues.length > 0) { 1863 // Get the category name from the current URL path 1864 const categoryFromPath = pathParts[pathParts.length - 1]; 1865 1866 // Create the new URL for the categories page 1867 const newUrl = new URL(window.location.origin); 1868 newUrl.pathname = `/blog/categories/${categoryFromPath}/`; 1869 if (selectedValues.length > 0) { 1870 // Convert tags to URL-friendly format 1871 const tagsValue = selectedValues 1872 .map((tag) => encodeURIComponent(tag)) 1873 .join(","); 1874 newUrl.searchParams.set("tags", tagsValue); 1875 } 1876 1877 // Force a page reload to the new URL 1878 window.location.replace(newUrl.toString()); 1879 return; // Stop here since we're redirecting 1880 } 1881 1882 // For non-overview pages, just update the URL 1883 if (selectedValues.length > 0) { 1884 // Convert tags to URL-friendly format 1885 const tagsValue = selectedValues 1886 .map((tag) => encodeURIComponent(tag)) 1887 .join(","); 1888 url.searchParams.set("tags", tagsValue); 1889 } else { 1890 url.searchParams.delete("tags"); 1891 } 1892 1893 // Update the URL without refreshing the page 1894 window.history.pushState({}, "", url.toString()); 1895 1896 // Update post visibility based on selected tags 1897 updatePostVisibility(selectedValues); 1898 1899 // Dispatch a custom event to notify that tags have changed 1900 const event = new CustomEvent("tagsChanged", { 1901 detail: { 1902 tags: selectedValues, 1903 category: pathParts[pathParts.length - 1] || "", 1904 }, 1905 }); 1906 document.dispatchEvent(event); 1907 } 1908 1909 // Function to update post visibility based on selected tags 1910 function updatePostVisibility(selectedTags) { 1911 // Find all blog post list containers 1912 const containers = document.querySelectorAll("[id^='blog-post-list-']"); 1913 1914 containers.forEach((container) => { 1915 const componentId = container.id; 1916 const showMoreButton = document.getElementById( 1917 `${componentId}-show-more`, 1918 ); 1919 const showAllButton = document.getElementById( 1920 `${componentId}-show-all`, 1921 ); 1922 const noMoreMessage = document.getElementById(`${componentId}-no-more`); 1923 const allPosts = container.querySelectorAll(".post-item"); 1924 1925 // If no tags selected, reset to initial infinite scroll state 1926 if (selectedTags.length === 0) { 1927 const itemsPerPage = showMoreButton 1928 ? parseInt( 1929 showMoreButton.getAttribute("data-items-per-page") || "12", 1930 10, 1931 ) 1932 : 12; 1933 // Batch DOM operations for better performance 1934 const postsToShow = Array.from(allPosts).slice(0, itemsPerPage); 1935 const postsToHide = Array.from(allPosts).slice(itemsPerPage); 1936 1937 requestAnimationFrame(() => { 1938 postsToShow.forEach((post) => post.classList.remove("hidden-post")); 1939 postsToHide.forEach((post) => post.classList.add("hidden-post")); 1940 }); 1941 1942 // Reset buttons 1943 if (showMoreButton) { 1944 showMoreButton.style.display = 1945 allPosts.length > itemsPerPage ? "inline-block" : "none"; 1946 showMoreButton.setAttribute("data-current-page", "1"); 1947 } 1948 if (showAllButton) { 1949 showAllButton.style.display = 1950 allPosts.length > itemsPerPage ? "inline-block" : "none"; 1951 } 1952 if (noMoreMessage) { 1953 noMoreMessage.classList.add("hidden"); 1954 } 1955 return; 1956 } 1957 1958 // Convert selected tags to lowercase for comparison 1959 const selectedTagsLower = selectedTags.map((tag) => tag.toLowerCase()); 1960 1961 // Batch DOM operations using requestAnimationFrame for better performance 1962 const postsToShow = []; 1963 const postsToHide = []; 1964 1965 // First pass: determine which posts to show/hide without DOM manipulation
1966 allPosts.forEach((post) => { 1967 const postTagsAttr = post 1968 .querySelector("[data-tags]") 1969 ?.getAttribute("data-tags"); 1970 if (!postTagsAttr) return; 1971 1972 try { 1973 const postTags = JSON.parse(postTagsAttr).map((tag) => 1974 tag.toLowerCase(), 1975 ); 1976 const hasMatchingTag = postTags.some((tag) => 1977 selectedTagsLower.includes(tag), 1978 ); 1979 1980 if (hasMatchingTag) { 1981 postsToShow.push(post); 1982 } else { 1983 postsToHide.push(post); 1984 } 1985 } catch (e) { 1986 console.error("Error parsing post tags:", e); 1987 } 1988 }); 1989 1990 // Second pass: batch apply changes in requestAnimationFrame 1991 requestAnimationFrame(() => { 1992 postsToShow.forEach((post) => post.classList.remove("hidden-post")); 1993 postsToHide.forEach((post) => post.classList.add("hidden-post")); 1994 }); 1995 1996 // Update button visibility 1997 if (showMoreButton) showMoreButton.style.display = "none"; 1998 if (showAllButton) showAllButton.style.display = "none"; 1999 if (noMoreMessage) noMoreMessage.classList.remove("hidden"); 2000 }); 2001 } 2002 } 2003})();</script>
2003 </div> </div> </div> </section> <section class="featured-post-section section" aria-labelledby="featured-post-heading"> <div class="padding-global-box"> <div class="container-large box-component box-rounded-full bg-neutral-default-secondary"> <div class="section-padding vertical extra-small gap-16"> <article class="featured-post" aria-labelledby="featured-post-title"> <h2 id="featured-post-heading" class="sr-only"> 2004Featured Post 2005</h2> <div class="container items-center grid grid-cols-12 gap-x-0 gap-y-8 md:gap-x-8"> <div class="featured-post-content"> <div class="post-meta"> <div class="featured-post-label"> <address class="author-info"> <div class="author-info-item"> <img src="/_astro/jonathan-d-rhyne.xChnw7U9_Z77b9n.webp" alt="Profile picture of Jonathan D. Rhyne" loading="lazy" decoding="async" srcset="/_astro/jonathan-d-rhyne.xChnw7U9_ZJJBqE.webp 192w" sizes="100vw" width="48" height="48"> <p class="author-name">Jonathan D. Rhyne</p> </div> </address> </div> <h2 id="featured-post-title" class="post-title"> <a href="/blog/nutrient-launches-documents-for-salesforce/" aria-label="Read full article: Nutrient launches Documents for Salesforce, consolidating the enterprise document lifecycle inside the CRM"> Nutrient launches Documents for Salesforce, consolidating the enterprise document lifecycle inside the CRM </a> </h2> </div> <div class="post-description"> <p>Nutrient announces Documents for Salesforce, a natively built solution that consolidates document generation, editing, redaction, and signing inside Salesforce. The platform eliminates fragmented document workflows by keeping templates, editing, and signing on the Salesforce record â governed by existing CRM permissions and controls.</p> <a href="/blog/nutrient-launches-documents-for-salesforce/" class="btn btn-primary" aria-label="Read more about Nutrient launches Documents for Salesforce, consolidating the enterprise document lifecycle inside the CRM"> 2006Read more 2007</a> </div> </div> <div class="xl:block xl:col-span-1 hidden xl:order-2"></div> <a href="/blog/nutrient-launches-documents-for-salesforce/" class="featured-post-media " aria-hidden="true" tabindex="-1"> <div class="relative aspect-video overflow-hidden rounded-3xl"> <img src="/_astro/article-header.uigNq342_105tMT.webp" alt="Featured image for article: Nutrient launches Documents for Salesforce, consolidating the enterprise document lifecycle inside the CRM" loading="eager" decoding="async" fetchpriority="high" srcset="/_astro/article-header.uigNq342_Z2okeg7.webp 480w, /_astro/article-header.uigNq342_fJ9Fd.webp 768w, /_astro/article-header.uigNq342_Z1Kyryg.webp 992w, /_astro/article-header.uigNq342_ZG5N8i.webp 1280w, /_astro/article-header.uigNq342_2rV2Tu.webp 1440w, /_astro/article-header.uigNq342_Zm5QgT.webp 1920w, /_astro/article-header.uigNq342_105tMT.webp 2000w" sizes="(min-width: 1400px) 760px, (min-width: 992px) 60vw, 100vw" width="2000" height="1000" class="object-cover w-full h-full"> </div> </a> </div> </article> </div> </div> </div> </section> <!-- Badges Section --> <section class="section-spacing-horizontal-default"> <div class="container-large radius-container container-spacing-horizontal-default container-spacing-vertical-large"> <div class="container grid grid-cols-1 lg:grid-cols-12 gap-spacing-lg"> <div class="lg:col-span-5 flex items-center"> <div class="text-block text-left"> <div class="text-block-container gap-spacing-lg"> <div class="text-block-headline-container"> <h2 class="text-block-title heading-3">Recognized by the industry, trusted by developers</h2> </div> <div class="text-block-content"> <p class="text-block-description font-size-text-default">Nutrient is consistently ranked as a leader in document technology by G2 and SourceForge.</p> </div> </div> </div> </div> <div class="lg:col-span-6 lg:col-start-7 flex items-start justify-between"> <div class="container grid gap-6 grid-cols-2 md:grid-cols-4 justify-between"> <div> <a title="Users love Nutrient SDK on G2" href="https://www.g2.com/products/nutrient-sdk/reviews?utm_source=rewards-medal" target="_blank"><img alt="Users Love Us" class="w-[104px] !rounded-none" src="https://www.g2.com/shared-assets/product-badges/users-love-us.svg"></a> </div> <div> <a title="Nutrient SDK reviews on SourceForge" href="https://sourceforge.net/software/product/Nutrient-SDK/?pk_campaign=badge&pk_source=vendor" target="_blank"><img alt="Nutrient SDK Reviews" class="w-[104px] !rounded-none" src="https://b.sf-syn.com/badge_img/3081810/leader-summer-white?achievement=leader-seasonal-2026-summer&variant_id=sf"></a> </div> <div> <a title="Nutrient SDK reviews on SourceForge" href="https://sourceforge.net/software/product/Nutrient-SDK/?pk_campaign=badge&pk_source=vendor" target="_blank"><img alt="Nutrient SDK Reviews" class="w-[104px] !rounded-none" src="https://b.sf-syn.com/badge_img/3081810/leader-spring-white?achievement=leader-seasonal-2026-spring&variant_id=sf"></a> </div> <div> <a title="Nutrient SDK reviews on SourceForge" href="https://sourceforge.net/software/product/Nutrient-SDK/?pk_campaign=badge&pk_source=vendor" target="_blank"><img alt="Nutrient SDK Reviews" class="w-[104px] !rounded-none" src="https://b.sf-syn.com/badge_img/3081810/leader-winter-white?achievement=leader-seasonal-2026-winter&variant_id=sf"></a> </div> </div> </div> </div> </div> </section> <!-- Separator --> <section class="section-spacing-horizontal-default"> <div class="container-large radius-container container-spacing-horizontal-default !py-0"> <hr class="separator separator-primary"> </div> </section> <!-- Latest News Section --> <section class="section-spacing-horizontal-default"> <div class="container-large radius-container container-spacing-horizontal-default !py-0 flex flex-col gap-container-spacing-vertical-small mb-container-spacing-vertical-medium mt
2007-container-spacing-vertical-small"> <div class="container grid gap-6 grid-cols-1"> <div class="flex flex-col gap-[10px] sm:gap-spacing-md sm:flex-row sm:justify-between sm:items-center"> <div class="text-block text-left"> <div class="text-block-container gap-spacing-2xs"> <div class="text-block-headline-container"> <h4 class="text-block-title heading-4">Latest news</h4> </div> </div> </div> <a href="/blog/categories/news/" target="_self" tabindex="0" class="btn btn-ghost btn-icon-right"> EXPLORE MORE <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class="w-6 h-6" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 2008 <path fill="currentColor" d="M15 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm2 2a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm3 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-3 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-1 3a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-1-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Zm-4-1a1 1 0 1 1 0 2 1 1 0 0 1 0-2Zm-2 1a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z"/> 2009 </svg><!-- Define styles for the SVG element with the provided color and size --> </a> </div> </div> <section class="latest-posts-wrapper article-preview-grid "> <div class="article-preview-wrapper"> <article class="article-preview-item " data-tags="["Media coverage"]"> <div class="article-preview-content"> <a href="https://governmenttechnologyinsider.com/the-document-accessibility-deadline-most-agencies-are-going-to-miss/" target="_blank" rel="noopener noreferrer" class="article-preview-media external-link"> <img src="/_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp" alt="The Document Accessibility Deadline Most Agencies Are Going to Miss " loading="lazy" decoding="async" srcset="/_astro/news-placeholder.BWNgkSPl_1ST1zN.webp 480w, /_astro/news-placeholder.BWNgkSPl_Z2vX443.webp 768w, /_astro/news-placeholder.BWNgkSPl_Z11eYlf.webp 992w, /_astro/news-placeholder.BWNgkSPl_ZwrIs9.webp 1280w, /_astro/news-placeholder.BWNgkSPl_Z1INL0M.webp 1440w, /_astro/news-placeholder.BWNgkSPl_Z1OGffh.webp 1920w, /_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp 2000w" sizes="(min-width: 992px) 40vw, (min-width: 768px) 50vw, 100vw" width="2000" height="1000" class="w-full h-full object-cover"> <span class="external-link-badge" aria-label="Opens in new tab"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class width="24" height="24" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 2010 <path fill="currentColor" d="M9 7a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm3 0a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm4-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-4 4a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm8-5a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm1 2a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z"/> 2011 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a> <div class="article-preview-text"> <div class="article-preview-meta"> <address class="author-info"> <img src="/_astro/default-avatar.DzCEIadE_ZznCP0.webp" alt="Government Technology Insider" loading="lazy" decoding="async" width="48" height="48"> <p class="author-name">Government Technology Insider</p> </address> </div> <h2 class="post-title"> <a href="https://governmenttechnologyinsider.com/the-document-accessibility-deadline-most-agencies-are-going-to-miss/" target="_blank" rel="noopener noreferrer"> The Document Accessibility Deadline Most Agencies Are Going to Miss </a> </h2> </div> </div> </article> <article class="article-preview-item " data-tags="["Press release"]"> <div class="article-preview-content"> <a href="/blog/nutrient-advances-workflow-platform-agentic-ai/" class="article-preview-media "> <img src="/_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp" alt="Nutrient advances Workflow platform with agentic AI for enterprise-grade speed and consistency in document-heavy operations" loading="lazy" decoding="async" srcset="/_astro/news-placeholder.BWNgkSPl_1ST1zN.webp 480w, /_astro/news-placeholder.BWNgkSPl_Z2vX443.webp 768w, /_astro/news-placeholder.BWNgkSPl_Z11eYlf.webp 992w, /_astro/news-placeholder.BWNgkSPl_ZwrIs9.webp 1280w, /_astro/news-placeholder.BWNgkSPl_Z1INL0M.webp 1440w, /_astro/news-placeholder.BWNgkSPl_Z1OGffh.webp 1920w, /_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp 2000w" sizes="(min-width: 992px) 40vw, (min-width: 768px) 50vw, 100vw" width="2000" height="1000" class="w-full h-full object-cover"> </a> <div class="article-preview-text"> <div class="article-preview-meta"> <address class="author-info"> <img src="/_astro/jonathan-d-rhyne.xChnw7U9_Z77b9n.webp" alt="Jonathan D. Rhyne" loading="lazy" decoding="async" width="48" height="48"> <p class="author-name">Jonathan D. Rhyne</p> </address> </div> <h2 class="post-title"> <a href="/blog/nutrient-advances-workflow-platform-agentic-ai/"> Nutrient advances Workflow platform with agentic AI for enterprise-grade speed and consistency in document-heavy operations </a> </h2> </div> </div> </article> <article class="article-preview-item " data-tags="["Media coverage","Security"]"> <div class="article-preview-content"> <a href="https://securitybuzz.com/cybersecurity-news/why-enterprise-permissions-are-ais-most-d
2011angerous-inheritance/" target="_blank" rel="noopener noreferrer" class="article-preview-media external-link"> <img src="/_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp" alt="Why Enterprise Permissions Are AIâs Most Dangerous Inheritance" loading="lazy" decoding="async" srcset="/_astro/news-placeholder.BWNgkSPl_1ST1zN.webp 480w, /_astro/news-placeholder.BWNgkSPl_Z2vX443.webp 768w, /_astro/news-placeholder.BWNgkSPl_Z11eYlf.webp 992w, /_astro/news-placeholder.BWNgkSPl_ZwrIs9.webp 1280w, /_astro/news-placeholder.BWNgkSPl_Z1INL0M.webp 1440w, /_astro/news-placeholder.BWNgkSPl_Z1OGffh.webp 1920w, /_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp 2000w" sizes="(min-width: 992px) 40vw, (min-width: 768px) 50vw, 100vw" width="2000" height="1000" class="w-full h-full object-cover"> <span class="external-link-badge" aria-label="Opens in new tab"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class width="24" height="24" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 2012 <path fill="currentColor" d="M9 7a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm3 0a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm4-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-4 4a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm8-5a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm1 2a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z"/> 2013 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a> <div class="article-preview-text"> <div class="article-preview-meta"> <address class="author-info"> <img src="/_astro/default-avatar.DzCEIadE_ZznCP0.webp" alt="SecurityBuzz" loading="lazy" decoding="async" width="48" height="48"> <p class="author-name">SecurityBuzz</p> </address> </div> <h2 class="post-title"> <a href="https://securitybuzz.com/cybersecurity-news/why-enterprise-permissions-are-ais-most-dangerous-inheritance/" target="_blank" rel="noopener noreferrer"> Why Enterprise Permissions Are AIâs Most Dangerous Inheritance </a> </h2> </div> </div> </article> <article class="article-preview-item " data-tags="["Press release"]"> <div class="article-preview-content"> <a href="/blog/nutrient-expands-ai-assistant/" class="article-preview-media "> <img src="/_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp" alt="Nutrient expands AI Assistant, automating multistep document workflows inside any application" loading="lazy" decoding="async" srcset="/_astro/news-placeholder.BWNgkSPl_1ST1zN.webp 480w, /_astro/news-placeholder.BWNgkSPl_Z2vX443.webp 768w, /_astro/news-placeholder.BWNgkSPl_Z11eYlf.webp 992w, /_astro/news-placeholder.BWNgkSPl_ZwrIs9.webp 1280w, /_astro/news-placeholder.BWNgkSPl_Z1INL0M.webp 1440w, /_astro/news-placeholder.BWNgkSPl_Z1OGffh.webp 1920w, /_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp 2000w" sizes="(min-width: 992px) 40vw, (min-width: 768px) 50vw, 100vw" width="2000" height="1000" class="w-full h-full object-cover"> </a> <div class="article-preview-text"> <div class="article-preview-meta"> <address class="author-info"> <img src="/_astro/jonathan-d-rhyne.xChnw7U9_Z77b9n.webp" alt="Jonathan D. Rhyne" loading="lazy" decoding="async" width="48" height="48"> <p class="author-name">Jonathan D. Rhyne</p> </address> </div> <h2 class="post-title"> <a href="/blog/nutrient-expands-ai-assistant/"> Nutrient expands AI Assistant, automating multistep document workflows inside any application </a> </h2> </div> </div> </article> <article class="article-preview-item " data-tags="["Media coverage"]"> <div class="article-preview-content"> <a href="https://fortune.com/2026/02/19/openclaw-who-is-peter-steinberger-openai-sam-altman-anthropic-moltbook/" target="_blank" rel="noopener noreferrer" class="article-preview-media external-link"> <img src="/_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp" alt="Who is OpenClaw creator Peter Steinberger? The millennial developer caught the attention of Sam Altman and Mark Zuckerberg" loading="lazy" decoding="async" srcset="/_astro/news-placeholder.BWNgkSPl_1ST1zN.webp 480w, /_astro/news-placeholder.BWNgkSPl_Z2vX443.webp 768w, /_astro/news-placeholder.BWNgkSPl_Z11eYlf.webp 992w, /_astro/news-placeholder.BWNgkSPl_ZwrIs9.webp 1280w, /_astro/news-placeholder.BWNgkSPl_Z1INL0M.webp 1440w, /_astro/news-placeholder.BWNgkSPl_Z1OGffh.webp 1920w, /_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp 2000w" sizes="(min-width: 992px) 40vw, (min-width: 768px) 50vw, 100vw" width="2000" height="1000" class="w-full h-full object-cover"> <span class="external-link-badge" aria-label="Opens in new tab"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class width="24" height="24" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v>
2014 <path fill="currentColor" d="M9 7a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm3 0a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm4-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-4 4a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm8-5a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm1 2a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z"/> 2015 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a> <div class="article-preview-text"> <div class="article-preview-meta"> <address class="author-info"> <img src="/_astro/default-avatar.DzCEIadE_ZznCP0.webp" alt="Fortune" loading="lazy" decoding="async" width="48" height="48"> <p class="author-name">Fortune</p> </address> </div> <h2 class="post-title"> <a href="https://fortune.com/2026/02/19/openclaw-who-is-peter-steinberger-openai-sam-altman-anthropic-moltbook/" target="_blank" rel="noopener noreferrer"> Who is OpenClaw creator Peter Steinberger? The millennial developer caught the attention of Sam Altman and Mark Zuckerberg </a> </h2> </div> </div> </article> <article class="article-preview-item " data-tags="["Media coverage"]"> <div class="article-preview-content"> <a href="https://www.sdcexec.com/warehousing/automation/article/22957364/nutrient-workflow-automation-the-missing-link-in-supply-chain-efficiency" target="_blank" rel="noopener noreferrer" class="article-preview-media external-link"> <img src="/_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp" alt="Workflow Automation: The missing link in supply chain efficiency" loading="lazy" decoding="async" srcset="/_astro/news-placeholder.BWNgkSPl_1ST1zN.webp 480w, /_astro/news-placeholder.BWNgkSPl_Z2vX443.webp 768w, /_astro/news-placeholder.BWNgkSPl_Z11eYlf.webp 992w, /_astro/news-placeholder.BWNgkSPl_ZwrIs9.webp 1280w, /_astro/news-placeholder.BWNgkSPl_Z1INL0M.webp 1440w, /_astro/news-placeholder.BWNgkSPl_Z1OGffh.webp 1920w, /_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp 2000w" sizes="(min-width: 992px) 40vw, (min-width: 768px) 50vw, 100vw" width="2000" height="1000" class="w-full h-full object-cover"> <span class="external-link-badge" aria-label="Opens in new tab"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class width="24" height="24" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 2016 <path fill="currentColor" d="M9 7a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm3 0a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm4-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-4 4a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm8-5a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm1 2a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z"/> 2017 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a> <div class="article-preview-text"> <div class="article-preview-meta"> <address class="author-info"> <img src="/_astro/bradley-hearn.h45ieF14_1Npwtn.webp" alt="Bradley Hearn" loading="lazy" decoding="async" width="48" height="48"> <p class="author-name">Bradley Hearn</p> </address> </div> <h2 class="post-title"> <a href="https://www.sdcexec.com/warehousing/automation/article/22957364/nutrient-workflow-automation-the-missing-link-in-supply-chain-efficiency" target="_blank" rel="noopener noreferrer"> Workflow Automation: The missing link in supply chain efficiency </a> </h2> </div> </div> </article> <article class="article-preview-item " data-tags="["Media coverage"]"> <div class="article-preview-content"> <a href="https://www.devopsdigest.com/2026-low-code-no-code-predictions" target="_blank" rel="noopener noreferrer" class="article-preview-media external-link"> <img src="/_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp" alt="2026 Low-Code/No-Code Predictions by DevOps" loading="lazy" decoding="async" srcset="/_astro/news-placeholder.BWNgkSPl_1ST1zN.webp 480w, /_astro/news-placeholder.BWNgkSPl_Z2vX443.webp 768w, /_astro/news-placeholder.BWNgkSPl_Z11eYlf.webp 992w, /_astro/news-placeholder.BWNgkSPl_ZwrIs9.webp 1280w, /_astro/news-placeholder.BWNgkSPl_Z1INL0M.webp 1440w, /_astro/news-placeholder.BWNgkSPl_Z1OGffh.webp 1920w, /_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp 2000w" sizes="(min-width: 992px) 40vw, (min-width: 768px) 50vw, 100vw" width="2000" height="1000" class="w-full h-full object-cover"> <span class="external-link-badge" aria-label="Opens in new tab"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class width="24" height="24" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v>
2018 <path fill="currentColor" d="M9 7a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm3 0a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm4-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-4 4a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm8-5a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm1 2a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z"/> 2019 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a> <div class="article-preview-text"> <div class="article-preview-meta"> <address class="author-info"> <img src="/_astro/default-avatar.DzCEIadE_ZznCP0.webp" alt="DevOps Digest" loading="lazy" decoding="async" width="48" height="48"> <p class="author-name">DevOps Digest</p> </address> </div> <h2 class="post-title"> <a href="https://www.devopsdigest.com/2026-low-code-no-code-predictions" target="_blank" rel="noopener noreferrer"> 2026 Low-Code/No-Code Predictions by DevOps </a> </h2> </div> </div> </article> <article class="article-preview-item " data-tags="["Media coverage"]"> <div class="article-preview-content"> <a href="https://www.kmworld.com/Articles/Editorial/ViewPoints/Leaders-predict-AI-to-continue-permeating-all-aspects-of-KM-in-2026-172594.aspx" target="_blank" rel="noopener noreferrer" class="article-preview-media external-link"> <img src="/_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp" alt="Leaders predict AI to continue permeating all aspects of KM in 2026" loading="lazy" decoding="async" srcset="/_astro/news-placeholder.BWNgkSPl_1ST1zN.webp 480w, /_astro/news-placeholder.BWNgkSPl_Z2vX443.webp 768w, /_astro/news-placeholder.BWNgkSPl_Z11eYlf.webp 992w, /_astro/news-placeholder.BWNgkSPl_ZwrIs9.webp 1280w, /_astro/news-placeholder.BWNgkSPl_Z1INL0M.webp 1440w, /_astro/news-placeholder.BWNgkSPl_Z1OGffh.webp 1920w, /_astro/news-placeholder.BWNgkSPl_Zep4Qd.webp 2000w" sizes="(min-width: 992px) 40vw, (min-width: 768px) 50vw, 100vw" width="2000" height="1000" class="w-full h-full object-cover"> <span class="external-link-badge" aria-label="Opens in new tab"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 24 24" width="24" height="24" class width="24" height="24" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 2020 <path fill="currentColor" d="M9 7a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm3 0a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm4-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-4 4a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 3a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm-1 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm8-5a1 1 0 1 1 2 0 1 1 0 0 1-2 0Zm1 2a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z"/> 2021 </svg><!-- Define styles for the SVG element with the provided color and size --> </span> </a> <div class="article-preview-text"> <div class="article-preview-meta"> <address class="author-info"> <img src="/_astro/default-avatar.DzCEIadE_ZznCP0.webp" alt="KMWorld" loading="lazy" decoding="async" width="48" height="48"> <p class="author-name">KMWorld</p> </address> </div> <h2 class="post-title"> <a href="https://www.kmworld.com/Articles/Editorial/ViewPoints/Leaders-predict-AI-to-continue-permeating-all-aspects-of-KM-in-2026-172594.aspx" target="_blank" rel="noopener noreferrer"> Leaders predict AI to continue permeating all aspects of KM in 2026 </a> </h2> </div> </div> </article> </div> </section> </div> </section> <!-- CTA Section --> <section class="section-spacing-horizontal-default mb-container-spacing-vertical-medium"> <div class="container-large radius-container container-spacing-horizontal-default container-spacing-vertical-large bg-neutral-default-secondary"> <div class="container grid grid-cols-1 lg:grid-cols-12 gap-spacing-xl"> <div class="lg:col-span-4 lg:col-start-5"> <div class="text-block text-center mx-auto"> <div class="text-block-container gap-spacing-lg"> <div class="text-block-headline-container"> <p class="text-block-supertitle heading-6"> blog archive </p> <h3 class="text-block-title heading-3">View all blog posts</h3> </div> <div class="text-block-content"> <div class="text-block-actions justify-center"> <a href="/blog/all/" target="_self" tabindex="0" class="btn btn-primary text-block-button"> view all </a> </div> </div> </div> </div> </div> </div> </div> </section> </div> </main> <footer class="footer"> <div class="footer-wrapper"> <section class="section-spacing-horizontal-default"> <div class="container-large container-spacing-horizontal-default !py-0"> <div class="footer-top"> <!-- Icon --><div class="footer-icon"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 70 70" width="70" height="70" class aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 2022 <path d="M35.0003 11.6667C33.7117 11.6667 32.667 12.7113 32.667 14
2022C32.667 15.2887 33.7117 16.3333 35.0003 16.3333C36.289 16.3333 37.3337 15.2887 37.3337 14C37.3337 12.7113 36.289 11.6667 35.0003 11.6667Z" fill="currentColor"/> 2023 <path d="M42.0003 23.3333C40.7117 23.3333 39.667 22.2887 39.667 21C39.667 19.7113 40.7117 18.6667 42.0003 18.6667C43.289 18.6667 44.3337 19.7113 44.3337 21C44.3337 22.2887 43.289 23.3333 42.0003 23.3333Z" fill="currentColor"/> 2024 <path d="M30.3337 21C30.3337 22.2887 29.289 23.3333 28.0003 23.3333C26.7117 23.3333 25.667 22.2887 25.667 21C25.667 19.7113 26.7117 18.6667 28.0003 18.6667C29.289 18.6667 30.3337 19.7113 30.3337 21Z" fill="currentColor"/> 2025 <path d="M14.0003 56C15.289 56 16.3337 54.9553 16.3337 53.6667C16.3337 52.378 15.289 51.3333 14.0003 51.3333C12.7117 51.3333 11.667 52.378 11.667 53.6667C11.667 54.9553 12.7117 56 14.0003 56Z" fill="currentColor"/> 2026 <path d="M47.8337 53.6667C47.8337 54.9553 46.789 56 45.5003 56C44.2117 56 43.167 54.9553 43.167 53.6667C43.167 52.378 44.2117 51.3333 45.5003 51.3333C46.789 51.3333 47.8337 52.378 47.8337 53.6667Z" fill="currentColor"/> 2027 <path d="M24.5003 56C25.789 56 26.8337 54.9553 26.8337 53.6667C26.8337 52.378 25.789 51.3333 24.5003 51.3333C23.2117 51.3333 22.167 52.378 22.167 53.6667C22.167 54.9553 23.2117 56 24.5003 56Z" fill="currentColor"/> 2028 <path d="M37.3337 53.6667C37.3337 54.9553 36.289 56 35.0003 56C33.7117 56 32.667 54.9553 32.667 53.6667C32.667 52.378 33.7117 51.3333 35.0003 51.3333C36.289 51.3333 37.3337 52.378 37.3337 53.6667Z" fill="currentColor"/> 2029 <path d="M56.0003 56C57.289 56 58.3337 54.9553 58.3337 53.6667C58.3337 52.378 57.289 51.3333 56.0003 51.3333C54.7117 51.3333 53.667 52.378 53.667 53.6667C53.667 54.9553 54.7117 56 56.0003 56Z" fill="currentColor"/> 2030 <path d="M23.3337 28C23.3337 29.2887 22.289 30.3333 21.0003 30.3333C19.7117 30.3333 18.667 29.2887 18.667 28C18.667 26.7113 19.7117 25.6667 21.0003 25.6667C22.289 25.6667 23.3337 26.7113 23.3337 28Z" fill="currentColor"/> 2031 <path d="M49.0003 30.3333C50.289 30.3333 51.3337 29.2887 51.3337 28C51.3337 26.7113 50.289 25.6667 49.0003 25.6667C47.7117 25.6667 46.667 26.7113 46.667 28C46.667 29.2887 47.7117 30.3333 49.0003 30.3333Z" fill="currentColor"/> 2032 <path d="M16.3337 35C16.3337 36.2887 15.289 37.3333 14.0003 37.3333C12.7117 37.3333 11.667 36.2887 11.667 35C11.667 33.7113 12.7117 32.6667 14.0003 32.6667C15.289 32.6667 16.3337 33.7113 16.3337 35Z" fill="currentColor"/> 2033 <path d="M14.0003 46.6667C15.289 46.6667 16.3337 45.622 16.3337 44.3333C16.3337 43.0447 15.289 42 14.0003 42C12.7117 42 11.667 43.0447 11.667 44.3333C11.667 45.622 12.7117 46.6667 14.0003 46.6667Z" fill="currentColor"/> 2034 <path d="M58.3337 44.3333C58.3337 45.622 57.289 46.6667 56.0003 46.6667C54.7117 46.6667 53.667 45.622 53.667 44.3333C53.667 43.0447 54.7117 42 56.0003 42C57.289 42 58.3337 43.0447 58.3337 44.3333Z" fill="currentColor"/> 2035 <path d="M56.0003 37.3333C57.289 37.3333 58.3337 36.2887 58.3337 35C58.3337 33.7113 57.289 32.6667 56.0003 32.6667C54.7117 32.6667 53.667 33.7113 53.667 35C53.667 36.2887 54.7117 37.3333 56.0003 37.3333Z" fill="currentColor"/> 2036 </svg><!-- Define styles for the SVG element with the provided color and size --> </div> <!-- Company --> <div class="footer-column"> <span class="footer-heading">Company</span> <ul> <li> <a href="/company/about/" class="footer-link"> About </a> </li><li> <a href="/security/" class="footer-link"> Security </a> </li><li> <a href="/company/team/" class="footer-link"> Team </a> </li><li> <a href="/company/careers/" class="footer-link"> Careers </a> </li><li> <a href="/partners/" class="footer-link"> Partners </a> </li><li> <a href="/legal/privacy/" class="footer-link"> Legal </a> </li><li> <a href="/blog/news/" class="footer-link"> News </a> </li> </ul> </div> <!-- Products --> <div class="footer-column"> <span class="footer-heading">Products</span> <ul> <li> <a href="/sdk/" class="footer-link"> SDK </a> </li><li> <a href="/low-code/" class="footer-link"> Integrations </a> </li><li> <a href="/workflow-automation/" class="footer-link"> Workflow </a> </li><li> <a href="/api/" class="footer-link"> Cloud </a> </li> </ul> </div> <!-- Resources --> <div class="footer-column"> <span class="footer-heading">Resources</span> <ul> <li> <a href="/blog/" class="footer-link"> Blog </a> </li><li> <a href="/events/" class="footer-link"> Events </a> </li><li> <a href="/blog/categories/customer-stories/" class="footer-link">
2036 Customer Stories </a> </li><li> <a href="/blog/categories/tutorials/" class="footer-link"> Tutorials </a> </li><li> <a href="/newsletter/" class="footer-link"> Newsletter </a> </li><li> <a href="/solutions/pdf-accessibility/" class="footer-link"> PDF Accessibility </a> </li><li> <a href="/blog/pdf-ua-compliance-guide/" class="footer-link"> PDF/UA Guide </a> </li> </ul> </div> <!-- Connect --> <div class="footer-column"> <span class="footer-heading">Connect</span> <ul> <li> <a href="/company/contact/" class="footer-link"> Contact </a> </li><li> <a href="https://www.linkedin.com/company/nutrientdocs" class="footer-link"> LinkedIn </a> </li><li> <a href="https://www.youtube.com/channel/UCQFsRxB1vTDJ5N1NaNsZNrw?sub_confirmation=1" class="footer-link"> YouTube </a> </li><li> <a href="https://discord.gg/Z754Pfb8bD" class="footer-link"> Discord </a> </li><li> <a href="https://x.com/nutrientdocs" class="footer-link"> X </a> </li><li> <a href="https://www.facebook.com/nutrientdocs/" class="footer-link"> Facebook </a> </li> </ul> </div> </div><div class="footer-bottom"> <!-- Render the SVG element with the computed attributes and content --><svg aria-hidden="true" fill="currentColor" viewBox="0 0 58 40" width="58" height="40" class="w-14 h-10 mx-auto icon-neutral-primary" aria-hidden="true" style="--icon-color: currentColor;" data-astro-cid-7qi5gn3v> 2037<path d="M5.27196 24.7452C2.65002 24.7452 0.526367 22.6216 0.526367 19.9996C0.526367 17.3777 2.65002 15.254 5.27196 15.254C7.8939 15.254 10.0176 17.3777 10.0176 19.9996C10.0176 22.6216 7.8939 24.7452 5.27196 24.7452ZM52.7279 15.254C50.106 15.254 47.9823 17.3777 47.9823 19.9996C47.9823 22.6216 50.106 24.7452 52.7279 24.7452C55.3498 24.7452 57.4735 22.6216 57.4735 19.9996C57.4735 17.3777 55.3498 15.254 52.7279 15.254ZM7.77289 31.6168C5.7655 33.3015 5.50212 36.296 7.18681 38.3034C8.8715 40.3108 11.866 40.5741 13.8734 38.8895C15.8807 37.2048 16.1441 34.2103 14.4594 32.2029C12.7747 30.1955 9.78028 29.9321 7.77289 31.6168ZM50.227 8.38239C52.2344 6.69771 52.4977 3.70324 50.8131 1.69585C49.1284 -0.311535 46.1339 -0.574915 44.1265 1.10977C42.1191 2.79446 41.8558 5.78893 43.5404 7.79631C45.2251 9.8037 48.2196 10.0671 50.227 8.38239ZM13.8734 1.11214C11.866 -0.572543 8.8715 -0.311535 7.18681 1.69822C5.50212 3.70798 5.76313 6.70008 7.77289 8.38477C9.78265 10.0695 12.7747 9.80845 14.4594 7.79869C16.1441 5.78893 15.8831 2.79683 13.8734 1.11214ZM50.227 31.6168C48.2196 29.9321 45.2251 30.1931 43.5404 32.2029C41.8558 34.2103 42.1168 37.2048 44.1265 38.8895C46.1339 40.5741 49.1284 40.3131 50.8131 38.3034C52.4977 36.296 52.2367 33.3015 50.227 31.6168ZM38.1091 21.447C36.1017 19.7623 33.1072 20.0233 31.4226 22.0331C29.7379 24.0429 29.9989 27.035 32.0086 28.7196C34.0184 30.4043 37.0105 30.1433 38.6952 28.1336C40.3799 26.1238 40.1189 23.1317 38.1091 21.447ZM25.9912 11.2796C23.9838 9.59489 20.9894 9.8559 19.3047 11.8657C17.62 13.8754 17.881 16.8675 19.8908 18.5522C21.9005 20.2369 24.8926 19.9759 26.5773 17.9661C28.262 15.9564 28.001 12.9643 25.9912 11.2796Z" fill="currentColor"></path> 2038 </svg><!-- Define styles for the SVG element with the provided color and size --> <p>Copyright 2026 Nutrient. All rights reserved.</p> </div> </div> </section> </div> </footer> <!-- Persistent "Ask AI" launcher pill. Styled to match the Chatlio pill so the 2039 two group together bottom-right; opens the kapa modal on click (kapa's own 2040 launcher is hidden â see data-button-hide below). When Chatlio is present 2041 its position is nudged left of the Chatlio pill at runtime (see script); 2042 otherwise it sits flush to the right margin. --><button id="kapa-lazy-button" class="group fixed bottom-[10px] right-4 z-[199] 2043 h-[40px] pl-5 pr-6 pt-[2px] 2044 rounded-full border-0 2045 cursor-pointer shadow-lg 2046 inline-flex items-center gap-2 2047 !bg-accent-default !text-on-accent-on-default hover:bg-[#2A2020] 2048 text-sm 2049 transition-[transform,right,background-color] duration-200 2050 focus:outline-none focus-visible:ring-2 focus-visible:ring-white/40 2051 disabled:hover:scale-100 2052 active:translate-y-0.5" aria-label="Ask AI" aria-busy="false" data-chatlio-present="true"> <svg id="kapa-button-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
2052 <path fill="currentColor" d="M13 18C13 18.2652 12.8946 18.5196 12.7071 18.7071C12.5196 18.8946 12.2652 19 12 19C11.7348 19 11.4804 18.8946 11.2929 18.7071C11.1054 18.5196 11 18.2652 11 18C11 17.7348 11.1054 17.4804 11.2929 17.2929C11.4804 17.1054 11.7348 17 12 17C12.2652 17 12.5196 17.1054 12.7071 17.2929C12.8946 17.4804 13 17.7348 13 18ZM13 22C13 22.2652 12.8946 22.5196 12.7071 22.7071C12.5196 22.8946 12.2652 23 12 23C11.7348 23 11.4804 22.8946 11.2929 22.7071C11.1054 22.5196 11 22.2652 11 22C11 21.7348 11.1054 21.4804 11.2929 21.2929C11.4804 21.1054 11.7348 21 12 21C12.2652 21 12.5196 21.1054 12.7071 21.2929C12.8946 21.4804 13 21.7348 13 22ZM9 23C8.73478 23 8.48043 22.8946 8.29289 22.7071C8.10536 22.5196 8 22.2652 8 22C8 21.7348 8.10536 21.4804 8.29289 21.2929C8.48043 21.1054 8.73478 21 9 21C9.26522 21 9.51957 21.1054 9.70711 21.2929C9.89464 21.4804 10 21.7348 10 22C10 22.2652 9.89464 22.5196 9.70711 22.7071C9.51957 22.8946 9.26522 23 9 23ZM5 22C5 22.2652 5.10536 22.5196 5.29289 22.7071C5.48043 22.8946 5.73478 23 6 23C6.26522 23 6.51957 22.8946 6.70711 22.7071C6.89464 22.5196 7 22.2652 7 22C7 21.7348 6.89464 21.4804 6.70711 21.2929C6.51957 21.1054 6.26522 21 6 21C5.73478 21 5.48043 21.1054 5.29289 21.2929C5.10536 21.4804 5 21.7348 5 22ZM2 19C2 19.2652 2.10536 19.5196 2.29289 19.7071C2.48043 19.8946 2.73478 20 3 20C3.26522 20 3.51957 19.8946 3.70711 19.7071C3.89464 19.5196 4 19.2652 4 19C4 18.7348 3.89464 18.4804 3.70711 18.2929C3.51957 18.1054 3.26522 18 3 18C2.73478 18 2.48043 18.1054 2.29289 18.2929C2.10536 18.4804 2 18.7348 2 19ZM3 17C2.73478 17 2.48043 16.8946 2.29289 16.7071C2.10536 16.5196 2 16.2652 2 16C2 15.7348 2.10536 15.4804 2.29289 15.2929C2.48043 15.1054 2.73478 15 3 15C3.26522 15 3.51957 15.1054 3.70711 15.2929C3.89464 15.4804 4 15.7348 4 16C4 16.2652 3.89464 16.5196 3.70711 16.7071C3.51957 16.8946 3.26522 17 3 17ZM2 13C2 13.2652 2.10536 13.5196 2.29289 13.7071C2.48043 13.8946 2.73478 14 3 14C3.26522 14 3.51957 13.8946 3.70711 13.7071C3.89464 13.5196 4 13.2652 4 13C4 12.7348 3.89464 12.4804 3.70711 12.2929C3.51957 12.1054 3.26522 12 3 12C2.73478 12 2.48043 12.1054 2.29289 12.2929C2.10536 12.4804 2 12.7348 2 13ZM2 10C2 10.2652 2.10536 10.5196 2.29289 10.7071C2.48043 10.8946 2.73478 11 3 11C3.26522 11 3.51957 10.8946 3.70711 10.7071C3.89464 10.5196 4 10.2652 4 10C4 9.73478 3.89464 9.48043 3.70711 9.29289C3.51957 9.10536 3.26522 9 3 9C2.73478 9 2.48043 9.10536 2.29289 9.29289C2.10536 9.48043 2 9.73478 2 10ZM21 11C20.7348 11 20.4804 10.8946 20.2929 10.7071C20.1054 10.5196 20 10.2652 20 10C20 9.73478 20.1054 9.48043 20.2929 9.29289C20.4804 9.10536 20.7348 9 21 9C21.2652 9 21.5196 9.10536 21.7071 9.29289C21.8946 9.48043 22 9.73478 22 10C22 10.2652 21.8946 10.5196 21.7071 10.7071C21.5196 10.8946 21.2652 11 21 11ZM20 13C20 13.2652 20.1054 13.5196 20.2929 13.7071C20.4804 13.8946 20.7348 14 21 14C21.2652 14 21.5196 13.8946 21.7071 13.7071C21.8946 13.5196 22 13.2652 22 13C22 12.7348 21.8946 12.4804 21.7071 12.2929C21.5196 12.1054 21.2652 12 21 12C20.7348 12 20.4804 12.1054 20.2929 12.2929C20.1054 12.4804 20 12.7348 20 13ZM21 17C20.7348 17 20.4804 16.8946 20.2929 16.7071C20.1054 16.5196 20 16.2652 20 16C20 15.7348 20.1054 15.4804 20.2929 15.2929C20.4804 15.1054 20.7348 15 21 15C21.2652 15 21.5196 15.1054 21.7071 15.2929C21.8946 15.4804 22 15.7348 22 16C22 16.2652 21.8946 16.5196 21.7071 16.7071C21.5196 16.8946 21.2652 17 21 17ZM20 19C20 19.2652 20.1054 19.5196 20.2929 19.7071C20.4804 19.8946 20.7348 20 21 20C21.2652 20 21.5196 19.8946 21.7071 19.7071C21.8946 19.5196 22 19.2652 22 19C22 18.7348 21.8946 18.4804 21.7071 18.2929C21.5196 18.1054 21.2652 18 21 18C20.7348 18 20.4804 18.1054 20.2929 18.2929C20.1054 18.4804 20 18.7348 20 19ZM18 23C17.7348 23 17.4804 22.8946 17.2929 22.7071C17.1054 22.5196 17 22.2652 17 22C17 21.7348 17.1054 21.4804 17.2929 21.2929C17.4804 21.1054 17.7348 21 18 21C18.2652 21 18.5196 21.1054 18.7071 21.2929C18.8946 21.4804 19 21.7348 19 22C19 22.2652 18.8946 22.5196 18.7071 22.7071C18.5196 22.8946 18.2652 23 18 23ZM15 23C14.7348 23 14.4804 22.8946 14.2929 22.7071C14.1054 22.5196 14 22.2652 14 22C14 21.7348 14.1054 21.4804 14.2929 21.2929C14.4804 21.1054 14.7348 21 15 21C15.2652 21 15.5196 21.1054 15.7071 21.2929C15.8946 21.4804 16 21.7348 16 22C16 22.2652 15.8946 22.5196 15.7071 22.7071C15.5196 22.8946 15.2652 23 15 23ZM16 13C16.2652 13 16.5196 12.8946 16.7071 12.7071C16.8946 12.5196 17 12.2652 17 12C17 11.7348 16.8946 11.4804 16.7071 11.2929C16.5196 11.1054 16.2652 11 16 11C15.7348 11 15.4804 11.1054 15.2929 11.2929C15.1054 11.4804 15 11.7348 15 12C15 12.2652 15.1054 12.5196 15.2929 12.7071C15.4804 12.8946 15.7348 13
205216 13ZM8 13C7.73478 13 7.48043 12.8946 7.29289 12.7071C7.10536 12.5196 7 12.2652 7 12C7 11.7348 7.10536 11.4804 7.29289 11.2929C7.48043 11.1054 7.73478 11 8 11C8.26522 11 8.51957 11.1054 8.70711 11.2929C8.89464 11.4804 9 11.7348 9 12C9 12.2652 8.89464 12.5196 8.70711 12.7071C8.51957 12.8946 8.26522 13 8 13ZM16 18C16 18.2652 15.8946 18.5196 15.7071 18.7071C15.5196 18.8946 15.2652 19 15 19C14.7348 19 14.4804 18.8946 14.2929 18.7071C14.1054 18.5196 14 18.2652 14 18C14 17.7348 14.1054 17.4804 14.2929 17.2929C14.4804 17.1054 14.7348 17 15 17C15.2652 17 15.5196 17.1054 15.7071 17.2929C15.8946 17.4804 16 17.7348 16 18ZM10 18C10 18.2652 9.89464 18.5196 9.70711 18.7071C9.51957 18.8946 9.26522 19 9 19C8.73478 19 8.48043 18.8946 8.29289 18.7071C8.10536 18.5196 8 18.2652 8 18C8 17.7348 8.10536 17.4804 8.29289 17.2929C8.48043 17.1054 8.73478 17 9 17C9.26522 17 9.51957 17.1054 9.70711 17.2929C9.89464 17.4804 10 17.7348 10 18ZM6 8C5.73478 8 5.48043 7.89464 5.29289 7.70711C5.10536 7.51957 5 7.26522 5 7C5 6.73478 5.10536 6.48043 5.29289 6.29289C5.48043 6.10536 5.73478 6 6 6C6.26522 6 6.51957 6.10536 6.70711 6.29289C6.89464 6.48043 7 6.73478 7 7C7 7.26522 6.89464 7.51957 6.70711 7.70711C6.51957 7.89464 6.26522 8 6 8ZM9 8C8.73478 8 8.48043 7.89464 8.29289 7.70711C8.10536 7.51957 8 7.26522 8 7C8 6.73478 8.10536 6.48043 8.29289 6.29289C8.48043 6.10536 8.73478 6 9 6C9.26522 6 9.51957 6.10536 9.70711 6.29289C9.89464 6.48043 10 6.73478 10 7C10 7.26522 9.89464 7.51957 9.70711 7.70711C9.51957 7.89464 9.26522 8 9 8ZM11 7C11 7.26522 11.1054 7.51957 11.2929 7.70711C11.4804 7.89464 11.7348 8 12 8C12.2652 8 12.5196 7.89464 12.7071 7.70711C12.8946 7.51957 13 7.26522 13 7C13 6.73478 12.8946 6.48043 12.7071 6.29289C12.5196 6.10536 12.2652 6 12 6C11.7348 6 11.4804 6.10536 11.2929 6.29289C11.1054 6.48043 11 6.73478 11 7ZM15 8C14.7348 8 14.4804 7.89464 14.2929 7.70711C14.1054 7.51957 14 7.26522 14 7C14 6.73478 14.1054 6.48043 14.2929 6.29289C14.4804 6.10536 14.7348 6 15 6C15.2652 6 15.5196 6.10536 15.7071 6.29289C15.8946 6.48043 16 6.73478 16 7C16 7.26522 15.8946 7.51957 15.7071 7.70711C15.5196 7.89464 15.2652 8 15 8ZM17 7C17 7.26522 17.1054 7.51957 17.2929 7.70711C17.4804 7.89464 17.7348 8 18 8C18.2652 8 18.5196 7.89464 18.7071 7.70711C18.8946 7.51957 19 7.26522 19 7C19 6.73478 18.8946 6.48043 18.7071 6.29289C18.5196 6.10536 18.2652 6 18 6C17.7348 6 17.4804 6.10536 17.2929 6.29289C17.1054 6.48043 17 6.73478 17 7ZM11 4C11 4.26522 11.1054 4.51957 11.2929 4.70711C11.4804 4.89464 11.7348 5 12 5C12.2652 5 12.5196 4.89464 12.7071 4.70711C12.8946 4.51957 13 4.26522 13 4C13 3.73478 12.8946 3.48043 12.7071 3.29289C12.5196 3.10536 12.2652 3 12 3C11.7348 3 11.4804 3.10536 11.2929 3.29289C11.1054 3.48043 11 3.73478 11 4ZM11 1C11 1.26522 11.1054 1.51957 11.2929 1.70711C11.4804 1.89464 11.7348 2 12 2C12.2652 2 12.5196 1.89464 12.7071 1.70711C12.8946 1.51957 13 1.26522 13 1C13 0.734784 12.8946 0.48043 12.7071 0.292893C12.5196 0.105357 12.2652 0 12 0C11.7348 0 11.4804 0.105357 11.2929 0.292893C11.1054 0.48043 11 0.734784 11 1Z"></path> </svg> <span id="kapa-button-text">Ask AI</span> </button>
2052<script type="module" src="/_astro/KapaWidgetLazy.astro_astro_type_script_index_0_lang.CvY4fyjC.js"></script>
2052 <chatlio-widget widgetid="ff0f5411-22c5-423f-6bdb-4c7779dc367c"></chatlio-widget>
2052<script type="module" src="/_astro/ChatlioWidget.astro_astro_type_script_index_0_lang.mw7P_HYS.js"></script>
2052 <!-- Deferred Third-Party Scripts (GTM, HubSpot) - loaded on user interaction or timeout -->
2052<script type="module">var u=["nutrient.io"];function m(e){const n=e.toLowerCase();return u.some(t=>n===t||n.endsWith(`.${t}`))}var o="pending";function l(){return document.cookie.split(";").some(e=>e.trim().startsWith("nutrient_team=true"))}function f(){return navigator.webdriver===!0}function p(){(function(e,n,t,i,d){e.dataLayer=e.dataLayer||[],e.dataLayer.push({"gtm.start":new Date().getTime(),event:"gtm.js"});const s=n.getElementsByTagName(t)[0],r=n.createElement(t),c=i!=="dataLayer"?"&l="+i:"";r.async=!0,r.src="https://www.googletagmanager.com/gtm.js?id="+d+c,s.parentNode?.insertBefore(r,s)})(window,document,"script","dataLayer","GTM-T6LGJJC")}function w(){const e=document.createElement("script");e.id="hs-script-loader",e.async=!0,e.src="https://js.hs-scripts.com/145134102.js",document.head.appendChild(e)}function a(){if(o==="pending"){if(o="loading",l()){console.log("[DeferredScripts] Disabled for team member"),o="loaded";return}if(f()){console.log("[DeferredScripts] Disabled for automated browser"),o="loaded";return}if(!m(window.location.hostname)){console.log("[DeferredScripts] Disabled outside production:",window.location.hostname),o="loaded";return}p(),w(),o="loaded"}}function g(){window.dataLayer=window.dataLayer||[];const e=["scroll","click","touchstart","keydown","mousemove"],n=()=>{a(),e.forEach(t=>window.removeEventListener(t,n,{capture:!0}))};e.forEach(t=>{window.addEventListener(t,n,{capture:!0,passive:!0,once:!0})}),setTimeout(a,5e3),document.addEventListener("visibilitychange",()=>{document.hidden&&a()},{once:!0})}g();</script>
2052<!-- Auth-based visibility control -->
2052<script type="module" src="/_astro/Layout.astro_astro_type_script_index_1_lang.DPfFpIR_.js"></script>
2052<!-- CSP-safe Cookiebot Accept/Deny handling (WWW-1425) -->
2052<script type="module">var i='[data-cookiebot-action="accept"]',a='[data-cookiebot-action="deny"]';function s(o){const t=o.target;if(!(t instanceof Element))return;const e=t.closest(i),c=e?null:t.closest(a);if(!e&&!c)return;o.preventDefault();const n=window.Cookiebot?.dialog;n&&(e?n.submitConsent?.():n.submitDecline?.())}document.addEventListener("click",s);</script>
2052<!-- Credit pricing (client-side with auth support) --> </body> </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.