diff --git a/assets/sass/main.scss b/assets/sass/main.scss index 202fee8..4ab3270 100644 --- a/assets/sass/main.scss +++ b/assets/sass/main.scss @@ -42,6 +42,12 @@ h4 { // } #home-hero { + @media (min-width: 768px) { + h1 { + font-size: clamp(1.5rem, 3.8vw, 2.875rem); + } + } + .btn { width: 320px; position: relative; diff --git a/content/en/blog/2026-10-23-PQ-secure.md b/content/en/blog/2026-10-23-PQ-secure.md new file mode 100644 index 0000000..f779b0f --- /dev/null +++ b/content/en/blog/2026-10-23-PQ-secure.md @@ -0,0 +1,49 @@ +--- +author: Tim Geoghegan +date: 2026-10-23T00:00:00Z +slug: PQ-secure +title: "Bringing Divvi Up into the Post-Quantum Era" +excerpt: "The MPC foundations of Divvi Up were already post-quantum secure, but there was still work to do to close the remaining safety gaps." +display_support_us_footer: true +display_inline_newsletter_embed: false +--- + +In the spring of this year, our colleagues at [Google](https://blog.google/innovation-and-ai/technology/safety-security/cryptography-migration-timeline/) and [Cloudflare](https://blog.cloudflare.com/post-quantum-roadmap/) announced that they're setting the goal of migrating to post-quantum (PQ) cryptography by 2029. This is a more aggressive target than had previously been accepted in the industry, sending a strong signal that it's time to secure our systems against cryptographically relevant quantum computers (CRQCs). + +That's a responsibility that Divvi Up takes very seriously. In this post, we're going to explain the work we've done to make our private aggregation services post-quantum secure. We'll learn how most of the cryptographic primitives powering Divvi Up were already PQ secure and then lay out how we closed the remaining gaps in transport security. + +## Post-quantum secure foundations + +When thinking about quantum computing, it's very easy to catastrophize and assume that every cryptosystem falls apart right away. But the truth is that quantum computers can only do very specific things that classical computers can't. In particular, [Shor's algorithm](https://en.wikipedia.org/wiki/Shor%27s_algorithm) gives a CRQC a big advantage at solving the [discrete logarithm problem](https://en.wikipedia.org/wiki/Discrete_logarithm). The security of signature schemes like RSA or ECDSA rely on the hardness of that problem, in the sense that breaking them is proven to be as computationally expensive as solving discrete logarithms, and thus a computer that can solve that problem significantly faster can attack the asymmetric cryptography that we use widely on the internet. + +Divvi Up is built on top of a cryptographic tool for private aggregation called [Verifiable Distributed Aggregation Functions](https://datatracker.ietf.org/doc/draft-irtf-cfrg-vdaf/). VDAFs provide two guarantees. First, they protect the *privacy* of individual contributions to the aggregation. Nobody but the client ever sees an individual measurement, and the servers only learn aggregates. Second, VDAFs protect the *robustness* of aggregations by allowing servers to reject invalid or malformed measurements without learning any individual values. + +Divvi Up runs the [Prio](https://www.usenix.org/system/files/conference/nsdi17/nsdi17-corrigan-gibbs.pdf) family of VDAFs. In Prio, the privacy guarantee is realized by using secret sharing to give each server just a share of private inputs which reveals nothing whatsoever about the original input. This is [information-theoretic secure](https://en.wikipedia.org/wiki/Information-theoretic_security), meaning that an attacker who holds one of the shares and wants to learn the private input has no advantage compared to an attacker who is just guessing randomly. Even a fast discrete logarithm solver like a CRQC has no advantage. + +On the other hand, Prio's robustness guarantee is not information-theoretic secure, but it is as strong as symmetric ciphers like 128 bit AES. [Grover's algorithm](https://en.wikipedia.org/wiki/Grover's_algorithm) does give CRQCs a theoretical advantage over classical computers here, but it's not big enough to meaningfully affect the security of symmetric cryptography or Prio's validity proofs. If you want to learn more, [check out this post by Filippo Valsorda](https://words.filippo.io/128-bits/). + +The result is that the most important protections offered by Divvi Up are already, and always have been, post-quantum secure. But that doesn't mean there wasn't anything to do. + +## Transport security + +VDAFs are a cryptographic primitive for private aggregation, but they don't make up an entire system you can safely run on the Internet. The validity proofs and secret shared inputs need to be encrypted in transit, or a network attacker would be able to observe both input shares, combine them back together, and violate privacy. + +Divvi Up's transport security is specified in the [Distributed Aggregation Protocol](https://datatracker.ietf.org/doc/draft-ietf-ppm-dap/). DAP relies on industry standard transport security protocols to achieve its security goals, namely [Transport Layer Security](https://www.rfc-editor.org/info/rfc9846/) (TLS), [Hybrid Public Key Encryption](https://datatracker.ietf.org/doc/draft-ietf-hpke-hpke/) (HPKE), and optionally [Oblivious HTTP](https://www.rfc-editor.org/info/rfc9458/) (OHTTP). + +Unlike Prio, each of these protocols makes heavy use of exactly the kind of asymmetric cryptography that CRQCs threaten. But the good news is that the working groups and communities responsible for each of these standards have been working on quantum-safe updates for a long time now. DAP and Divvi Up get to use all that for free because we built on top of these protocols. + +For TLS, the most urgent thing is to enable ciphersuites using the MLKEM768-X25519 hybrid key encapsulation mechanism, to guard against [harvest-now-decrypt-later attacks](https://en.wikipedia.org/wiki/Harvest_now,_decrypt_later). This change has already been deployed to Divvi Up's production environments, and any TLS client that supports PQ is already uploading reports over PQ-secure connections. To avoid breaking existing clients, we'll also continue to support TLS connections using exclusively classical cryptography, but we'll disable those ciphersuites at some point in the future. + +We also need to serve TLS certificates containing post-quantum keys, signed by post-quantum CAs. No publicly trusted post-quantum CA exists yet, but the IETF's [PLANTS working group](https://datatracker.ietf.org/wg/plants/about/) is working hard on specifying [Merkle Tree Certificates](https://datatracker.ietf.org/doc/draft-ietf-plants-merkle-tree-certs/) (MTCs), which are emerging as the web’s solution to scalable quantum-safe TLS certificates. To learn more about MTCs and the work underway at our sibling project Let's Encrypt, check out [this post by Andrew Gabbitas](https://letsencrypt.org/2026/06/03/pq-certs). + +DAP uses HPKE for secure asynchronous communication between protocol participants, tunneled within the TLS connections. HPKE was designed to be usable with a variety of ciphersuites and the IETF's HPKE working group has already published a [draft](https://datatracker.ietf.org/doc/draft-ietf-hpke-pq/) updating HPKE with PQ secure configurations. We worked with our friends in the open source community to ensure that the necessary suites are available in the [Rust HPKE package](https://crates.io/crates/hpke). Divvi Up's production environments are already advertising hybrid HPKE ciphersuites, and will drop support for exclusively classical suites in the future. + +Finally, DAP can optionally be composed with Oblivious HTTP for stronger privacy protections. To learn more about that, check out [this post about our OHTTP gateway](/blog/ohttp-now-available/). Just like DAP, OHTTP uses HPKE. We've added support for the latest post-quantum ciphersuites to [privacy-gateway-go](https://github.com/cloudflare/privacy-gateway-server-go/pull/76) and [ohttp-go](https://github.com/chris-wood/ohttp-go/pull/37) and have upgraded our OHTTP gateways to advertise post-quantum ciphersuites alongside classical ones, allowing clients that support it to opt into quantum safe cryptography. + +Besides this server-side work, clients will also need to update so that they can use PQ ciphersuites in all these protocols. We'll facilitate that by distributing updated clients for Divvi Up in [Rust](https://crates.io/crates/janus-client), [TypeScript](https://github.com/divviup/divviup-ts) and [Java](https://github.com/divviup/divviup-android/). + +## A smooth transition to a PQ future + +That's all the pieces we need to upgrade to make Divvi Up secure against CRQCs. While the quantum computing threat is real and imminent enough to warrant decisive action, that doesn't mean we have to flip a big switch and leave anyone who isn't ready behind. By building on IETF standards that are easy to deploy using off-the-shelf software components, collaborating with the open source community, and providing graceful upgrade paths allowing users to opt in at their own pace, we can move to PQ security without unnecessary disruption to running systems. + +If you’re interested in learning more about how Divvi Up can help your team with secure, private telemetry, [contact us](/contact/). diff --git a/layouts/partials/divvi/divvi_home_hero.html b/layouts/partials/divvi/divvi_home_hero.html index deed186..4f2fa1e 100644 --- a/layouts/partials/divvi/divvi_home_hero.html +++ b/layouts/partials/divvi/divvi_home_hero.html @@ -6,7 +6,9 @@ >

- Divvi Up: A privacy respecting telemetry service + Divvi Up:
+ A privacy respecting
+ telemetry service

diff --git a/resources/_gen/assets/sass/main.scss_77b10c8e87ff110a62c52933fe3f7f11.content b/resources/_gen/assets/sass/main.scss_77b10c8e87ff110a62c52933fe3f7f11.content index 1fbc4df..9b0f6fd 100644 --- a/resources/_gen/assets/sass/main.scss_77b10c8e87ff110a62c52933fe3f7f11.content +++ b/resources/_gen/assets/sass/main.scss_77b10c8e87ff110a62c52933fe3f7f11.content @@ -1 +1 @@ -:root{--primary-font:"Helvetica Neue", Helvetica, Arial, sans-serif;--font-family-sans-serif:var(--primary-font), sans-serif;--blue-color:#0114b5;--teal-color:#0af;--aquamarine-color:#7acee2;--primary-text-color:#fff;--primary-accent-color:#00c9ff;--primary-hover-color:#0114b5;--primary-link-color:#fff;--primary-hero-background-color:#fff;--primary-background-color:#0015a7;--footer-background-color:#051735;--link-color-on-white-bg:#0114b5;--link-hover-color-on-white-bg:#0114b5;--primary-button-background-color:#0af;--gray-1:#1a1a1a;--gray-2:#404040;--gray-3:#737373;--gray-4:#ccc;--gray-5:#e5e5e5;--gray-6:#f2f2f2}@font-face{font-family:lato;src:url(/fonts/Lato/Lato-Thin.ttf)format("truetype");font-weight:300;font-style:normal}@font-face{font-family:lato;src:url(/fonts/Lato/Lato-Regular.ttf)format("truetype");font-weight:400;font-style:normal}@font-face{font-family:lato;src:url(/fonts/Lato/Lato-Bold.ttf)format("truetype");font-weight:700;font-style:normal}@font-face{font-family:lato;src:url(/fonts/Lato/Lato-Black.ttf)format("truetype");font-weight:900;font-style:normal}:root{--primary-font:"Helvetica Neue", Helvetica, Arial, sans-serif;--font-family-sans-serif:var(--primary-font), sans-serif;--blue-color:#0114b5;--teal-color:#0af;--aquamarine-color:#7acee2;--primary-text-color:#fff;--primary-accent-color:#00c9ff;--primary-hover-color:#0114b5;--primary-link-color:#fff;--primary-hero-background-color:#fff;--primary-background-color:#0015a7;--footer-background-color:#051735;--link-color-on-white-bg:#0114b5;--link-hover-color-on-white-bg:#0114b5;--primary-button-background-color:#0af;--gray-1:#1a1a1a;--gray-2:#404040;--gray-3:#737373;--gray-4:#ccc;--gray-5:#e5e5e5;--gray-6:#f2f2f2}a{color:var(--primary-link-color) !important;text-underline-offset:2px;text-decoration-color:var(--primary-accent-color);text-decoration-thickness:1px}a:hover,a:focus{text-decoration:underline;text-decoration-color:var(--teal-color);text-decoration-thickness:2px}a.nav-link:hover{text-decoration:underline !important;text-decoration-color:var(--teal-color) !important;text-decoration-thickness:1px;text-underline-offset:3px}.btn:hover{text-decoration:none}.btn-primary{background-color:var(--primary-button-background-color) !important;border-color:var(--primary-button-background-color) !important;color:#fff !important}.btn-primary:hover{background-color:#0099e6 !important;border-color:#0099e6 !important}.btn-outline-primary{border-color:var(--primary-link-color) !important;color:var(--primary-link-color) !important}.btn-outline-primary:hover{background-color:var(--primary-link-color) !important;color:#fff !important}.text-primary{color:var(--primary-text-color) !important}.navbar-light .navbar-toggler-icon,.navbar-light .navbar-toggler-icon::before,.navbar-light .navbar-toggler-icon::after{background-color:var(--primary-link-color) !important}.navbar-stuck.navbar-light .navbar-toggler-icon,.navbar-stuck.navbar-light .navbar-toggler-icon::before,.navbar-stuck.navbar-light .navbar-toggler-icon::after{background-color:var(--link-color-on-white-bg) !important}.btn-divvi-primary{background-color:var(--teal-color) !important;color:#fff !important;border-color:#0af;font-weight:700 !important;font-family:var(--primary-font);border:1px solid transparent}footer{background-color:var(--footer-background-color)}footer a{color:#fff !important}body,.tooltip,.popover{font-family:var(--primary-font),sans-serif}.bg-dark{background-color:#051735 !important}@media(min-width:768px){.pt-md-8{padding-top:8rem !important}}.accordion-button{color:#082659 !important;font-size:20px;line-height:34px}.accordion-button::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none'%3e%3cpath fill-rule='evenodd' d='M7.999.667c.368 0 .667.298.667.667v6h6c.368 0 .667.298.667.667s-.299.667-.667.667h-6v6c0 .368-.298.667-.667.667s-.667-.299-.667-.667v-6h-6C.964 8.667.666 8.369.666 8s.298-.667.667-.667h6v-6c0-.368.298-.667.667-.667z' fill='%2314dfb4'/%3e%3c/svg%3e") !important}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none'%3e%3cpath fill-rule='evenodd' d='M.666 8c0-.368.298-.667.667-.667v1.333C.964 8.666.666 8.368.666 8zm14 0v.667H1.333V7.333h13.333V8zm0 0v.667c.368 0 .667-.298.667-.667s-.299-.667-.667-.667V8z' fill='%2314dfb4'/%3e%3c/svg%3e") !important}.btn>[class^=ci-],.btn>[class*=" ci-"]{font-size:1em}.cs-page-wrapper{-ms-flex:1 0 auto;flex:1 0 auto}.navbar-stuck #logo-white{display:none}#logo-color{display:none}.navbar-stuck #logo-color{display:block}header .nav-link{color:#fff !important}@media screen and (max-width:991.9px){header .navbar-collapse .nav-link{color:var(--blue-color) !important;padding-left:31px;padding-right:31px}header .navbar-collapse .dropdown-menu .dropdown-item{padding-left:31px;padding-right:31px}}header.navbar-stuck .nav-link{color:var(--blue-color) !important}header .dropdown-menu a{color:var(--link-color-on-white-bg) !important}header .dropdown-menu a:hover{color:var(--link-color-hover-on-white-bg) !important}h1.page-title{color:#fff !important;text-align:center}.why-cards{padding-left:0;padding-right:0}.why-cards .card{background-color:#fff;border-color:var(--teal-color);border-width:2px}.why-cards .card,.why-cards .card h3{color:#1a1a1a !important}.large-btn{display:block;border:1px solid var(--footer-background-color);border-radius:15px;height:100px;padding:15px 25px;margin-bottom:40px;color:#fff !important;text-decoration:none;background-color:#001398}.large-btn:hover{text-decoration:none;background-color:#000f74}@media screen and (max-width:499.98px){.large-btn{padding:20px 15px}}.large-btn span{display:block}.large-btn span.the-name{font-size:20px;font-weight:700;margin-bottom:10px}@media screen and (max-width:499.98px){.large-btn span.the-name{font-size:16px}}@media screen and (max-width:499.98px){.large-btn span.the-email{font-size:13px}}.invert-container{background:#000f74}.invert-teal-container{background:var(--teal-color)}.invert-teal-container .btn{background-color:#fff !important;color:var(--teal-color) !important}.invert-teal-container .btn:hover{background-color:#fff !important}.fs-xl{font-size:1.5rem}.default-padding-l{padding-left:31px}.default-padding-r{padding-right:31px}.tns-nav [data-nav]{height:8px}.tns-nav-inverse [data-nav]::before,.tns-nav-outside [data-nav]::before{background-color:var(--teal-color)}.tns-nav-inverse [data-nav],.tns-nav-outside [data-nav]{background-color:#fff}.tns-nav-inverse [data-nav]:hover,.tns-nav-outside [data-nav]:hover{background-color:var(--teal-color)}.footer-white{background-color:#fff;color:#1a1a1a}.footer-white a{color:var(--blue-color) !important}.footer-white .text-light{color:#1a1a1a !important}.offset-scroll-position-for-fixed-header{padding-top:110px;margin-top:calc(110px * -1);display:block}.btn-prevent-overflow{padding-left:0 !important;padding-right:0 !important;max-width:100%;width:100%}@media screen and (max-width:767.98px){.mobile-only\:btn-prevent-overflow{padding-left:0 !important;padding-right:0 !important;max-width:100%;width:100%}}:root{--primary-font:"Helvetica Neue", Helvetica, Arial, sans-serif;--font-family-sans-serif:var(--primary-font), sans-serif;--blue-color:#0114b5;--teal-color:#0af;--aquamarine-color:#7acee2;--primary-text-color:#fff;--primary-accent-color:#00c9ff;--primary-hover-color:#0114b5;--primary-link-color:#fff;--primary-hero-background-color:#fff;--primary-background-color:#0015a7;--footer-background-color:#051735;--link-color-on-white-bg:#0114b5;--link-hover-color-on-white-bg:#0114b5;--primary-button-background-color:#0af;--gray-1:#1a1a1a;--gray-2:#404040;--gray-3:#737373;--gray-4:#ccc;--gray-5:#e5e5e5;--gray-6:#f2f2f2}.tpl-page .cs-page-wrapper{margin-top:100px}.tpl-page h1{text-align:center}.footnotes{padding-top:10px}.footnotes hr{margin-bottom:10px}.footnotes ol{padding-left:17px}.sponsor-logos{display:flex}.sponsor-logos .sponsor{margin-bottom:40px;margin-right:40px}.sponsor-logos .sponsor img{max-height:100px}.sponsor-logos .sponsor:last-child{margin-bottom:0}blockquote{padding-left:40px;padding-right:40px}.page__blog h1,.page__contact h1{text-align:center !important}@media screen and (max-width:767.98px){.tpl-post .cs-page-wrapper{margin-top:70px !important}.tpl-post .partial-hero{margin-top:20px !important}}.tpl-post .partial-hero{margin-top:40px}.tpl-post .partial-hero>.container{padding-left:0;padding-right:0}.tpl-post .cs-page-wrapper{margin-top:100px}.tpl-post .author-bg{color:var(--teal-color);margin-bottom:25px;font-weight:700;display:inline-block}.tpl-post .blog_list_item__date{text-transform:uppercase;letter-spacing:2px;font-weight:900;color:var(--teal-color) !important}.tpl-post #container-blog{background-color:#fff;color:var(--blue-color) !important}.tpl-post #container-blog h1,.tpl-post #container-blog h2,.tpl-post #container-blog h3,.tpl-post #container-blog a:not(.btn){color:var(--blue-color) !important}.tpl-post h1{text-align:left;max-width:680px;margin-left:auto;margin-right:auto;color:#fff !important}.tpl-post .article_content figure,.tpl-post .article_content img,.tpl-post .blog_list figure,.tpl-post .blog_list img{max-width:100%}.tpl-post .article_content p:has(+img),.tpl-post .blog_list p:has(+img){max-width:680px;margin-left:auto;margin-right:auto}.tpl-post .article_content .blog_list_item,.tpl-post .article_content h2,.tpl-post .article_content h3,.tpl-post .article_content h4,.tpl-post .article_content h5,.tpl-post .article_content h6,.tpl-post .article_content p,.tpl-post .article_content ul,.tpl-post .article_content figcaption,.tpl-post .blog_list .blog_list_item,.tpl-post .blog_list h2,.tpl-post .blog_list h3,.tpl-post .blog_list h4,.tpl-post .blog_list h5,.tpl-post .blog_list h6,.tpl-post .blog_list p,.tpl-post .blog_list ul,.tpl-post .blog_list figcaption{max-width:680px;margin-left:auto;margin-right:auto}.tpl-post .article_content li,.tpl-post .article_content p,.tpl-post .blog_list li,.tpl-post .blog_list p{font-size:20px;line-height:34px}.tpl-post .article_content ul,.tpl-post .blog_list ul{margin-bottom:34px}.tpl-post .article_content .partial-hero>.container,.tpl-post .blog_list .partial-hero>.container{padding-left:0;padding-right:0}.tpl-post .article_content figure,.tpl-post .blog_list figure{margin-bottom:34px}.tpl-post .article_content figure figcaption,.tpl-post .blog_list figure figcaption{font-size:14px;line-height:20px;margin-top:8px}.tpl-post #container-blog .force-black h2,.tpl-post #container-blog .force-black a,.tpl-post #container-blog .force-black p{color:#000 !important}.tpl-post #container-blog .force-gray h2,.tpl-post #container-blog .force-gray a,.tpl-post #container-blog .force-gray p{color:#333 !important}.two-image-row{max-width:680px;margin:0 auto 1.5em;align-items:center;padding:0}.quote-text p{font-size:24px !important;line-height:36px !important;font-style:italic;font-weight:700;color:#000}blockquote.blockquote{padding:0;max-width:680px;margin:0 auto 1.5em}blockquote.blockquote::before{left:-45px}.blockquote-footer{font-size:16px;line-height:24px}@media screen and (max-width:767.98px){blockquote.blockquote{padding-left:30px;padding-right:30px}blockquote.blockquote::before{left:0;top:5px;transform:scale(.75)}}.pic-quote-right{margin:0 0 1.5em}@media screen and (min-width:497.98px){.pic-quote-right{float:right;margin:0 0 1.5em 1.5em;max-width:40%}}.tpl-post h1.page-title{margin-bottom:0 !important}.post-footer{background-color:var(--primary-background-color);color:#fff;padding:1.5rem;margin-top:2rem;margin-left:-20px;margin-right:-20px}.tpl-post #container-blog .post-footer a{color:#fff !important}.post-footer h6{font-size:20px;line-height:1;color:#fff;font-weight:700;margin-top:0}.post-footer p:last-child{margin-bottom:0}.blog_list_item__image{margin-right:1rem;margin-bottom:1rem}@media screen and (min-width:767.98px){.blockquote-intro-offset{padding-left:95px;padding-right:95px}}blockquote.blockquote::before{color:#0015a7}.tella-blog-post-image{display:block}@media screen and (min-width:767.98px){.tella-blog-post-image{margin-bottom:20px;margin-left:20px;top:30px;position:relative;float:right;max-height:400px}}@media screen and (max-width:767.97px){.tella-blog-post-image{margin-left:auto;margin-bottom:40px;margin-right:auto;max-height:70vh}}body,h1,h2,h3,h4{color:var(--primary-text-color) !important}#footer-logo{margin-bottom:5px;max-width:100%}#footer-logo-link{max-width:320px}.btn-large{font-size:18px}.logo-container{width:200px;height:200px}.logo-container img{width:100%;height:100%;object-fit:contain}#home-hero .btn{width:320px;position:relative}#home-hero .btn i{position:absolute;left:18px;top:16px}.highlight{background:#e8fcf8;text-align:center;padding:20px 10px 10px;margin:10px 0 20px}.highlight h2{font-size:20px;text-transform:uppercase;letter-spacing:.5px}.highlight p{font-size:20px}#copyright-line{background-color:#292c37;background-repeat:repeat}#copyright-line a{text-decoration:none}#copyright-line a:hover{text-decoration:underline}.navbar-floating{z-index:1030}.blog-date{font-size:15px}.get-involved-item{margin-bottom:50px}.get-involved-item form button{display:block;margin-top:10px;background:var(--teal-color) !important;border-color:var(--teal-color) !important}header.cs-header{background-color:var(--primary-background-color)}body{background-color:var(--primary-background-color)}.no-br{white-space:nowrap}a[name]{scroll-padding-top:50px}.navbar-brand{padding-top:4px}.text-muted a{color:#787a80 !important;text-decoration-color:#787a80 !important}.text-muted a:hover{color:#fff !important;text-decoration-color:var(--teal-color) !important}.email-field-container input{width:400px;max-width:100%}video::-webkit-media-controls-panel{background-image:none !important}.tpl-page .cs-page-wrapper #promo_announcement,.tpl-post #promo_announcement{margin-top:0}#promo_announcement{display:block;padding:10px;background-color:var(--teal-color);color:#fff !important;text-decoration-color:#fff;text-decoration:none;margin-top:90px;text-align:center;font-weight:700}#promo_announcement:hover{background-color:#0099e6 !important}@media screen and (max-width:575.98px){#promo_announcement{margin-top:66px}}.flex{display:flex}.flex-row{flex-direction:row}.use-case-image{max-width:160px}@media screen and (max-width:500px){.use-case-image{max-width:100px}}.use-case-image-column{width:160px;flex-shrink:0;align-content:center;justify-content:center;align-items:center;text-align:center}@media screen and (max-width:500px){.use-case-image-column{width:100px}}.use-cases-columns{align-items:flex-start;flex-direction:column}.use-cases-card a,.use-cases-card h5,.use-cases-card h4{color:var(--primary-button-background-color) !important}.use-cases-card{background:#fff;width:100%;color:#000;padding:1rem;border-radius:1rem;border:1px solid var(--primary-accent-color)}@media screen and (min-width:768px){.use-cases-card{width:50%}.use-cases-columns{flex-direction:row}}.text-xs{font-size:.75rem}.isrg-card{background:#fff;width:100%;color:#000;padding:1rem;border-radius:1rem;border:1px solid var(--primary-accent-color)}.isrg-card a,.isrg-card h5,.isrg-card h4{color:var(--primary-button-background-color) !important}.self-center{align-self:center}div[data-netlify-site-id]{display:none;pointer-events:none}code[class*=language-],pre[class*=language-],pre{margin-top:1rem !important;margin-bottom:1rem !important}a code{color:#e3116c}.rss-feed-link{display:inline-flex;align-items:center;gap:6px;font-size:14px;font-weight:600;color:var(--link-color-on-white-bg);text-decoration:none;transition:color 150ms}.rss-feed-link:hover{color:var(--teal-color);text-decoration:none}.rss-feed-link--dark{color:var(--teal-color)}.rss-feed-link--dark:hover{color:var(--aquamarine-color)}.rss-feed-link .rss-icon{display:inline-block;flex-shrink:0;width:14px;height:14px;background-color:currentColor;-webkit-mask-image:url(/images/rss-icon.svg);mask-image:url(/images/rss-icon.svg);-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat} \ No newline at end of file +:root{--primary-font:"Helvetica Neue", Helvetica, Arial, sans-serif;--font-family-sans-serif:var(--primary-font), sans-serif;--blue-color:#0114b5;--teal-color:#0af;--aquamarine-color:#7acee2;--primary-text-color:#fff;--primary-accent-color:#00c9ff;--primary-hover-color:#0114b5;--primary-link-color:#fff;--primary-hero-background-color:#fff;--primary-background-color:#0015a7;--footer-background-color:#051735;--link-color-on-white-bg:#0114b5;--link-hover-color-on-white-bg:#0114b5;--primary-button-background-color:#0af;--gray-1:#1a1a1a;--gray-2:#404040;--gray-3:#737373;--gray-4:#ccc;--gray-5:#e5e5e5;--gray-6:#f2f2f2}@font-face{font-family:lato;src:url(/fonts/Lato/Lato-Thin.ttf)format("truetype");font-weight:300;font-style:normal}@font-face{font-family:lato;src:url(/fonts/Lato/Lato-Regular.ttf)format("truetype");font-weight:400;font-style:normal}@font-face{font-family:lato;src:url(/fonts/Lato/Lato-Bold.ttf)format("truetype");font-weight:700;font-style:normal}@font-face{font-family:lato;src:url(/fonts/Lato/Lato-Black.ttf)format("truetype");font-weight:900;font-style:normal}:root{--primary-font:"Helvetica Neue", Helvetica, Arial, sans-serif;--font-family-sans-serif:var(--primary-font), sans-serif;--blue-color:#0114b5;--teal-color:#0af;--aquamarine-color:#7acee2;--primary-text-color:#fff;--primary-accent-color:#00c9ff;--primary-hover-color:#0114b5;--primary-link-color:#fff;--primary-hero-background-color:#fff;--primary-background-color:#0015a7;--footer-background-color:#051735;--link-color-on-white-bg:#0114b5;--link-hover-color-on-white-bg:#0114b5;--primary-button-background-color:#0af;--gray-1:#1a1a1a;--gray-2:#404040;--gray-3:#737373;--gray-4:#ccc;--gray-5:#e5e5e5;--gray-6:#f2f2f2}a{color:var(--primary-link-color) !important;text-underline-offset:2px;text-decoration-color:var(--primary-accent-color);text-decoration-thickness:1px}a:hover,a:focus{text-decoration:underline;text-decoration-color:var(--teal-color);text-decoration-thickness:2px}a.nav-link:hover{text-decoration:underline !important;text-decoration-color:var(--teal-color) !important;text-decoration-thickness:1px;text-underline-offset:3px}.btn:hover{text-decoration:none}.btn-primary{background-color:var(--primary-button-background-color) !important;border-color:var(--primary-button-background-color) !important;color:#fff !important}.btn-primary:hover{background-color:#0099e6 !important;border-color:#0099e6 !important}.btn-outline-primary{border-color:var(--primary-link-color) !important;color:var(--primary-link-color) !important}.btn-outline-primary:hover{background-color:var(--primary-link-color) !important;color:#fff !important}.text-primary{color:var(--primary-text-color) !important}.navbar-light .navbar-toggler-icon,.navbar-light .navbar-toggler-icon::before,.navbar-light .navbar-toggler-icon::after{background-color:var(--primary-link-color) !important}.navbar-stuck.navbar-light .navbar-toggler-icon,.navbar-stuck.navbar-light .navbar-toggler-icon::before,.navbar-stuck.navbar-light .navbar-toggler-icon::after{background-color:var(--link-color-on-white-bg) !important}.btn-divvi-primary{background-color:var(--teal-color) !important;color:#fff !important;border-color:#0af;font-weight:700 !important;font-family:var(--primary-font);border:1px solid transparent}footer{background-color:var(--footer-background-color)}footer a{color:#fff !important}body,.tooltip,.popover{font-family:var(--primary-font),sans-serif}.bg-dark{background-color:#051735 !important}@media(min-width:768px){.pt-md-8{padding-top:8rem !important}}.accordion-button{color:#082659 !important;font-size:20px;line-height:34px}.accordion-button::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none'%3e%3cpath fill-rule='evenodd' d='M7.999.667c.368 0 .667.298.667.667v6h6c.368 0 .667.298.667.667s-.299.667-.667.667h-6v6c0 .368-.298.667-.667.667s-.667-.299-.667-.667v-6h-6C.964 8.667.666 8.369.666 8s.298-.667.667-.667h6v-6c0-.368.298-.667.667-.667z' fill='%2314dfb4'/%3e%3c/svg%3e") !important}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none'%3e%3cpath fill-rule='evenodd' d='M.666 8c0-.368.298-.667.667-.667v1.333C.964 8.666.666 8.368.666 8zm14 0v.667H1.333V7.333h13.333V8zm0 0v.667c.368 0 .667-.298.667-.667s-.299-.667-.667-.667V8z' fill='%2314dfb4'/%3e%3c/svg%3e") !important}.btn>[class^=ci-],.btn>[class*=" ci-"]{font-size:1em}.cs-page-wrapper{-ms-flex:1 0 auto;flex:1 0 auto}.navbar-stuck #logo-white{display:none}#logo-color{display:none}.navbar-stuck #logo-color{display:block}header .nav-link{color:#fff !important}@media screen and (max-width:991.9px){header .navbar-collapse .nav-link{color:var(--blue-color) !important;padding-left:31px;padding-right:31px}header .navbar-collapse .dropdown-menu .dropdown-item{padding-left:31px;padding-right:31px}}header.navbar-stuck .nav-link{color:var(--blue-color) !important}header .dropdown-menu a{color:var(--link-color-on-white-bg) !important}header .dropdown-menu a:hover{color:var(--link-color-hover-on-white-bg) !important}h1.page-title{color:#fff !important;text-align:center}.why-cards{padding-left:0;padding-right:0}.why-cards .card{background-color:#fff;border-color:var(--teal-color);border-width:2px}.why-cards .card,.why-cards .card h3{color:#1a1a1a !important}.large-btn{display:block;border:1px solid var(--footer-background-color);border-radius:15px;height:100px;padding:15px 25px;margin-bottom:40px;color:#fff !important;text-decoration:none;background-color:#001398}.large-btn:hover{text-decoration:none;background-color:#000f74}@media screen and (max-width:499.98px){.large-btn{padding:20px 15px}}.large-btn span{display:block}.large-btn span.the-name{font-size:20px;font-weight:700;margin-bottom:10px}@media screen and (max-width:499.98px){.large-btn span.the-name{font-size:16px}}@media screen and (max-width:499.98px){.large-btn span.the-email{font-size:13px}}.invert-container{background:#000f74}.invert-teal-container{background:var(--teal-color)}.invert-teal-container .btn{background-color:#fff !important;color:var(--teal-color) !important}.invert-teal-container .btn:hover{background-color:#fff !important}.fs-xl{font-size:1.5rem}.default-padding-l{padding-left:31px}.default-padding-r{padding-right:31px}.tns-nav [data-nav]{height:8px}.tns-nav-inverse [data-nav]::before,.tns-nav-outside [data-nav]::before{background-color:var(--teal-color)}.tns-nav-inverse [data-nav],.tns-nav-outside [data-nav]{background-color:#fff}.tns-nav-inverse [data-nav]:hover,.tns-nav-outside [data-nav]:hover{background-color:var(--teal-color)}.footer-white{background-color:#fff;color:#1a1a1a}.footer-white a{color:var(--blue-color) !important}.footer-white .text-light{color:#1a1a1a !important}.offset-scroll-position-for-fixed-header{padding-top:110px;margin-top:calc(110px * -1);display:block}.btn-prevent-overflow{padding-left:0 !important;padding-right:0 !important;max-width:100%;width:100%}@media screen and (max-width:767.98px){.mobile-only\:btn-prevent-overflow{padding-left:0 !important;padding-right:0 !important;max-width:100%;width:100%}}:root{--primary-font:"Helvetica Neue", Helvetica, Arial, sans-serif;--font-family-sans-serif:var(--primary-font), sans-serif;--blue-color:#0114b5;--teal-color:#0af;--aquamarine-color:#7acee2;--primary-text-color:#fff;--primary-accent-color:#00c9ff;--primary-hover-color:#0114b5;--primary-link-color:#fff;--primary-hero-background-color:#fff;--primary-background-color:#0015a7;--footer-background-color:#051735;--link-color-on-white-bg:#0114b5;--link-hover-color-on-white-bg:#0114b5;--primary-button-background-color:#0af;--gray-1:#1a1a1a;--gray-2:#404040;--gray-3:#737373;--gray-4:#ccc;--gray-5:#e5e5e5;--gray-6:#f2f2f2}.tpl-page .cs-page-wrapper{margin-top:100px}.tpl-page h1{text-align:center}.footnotes{padding-top:10px}.footnotes hr{margin-bottom:10px}.footnotes ol{padding-left:17px}.sponsor-logos{display:flex}.sponsor-logos .sponsor{margin-bottom:40px;margin-right:40px}.sponsor-logos .sponsor img{max-height:100px}.sponsor-logos .sponsor:last-child{margin-bottom:0}blockquote{padding-left:40px;padding-right:40px}.page__blog h1,.page__contact h1{text-align:center !important}@media screen and (max-width:767.98px){.tpl-post .cs-page-wrapper{margin-top:70px !important}.tpl-post .partial-hero{margin-top:20px !important}}.tpl-post .partial-hero{margin-top:40px}.tpl-post .partial-hero>.container{padding-left:0;padding-right:0}.tpl-post .cs-page-wrapper{margin-top:100px}.tpl-post .author-bg{color:var(--teal-color);margin-bottom:25px;font-weight:700;display:inline-block}.tpl-post .blog_list_item__date{text-transform:uppercase;letter-spacing:2px;font-weight:900;color:var(--teal-color) !important}.tpl-post #container-blog{background-color:#fff;color:var(--blue-color) !important}.tpl-post #container-blog h1,.tpl-post #container-blog h2,.tpl-post #container-blog h3,.tpl-post #container-blog a:not(.btn){color:var(--blue-color) !important}.tpl-post h1{text-align:left;max-width:680px;margin-left:auto;margin-right:auto;color:#fff !important}.tpl-post .article_content figure,.tpl-post .article_content img,.tpl-post .blog_list figure,.tpl-post .blog_list img{max-width:100%}.tpl-post .article_content p:has(+img),.tpl-post .blog_list p:has(+img){max-width:680px;margin-left:auto;margin-right:auto}.tpl-post .article_content .blog_list_item,.tpl-post .article_content h2,.tpl-post .article_content h3,.tpl-post .article_content h4,.tpl-post .article_content h5,.tpl-post .article_content h6,.tpl-post .article_content p,.tpl-post .article_content ul,.tpl-post .article_content figcaption,.tpl-post .blog_list .blog_list_item,.tpl-post .blog_list h2,.tpl-post .blog_list h3,.tpl-post .blog_list h4,.tpl-post .blog_list h5,.tpl-post .blog_list h6,.tpl-post .blog_list p,.tpl-post .blog_list ul,.tpl-post .blog_list figcaption{max-width:680px;margin-left:auto;margin-right:auto}.tpl-post .article_content li,.tpl-post .article_content p,.tpl-post .blog_list li,.tpl-post .blog_list p{font-size:20px;line-height:34px}.tpl-post .article_content ul,.tpl-post .blog_list ul{margin-bottom:34px}.tpl-post .article_content .partial-hero>.container,.tpl-post .blog_list .partial-hero>.container{padding-left:0;padding-right:0}.tpl-post .article_content figure,.tpl-post .blog_list figure{margin-bottom:34px}.tpl-post .article_content figure figcaption,.tpl-post .blog_list figure figcaption{font-size:14px;line-height:20px;margin-top:8px}.tpl-post #container-blog .force-black h2,.tpl-post #container-blog .force-black a,.tpl-post #container-blog .force-black p{color:#000 !important}.tpl-post #container-blog .force-gray h2,.tpl-post #container-blog .force-gray a,.tpl-post #container-blog .force-gray p{color:#333 !important}.two-image-row{max-width:680px;margin:0 auto 1.5em;align-items:center;padding:0}.quote-text p{font-size:24px !important;line-height:36px !important;font-style:italic;font-weight:700;color:#000}blockquote.blockquote{padding:0;max-width:680px;margin:0 auto 1.5em}blockquote.blockquote::before{left:-45px}.blockquote-footer{font-size:16px;line-height:24px}@media screen and (max-width:767.98px){blockquote.blockquote{padding-left:30px;padding-right:30px}blockquote.blockquote::before{left:0;top:5px;transform:scale(.75)}}.pic-quote-right{margin:0 0 1.5em}@media screen and (min-width:497.98px){.pic-quote-right{float:right;margin:0 0 1.5em 1.5em;max-width:40%}}.tpl-post h1.page-title{margin-bottom:0 !important}.post-footer{background-color:var(--primary-background-color);color:#fff;padding:1.5rem;margin-top:2rem;margin-left:-20px;margin-right:-20px}.tpl-post #container-blog .post-footer a{color:#fff !important}.post-footer h6{font-size:20px;line-height:1;color:#fff;font-weight:700;margin-top:0}.post-footer p:last-child{margin-bottom:0}.blog_list_item__image{margin-right:1rem;margin-bottom:1rem}@media screen and (min-width:767.98px){.blockquote-intro-offset{padding-left:95px;padding-right:95px}}blockquote.blockquote::before{color:#0015a7}.tella-blog-post-image{display:block}@media screen and (min-width:767.98px){.tella-blog-post-image{margin-bottom:20px;margin-left:20px;top:30px;position:relative;float:right;max-height:400px}}@media screen and (max-width:767.97px){.tella-blog-post-image{margin-left:auto;margin-bottom:40px;margin-right:auto;max-height:70vh}}body,h1,h2,h3,h4{color:var(--primary-text-color) !important}#footer-logo{margin-bottom:5px;max-width:100%}#footer-logo-link{max-width:320px}.btn-large{font-size:18px}.logo-container{width:200px;height:200px}.logo-container img{width:100%;height:100%;object-fit:contain}@media(min-width:768px){#home-hero h1{font-size:clamp(1.5rem,3.8vw,2.875rem)}}#home-hero .btn{width:320px;position:relative}#home-hero .btn i{position:absolute;left:18px;top:16px}.highlight{background:#e8fcf8;text-align:center;padding:20px 10px 10px;margin:10px 0 20px}.highlight h2{font-size:20px;text-transform:uppercase;letter-spacing:.5px}.highlight p{font-size:20px}#copyright-line{background-color:#292c37;background-repeat:repeat}#copyright-line a{text-decoration:none}#copyright-line a:hover{text-decoration:underline}.navbar-floating{z-index:1030}.blog-date{font-size:15px}.get-involved-item{margin-bottom:50px}.get-involved-item form button{display:block;margin-top:10px;background:var(--teal-color) !important;border-color:var(--teal-color) !important}header.cs-header{background-color:var(--primary-background-color)}body{background-color:var(--primary-background-color)}.no-br{white-space:nowrap}a[name]{scroll-padding-top:50px}.navbar-brand{padding-top:4px}.text-muted a{color:#787a80 !important;text-decoration-color:#787a80 !important}.text-muted a:hover{color:#fff !important;text-decoration-color:var(--teal-color) !important}.email-field-container input{width:400px;max-width:100%}video::-webkit-media-controls-panel{background-image:none !important}.tpl-page .cs-page-wrapper #promo_announcement,.tpl-post #promo_announcement{margin-top:0}#promo_announcement{display:block;padding:10px;background-color:var(--teal-color);color:#fff !important;text-decoration-color:#fff;text-decoration:none;margin-top:90px;text-align:center;font-weight:700}#promo_announcement:hover{background-color:#0099e6 !important}@media screen and (max-width:575.98px){#promo_announcement{margin-top:66px}}.flex{display:flex}.flex-row{flex-direction:row}.use-case-image{max-width:160px}@media screen and (max-width:500px){.use-case-image{max-width:100px}}.use-case-image-column{width:160px;flex-shrink:0;align-content:center;justify-content:center;align-items:center;text-align:center}@media screen and (max-width:500px){.use-case-image-column{width:100px}}.use-cases-columns{align-items:flex-start;flex-direction:column}.use-cases-card a,.use-cases-card h5,.use-cases-card h4{color:var(--primary-button-background-color) !important}.use-cases-card{background:#fff;width:100%;color:#000;padding:1rem;border-radius:1rem;border:1px solid var(--primary-accent-color)}@media screen and (min-width:768px){.use-cases-card{width:50%}.use-cases-columns{flex-direction:row}}.text-xs{font-size:.75rem}.isrg-card{background:#fff;width:100%;color:#000;padding:1rem;border-radius:1rem;border:1px solid var(--primary-accent-color)}.isrg-card a,.isrg-card h5,.isrg-card h4{color:var(--primary-button-background-color) !important}.self-center{align-self:center}div[data-netlify-site-id]{display:none;pointer-events:none}code[class*=language-],pre[class*=language-],pre{margin-top:1rem !important;margin-bottom:1rem !important}a code{color:#e3116c}.rss-feed-link{display:inline-flex;align-items:center;gap:6px;font-size:14px;font-weight:600;color:var(--link-color-on-white-bg);text-decoration:none;transition:color 150ms}.rss-feed-link:hover{color:var(--teal-color);text-decoration:none}.rss-feed-link--dark{color:var(--teal-color)}.rss-feed-link--dark:hover{color:var(--aquamarine-color)}.rss-feed-link .rss-icon{display:inline-block;flex-shrink:0;width:14px;height:14px;background-color:currentColor;-webkit-mask-image:url(/images/rss-icon.svg);mask-image:url(/images/rss-icon.svg);-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat} \ No newline at end of file diff --git a/resources/_gen/assets/sass/main.scss_77b10c8e87ff110a62c52933fe3f7f11.json b/resources/_gen/assets/sass/main.scss_77b10c8e87ff110a62c52933fe3f7f11.json index 74612f8..db1fc51 100644 --- a/resources/_gen/assets/sass/main.scss_77b10c8e87ff110a62c52933fe3f7f11.json +++ b/resources/_gen/assets/sass/main.scss_77b10c8e87ff110a62c52933fe3f7f11.json @@ -1 +1 @@ -{"Target":"/sass/main.min.262aef7ed285a491c5bf7480083a223598fac44c28820d035dced6c956527c2f.css","MediaType":"text/css","Data":{"Integrity":"sha256-JirvftKFpJHFv3SACDoiNZj6xEwogg0DXc7WyVZSfC8="}} \ No newline at end of file +{"Target":"/sass/main.min.8eef7ef4cb3b35862b779c9084b553425f90272a0b04105649e2c370610ce20f.css","MediaType":"text/css","Data":{"Integrity":"sha256-ju9+9Ms7NYYrd5yQhLVTQl+QJyoLBBBWSeLDcGEM4g8="}} \ No newline at end of file