Error message

  • Deprecated function: implode(): Passing glue string after array is deprecated. Swap the parameters in drupal_get_feeds() (line 394 of /home/cay45lq1/public_html/includes/common.inc).
  • Deprecated function: The each() function is deprecated. This message will be suppressed on further calls in menu_set_active_trail() (line 2405 of /home/cay45lq1/public_html/includes/menu.inc).

Feed aggregator

New forum topics

'Nintendo products are fully compliant with these requirements' — A new Nintendo Switch 2 model featuring a removable battery will be released in the EU soon to meet regulations

TechRadar News - Fri, 06/05/2026 - 10:10
Nintendo has announced that it will soon release a revised Switch 2 model with a removable battery in Europe to meet new regulations.
Categories: Technology

Anthropic's bizarre call for everyone to slow down on AI is a pipe dream — here's why that will never happen

TechRadar News - Fri, 06/05/2026 - 10:08
Anthropic's fears about recursive development are well-founded, but its idea for how to control it is laughable.
Categories: Technology

Proxmox VE virtualization platform review

TechRadar News - Fri, 06/05/2026 - 10:05
Powerful open-source virtualization for users ready to move beyond desktop VM tools
Categories: Technology

Proxmox VE virtualization platform review

TechRadar Reviews - Fri, 06/05/2026 - 10:05

Proxmox VE is often listed among the best virtual machine software options, although it belongs to a different category than most desktop virtualization tools. Rather than running as an application inside Windows, macOS, or Linux, it is designed as a server virtualization platform that manages workloads through a web-based interface.

At its core, Proxmox VE combines KVM for full virtual machines with LXC containers for lighter workloads. This gives users the option to run complete operating systems when needed, while also deploying more efficient containerized services where a full VM would be unnecessary. That combination is one of the main reasons Proxmox has become popular in homelab environments, where users often want to run many services on limited hardware.

The platform has also gained momentum because of changes in the broader virtualization market. VMware remains a powerful enterprise platform, but licensing and ecosystem changes have made many homelab users and smaller organizations look for alternatives. Proxmox does not replace VMware in every enterprise scenario, but it offers a strong mix of flexibility, cost control, and practical capability.

This makes Proxmox VE particularly interesting for users who want to move beyond basic desktop virtualization. It is not the easiest tool in this category, but it is one of the most capable once the underlying concepts are understood.

Proxmox VE: Plans and pricing

Proxmox VE is free to download and use, which is one of its biggest advantages. There are no per-VM, per-core, or per-user licensing fees for the core platform, and users can install it on their own hardware without paying for a traditional software license.

The commercial model is built around annual subscriptions, priced per physical CPU socket. This is an important distinction, especially when compared with platforms that price around cores, editions, or broader enterprise bundles. For Proxmox VE, the number of cores on a processor does not change the subscription count.

The current subscription tiers start with Community at €120 per year per CPU socket, which provides access to the enterprise repository and community support. Basic costs €370 per year per CPU socket and adds three support tickets with a one-business-day response time. Standard costs €550 per year per CPU socket and includes 10 support tickets with a four-hour response time for critical requests within a business day. Premium costs €1,100 per year per CPU socket and includes unlimited support tickets with a two-hour response time for critical requests within a business day. All prices are listed as net prices, with VAT added where applicable.

This does not mean that free users are locked out of the core platform. The main virtualization features, including virtual machines, containers, clustering, high availability, and live migration, remain available without a paid subscription. Free users can use the no-subscription repository, although production environments will generally be better served by the enterprise repository and vendor-backed support.

Free installations also display a “no valid subscription” notice when logging into the web interface. This is a familiar Proxmox quirk rather than a functional limitation, but it is worth mentioning because almost every free user will encounter it.

In practice, Proxmox’s pricing model is one of the reasons it has gained more attention in recent years. Homelab users can run the platform at no cost, while businesses can add support without moving to a per-core licensing model. That makes Proxmox particularly attractive for users evaluating alternatives to VMware, although organizations still need to consider support, skills, migration planning, and operational risk rather than looking only at the license cost.

Proxmox VE: Features

(Image credit: Proxmox // Future)

Proxmox VE provides a broad set of features that go well beyond basic VM creation. The platform integrates KVM virtual machines, LXC containers, software-defined storage, networking, clustering, and high-availability tools into a single environment. This gives it a level of scope that is closer to infrastructure management than traditional desktop virtualization.

The support for both VMs and containers is particularly important. Full virtual machines remain useful when complete operating system isolation is needed, while LXC containers offer a lighter way to run services with lower overhead. For users running many small services in a homelab, this can be a major advantage over platforms that focus only on full virtual machines.

Storage is another major part of the platform. Proxmox can work with technologies such as ZFS, LVM, NFS, iSCSI, and Ceph, depending on the deployment. This flexibility is powerful, but it also requires care. Unlike desktop virtualization tools, where storage is often abstracted away, Proxmox expects users to understand how their storage choices affect performance, snapshots, replication, and reliability.

Backup integration is also a strong point. Proxmox Backup Server adds support for efficient backup workflows, including incremental and deduplicated backups. This has become an important part of the Proxmox ecosystem, especially for users who want a backup approach designed around virtual machines and containers rather than a generic file-based tool.

Clustering and high availability extend the platform further. Users can group multiple nodes together, migrate workloads, and design environments that are more resilient than a single standalone host. These features are valuable, but they require planning and are not as simple as creating a local VM on a desktop hypervisor.

Proxmox VE: Interface and use

(Image credit: Proxmox // Future)

Proxmox VE is managed primarily through a browser-based interface. This is one of its biggest practical advantages, because most common tasks can be handled without installing a separate management application. The interface provides access to nodes, virtual machines, containers, storage, networking, logs, and tasks from one central view.

The design is functional rather than polished. Compared to VMware’s more refined enterprise tools or desktop applications such as Parallels and VMware Workstation, Proxmox can feel more technical and less guided. However, the layout is logical once the main concepts are understood, and common actions such as creating a VM, opening a console, checking storage, or viewing node resources are easy to reach.

Creating a virtual machine follows a structured wizard, but the process still assumes that users understand ISO images, storage targets, CPU allocation, memory, networking, and disk formats. This is not difficult for experienced users, but it is a noticeable step up from tools that automatically hide most of these decisions.

The same applies to containers and networking. LXC containers are efficient and powerful, but users need to understand how they differ from virtual machines. Networking can also become complex, especially when moving beyond a simple bridged setup into VLANs, software-defined networking, or clustered environments.

For homelab users and administrators, this level of control is part of the appeal. For casual users who only want to run another operating system occasionally, it may feel like too much infrastructure for the task.

Proxmox VE: Performance

(Image credit: Proxmox // Future)

Proxmox VE can deliver strong performance, particularly when installed directly on suitable hardware. Because it is built around KVM and runs as a server virtualization platform rather than a desktop application, it avoids some of the overhead and friction associated with Type 2 hypervisors.

That said, performance depends heavily on hardware, storage design, and configuration. A well-configured Proxmox system can run virtual machines and containers efficiently, but poor storage choices, unsuitable networking, or underpowered hardware can limit the experience quickly. This is especially true when using ZFS, Ceph, or more advanced replication setups, where configuration decisions have a direct impact on performance.

Containers are one of Proxmox’s strongest performance-related advantages. LXC workloads are lighter than full virtual machines and can help users run more services on the same hardware. This matters in homelab and small infrastructure environments, where memory and storage are often limited.

GPU passthrough is also available and can be useful for advanced users who want to assign hardware to specific workloads. However, it requires compatible hardware and additional configuration, so it should not be treated as a beginner feature.

In longer-term use, Proxmox is often praised for stability, especially in homelab scenarios. Once configured properly, it can provide a reliable base for running persistent workloads, although it remains less polished than VMware in some areas. That balance is important: Proxmox performs well, but it rewards users who understand the platform rather than those expecting a fully guided experience.

Proxmox VE: Support

Proxmox has extensive documentation, an active community, and a growing ecosystem of guides, scripts, and third-party resources. This community activity is one of the reasons the platform has gained momentum among homelab users and smaller organizations.

Official support is tied to paid subscriptions, which also provide access to the enterprise repository. For businesses, this model makes sense because it provides a clearer support path and more conservative update source. For individual users, community documentation and forums will often be the main support channel.

This is one area where expectations matter. Proxmox offers strong value, but free users should not expect the same support experience as customers of a fully commercial enterprise platform. The platform is usable without a subscription, but production environments should consider the support model carefully.

The broader ecosystem has improved. Proxmox Backup Server strengthens the native backup story, and third-party backup vendors have started adding support for Proxmox environments. This makes the platform easier to consider for more serious deployments than it was in the past.

Proxmox VE: The competition

Proxmox VE competes most directly with VMware vSphere and ESXi in infrastructure environments, although it is also often discussed by users moving beyond desktop tools such as VirtualBox, VMware Workstation, and Hyper-V.

Compared to VMware, Proxmox offers a more accessible cost structure and a stronger appeal for homelabs, smaller deployments, and users who prefer open-source infrastructure. It also has advantages in container support through LXC, which gives it a useful middle ground between full virtual machines and lighter service deployments.

VMware still has strengths that Proxmox has not fully matched. Its enterprise ecosystem remains more mature, and areas such as advanced storage, polished management tooling, and large-scale enterprise support are still important differentiators. For large organizations with complex requirements, VMware may remain the safer and more familiar choice.

Hyper-V remains relevant for Windows-centric environments, especially where integration with Microsoft infrastructure matters. However, Proxmox is more flexible for users who want an open-source server virtualization platform with strong Linux foundations.

In practice, Proxmox VE is best suited to users who want serious virtualization without commercial licensing pressure and who are willing to learn the platform properly. It is not the easiest tool in the category, but it offers one of the strongest combinations of value, flexibility, and control.

Proxmox VE: Final Verdict

Proxmox VE is one of the strongest open-source virtualization platforms available for homelab users, small infrastructure environments, and users who want more control than desktop virtualization tools can provide. It combines KVM virtual machines, LXC containers, clustering, storage, networking, and backup integration into a single platform, making it far more ambitious than tools such as VirtualBox or VMware Workstation.

That strength also defines its limitations. Proxmox is not designed as a simple desktop application. It is installed as a server-focused operating environment, managed through a browser, and built around concepts such as nodes, storage pools, bridges, containers, and clusters. Users familiar with Linux and infrastructure tools will appreciate the control, while beginners may find the learning curve significant.

For users willing to work through that complexity, Proxmox VE delivers excellent value. It is free to download and use, has strong community momentum, and offers a capable alternative to commercial virtualization platforms. It still lacks some of VMware’s enterprise polish and ecosystem depth, but for homelabs and smaller deployments, it is a serious and increasingly compelling option.

Categories: Reviews

Google Fitbit Air review: The affordable Whoop alternative hits all the right notes, but its messy AI-powered app holds it back from greatness

TechRadar Reviews - Fri, 06/05/2026 - 10:04
Google Fitbit Air: One minute review

For a simple device, there’s a lot going on with the Google Fitbit Air. People feel very strongly about it, for better or for worse, and there’s been a lot of chatter and interest surrounding its release. My experience actually wearing the device has generally been very positive, with tracking accuracy comparable to that offered by my Apple Watch Ultra 3, which is pretty much the gold standard for wrist-based health tracking. Metrics relying on the tracker’s onboard heart-rate monitoring are reliable, matching the Apple Watch closely during work, rest, and exercise during my week with the Fitbit Air.

Set-and-forget trackers are clearly having a moment. Oura has released the Oura Ring 5 just one year after the Ring 4, and Whoop’s success has given rise to a number of copycats from brands looking to recreate the experience of a distraction-free screenless ‘focus band’ for a less premium price.

Google is one such copycat, but the screenless, slender form factor suits the Fitbit brand — the original Fitbit was a digital pedometer — down to the ground. It speaks to the core of what Fitbit used to be, before it became just another company churning out mediocre smartwatches running a limited proprietary operating system. Your Fitbit was always meant to be a discreet little device, and devices don’t come more discreet than the Google Fitbit Air. Weighing just 12g and using a very slender 17mm-wide band, the Fitbit Air is a lovely and (crucially) comfortable device to wear and use. It’s much more comfortable to wear during sleep than any full smartwatch I’ve ever tried (and I have tried a lot), or even the Whoop.

However, it’s hard to separate the Fitbit Air from the Google Health app, with Google’s redesign of the Fitbit app causing particular ire amongst Fitbit users. The app is a bit of a mess, and not intuitive to use, with features dotted all over the place. It feels like it’s designed to primarily function as a home for the AI Health Coach chatbot, which is very intelligent and perhaps the best in-app AI assistant I’ve tried, but it’s not the best way to operate a health app. Whoop’s balance of AI and on-page metrics is much better.

If you’re looking for a consistent screenless focus band to track different sorts of workouts like gym, sports, and yoga, alongside sleep, heart health and general wellness, you can use the Google Fitbit Air as is, paying just the up-front price, and keep your tracking simple.

Whether or not you can get onboard with the Premium option will depend on how much you like chatbots — I found its flexibility immensely helpful, but its constant chirpy summaries and insistence on hiding my data inside walls of text became annoying, so it’s a mixed bag for me. Overall, though, this is the best, most interesting Fitbit to have been released in years.

Google Fitbit Air: Price and availability
  • $99.99 in the US
  • £84.99 in the UK
  • AU$199 in Australia

The Google Fitbit Air costs $99.99 / £84.99 / AU$199, and for that you get the tracker, a band of your choice, and a charger specific to the Google Fitbit Air — proving once again that Google seems to be allergic to making a charger that’s compatible with more than one device.

The Google Health Premium subscription, which gives you access to Google’s AI Health Coach, costs $9.99 / £7.99 / AU$14.99 a month, or $99.99 / £79.99 / AU$140 annually. Existing Google AI Pro members get it at no extra cost.

For comparison, the cheapest Apple Watch SE 3 starts at $249 / £219 / AU$399, while Whoop’s complex pricing structure begins at £169 / $199 / AU$299 per year for the lowest tier. The Google Fitbit Air’s pricing is cheap for what you get, with the Health Coach as an optional add-on rather than a mandatory subscription.

  • Value score: 4.5/5
Google Fitbit Air review: Design

(Image credit: Future)
  • Simple, screenless and elegant
  • Light and comfortable
  • App design is chaotic

The Google Fitbit Air’s design can be split into two components: the physical device, which is excellent, and the new Google Health app, which is a bit of a misfire.

Let’s start with the positives. The Fitbit Air comprises the tracker itself, and a wraparound band in a choice of three styles — a silicone Active band, the woven Performance Loop, or the polyurethane (pleather) Elevated Modern band. Each comes with their own color options, and a plastic clasp. On the underside of the tracker are the optical heart rate sensor, skin temperature sensor, and an accelerometer and gyroscope for counting steps.

It weighs just 12g, even with the Performance Loop strap, so it’s light and easy to wear, which is crucial for sleep tracking. I wore it on my right wrist, with a watch on my left during the day, and I didn’t feel like an obnoxious techie: unless someone looks closely, it just looks like a wristband, with the lack of a screen helping here. The Performance Loop strap that came with my review unit is the best-looking of the three options in this respect, but none of them look bad.

The tracker also has a haptic vibrate function — if you set an alarm in the app, this can be disabled with a tap on the top of the device. And that’s pretty much all the interaction you have with the sensor and band as a whole; everything else, as with one of the best smart rings or other screenless tracking options, is done via the app.

(Image credit: Future)

The app is where Google’s design falls down. Split into four tabs — Today, Fitness, Sleep and Health — the Google Health app features a dashboard with key metrics at the top, and insights or libraries of content below it.

But with information scattered across a quartet of tabs, it’s hard to find certain granular metrics or content you’re looking for compared to the old Fitbit app. I searched for Mindfulness content for 10 minutes before finding the five-minute meditation I was after, for example, and I often ended up starting new chats with the AI coach rather than resuming a chat from my history. It’s just not intuitive to use.

What is right in your face, for Premium users, is the AI coach, which cloaks your metrics in paragraphs of cheery text, so it takes longer to get to your information. It’s clever, and we’ll get onto its functionality in a moment, but I wish it summarized and contextualized less, and just offered more 'glanceability'.

  • Design score: 3.5/5
Google Fitbit Air review: Features

(Image credit: Future)
  • Set-and-forget tracker with a haptic alarm
  • Good metrics
  • AI Health Coach is a flexible macro-feature

The Fitbit Air records the usual metrics you’d expect with a modern fitness tracker, including step count, heart rate, floors climbed, sleep stages, and so forth. Fitbit’s Daily Readiness score shows you how prepared your body is for exercise, based on recent activity and sleep scores, while it also surfaces weekly cardio goals, hydration, and basic food logging. It can offer irregular heart rate rhythm notifications, which is great for potentially diagnosing atrial fibrilation, and allows you to take an ECG scan manually to monitor your heart health.

Basic tracking is all the free version gets you; there’s no workout builder, mindfulness content, way to log sickness, or any other extras beyond the numbers. It doesn’t add any special metrics for runners, such as stride or cadence, as many of the best running watches do. For some users who just want the numbers, this will be fine, with no need to subscribe to the Premium tier.

For Premium users, food logging can be done via the AI Health Coach, by taking a picture of your food. It’s very good at logging packaged food (it was bang on logging a crinkled package of chips with the message ‘log this’ as a 74kcal snack, also breaking down macros and salt content) but can struggle with plates of homemade food, although a basic description such as ‘log this lentil curry’ is enough for it to provide an estimation. The more information you can provide (weight etc), the more detailed it gets.

It’s the best version of this feature I’ve tried across many different apps, but those without the Health Coach can log food manually, as you can in other apps like MyFitnessPal.

(Image credit: Future)

The app also has access to Fitbit’s library of workout and meditation content, including individual moves, which you can use to build your own workout. Again, this is only available through the Premium subscription.

Through it all runs the AI Health Coach, which I actually found to be useful. Although there was no field to input illness as such, I typed my cold symptoms out to the Health Coach, and it remembered I was ill and adjusted its messaging and advice throughout the rest of the week based on my symptoms. I went to the gym without following one of the app’s pre-prescribed workouts, typed my sets and reps into the Coach’s ‘Ask Coach’ field, and it not only logged the workout, but suggested complementary routines to work different muscle groups for the rest of the week.

The AI Coach is a flexible ‘macro-feature’ that works well in conjunction with the rest of the app, and almost allows you to bypass the chaotic layout: you can just ask the Coach to serve you up what you need, which I’m sure was Google’s intent. Your use of the Coach will depend on your tolerance for chatbots: those who use Gemini or ChatGPT for everything will get a lot out of it, while those who loathe AI and just want numbers will likely loathe the Premium tier.

  • Features score: 4/5
Google Fitbit Air review: Performance

(Image credit: Future)
  • Performed well compared to the Apple Watch Ultra 3 in most scenarios
  • Poor run estimations
  • Battery life as described

As I noted when I compared the Google Fitbit Air against the Apple Watch Ultra 3, the tracker performed well during my 10K test run, at least for the metrics like heart rate and calorie count, which it can use its onboard sensors for. The metrics it uses my phone's GPS to estimate, like distance, were off significantly.

I’ve embedded the results below, but generally there was no statistically significant difference between heart rate or calorie estimations from the two devices. I'll be updating the review with confirmation of heart rate scores tested against a new Polar H10 chest strap, as my old testing unit has malfunctioned.

@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,400;0,900;1,900&display=swap'); /* Reset & Base */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper *, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper *:before, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper *:after, #fv-chart-1780054953725-jxfr84byr-slideshow *, #fv-chart-1780054953725-jxfr84byr-slideshow *:before, #fv-chart-1780054953725-jxfr84byr-slideshow *:after { box-sizing: border-box !important; margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper, #fv-chart-1780054953725-jxfr84byr-slideshow { font-family: 'Open Sans', sans-serif !important; } /* Main Wrappers */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper { position: relative !important; overflow: visible !important; --riv-primary: #2E6E93; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-inner-wrapper { color: #1F2937 !important; background-color: #ffffff !important; padding: 1.5rem 1.5rem 2rem !important; border-radius: 0.5rem !important; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1) !important; margin: 1rem 0 !important; display: flex !important; flex-direction: column !important; overflow: hidden !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-inner-wrapper.fv-no-header.fv-is-image-compare { padding-top: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.fv-full-bleed { width: 100vw !important; margin-left: calc(50% - 50vw) !important; } body { overflow-x: clip !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.fv-full-bleed .fv-inner-wrapper { padding: 0 !important; border-radius: 0 !important; box-shadow: none !important; margin: 0 !important; background-color: transparent !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-inner-wrapper.fv-is-shop-the-look { padding: 0 !important; border-radius: 0 !important; box-shadow: none !important; margin: 0 !important; background-color: transparent !important; } /* Slideshow Styles */ #fv-chart-1780054953725-jxfr84byr-slideshow { position: relative !important; width: 100% !important; margin: 1rem 0 !important; --riv-primary: #2E6E93; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-slides-wrapper { position: relative !important; width: 100% !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-slide { width: 100% !important; animation: fv-fade-in 0.3s ease-in-out; } @keyframes fv-fade-in { from { opacity: 0; } to { opacity: 1; } } /* Top Navigation Row (Redesign) */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-slideshow-nav-row { position: relative !important; display: flex !important; justify-content: space-between !important; align-items: center !important; padding: 0 0 16px 0 !important; width: 100% !important; z-index: 20 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-nav-btn { background-color: var(--riv-primary) !important; color: #ffffff !important; border: none !important; border-radius: 4px !important; padding: 8px 16px !important; font-size: 14px !important; font-weight: 700 !important; cursor: pointer !important; display: flex !important; align-items: center !important; justify-content: center !important; gap: 6px !important; transition: opacity 0.2s, background-color 0.2s !important; height: 36px !important; text-transform: none !important; box-shadow: 0 1px 2px rgba(0,0,0,0.1) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-nav-btn svg { width: 18px !important; height: 18px !important; stroke-width: 3px !important; filter: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-nav-btn:hover { opacity: 0.9 !important; transform: translateY(-1px) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-nav-btn.disabled { background-color: #E5E7EB !important; color: #9CA3AF !important; cursor: default !important; pointer-events: none !important; box-shadow: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-slide-counter { font-family: 'Poppins', sans-serif !important; font-size: 14px !important; font-weight: 600 !important; color: #374151 !important; text-align: center !important; min-width: 40px !important; background-color: rgba(255,255,255,0.8) !important; padding: 2px 8px !important; border-radius: 10px !important; } /* Slideshow Dropdown Navigation */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-slideshow-select { position: absolute !important; top: 10px !important; right: 10px !important; z-index: 20 !important; appearance: none !important; -webkit-appearance: none !important; -moz-appearance: none !important; background-color: white !important; border: 1px solid #d1d5db !important; color: #1F2937 !important; font-family: 'Open Sans', sans-serif !important; font-size: 14px !important; font-weight: 600 !important; padding: 6px 32px 6px 12px !important; border-radius: 4px !important; cursor: pointer !important; box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e") !important; background-position: right 0.5rem center !important; background-repeat: no-repeat !important; background-size: 1.5em 1.5em !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-slideshow-select:focus { outline: 2px solid #2E6E93 !important; border-color: #2E6E93 !important; } /* Typography */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-chart-title { font-weight: bold !important; text-align: center !important; margin-bottom: 0.5rem !important; color: var(--riv-primary) !important; font-size: 20px !important; line-height: 1.2 !important; font-family: 'Open Sans', sans-serif !important; text-transform: none !important; white-space: normal !important; overflow-wrap: break-word !important; padding: 0 20px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-chart-subhead { font-size: 18px !important; font-weight: 500 !important; text-align: center !important; margin-bottom: 2rem !important; color: #374151 !important; line-height: 1.7 !important; font-family: 'Open Sans', sans-serif !important; display: block !important; text-transform: none !important; padding: 0 20px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .rv-chart-caption { font-size: 15px !important; color: #374151 !important; text-align: center !important; font-style: normal !important; font-weight: normal !important; line-height: 1.7 !important; font-family: 'Open Sans', sans-serif !important; display: block !important; } /* Versus Chart */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-chart { display: flex; flex-direction: column; width: 100%; margin-top: 1rem; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; padding: 0 1rem; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-wrapper { flex: 1; min-width: 0; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-wrapper.fv-left { text-align: center; padding-right: 1rem; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-wrapper.fv-right { text-align: center; padding-left: 1rem; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-container { position: relative; display: inline-block; max-width: 100%; width: 100%; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-chevron { position: absolute; top: 50%; transform: translateY(-50%); pointer-events: none; width: 16px; height: 16px; flex-shrink: 0; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-wrapper.fv-left .fv-versus-chevron { right: 0; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-wrapper.fv-right .fv-versus-chevron { right: 0; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select { background: transparent; border: none; border-bottom: 2px solid; font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; padding: 0.25rem 0; cursor: pointer; outline: none; appearance: none; -webkit-appearance: none; -moz-appearance: none; max-width: 100%; width: 100%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select.fv-select-left { text-align: center; direction: ltr; padding-right: 1.25rem; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select.fv-select-right { text-align: center; padding-right: 1.25rem; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select option { font-family: 'Open Sans', sans-serif; font-weight: 400; font-size: 14px; color: #374151; direction: ltr; text-align: left; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-vs { font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; color: #374151; letter-spacing: 0.1em; padding: 0 1rem; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-body { display: flex; flex-direction: column; gap: 1.5rem; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-row { position: relative; height: auto; padding-top: 20px; margin-bottom: 0.25rem; display: block; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-bar-container { position: relative; height: 32px; display: flex; align-items: center; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-bar-left-wrapper { flex: 1; height: 100%; display: flex; justify-content: flex-end; align-items: center; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-bar-right-wrapper { flex: 1; height: 100%; display: flex; justify-content: flex-start; align-items: center; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-bar { height: 32px; width: var(--target-width); transition: width 0.8s ease-out; animation: fv-grow-max-width 0.8s ease-out forwards; display: flex; align-items: center; overflow: hidden; color: #ffffff; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-bar-left { border-radius: 4px 0 0 4px; justify-content: flex-end; padding: 0 8px; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-bar-right { border-radius: 0 4px 4px 0; justify-content: flex-start; padding: 0 8px; } @keyframes fv-grow-max-width { from { max-width: 0; } to { max-width: 100%; } } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-center-line { position: absolute; left: 50%; top: 0; bottom: 0; width: 4px; background-color: #ffffff; transform: translateX(-50%); z-index: 1; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-inside-left { white-space: nowrap; flex-shrink: 0; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-inside-right { white-space: nowrap; flex-shrink: 0; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-val-text { font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-pct-diff { font-size: 12px; font-weight: 600; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-label { position: absolute; left: 50%; transform: translateX(-50%); top: 0; background-color: transparent; border: none; box-shadow: none; padding: 0; font-family: 'Open Sans', sans-serif; font-weight: 700; font-size: 14px; color: #374151; white-space: nowrap; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0,0,0,0) !important; white-space: nowrap !important; border: 0 !important; } /* Image Comparison Styles */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-container { width: auto !important; margin-left: -1.5rem !important; margin-right: -1.5rem !important; margin-bottom: 2rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.fv-full-bleed .fv-image-compare-container { width: 100% !important; max-width: none !important; margin: 0 auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper { position: relative !important; width: 100% !important; overflow: hidden !important; border-radius: 0 !important; background-color: #000 !important; touch-action: pan-y !important; user-select: none !important; -webkit-user-select: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-inner { position: relative !important; width: 100% !important; height: 100% !important; display: block !important; transform-origin: center center !important; transition: transform 0.1s ease-out !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-bg { display: block !important; width: 100% !important; height: auto !important; pointer-events: none !important; user-select: none !important; -webkit-user-select: none !important; -webkit-user-drag: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-fg { position: absolute !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; object-fit: cover !important; clip-path: polygon(0 0, 50% 0, 50% 100%, 0 100%) !important; pointer-events: none !important; user-select: none !important; -webkit-user-select: none !important; -webkit-user-drag: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-slider { position: absolute !important; top: 0 !important; bottom: 0 !important; left: 50% !important; width: 32px !important; transform: translateX(-50%) !important; cursor: ew-resize !important; z-index: 10 !important; user-select: none !important; -webkit-user-select: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-slider-line { position: absolute !important; top: 0 !important; bottom: 0 !important; left: 50% !important; width: 4px !important; background-color: white !important; transform: translateX(-50%) !important; box-shadow: 0 0 10px rgba(0,0,0,0.5) !important; pointer-events: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-handle { position: absolute !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; width: 32px !important; height: 32px !important; background-color: white !important; border-radius: 50% !important; box-shadow: 0 2px 6px rgba(0,0,0,0.3) !important; display: flex !important; align-items: center !important; justify-content: center !important; gap: 4px !important; pointer-events: none !important; z-index: 11 !important; overflow: hidden !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-handle.fv-image-compare-handle-square { border-radius: 6px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-arrow-left { width: 0 !important; height: 0 !important; border-top: 4px solid transparent !important; border-bottom: 4px solid transparent !important; border-right: 4px solid #4b5563 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-arrow-right { width: 0 !important; height: 0 !important; border-top: 4px solid transparent !important; border-bottom: 4px solid transparent !important; border-left: 4px solid #4b5563 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-label { position: absolute !important; top: 1rem !important; background-color: rgba(0, 0, 0, 0.5) !important; color: white !important; padding: 0.25rem 0.75rem !important; border-radius: 0.25rem !important; font-size: 0.875rem !important; font-weight: 500 !important; pointer-events: none !important; backdrop-filter: blur(4px) !important; z-index: 5 !important; transition: right 0.3s ease, opacity 0.2s ease !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-label-left { left: 1rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-label-right { right: 1rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-expand-btn, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-close-btn { position: absolute !important; bottom: 1rem !important; right: 1rem !important; background-color: rgba(0, 0, 0, 0.5) !important; color: white !important; border: none !important; border-radius: 0.25rem !important; padding: 0.5rem !important; cursor: pointer !important; z-index: 20 !important; display: flex !important; align-items: center !important; justify-content: center !important; backdrop-filter: blur(4px) !important; transition: background-color 0.2s !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-expand-btn:hover, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-close-btn:hover { background-color: rgba(0, 0, 0, 0.7) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-close-btn { display: none !important; top: 1rem !important; bottom: auto !important; } /* Fullscreen State */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper.fv-image-compare-fullscreen { position: fixed !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important; width: 100% !important; height: 100% !important; z-index: 999999 !important; display: flex !important; align-items: center !important; justify-content: center !important; background-color: rgba(0, 0, 0, 0.9) !important; margin: 0 !important; touch-action: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper.fv-image-compare-fullscreen .fv-image-compare-inner { width: 100% !important; height: 100% !important; display: flex !important; align-items: center !important; justify-content: center !important; cursor: grab !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper.fv-image-compare-fullscreen .fv-image-compare-inner:active { cursor: grabbing !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper.fv-image-compare-fullscreen .fv-image-compare-bg { position: absolute !important; top: 0 !important; left: 0 !important; max-width: 100% !important; max-height: 100% !important; width: 100% !important; height: 100% !important; object-fit: contain !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper.fv-image-compare-fullscreen .fv-image-compare-fg { max-width: 100% !important; max-height: 100% !important; width: 100% !important; height: 100% !important; object-fit: contain !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper.fv-image-compare-fullscreen .fv-image-compare-expand-btn { display: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper.fv-image-compare-fullscreen .fv-image-compare-close-btn { display: flex !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-image-compare-wrapper.fv-image-compare-fullscreen .fv-image-compare-label-right { right: 4rem !important; } /* Footer */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bottom-bar { display: flex !important; flex-direction: column !important; align-items: center !important; margin-top: 0.5rem !important; gap: 1rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-footer-content { text-align: center !important; width: 100% !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-logo { display: block !important; margin: 0 auto !important; width: 120px !important; min-width: 120px !important; max-width: 120px !important; height: auto !important; object-fit: contain !important; flex-shrink: 0 !important; } /* Display Mode Controls */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-dropdown-wrapper { text-align: center !important; margin-bottom: 16px !important; margin-top: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-dropdown-title-container { position: relative !important; display: inline-block !important; max-width: 100% !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-dropdown-title { appearance: none !important; -webkit-appearance: none !important; -moz-appearance: none !important; background: transparent !important; border: none !important; font-size: 18px !important; font-weight: 600 !important; color: var(--riv-primary) !important; padding-right: 28px !important; padding-left: 10px !important; cursor: pointer !important; text-align: center !important; text-align-last: center !important; width: auto !important; max-width: 100% !important; font-family: 'Open Sans', sans-serif !important; line-height: 1.3 !important; margin: 0 !important; text-overflow: ellipsis !important; overflow: hidden !important; white-space: nowrap !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-dropdown-title:focus { outline: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-dropdown-title::-ms-expand { display: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-dropdown-chevron { position: absolute !important; right: 0 !important; top: 50% !important; transform: translateY(-50%) !important; pointer-events: none !important; color: var(--riv-primary) !important; display: flex !important; align-items: center !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-carousel-title-controls { display: flex !important; justify-content: space-between !important; align-items: center !important; margin-bottom: 16px !important; width: 100% !important; gap: 12px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-carousel-nav-btn { background: transparent !important; border: 1px solid #d1d5db !important; border-radius: 6px !important; padding: 6px 10px !important; cursor: pointer !important; font-size: 14px !important; color: #374151 !important; display: flex !important; align-items: center !important; gap: 4px !important; font-family: 'Open Sans', sans-serif !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-carousel-nav-btn:hover { border-color: #9ca3af !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-carousel-counter { font-size: 14px !important; color: #374151 !important; text-align: center !important; margin-top: 1rem !important; } /* Legend */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-legend { display: flex !important; justify-content: center !important; flex-wrap: wrap !important; gap: 8px 16px !important; margin: 0 !important; padding: 0 !important; margin-top: 1rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-legend-item { display: flex !important; align-items: center !important; gap: 6px !important; font-size: 14px !important; color: #374151 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-legend-color { width: 12px !important; height: 12px !important; border-radius: 3px !important; } /* Multi-Value Legend */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-multi-value-legend { display: flex !important; justify-content: center !important; flex-wrap: wrap !important; gap: 12px 24px !important; margin-bottom: 1.5rem !important; padding: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-multi-legend-item { display: flex !important; align-items: center !important; gap: 8px !important; font-size: 14px !important; color: #374151 !important; font-weight: 500 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-multi-legend-swatch { width: 16px !important; height: 16px !important; border-radius: 3px !important; } /* Chart Core Styles */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-benchmark-group { margin-bottom: 1rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-benchmark-title { font-size: 18px !important; font-weight: 600 !important; margin-bottom: 16px !important; margin-top: 0 !important; padding: 0 !important; text-align: center !important; color: var(--riv-primary) !important; flex: 1 !important; min-width: 0 !important; font-family: 'Open Sans', sans-serif !important; line-height: 1.3 !important; text-transform: none !important; white-space: normal !important; overflow-wrap: break-word !important; word-wrap: break-word !important; max-width: 100% !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-row, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stacked-product { display: flex !important; align-items: center !important; width: 100% !important; margin-bottom: 0.75rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-label { width: 150px !important; flex-shrink: 0 !important; font-size: 14px !important; color: #374151 !important; padding-right: 10px !important; text-align: right !important; font-weight: 500 !important; display: block !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-container { flex-grow: 1 !important; background-color: #E5E7EB !important; border-radius: 4px !important; min-height: 25px !important; border: 1px solid #D1D5DB !important; position: relative !important; display: flex !important; align-items: center !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar { height: 100% !important; border-radius: 3px !important; display: flex !important; align-items: center !important; transition: opacity 0.2s ease, width 0.8s ease-out !important; min-height: 23px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar:hover { opacity: 0.8 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-inner-content { display: flex !important; justify-content: space-between !important; align-items: center !important; width: 100% !important; height: 100% !important; padding: 0 8px !important; font-size: 14px !important; font-weight: bold !important; overflow: hidden !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-inner-label { white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; padding-right: 8px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-inner-value { flex-shrink: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-value-outside { padding-left: 8px !important; font-size: 14px !important; font-weight: bold !important; color: #374151 !important; white-space: nowrap !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-label.fv-primary-product { font-weight: bold !important; color: var(--riv-primary) !important; } /* Multi-Value Bar Logic */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-multi-bar-container { flex-direction: column !important; padding: 4px !important; align-items: stretch !important; gap: 4px !important; height: auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-multi-bar-item { display: flex !important; align-items: center !important; height: 25px !important; width: 100% !important; } /* Stacked Bar */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stacked-bar { display: flex !important; overflow: hidden !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stacked-segment { height: 100% !important; display: flex !important; align-items: center !important; justify-content: flex-end !important; padding-right: 8px !important; border-right: 1px solid rgba(255,255,255,0.3) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stacked-segment:last-child { border-right: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-segment-value { font-size: 14px !important; font-weight: bold !important; } /* Grouped Bar */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-grouped-bar-product { display: flex !important; flex-direction: column !important; width: 100% !important; margin-bottom: 1.25rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-grouped-product-title-wrapper { padding-left: 150px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-grouped-product-title { width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.5rem !important; font-weight: 700 !important; font-size: 14px !important; color: #374151 !important; text-transform: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-cluster { width: 100% !important; flex-grow: 1 !important; display: flex !important; flex-direction: column !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-cluster .fv-bar-row { margin-bottom: 3px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-cluster .fv-bar-container { height: 20px !important; } /* Line Chart Grid */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .riv-grid line { stroke: #D1D5DB !important; stroke-dasharray: 3 3 !important; } /* X-Axis */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-wrapper { display: flex !important; width: 100% !important; margin-top: 0.5rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-label-space { width: 150px !important; padding-right: 10px !important; flex-shrink: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-chart-space { flex-grow: 1 !important; padding-right: 8px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-wrapper.fv-grouped-x-axis { margin-left: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-line { border-top: 1px solid #D1D5DB !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-ticks { display: flex !important; justify-content: space-between !important; padding-top: 4px !important; font-size: 13px !important; color: #374151 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-ticks span { position: relative !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-ticks span::before { content: '' !important; position: absolute !important; top: -6px !important; left: 50% !important; transform: translateX(-50%) !important; width: 2px !important; height: 4px !important; background-color: #D1D5DB !important; border-radius: 1px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-unit { text-align: center !important; font-size: 14px !important; color: #374151 !important; margin-top: 8px !important; display: block !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-title { text-align: center !important; font-size: 15px !important; color: #374151 !important; margin-top: 8px !important; margin-bottom: 16px !important; line-height: 1.5 !important; padding: 0 1rem !important; display: block !important; font-weight: bold !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-y-axis-title { font-size: 15px !important; color: #374151 !important; line-height: 1.5 !important; text-align: left !important; padding-left: 5.83% !important; /* Aligns with Y-axis line inside SVG (35/600) */ margin-bottom: 4px !important; display: block !important; font-weight: bold !important; } /* Shop The Look */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-container { position: relative !important; width: auto !important; display: block !important; background-color: transparent !important; transition: min-height 0.3s ease !important; overflow: hidden !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-wrapper { position: relative !important; width: auto !important; display: block !important; margin: 0 auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.fv-full-bleed .fv-stl-container { width: 100% !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.fv-full-bleed .fv-stl-wrapper { width: 100% !important; max-width: none !important; margin: 0 auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-image { display: block !important; width: 100% !important; height: auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-hotspot-container { position: absolute !important; z-index: 10 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-hotspot-btn { position: absolute !important; margin-left: -0.75rem !important; margin-top: -0.75rem !important; width: 1.5rem !important; height: 1.5rem !important; border-radius: 9999px !important; display: flex !important; align-items: center !important; justify-content: center !important; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; transition-property: all !important; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; transition-duration: 300ms !important; cursor: pointer !important; border: none !important; padding: 0 !important; background-color: #ffffff !important; color: #1e293b !important; font-size: 0.75rem !important; font-weight: 700 !important; font-family: sans-serif !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-hotspot-btn:hover { transform: scale(1.1) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-hotspot-btn:focus { outline: 2px solid transparent !important; outline-offset: 2px !important; box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #000000 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-hotspot-btn[aria-expanded="true"] { background-color: #3b82f6 !important; color: #ffffff !important; transform: scale(1.1) !important; box-shadow: 0 0 0 2px #ffffff !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-hotspot-pulse { position: absolute !important; inset: 0 !important; border-radius: 9999px !important; background-color: #2E6E93 !important; opacity: 0.4 !important; pointer-events: none !important; z-index: -1 !important; animation: fv-stl-ping 1.5s cubic-bezier(0, 0, 0.2, 1) 3 forwards !important; } @keyframes fv-stl-ping { 75%, 100% { transform: scale(2); opacity: 0; } } @media (max-width: 640px) { #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-hotspot-pulse { animation-fill-mode: none !important; } } /* Shop the look button */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-btn { position: absolute !important; bottom: 1rem !important; right: 1rem !important; height: 2.5rem !important; background-color: rgba(255, 255, 255, 0.95) !important; backdrop-filter: blur(12px) !important; color: #111827 !important; padding: 0 1rem 0 3rem !important; border-radius: 0.25rem !important; font-weight: 700 !important; font-size: 0.875rem !important; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2) !important; border: none !important; cursor: pointer !important; transition: all 0.2s !important; z-index: 10 !important; display: flex !important; align-items: center !important; text-transform: uppercase !important; overflow: hidden !important; white-space: nowrap !important; max-width: calc(100% - 2rem) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-btn span { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-btn:hover { background-color: #ffffff !important; transform: scale(1.05) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-logo { position: absolute !important; left: 0 !important; top: 0 !important; width: 2.5rem !important; height: 2.5rem !important; object-fit: cover !important; background-color: #ffffff !important; border-right: 1px solid #f3f4f6 !important; flex-shrink: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-icon { position: absolute !important; left: 0 !important; top: 0 !important; width: 2.5rem !important; height: 2.5rem !important; display: flex !important; align-items: center !important; justify-content: center !important; background-color: #ffffff !important; border-right: 1px solid #f3f4f6 !important; color: #1f2937 !important; flex-shrink: 0 !important; } /* All Products Modal */ #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr { position: fixed !important; inset: 0 !important; background-color: rgba(0, 0, 0, 0) !important; backdrop-filter: blur(0px) !important; -webkit-backdrop-filter: blur(0px) !important; display: flex !important; align-items: center !important; justify-content: center !important; z-index: 99999 !important; pointer-events: none !important; transition: background-color 0.3s ease, backdrop-filter 0.3s ease, -webkit-backdrop-filter 0.3s ease !important; padding: 1rem !important; overflow: hidden !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr { position: absolute !important; padding: 0 !important; align-items: flex-end !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr.is-active { background-color: rgba(0, 0, 0, 0.2) !important; backdrop-filter: blur(4px) !important; -webkit-backdrop-filter: blur(4px) !important; pointer-events: auto !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-content { width: 100% !important; max-width: 42rem !important; max-height: 100% !important; display: flex !important; flex-direction: column !important; position: relative !important; background-color: rgba(255, 255, 255, 0.95) !important; backdrop-filter: blur(12px) !important; -webkit-backdrop-filter: blur(12px) !important; border-radius: 1rem !important; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; overflow: hidden !important; transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.3s ease !important; opacity: 0 !important; transform: scale(0.95) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-content { max-width: 100% !important; height: 85% !important; max-height: 85% !important; border-radius: 1.5rem 1.5rem 0 0 !important; transform: translateY(100%) !important; opacity: 1 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr.is-active .fv-stl-all-products-content { opacity: 1 !important; transform: scale(1) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr.is-active .fv-stl-all-products-content { transform: translateY(0) !important; } /* V2 Bottom Sheet Style */ #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr.v2 { align-items: flex-end !important; padding: 0 !important; } @media (min-width: 640px) { #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr.v2:not(.mobile-view *) { justify-content: flex-end !important; } } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr.v2 .fv-stl-all-products-content { max-width: 100% !important; height: 85% !important; max-height: 85% !important; border-radius: 1.5rem 1.5rem 0 0 !important; transform: translateY(100%) !important; opacity: 1 !important; } @media (min-width: 640px) { #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr.v2:not(.mobile-view *) .fv-stl-all-products-content { max-width: 700px !important; border-radius: 1.5rem 0 0 0 !important; } } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr.v2.is-active .fv-stl-all-products-content { transform: translateY(0) !important; opacity: 1 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-header { display: flex !important; align-items: center !important; justify-content: space-between !important; padding: 1.5rem !important; border-bottom: 1px solid #e5e7eb !important; flex-shrink: 0 !important; position: sticky !important; top: 0 !important; background-color: rgba(255, 255, 255, 0.8) !important; backdrop-filter: blur(12px) !important; -webkit-backdrop-filter: blur(12px) !important; z-index: 10 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-header { padding: 0.75rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-logo { height: 1.5rem !important; width: auto !important; object-fit: contain !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-logo { height: 1.25rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-title { font-size: 1.25rem !important; font-weight: 700 !important; color: #111827 !important; margin: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-title { font-size: 1.125rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-close { width: 2rem !important; height: 2rem !important; border-radius: 9999px !important; background-color: rgba(0, 0, 0, 0.05) !important; display: flex !important; align-items: center !important; justify-content: center !important; border: none !important; cursor: pointer !important; z-index: 10 !important; color: #6b7280 !important; transition: all 0.2s !important; padding: 0 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-close:hover { background-color: rgba(0, 0, 0, 0.1) !important; color: #111827 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-list { list-style: none !important; padding: 1.5rem !important; margin: 0 !important; overflow-y: auto !important; flex: 1 !important; display: flex !important; flex-direction: column !important; gap: 0.75rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-list { padding: 0.75rem !important; gap: 0.5rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-item { margin: 0 !important; padding: 0.25rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-link { display: flex !important; align-items: flex-start !important; padding: 0.75rem !important; text-decoration: none !important; color: inherit !important; transition: all 0.2s !important; border-radius: 1rem !important; border: 1px solid transparent !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-link { padding: 0.5rem !important; border-radius: 0.75rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-link:hover { background-color: #ffffff !important; border-color: #e5e7eb !important; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03) !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-item.is-highlighted .fv-stl-all-products-link { background-color: #ffffff !important; border-color: #d1d5db !important; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06), 0 0 0 2px #111827 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-image-container { position: relative !important; margin-right: 1.25rem !important; flex-shrink: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-image-container { margin-right: 0.75rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-number { position: absolute !important; top: -0.5rem !important; left: -0.5rem !important; width: 1.5rem !important; height: 1.5rem !important; border-radius: 9999px !important; background-color: #0f172a !important; color: #ffffff !important; display: flex !important; align-items: center !important; justify-content: center !important; font-size: 0.75rem !important; font-weight: 700 !important; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06), 0 0 0 2px #ffffff !important; z-index: 10 !important; font-family: sans-serif !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-number { top: -0.375rem !important; left: -0.375rem !important; width: 1.25rem !important; height: 1.25rem !important; font-size: 0.625rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-image-wrapper { width: 6rem !important; height: 6rem !important; border-radius: 0.75rem !important; overflow: hidden !important; background-color: #f9fafb !important; border: 1px solid #f3f4f6 !important; display: flex !important; align-items: center !important; justify-content: center !important; box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.02) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-image-wrapper { width: 4rem !important; height: 4rem !important; border-radius: 0.5rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-image { width: 100% !important; height: 100% !important; object-fit: cover !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-placeholder { width: 2rem !important; height: 2rem !important; color: #d1d5db !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-placeholder { width: 1.5rem !important; height: 1.5rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-info { flex: 1 !important; min-width: 0 !important; display: flex !important; flex-direction: column !important; justify-content: center !important; margin-top: 0.25rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-info { margin-top: 0 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-brand { font-size: 0.625rem !important; font-weight: 700 !important; color: #6b7280 !important; text-transform: uppercase !important; letter-spacing: 0.1em !important; margin: 0 0 0.375rem 0 !important; white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-brand { font-size: 0.5625rem !important; margin: 0 0 0.25rem 0 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-name { font-size: 1rem !important; font-weight: 700 !important; color: #111827 !important; margin: 0 0 0.375rem 0 !important; display: -webkit-box !important; -webkit-line-clamp: 2 !important; -webkit-box-orient: vertical !important; overflow: hidden !important; line-height: 1.25 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-name { font-size: 0.875rem !important; margin: 0 0 0.25rem 0 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-meta { display: flex !important; align-items: center !important; font-size: 0.875rem !important; margin-bottom: 0.375rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-meta { font-size: 0.75rem !important; margin-bottom: 0.25rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-price { font-weight: 700 !important; color: #111827 !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-sale-price { font-weight: 700 !important; color: #dc2626 !important; margin-right: 0.5rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-sale-price { margin-right: 0.375rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-original-price { color: #9ca3af !important; text-decoration: line-through !important; font-size: 0.75rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-original-price { font-size: 0.625rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-commentary { font-size: 0.875rem !important; color: #4b5563 !important; margin: 0 !important; display: -webkit-box !important; -webkit-line-clamp: 2 !important; -webkit-box-orient: vertical !important; overflow: hidden !important; line-height: 1.375 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-commentary { font-size: 0.75rem !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-action { width: 2.5rem !important; height: 2.5rem !important; border-radius: 9999px !important; background-color: #f9fafb !important; display: flex !important; align-items: center !important; justify-content: center !important; color: #9ca3af !important; margin-left: 1rem !important; flex-shrink: 0 !important; border: 1px solid #f3f4f6 !important; transition: all 0.2s !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-action { width: 2rem !important; height: 2rem !important; margin-left: 0.75rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-action svg { width: 14px !important; height: 14px !important; } #fv-stl-all-products-modal-fv-chart-1780054953725-jxfr84byr .fv-stl-all-products-link:hover .fv-stl-all-products-action { background-color: #111827 !important; color: #ffffff !important; border-color: #111827 !important; } /* Image Annotation Styles */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-container { position: relative !important; width: auto !important; display: block !important; background-color: transparent !important; overflow: hidden !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-wrapper { position: relative !important; width: auto !important; display: block !important; margin: 0 auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.fv-full-bleed .fv-ia-container { width: 100% !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.fv-full-bleed .fv-ia-wrapper { width: 100% !important; max-width: none !important; margin: 0 auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-image { display: block !important; width: 100% !important; height: auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-node-container { position: absolute !important; z-index: 10 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-node-button { position: absolute !important; margin-left: -0.75rem !important; margin-top: -0.75rem !important; width: 1.5rem !important; height: 1.5rem !important; border-radius: 9999px !important; display: flex !important; align-items: center !important; justify-content: center !important; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1) !important; transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) !important; cursor: pointer !important; border: none !important; padding: 0 !important; background-color: #ffffff !important; color: #1e293b !important; font-size: 0.75rem !important; font-weight: 700 !important; font-family: sans-serif !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-node-button:hover { transform: scale(1.1) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-node-button.is-active { background-color: #2E6E93 !important; color: #ffffff !important; transform: scale(1.1) !important; box-shadow: 0 0 0 2px #ffffff !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-pulse-ring { position: absolute !important; inset: 0 !important; border-radius: 9999px !important; background-color: #2E6E93 !important; opacity: 0.4 !important; pointer-events: none !important; z-index: -1 !important; animation: fv-ia-ping 1.5s cubic-bezier(0, 0, 0.2, 1) 3 forwards !important; } @keyframes fv-ia-ping { 75%, 100% { transform: scale(2); opacity: 0; } } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-static-tooltip { display: none !important; position: absolute !important; top: -10px !important; left: 50% !important; transform: translate(-50%, -100%) !important; background-color: rgba(255, 255, 255, 0.95) !important; padding: 10px !important; border-radius: 6px !important; box-shadow: 0 4px 12px rgba(0,0,0,0.15) !important; width: max-content !important; max-width: 200px !important; font-size: 13px !important; color: #1f2937 !important; z-index: 20 !important; pointer-events: none !important; white-space: pre-wrap !important; line-height: 1.4 !important; border: 1px solid #e5e7eb !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-node-button:hover + .fv-ia-static-tooltip { display: block !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-logo-explore-bar { position: relative !important; width: 100% !important; display: flex !important; justify-content: center !important; align-items: center !important; min-height: 30px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-logo-explore-bar .fv-logo { margin: 0 auto !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-explore-wrapper { position: absolute !important; right: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-logo-explore-bar { flex-direction: column !important; min-height: auto !important; gap: 0.75rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-ia-explore-wrapper { position: static !important; align-self: flex-end !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-explore-btn { background-color: rgba(255, 255, 255, 0.95) !important; color: #1e293b !important; border: 1px solid #e5e7eb !important; border-radius: 9999px !important; padding: 0.5rem 1.25rem !important; font-size: 0.875rem !important; font-weight: 600 !important; font-family: sans-serif !important; display: inline-flex !important; align-items: center !important; gap: 0.5rem !important; cursor: pointer !important; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1) !important; transition: all 0.2s !important; pointer-events: auto !important; flex-shrink: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-explore-btn:hover { background-color: #ffffff !important; transform: translateY(-2px) !important; box-shadow: 0 6px 8px -1px rgba(0, 0, 0, 0.15) !important; color: #2E6E93 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-explore-btn svg { transition: transform 0.2s !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-explore-btn:hover svg { transform: translateX(2px) !important; } /* IA Modal Styles */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-active-modal-container { display: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-modals { display: block !important; position: static !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-modal-item { display: none !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-modal-item.is-active { display: flex !important; flex-direction: column !important; position: absolute !important; top: 1rem !important; right: 1rem !important; z-index: 20 !important; width: 18rem !important; max-width: calc(100% - 2rem) !important; background-color: #ffffff !important; padding: 1rem !important; border-radius: 0.75rem !important; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; border: 1px solid #e5e7eb !important; border-top: 4px solid #2E6E93 !important; animation: fv-ia-fade-in 0.2s ease-out !important; gap: 0.75rem !important; max-height: 80% !important; overflow-y: auto !important; pointer-events: auto !important; } @keyframes fv-ia-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-modal-header { display: flex !important; justify-content: space-between !important; align-items: flex-start !important; margin: 0 !important; gap: 0.5rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-node-title { font-size: 1rem !important; line-height: 1.25 !important; font-weight: 700 !important; color: #111827 !important; margin: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-close-button { background: #f9fafb !important; border: 1px solid #e5e7eb !important; border-radius: 50% !important; width: 2rem !important; height: 2rem !important; display: flex !important; align-items: center !important; justify-content: center !important; color: #9ca3af !important; cursor: pointer !important; padding: 0 !important; flex-shrink: 0 !important; transition: all 0.2s !important; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-close-button:hover { background: #e5e7eb !important; color: #111827 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-node-description { font-size: 0.875rem !important; color: #374151 !important; margin: 0 !important; line-height: 1.625 !important; white-space: pre-wrap !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-ia-node-description { font-size: 0.875rem !important; } /* Error Handling */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-ia-empty { display: flex !important; align-items: center !important; justify-content: center !important; height: 200px !important; background-color: #f1f5f9 !important; color: #64748b !important; border: 2px dashed #cbd5e1 !important; border-radius: 0.5rem !important; } /* Countdown Styles */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-container { display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; padding: 1rem !important; position: relative !important; width: 100% !important; box-sizing: border-box !important; font-family: Montserrat, sans-serif !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-header { text-align: center !important; margin-bottom: 2rem !important; z-index: 10 !important; width: 100% !important; display: flex !important; flex-direction: column !important; align-items: center !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-title { font-size: 1.25rem !important; font-weight: 900 !important; text-transform: uppercase !important; letter-spacing: 0.05em !important; margin: 0 !important; font-style: italic !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-subhead { font-size: 1.125rem !important; font-weight: 900 !important; text-transform: uppercase !important; letter-spacing: 0.05em !important; margin: 0.25rem 0 0 0 !important; font-style: italic !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-timer-wrap { display: flex !important; flex-direction: column !important; align-items: center !important; width: 100% !important; max-width: 64rem !important; z-index: 10 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-labels { display: flex !important; justify-content: center !important; width: 100% !important; margin-bottom: 0.5rem !important; padding: 0 0.5rem !important; font-size: 0.75rem !important; font-weight: bold !important; text-transform: uppercase !important; letter-spacing: 0.05em !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-labels > div { flex: 1 !important; text-align: center !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-box { position: relative !important; width: 100% !important; border-top: 6px solid #333 !important; border-bottom: 8px solid #333 !important; padding: 1rem 0 !important; background: linear-gradient(to bottom, #1f2937, #000000) !important; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-digits { display: flex !important; justify-content: center !important; font-size: 1.75rem !important; font-weight: 900 !important; letter-spacing: 0em !important; font-family: monospace !important; color: #fff !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-digits > div.digit-box { flex: 1 !important; text-align: center !important; white-space: nowrap !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-digits > div.colon { flex: 0 0 auto !important; opacity: 0.5 !important; position: relative !important; top: -2px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-spike-l { position: absolute !important; left: -15px !important; top: 50% !important; transform: translateY(-50%) !important; width: 0 !important; height: 0 !important; border-top: 15px solid transparent !important; border-bottom: 15px solid transparent !important; border-right: 15px solid #374151 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-spike-r { position: absolute !important; right: -15px !important; top: 50% !important; transform: translateY(-50%) !important; width: 0 !important; height: 0 !important; border-top: 15px solid transparent !important; border-bottom: 15px solid transparent !important; border-left: 15px solid #374151 !important; } @media (min-width: 600px) { #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-container { padding: 2rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-title { font-size: 1.75rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-subhead { font-size: 1.25rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-digits { font-size: 2.25rem !important; letter-spacing: 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-labels { font-size: 0.875rem !important; padding: 0 1rem !important; margin-bottom: 1rem !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-box { padding: 1.5rem 0 !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-digits > div.colon { top: -4px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-spike-l { left: -20px !important; border-top-width: 20px !important; border-bottom-width: 20px !important; border-right-width: 20px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-spike-r { right: -20px !important; border-top-width: 20px !important; border-bottom-width: 20px !important; border-left-width: 20px !important; } } @media (min-width: 768px) { #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-digits { font-size: 3.5rem !important; letter-spacing: 0.05em !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-countdown-digits > div.colon { top: -5px !important; } } /* Mobile / Forced Mobile View / Labels on Top */ #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-pie-container, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-pie-container { flex-direction: column !important; gap: 1rem !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-grouped-product-title-wrapper, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-grouped-product-title-wrapper { padding-left: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-bar-row, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-stacked-product, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-grouped-bar-product, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-bar-row, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-stacked-product, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-grouped-bar-product { flex-direction: column !important; align-items: flex-start !important; margin-bottom: 1.25rem !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-bar-label:not(.fv-grouped-product-title), #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-bar-label:not(.fv-grouped-product-title) { width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-bar-label, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-grouped-product-title, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-bar-label, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-grouped-product-title { width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-bar-container, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-bar-cluster, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-bar-container, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-bar-cluster { width: 100% !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-x-axis-wrapper, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-x-axis-wrapper { margin-left: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-x-axis-label-space, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-x-axis-label-space { display: none !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-x-axis-chart-space, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-x-axis-chart-space { padding-right: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-benchmark-title, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-benchmark-title { font-size: 16px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-dropdown-title, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-dropdown-title { font-size: 16px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-carousel-nav-btn, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-carousel-nav-btn { padding: 8px 12px !important; font-size: 14px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-chart-title, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-chart-title { padding: 0 8px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-chart-subhead, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-chart-subhead { padding: 0 8px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-header, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-header { flex-direction: column !important; align-items: center !important; padding: 0 !important; gap: 0.5rem !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-select-wrapper, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-select-wrapper { flex: 1 !important; min-width: 0 !important; width: 100% !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-select-wrapper.fv-left, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-select-wrapper.fv-left { text-align: center !important; padding-right: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-select-wrapper.fv-right, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-select-wrapper.fv-right { text-align: center !important; padding-left: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-select.fv-select-left, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-select.fv-select-left { text-align: center !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-select.fv-select-right, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-select.fv-select-right { text-align: center !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-vs, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-vs { text-align: center !important; padding: 0.25rem 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-select-container, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-select-container { max-width: 100% !important; width: 100% !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-versus-select, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-versus-select { font-size: 14px !important; width: 100% !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-stl-shop-all-btn, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-stl-shop-all-btn { bottom: 0.5rem !important; right: 0.5rem !important; height: 2rem !important; font-size: 0.75rem !important; padding: 0 0.75rem 0 2.5rem !important; max-width: calc(100% - 1rem) !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-stl-shop-all-logo, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-stl-shop-all-icon, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-stl-shop-all-logo, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-stl-shop-all-icon { width: 2rem !important; height: 2rem !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-stl-shop-all-icon svg, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.labels-on-top .fv-stl-shop-all-icon svg { width: 14px !important; height: 14px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view .fv-y-axis-title { padding-left: 5% !important; /* (30/600) for mobile view */ } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.mobile-view.fv-contains-line-chart .fv-footer-content { margin-left: -1rem !important; margin-right: -1rem !important; } @media (max-width: 599px) { #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-pie-container { flex-direction: column !important; gap: 1rem !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-grouped-product-title-wrapper { padding-left: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-row, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stacked-product, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-grouped-bar-product { flex-direction: column !important; align-items: flex-start !important; margin-bottom: 1.25rem !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-label:not(.fv-grouped-product-title) { width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-label, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-grouped-product-title { width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-container, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-bar-cluster { width: 100% !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-wrapper { margin-left: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-label-space { display: none !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-x-axis-chart-space { padding-right: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-benchmark-title { font-size: 16px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-dropdown-title { font-size: 16px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-carousel-nav-btn { padding: 8px 12px !important; font-size: 14px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-chart-title { padding: 0 8px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-chart-subhead { padding: 0 8px !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-header { flex-direction: column !important; align-items: center !important; padding: 0 !important; gap: 0.5rem !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-wrapper { flex: 1 !important; min-width: 0 !important; width: 100% !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-wrapper.fv-left { text-align: center !important; padding-right: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-wrapper.fv-right { text-align: center !important; padding-left: 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select.fv-select-left { text-align: center !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select.fv-select-right { text-align: center !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-vs { text-align: center !important; padding: 0.25rem 0 !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select-container { max-width: 100% !important; width: 100% !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-versus-select { font-size: 14px !important; width: 100% !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-btn { bottom: 0.5rem !important; right: 0.5rem !important; height: 2rem !important; font-size: 0.75rem !important; padding: 0 0.75rem 0 2.5rem !important; max-width: calc(100% - 1rem) !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-logo, #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-icon { width: 2rem !important; height: 2rem !important; }#fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-stl-shop-all-icon svg { width: 14px !important; height: 14px !important; } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper .fv-y-axis-title { padding-left: 5% !important; /* (30/600) for mobile view */ } #fv-chart-1780054953725-jxfr84byr-slideshow .fv-chart-wrapper.fv-contains-line-chart .fv-footer-content { margin-left: -1rem !important; margin-right: -1rem !important; } } [{ "@context": "https://schema.org", "@type": "Dataset", "name": "Overall Chart Title", "description": "Subhead to describe the test and what's being measured and why", "creator": { "@type": "Organization", "name": "TechRadar", "logo": "https://cdn.mos.cms.futurecdn.net/dAwPEozB9GMMhAngdFJTHb.png" }, "isAccessibleForFree": true, "dateCreated": "2026-05-29T11:42:33.728Z", "keywords": [ "Google Fitbit Air", "Apple Watch Ultra 3", "Average heart rate", "benchmark", "comparison", "performance", "review", "TechRadar" ], "measurementTechnique": "Performance Benchmarking", "variableMeasured": [ { "@type": "PropertyValue", "name": "Google Fitbit Air – Average heart rate", "value": 158, "unitText": "" }, { "@type": "PropertyValue", "name": "Apple Watch Ultra 3 – Average heart rate", "value": 161, "unitText": "" } ]},{ "@context": "https://schema.org", "@type": "Dataset", "name": "Overall Chart Title", "description": "Subhead to describe the test and what's being measured and why", "creator": { "@type": "Organization", "name": "TechRadar", "logo": "https://cdn.mos.cms.futurecdn.net/dAwPEozB9GMMhAngdFJTHb.png" }, "isAccessibleForFree": true, "dateCreated": "2026-05-29T11:42:33.728Z", "keywords": [ "Google Fitbit Air", "Apple Watch Ultra 3", "Average Pace", "benchmark", "comparison", "performance", "review", "TechRadar" ], "measurementTechnique": "Performance Benchmarking", "variableMeasured": [ { "@type": "PropertyValue", "name": "Google Fitbit Air – Average Pace", "value": 5.37, "unitText": "" }, { "@type": "PropertyValue", "name": "Apple Watch Ultra 3 – Average Pace", "value": 5.47, "unitText": "" } ]},{ "@context": "https://schema.org", "@type": "Dataset", "name": "Overall Chart Title", "description": "Subhead to describe the test and what's being measured and why", "creator": { "@type": "Organization", "name": "TechRadar", "logo": "https://cdn.mos.cms.futurecdn.net/dAwPEozB9GMMhAngdFJTHb.png" }, "isAccessibleForFree": true, "dateCreated": "2026-05-29T11:42:33.728Z", "keywords": [ "Google Fitbit Air", "Apple Watch Ultra 3", "Calories burned", "benchmark", "comparison", "performance", "review", "TechRadar" ], "measurementTechnique": "Performance Benchmarking", "variableMeasured": [ { "@type": "PropertyValue", "name": "Google Fitbit Air – Calories burned", "value": 773, "unitText": "" }, { "@type": "PropertyValue", "name": "Apple Watch Ultra 3 – Calories burned", "value": 750, "unitText": "" } ]},{ "@context": "https://schema.org", "@type": "Dataset", "name": "Overall Chart Title", "description": "Subhead to describe the test and what's being measured and why", "creator": { "@type": "Organization", "name": "TechRadar", "logo": "https://cdn.mos.cms.futurecdn.net/dAwPEozB9GMMhAngdFJTHb.png" }, "isAccessibleForFree": true, "dateCreated": "2026-05-29T11:42:33.728Z", "keywords": [ "Google Fitbit Air", "Apple Watch Ultra 3", "Distance", "benchmark", "comparison", "performance", "review", "TechRadar" ], "measurementTechnique": "Performance Benchmarking", "variableMeasured": [ { "@type": "PropertyValue", "name": "Google Fitbit Air – Distance", "value": 10.43, "unitText": "" }, { "@type": "PropertyValue", "name": "Apple Watch Ultra 3 – Distance", "value": 10.03, "unitText": "" } ]}] Previous 1 / 4 Next Average heart rate Google Fitbit Air 158 Apple Watch Ultra 3 161 050100150200 Average heart rate Data ProductValue Google Fitbit Air 158 Apple Watch Ultra 3 161 Average Pace Google Fitbit Air 5.37 Apple Watch Ultra 3 5.47 01.534.56 Average Pace Data ProductValue Google Fitbit Air 5.37 Apple Watch Ultra 3 5.47 Calories burned Google Fitbit Air 773 Apple Watch Ultra 3 750 0200400600800 Calories burned Data ProductValue Google Fitbit Air 773 Apple Watch Ultra 3 750 Distance Google Fitbit Air 10.43 Apple Watch Ultra 3 10.03 03.757.511.2515 Kilometers Distance Data ProductValue Google Fitbit Air 10.43 Apple Watch Ultra 3 10.03 window.iFrameResizer = { heightCalculationMethod: 'taggedElement' }; (function() { /* Global animation function for slideshow re-use */ window.fvAnimateCharts = function(chartWrapper) { if (!chartWrapper) return; function animateBars(chartElement) { if (!chartElement) return; var bars = chartElement.querySelectorAll('.fv-bar, .fv-stacked-segment'); bars.forEach(function(bar, index) { /* Reset to 0 first to ensure animation triggers */ bar.style.setProperty('width', '0%', 'important'); bar.style.setProperty('transition', 'none', 'important'); var targetWidth = bar.dataset.targetWidth; if (targetWidth === undefined) return; /* Force reflow */ void bar.offsetWidth; var targetMargin = bar.dataset.targetMargin; var baseMargin = bar.dataset.baseMargin; if (baseMargin !== undefined) { bar.style.setProperty('margin-left', baseMargin + '%', 'important'); } setTimeout(function() { var marginTransition = baseMargin !== undefined ? ', margin-left 0.8s ease-out' : ''; bar.style.setProperty('transition', 'opacity 0.2s ease, width 0.8s ease-out' + marginTransition, 'important'); bar.style.setProperty('width', targetWidth + '%', 'important'); if (targetMargin !== undefined && baseMargin !== undefined) { bar.style.setProperty('margin-left', targetMargin + '%', 'important'); } }, index * 50 + 50); /* Reduced initial delay */ }); } function animateLineChart(chartElement) { if (!chartElement) return; var lineSvg = chartElement.querySelector('svg'); if (!lineSvg) return; var paths = lineSvg.querySelectorAll('.riv-line-path'); paths.forEach(function(p, i) { if (typeof p.getTotalLength === 'function') { var len = p.getTotalLength(); p.style.transition = 'none'; p.style.strokeDasharray = len; p.style.strokeDashoffset = len; p.getBoundingClientRect(); setTimeout(function() { p.style.transition = 'stroke-dashoffset 1s ease-out ' + (i * 0.1) + 's, stroke-width 0.2s, opacity 0.2s'; p.style.strokeDashoffset = '0'; }, 100); } }); var dots = lineSvg.querySelectorAll('.riv-dot'); dots.forEach(function(dot, i) { dot.style.opacity = '0'; setTimeout(function() { dot.style.transition = 'opacity 0.3s ease'; dot.style.opacity = '1'; }, 500 + i * 10); }); } /* Execute */ var charts = chartWrapper.querySelectorAll('.fv-chart-item'); charts.forEach(function(chart) { /* If in carousel/dropdown mode, hidden charts are display:none. */ /* We only animate what is visible. */ if (window.getComputedStyle(chart).display === 'none') return; var chartType = chart.dataset.chartType; if (chartType === 'Line') { animateLineChart(chart); } else if (chartType !== 'Pie') { animateBars(chart); } }); }; function initialize(uniqueId, isSlideshow) { var root = document.getElementById(uniqueId); /* In slideshow mode, 'root' will be null because the container has '-slideshow' suffix. */ /* We handle that logic below. */ if (!root && !isSlideshow) return; /* Setup internal interactions (Carousel/Dropdown/LineChart) for a specific chart wrapper */ function setupWrapper(chartWrapper) { if (!chartWrapper) return; /* Responsive mobile view handling */ function checkMobileView() { var width = chartWrapper.getBoundingClientRect().width; var isMobileDevice = window.screen && Math.min(window.screen.width, window.screen.height) <= 599; var isMobile; if (width === 0) { /* Fallback for when width isn't available yet (e.g., hidden tab) */ isMobile = isMobileDevice || window.matchMedia('(max-width: 599px)').matches; } else { /* Mobile if container is small OR if it's a physical mobile device (overriding fixed-width iframes) */ isMobile = isMobileDevice || width < 600; } if (isMobile) { chartWrapper.classList.add('mobile-view'); } else { chartWrapper.classList.remove('mobile-view'); } } /* Initial check */ checkMobileView(); if (typeof ResizeObserver !== 'undefined') { var ro = new ResizeObserver(function() { checkMobileView(); }); ro.observe(chartWrapper); } /* Always add window resize listener as a reliable fallback for DevTools and edge cases */ window.addEventListener('resize', checkMobileView); /* Labels on top handler */ var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === 'true'; if (labelsOnTop) { /* If there are multiple charts and we're not in a carousel/dropdown, we might have mixed types. */ /* But typically, labels-on-top is a global setting. We'll apply it initially, */ /* and showInternalChart will toggle it if needed. */ var charts = chartWrapper.querySelectorAll('.fv-chart-item'); var hasVisibleBarChart = false; charts.forEach(function(c) { if (window.getComputedStyle(c).display !== 'none') { var cType = c.dataset.chartType; if (cType === 'Bar' || cType === 'Stacked Bar' || cType === 'Versus') { hasVisibleBarChart = true; } } }); if (hasVisibleBarChart) { chartWrapper.classList.add('labels-on-top'); } else { chartWrapper.classList.remove('labels-on-top'); } } else { chartWrapper.classList.remove('labels-on-top'); } /* Legend interactions */ chartWrapper.querySelectorAll('.riv-line-legend').forEach(function(legend) { var chartId = legend.dataset.chart; var chart = chartWrapper.querySelector('[id="' + chartId + '"]'); if (!chart) return; var lines = chart.querySelectorAll('.riv-line-path'); var dots = chart.querySelectorAll('.riv-dot'); var legendItems = legend.querySelectorAll('.riv-legend-item'); legendItems.forEach(function(item) { var productName = item.dataset.product; var safeProductName = productName.replace(/"/g, '\"'); var line = chart.querySelector('.riv-line-path[data-product="' + safeProductName + '"]'); var productDots = chart.querySelectorAll('.riv-dot[data-product="' + safeProductName + '"]'); if (line && !line.dataset.origStroke) { line.dataset.origStroke = line.getAttribute('stroke-width') || '2'; } var highlight = function() { if (legend.querySelector('.isolated')) return; lines.forEach(function(l) { l.style.opacity = '0.2'; l.setAttribute('stroke-width', l.dataset.origStroke); }); dots.forEach(function(d) { d.style.opacity = '0.2'; }); legendItems.forEach(function(i) { i.style.opacity = '0.3'; i.style.transition = 'opacity 0.2s'; }); if (line) { line.style.opacity = '1'; line.setAttribute('stroke-width', '4'); } productDots.forEach(function(d) { d.style.opacity = '1'; }); item.style.opacity = '1'; }; var clearHighlight = function() { if (legend.querySelector('.isolated')) return; lines.forEach(function(l) { l.style.opacity = '1'; l.setAttribute('stroke-width', l.dataset.origStroke); }); dots.forEach(function(d) { d.style.opacity = '1'; }); legendItems.forEach(function(i) { i.style.opacity = '1'; }); }; var toggleIsolate = function() { var isIsolated = item.classList.contains('isolated'); legendItems.forEach(function(i) { i.classList.remove('isolated'); }); if (isIsolated) { lines.forEach(function(l) { l.style.opacity = '1'; l.setAttribute('stroke-width', l.dataset.origStroke); }); dots.forEach(function(d) { d.style.opacity = '1'; }); legendItems.forEach(function(i) { i.style.opacity = '1'; }); } else { item.classList.add('isolated'); lines.forEach(function(l) { l.style.opacity = '0.2'; l.setAttribute('stroke-width', l.dataset.origStroke); }); dots.forEach(function(d) { d.style.opacity = '0.2'; }); legendItems.forEach(function(i) { i.style.opacity = '0.3'; i.style.transition = 'opacity 0.2s'; }); if (line) { line.style.opacity = '1'; line.setAttribute('stroke-width', '4'); } productDots.forEach(function(d) { d.style.opacity = '1'; }); item.style.opacity = '1'; } }; item.addEventListener('mouseenter', highlight); item.addEventListener('focus', highlight); item.addEventListener('mouseleave', clearHighlight); item.addEventListener('blur', clearHighlight); item.addEventListener('click', toggleIsolate); if (line) { line.style.cursor = 'pointer'; line.addEventListener('mouseenter', highlight); line.addEventListener('mouseleave', clearHighlight); line.addEventListener('click', toggleIsolate); } }); }); /* Versus Chart Logic */ var versusCharts = chartWrapper.querySelectorAll('.fv-versus-chart'); versusCharts.forEach(function(vc) { var dataJson = vc.getAttribute('data-versus-data'); var leftColor = vc.getAttribute('data-left-color') || '#E53935'; var rightColor = vc.getAttribute('data-right-color') || '#FFB300'; if (!dataJson) return; var versusData = JSON.parse(dataJson); var leftSelect = vc.querySelector('.fv-select-left'); var rightSelect = vc.querySelector('.fv-select-right'); var rows = vc.querySelectorAll('.fv-versus-row'); function updateVersusChart() { var leftProduct = leftSelect.value; var rightProduct = rightSelect.value; leftSelect.style.color = leftColor; leftSelect.style.borderColor = leftColor; rightSelect.style.color = rightColor; rightSelect.style.borderColor = rightColor; rows.forEach(function(row) { var index = parseInt(row.getAttribute('data-index')); var data = versusData[index]; if (!data) return; var leftVal = data.productData[leftProduct] ? data.productData[leftProduct].value : undefined; var rightVal = data.productData[rightProduct] ? data.productData[rightProduct].value : undefined; var leftIsNum = typeof leftVal === 'number'; var rightIsNum = typeof rightVal === 'number'; var leftNum = leftIsNum ? leftVal : 0; var rightNum = rightIsNum ? rightVal : 0; var maxVal = Math.max(leftNum, rightNum, 0.0001); var leftWidth = leftIsNum ? (leftNum / maxVal) * 95 : 0; var rightWidth = rightIsNum ? (rightNum / maxVal) * 85 : 0; var winner = null; var pctDiffStr = null; if (leftIsNum && rightIsNum) { if (leftNum > rightNum) { winner = 'left'; if (rightNum > 0) { var diff = Math.round(((leftNum - rightNum) / rightNum) * 100); pctDiffStr = '+' + diff.toLocaleString() + '%'; } } else if (rightNum > leftNum) { winner = 'right'; if (leftNum > 0) { var diff = Math.round(((rightNum - leftNum) / leftNum) * 100); pctDiffStr = '+' + diff.toLocaleString() + '%'; } } } var leftDisplay = data.productData[leftProduct] && data.productData[leftProduct].displayValue !== undefined ? data.productData[leftProduct].displayValue : (leftIsNum ? leftNum.toLocaleString() : (leftVal !== undefined ? leftVal : '-')); var rightDisplay = data.productData[rightProduct] && data.productData[rightProduct].displayValue !== undefined ? data.productData[rightProduct].displayValue : (rightIsNum ? rightNum.toLocaleString() : (rightVal !== undefined ? rightVal : '-')); var unit = (data.productData[leftProduct] && data.productData[leftProduct].unit) || (data.productData[rightProduct] && data.productData[rightProduct].unit) || ''; var leftTextStr = leftDisplay; var rightTextStr = rightDisplay; var leftBar = row.querySelector('.fv-versus-bar-left'); var rightBar = row.querySelector('.fv-versus-bar-right'); var leftText = row.querySelector('.fv-inside-left'); var rightText = row.querySelector('.fv-inside-right'); var labelText = row.querySelector('.fv-versus-label span'); var leftWrapper = row.querySelector('.fv-versus-bar-left-wrapper'); var rightWrapper = row.querySelector('.fv-versus-bar-right-wrapper'); var existingPctDiffs = row.querySelectorAll('.fv-versus-pct-diff'); existingPctDiffs.forEach(function(el) { el.remove(); }); if (winner === 'left' && pctDiffStr) { var pctSpan = document.createElement('span'); pctSpan.className = 'fv-versus-pct-diff'; pctSpan.style.color = 'rgba(255, 255, 255, 0.9)'; pctSpan.textContent = pctDiffStr; if (leftBar) leftBar.insertBefore(pctSpan, leftBar.firstChild); } else if (winner === 'right' && pctDiffStr) { var pctSpan = document.createElement('span'); pctSpan.className = 'fv-versus-pct-diff'; pctSpan.style.color = 'rgba(255, 255, 255, 0.9)'; pctSpan.textContent = pctDiffStr; if (rightBar) rightBar.appendChild(pctSpan); } if (leftBar) { leftBar.style.backgroundColor = leftColor; leftBar.dataset.targetWidth = leftWidth; leftBar.style.setProperty('--target-width', leftWidth + '%'); leftBar.style.width = leftWidth + '%'; } if (rightBar) { rightBar.style.backgroundColor = rightColor; rightBar.dataset.targetWidth = rightWidth; rightBar.style.setProperty('--target-width', rightWidth + '%'); rightBar.style.width = rightWidth + '%'; } if (leftText) { leftText.innerHTML = leftTextStr; } if (rightText) { rightText.innerHTML = rightTextStr; } if (labelText) { labelText.textContent = data.attribute + (unit ? ' (' + unit + ')' : ''); } }); } if (leftSelect) leftSelect.addEventListener('change', updateVersusChart); if (rightSelect) rightSelect.addEventListener('change', updateVersusChart); }); /* Carousel & Dropdown Logic */ var charts = chartWrapper.querySelectorAll('.fv-chart-item'); var dropdown = chartWrapper.querySelector('.fv-dropdown-title'); var prevBtn = chartWrapper.querySelector('.fv-carousel-nav-btn.prev'); var nextBtn = chartWrapper.querySelector('.fv-carousel-nav-btn.next'); var carouselTitle = chartWrapper.querySelector('.fv-carousel-title-controls .fv-benchmark-title'); var counter = chartWrapper.querySelector('.fv-carousel-counter'); /* Text Elements */ var subheadEl = chartWrapper.querySelector('.fv-chart-subhead'); var captionEl = chartWrapper.querySelector('.rv-chart-caption'); var footerContentEl = chartWrapper.querySelector('.fv-footer-content'); var bottomBarEl = chartWrapper.querySelector('.fv-bottom-bar'); var logoEl = chartWrapper.querySelector('.fv-logo'); if (charts.length > 1 && (dropdown || prevBtn)) { var currentChartIndex = 0; var titles = []; if (dropdown) { titles = Array.from(dropdown.options).map(function(o) { return o.text; }); } else { charts.forEach(function(c) { titles.push(c.getAttribute('data-title') || ''); }); } function showInternalChart(index) { if (index < 0) index = charts.length - 1; if (index >= charts.length) index = 0; currentChartIndex = index; charts.forEach(function(c, i) { c.style.display = i === index ? 'block' : 'none'; if (i === index) { var cType = c.dataset.chartType; if (cType === 'Line') { /* Line chart animations if needed */ } else if (cType !== 'Pie') { window.fvAnimateCharts(chartWrapper); } /* Update labels-on-top based on current chart type */ var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === 'true'; if (labelsOnTop && (cType === 'Bar' || cType === 'Stacked Bar' || cType === 'Versus')) { chartWrapper.classList.add('labels-on-top'); } else { chartWrapper.classList.remove('labels-on-top'); } } }); if (dropdown) dropdown.value = index; if (carouselTitle && titles[index]) carouselTitle.textContent = titles[index]; if (counter) counter.textContent = (index + 1) + ' of ' + charts.length; /* Update Subhead and Caption */ var activeChart = charts[index]; if (activeChart) { var newSubhead = activeChart.getAttribute('data-subhead'); var newCaption = activeChart.getAttribute('data-caption'); var currentChartType = activeChart.getAttribute('data-chart-type'); var hideGlobalCaption = currentChartType === 'Countdown' || currentChartType === 'Image Comparison' || currentChartType === 'Shop the Collection'; if (subheadEl) subheadEl.textContent = newSubhead || ''; if (captionEl) captionEl.textContent = newCaption || ''; if (footerContentEl) { if (newCaption && newCaption.trim().length > 0 && !hideGlobalCaption) { footerContentEl.style.display = 'block'; if (bottomBarEl) bottomBarEl.style.display = 'flex'; } else { footerContentEl.style.display = 'none'; if (bottomBarEl && !logoEl) { bottomBarEl.style.display = 'none'; } } } } } if (dropdown) dropdown.addEventListener('change', function(e) { showInternalChart(parseInt(e.target.value)); }); if (prevBtn) prevBtn.addEventListener('click', function() { showInternalChart(currentChartIndex - 1); }); if (nextBtn) nextBtn.addEventListener('click', function() { showInternalChart(currentChartIndex + 1); }); } /* Image Comparison Logic */ var imageCompareWrappers = chartWrapper.querySelectorAll('.fv-image-compare-wrapper'); imageCompareWrappers.forEach(function(wrapper) { var inner = wrapper.querySelector('.fv-image-compare-inner') || wrapper; var slider = wrapper.querySelector('.fv-image-compare-slider'); var fgImage = wrapper.querySelector('.fv-image-compare-fg'); var bgImage = wrapper.querySelector('.fv-image-compare-bg'); var labelLeft = wrapper.querySelector('.fv-image-compare-label-left'); var labelRight = wrapper.querySelector('.fv-image-compare-label-right'); var isDragging = false; /* Zoom state */ var scale = 1; var panX = 0; var panY = 0; var isPanning = false; var hasPanned = false; var lastClientX = 0; var lastClientY = 0; var initialDistance = null; var lastCenterX = null; var lastCenterY = null; function updateTransform() { if (wrapper.classList.contains('fv-image-compare-fullscreen')) { inner.style.setProperty('transform', 'translate(' + panX + 'px, ' + panY + 'px) scale(' + scale + ')', 'important'); } else { inner.style.removeProperty('transform'); scale = 1; panX = 0; panY = 0; } } function constrainPan() { var rect = wrapper.getBoundingClientRect(); /* Max pan depends on how much the image is scaled beyond the wrapper */ var maxPanX = Math.max(0, (rect.width * scale - rect.width) / 2); var maxPanY = Math.max(0, (rect.height * scale - rect.height) / 2); panX = Math.max(-maxPanX, Math.min(panX, maxPanX)); panY = Math.max(-maxPanY, Math.min(panY, maxPanY)); } wrapper.addEventListener('wheel', function(e) { if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return; e.preventDefault(); var zoomSensitivity = 0.005; var zoomFactor = Math.exp(-e.deltaY * zoomSensitivity); var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); if (newScale === scale) return; var rect = wrapper.getBoundingClientRect(); var mouseX = e.clientX - rect.left - rect.width / 2; var mouseY = e.clientY - rect.top - rect.height / 2; var ratio = newScale / scale; panX = mouseX - (mouseX - panX) * ratio; panY = mouseY - (mouseY - panY) * ratio; scale = newScale; constrainPan(); updateTransform(); }, { passive: false }); wrapper.addEventListener('mousedown', function(e) { if (!wrapper.classList.contains('fv-image-compare-fullscreen') || scale <= 1) return; if (e.target.closest('.fv-image-compare-slider') || e.target.closest('button')) return; isPanning = true; hasPanned = false; lastClientX = e.clientX; lastClientY = e.clientY; }); window.addEventListener('mousemove', function(e) { if (!isPanning) return; var dx = e.clientX - lastClientX; var dy = e.clientY - lastClientY; if (Math.abs(dx) > 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.clientX; lastClientY = e.clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); }); window.addEventListener('mouseup', function() { isPanning = false; }); wrapper.addEventListener('touchstart', function(e) { if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return; if (e.touches.length === 2) { e.preventDefault(); var dx = e.touches[0].clientX - e.touches[1].clientX; var dy = e.touches[0].clientY - e.touches[1].clientY; initialDistance = Math.sqrt(dx * dx + dy * dy); var rect = wrapper.getBoundingClientRect(); lastCenterX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left - rect.width / 2; lastCenterY = (e.touches[0].clientY + e.touches[1].clientY) / 2 - rect.top - rect.height / 2; hasPanned = true; /* Prevent click after pinch */ } else if (e.touches.length === 1 && scale > 1) { if (e.target.closest('.fv-image-compare-slider') || e.target.closest('button')) return; isPanning = true; hasPanned = false; lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; } }, { passive: false }); wrapper.addEventListener('touchmove', function(e) { if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return; if (e.touches.length === 2 && initialDistance !== null) { e.preventDefault(); var dx = e.touches[0].clientX - e.touches[1].clientX; var dy = e.touches[0].clientY - e.touches[1].clientY; var distance = Math.sqrt(dx * dx + dy * dy); if (initialDistance > 0) { var zoomFactor = distance / initialDistance; var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); var rect = wrapper.getBoundingClientRect(); var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left - rect.width / 2; var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 - rect.top - rect.height / 2; var ratio = newScale / scale; panX = centerX - (centerX - panX) * ratio; panY = centerY - (centerY - panY) * ratio; if (lastCenterX !== null && lastCenterY !== null) { panX += (centerX - lastCenterX); panY += (centerY - lastCenterY); } scale = newScale; lastCenterX = centerX; lastCenterY = centerY; constrainPan(); updateTransform(); } initialDistance = distance; } else if (e.touches.length === 1 && isPanning) { e.preventDefault(); var dx = e.touches[0].clientX - lastClientX; var dy = e.touches[0].clientY - lastClientY; if (Math.abs(dx) > 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); } }, { passive: false }); wrapper.addEventListener('touchend', function(e) { if (e.touches.length < 2) { initialDistance = null; } if (e.touches.length === 0) { isPanning = false; } }); function handleMove(clientX) { var rect = inner.getBoundingClientRect(); var x = Math.max(0, Math.min(clientX - rect.left, rect.width)); var percent = Math.max(0, Math.min((x / rect.width) * 100, 100)); if (slider) slider.style.setProperty('left', percent + '%', 'important'); if (fgImage) fgImage.style.setProperty('clip-path', 'polygon(0 0, ' + percent + '% 0, ' + percent + '% 100%, 0 100%)', 'important'); if (labelLeft) { if (percent < 10) { labelLeft.style.setProperty('opacity', '0', 'important'); } else { labelLeft.style.setProperty('opacity', '1', 'important'); } } if (labelRight) { if (percent > 90) { labelRight.style.setProperty('opacity', '0', 'important'); } else { labelRight.style.setProperty('opacity', '1', 'important'); } } } function onMouseMove(e) { if (!isDragging) return; handleMove(e.clientX); } function onTouchMove(e) { if (!isDragging) return; e.preventDefault(); handleMove(e.touches[0].clientX); } function stopDragging() { isDragging = false; window.removeEventListener('mousemove', onMouseMove); window.removeEventListener('mouseup', stopDragging); window.removeEventListener('touchmove', onTouchMove); window.removeEventListener('touchend', stopDragging); } if (slider) { var startDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener('mousemove', onMouseMove); window.addEventListener('mouseup', stopDragging); }; var startTouchDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener('touchmove', onTouchMove, { passive: false }); window.addEventListener('touchend', stopDragging); }; slider.addEventListener('mousedown', function(e) { e.preventDefault(); startDrag(e.clientX); }); slider.addEventListener('touchstart', function(e) { e.preventDefault(); startTouchDrag(e.touches[0].clientX); }, { passive: false }); } /* Expand/Close Logic */ var expandBtn = wrapper.querySelector('.fv-image-compare-expand-btn'); var closeBtn = wrapper.querySelector('.fv-image-compare-close-btn'); if (expandBtn) { if (window !== window.parent) { expandBtn.style.display = 'none'; } else { expandBtn.addEventListener('click', function(e) { /* e.preventDefault(); // Removed to allow text selection */ e.stopPropagation(); wrapper.classList.add('fv-image-compare-fullscreen'); document.body.style.overflow = 'hidden'; /* Load high-res images if available */ if (fgImage && fgImage.dataset.highresSrc) { fgImage.src = fgImage.dataset.highresSrc; fgImage.removeAttribute('srcset'); fgImage.removeAttribute('sizes'); } if (bgImage && bgImage.dataset.highresSrc) { bgImage.src = bgImage.dataset.highresSrc; bgImage.removeAttribute('srcset'); bgImage.removeAttribute('sizes'); } }); } } if (closeBtn) { closeBtn.addEventListener('click', function(e) { /* e.preventDefault(); // Removed to allow text selection */ e.stopPropagation(); wrapper.classList.remove('fv-image-compare-fullscreen'); document.body.style.overflow = ''; updateTransform(); }); } /* Close on Escape */ document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && wrapper.classList.contains('fv-image-compare-fullscreen')) { wrapper.classList.remove('fv-image-compare-fullscreen'); document.body.style.overflow = ''; updateTransform(); } }); }); /* Shop The Look Hotspots */ var hotspots = chartWrapper.querySelectorAll('.fv-stl-hotspot-btn'); var allProductsModal = chartWrapper.querySelector('.fv-stl-all-products-modal'); var shopAllBtn = chartWrapper.querySelector('.fv-stl-shop-all-btn'); var allProductsList = chartWrapper.querySelector('.fv-stl-all-products-list'); var stlContainer = chartWrapper.querySelector('.fv-stl-container'); function closeAllModals() { if (allProductsModal) { allProductsModal.classList.remove('is-active'); /* Remove highlights */ var items = allProductsModal.querySelectorAll('.fv-stl-all-products-item'); items.forEach(function(item) { item.classList.remove('is-highlighted'); }); /* Remove min-height after transition */ if (stlContainer) { setTimeout(function() { if (!allProductsModal.classList.contains('is-active')) { stlContainer.style.minHeight = ''; if ('parentIFrame' in window) { window.parentIFrame.size(); } } }, 300); } } hotspots.forEach(function(btn) { btn.setAttribute('aria-expanded', 'false'); }); if ('parentIFrame' in window) { window.parentIFrame.size(); } } hotspots.forEach(function(btn) { btn.addEventListener('click', function(e) { e.stopPropagation(); var hotspotId = btn.getAttribute('data-hotspot-id'); var isExpanded = btn.getAttribute('aria-expanded') === 'true'; closeAllModals(); if (!isExpanded && allProductsModal) { btn.setAttribute('aria-expanded', 'true'); allProductsModal.classList.add('is-active'); /* Ensure container is tall enough */ var container = btn.closest('.fv-stl-container'); if (container && container.offsetHeight < 450) { container.style.minHeight = '450px'; } /* Highlight and scroll to item */ var targetItem = allProductsModal.querySelector('.fv-stl-all-products-item[data-product-id="' + hotspotId + '"]'); if (targetItem) { targetItem.classList.add('is-highlighted'); setTimeout(function() { targetItem.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } if ('parentIFrame' in window) { window.parentIFrame.size(); } } }); }); /* Shop All button */ if (shopAllBtn && allProductsModal) { shopAllBtn.addEventListener('click', function(e) { e.stopPropagation(); closeAllModals(); allProductsModal.classList.add('is-active'); /* Ensure container is tall enough */ var container = shopAllBtn.closest('.fv-stl-container'); if (container && container.offsetHeight < 450) { container.style.minHeight = '450px'; } if ('parentIFrame' in window) { window.parentIFrame.size(); } }); } /* Close button in all products modal */ if (allProductsModal) { var closeAllBtn = allProductsModal.querySelector('.fv-stl-all-products-close'); if (closeAllBtn) { closeAllBtn.addEventListener('click', function(e) { e.stopPropagation(); closeAllModals(); }); } } /* Close modals when clicking outside */ chartWrapper.addEventListener('click', function(e) { /* Only close if clicking on the wrapper or container, not inside a modal content */ if (!e.target.closest('.fv-stl-all-products-content')) { closeAllModals(); } }); if (allProductsModal) { allProductsModal.addEventListener('click', function(e) { if (!e.target.closest('.fv-stl-all-products-content')) { closeAllModals(); } }); } /* Image Annotation Logic */ var iaNodes = chartWrapper.querySelectorAll('.fv-ia-node-button'); var iaWrapper = chartWrapper.querySelector('.fv-ia-wrapper'); var originalCaption = chartWrapper.querySelector('.fv-original-caption') || captionEl; var dynamicCaption = chartWrapper.querySelector('.fv-ia-dynamic-caption'); var exploreBtn = chartWrapper.querySelector('.fv-ia-explore-btn'); var currentIaIndex = -1; function closeAllIANodes() { iaNodes.forEach(function(btn) { btn.classList.remove('is-active'); }); if (originalCaption) originalCaption.style.display = 'block'; if (dynamicCaption) dynamicCaption.style.display = 'none'; } function resetExploreBtn() { currentIaIndex = -1; if (exploreBtn) { var exploreSpan = exploreBtn.querySelector('span'); if (exploreSpan) exploreSpan.textContent = 'Explore'; } } iaNodes.forEach(function(btn, index) { btn.addEventListener('click', function(e) { e.stopPropagation(); var isActive = btn.classList.contains('is-active'); closeAllIANodes(); if (!isActive) { currentIaIndex = index; if (exploreBtn) { var exploreSpan = exploreBtn.querySelector('span'); if (exploreSpan) exploreSpan.textContent = 'Next'; } btn.classList.add('is-active'); if (dynamicCaption) { var title = btn.getAttribute('data-title') || ''; var desc = btn.getAttribute('data-desc') || ''; dynamicCaption.innerHTML = ''; var strongTag = document.createElement('strong'); strongTag.textContent = title; dynamicCaption.appendChild(strongTag); if (desc) { dynamicCaption.appendChild(document.createTextNode(' - ' + desc)); } if (originalCaption) originalCaption.style.display = 'none'; dynamicCaption.style.display = 'block'; if (footerContentEl) footerContentEl.style.display = 'block'; } } else { resetExploreBtn(); } }); }); if (exploreBtn) { exploreBtn.addEventListener('click', function(e) { e.stopPropagation(); if (iaNodes.length === 0) return; var nextIndex = currentIaIndex + 1; if (nextIndex >= iaNodes.length) { closeAllIANodes(); resetExploreBtn(); } else { currentIaIndex = nextIndex; var targetBtn = iaNodes[currentIaIndex]; if (targetBtn) { if(targetBtn.classList.contains('is-active')) { targetBtn.click(); } targetBtn.click(); } } }); } if (iaWrapper) { iaWrapper.addEventListener('click', function(e) { if (!e.target.closest('.fv-ia-node-button') && !e.target.closest('.fv-ia-explore-btn')) { closeAllIANodes(); resetExploreBtn(); } }); } /* Initial Animation */ window.fvAnimateCharts(chartWrapper); /* Countdown Logic */ var countdownContainer = chartWrapper.querySelector('.fv-countdown-container'); if (countdownContainer) { var targetDateAttr = countdownContainer.getAttribute('data-target-date'); if (targetDateAttr) { var targetDate = new Date(targetDateAttr); var primaryColor = countdownContainer.getAttribute('data-primary-color') || '#f97316'; var subheadColor = countdownContainer.getAttribute('data-subhead-color') || '#ffffff'; var pad = function(n) { return (n < 10 ? '0' : '') + n; }; var updateCountdown = function() { var difference = +targetDate - +new Date(); var d = 0, h = 0, m = 0, s = 0; if (difference > 0) { d = Math.floor(difference / (1000 * 60 * 60 * 24)); h = Math.floor((difference / (1000 * 60 * 60)) % 24); m = Math.floor((difference / 1000 / 60) % 60); s = Math.floor((difference / 1000) % 60); } var daysEl = countdownContainer.querySelector('[data-time="days"]'); var hoursEl = countdownContainer.querySelector('[data-time="hours"]'); var minsEl = countdownContainer.querySelector('[data-time="minutes"]'); var secsEl = countdownContainer.querySelector('[data-time="seconds"]'); if (daysEl) daysEl.textContent = d; if (hoursEl) hoursEl.textContent = pad(h); if (minsEl) minsEl.textContent = pad(m); if (secsEl) secsEl.textContent = pad(s); }; updateCountdown(); setInterval(updateCountdown, 1000); } } } if (true) { var slideshowContainer = document.getElementById(uniqueId + '-slideshow'); if (slideshowContainer) { var slides = slideshowContainer.querySelectorAll('.fv-slide'); slides.forEach(function(slide) { setupWrapper(slide.querySelector('.fv-chart-wrapper')); }); } var slideshowContainer = document.getElementById(uniqueId + '-slideshow'); /* Check if container exists to prevent errors */ if (slideshowContainer) { var currentSlideIndex = 0; var slides = slideshowContainer.querySelectorAll('.fv-slide'); var counter = slideshowContainer.querySelector('.fv-slide-counter'); var prevBtn = slideshowContainer.querySelector('.fv-nav-btn.prev'); var nextBtn = slideshowContainer.querySelector('.fv-nav-btn.next'); var dropdown = slideshowContainer.querySelector('.fv-slideshow-select'); function updateControls(index) { if (counter) counter.textContent = (index + 1) + ' / ' + slides.length; if (dropdown) dropdown.value = index; if (prevBtn) { if (index === 0) prevBtn.classList.add('disabled'); else prevBtn.classList.remove('disabled'); } if (nextBtn) { if (index === slides.length - 1) nextBtn.classList.add('disabled'); else nextBtn.classList.remove('disabled'); } } function showSlide(index) { if (index < 0) return; /* index = slides.length - 1; // Disable loop for linear nav style */ if (index >= slides.length) return; /* index = 0; */ currentSlideIndex = index; slides.forEach(function(slide, i) { slide.style.display = i === index ? 'block' : 'none'; if (i === index) { /* Re-trigger animations for the active slide */ var chartEl = slide.querySelector('.fv-chart-wrapper'); if (chartEl && window.fvAnimateCharts) { window.fvAnimateCharts(chartEl); } } }); updateControls(currentSlideIndex); } if (prevBtn) { prevBtn.addEventListener('click', function() { showSlide(currentSlideIndex - 1); }); } if (nextBtn) { nextBtn.addEventListener('click', function() { showSlide(currentSlideIndex + 1); }); } if (dropdown) { dropdown.addEventListener('change', function(e) { showSlide(parseInt(e.target.value)); }); } /* Initial setup */ updateControls(currentSlideIndex); /* Initial animation for the first slide */ if (slides.length > 0) { var firstChart = slides[0].querySelector('.fv-chart-wrapper'); if (firstChart && window.fvAnimateCharts) { setTimeout(function() { window.fvAnimateCharts(firstChart); }, 100); } } } } else { setupWrapper(root); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', function() { initialize('fv-chart-1780054953725-jxfr84byr', true); }); } else { initialize('fv-chart-1780054953725-jxfr84byr', true); } })();

My experience of tracking my sleep with the same two devices — I wore one on each wrist — was similar to the above, with close enough metrics but slightly different outcomes.

The Fitbit Air’s total sleep time estimation was within five minutes of the Apple Watch, and sleep stages were similar. However, while my sleep score was 90 with the Apple Watch, Fitbit registered it as only 81, citing a 10-point difference in sleep quality. However, the Google Fitbit Air’s sleep tracking has consistently registered my wake-up times during testing, successfully recording my early-hours bathroom trips and my cat jumping on my legs at 5am.

Apple HealthFutureGoogle HealthFuture

Because of the lack of a screen, GPS, and specialist metrics, regular runners won’t get a whole lot out of the Fitbit Air. Compared to my usual wealth of data from Apple or the best Garmin watches, I found it lacking, and my GPS map — imported from my phone, as the Air has no GPS of its own —- inaccurate, off by 400m compared to the Apple Watch.

Battery life is excellent, exceeding the seven days the device promised. Charging is fast, with just five minutes delivering a full day of battery life, and a full charge taking around an hour. The device is very comfortable to wear, as previously mentioned — I’ve barely needed to take it off all week.

  • Performance score: 4.5 / 5
Google Fitbit Air: Scorecard

Category

Comment

Score

Value

Very well priced compared to rivals.

4.5

Design

Great tracker, flawed app.

3.5

Features

Limited free options, expansive Premium AI tools.

4

Performance

Excellent in most areas.

4.5

Google Fitbit Air: Should I buy?Buy it if...

You want an affordable fitness tracker

The Google Fitbit Air is likely to shoot to the top of our best cheap fitness tracker list.

You like the AI chatbot interface

Google Health’s Premium service is entirely dependent on using and interacting with an AI companion.

You want a screenless focus band

Even at the basic free level, a slim screenless band to record all your metrics makes for a nice fitness tracking experience.

Don't buy it if...

You’re a runner

You’ll be better served with one of the best Garmin watches.

Money is no object

For serial health optimizers looking to splash some cash, the Whoop app is better.

You’re concerned about data privacy

Google has pledged not to use Fitbit data for its ads business, but if you’re still concerned about feeding all your data to Google’s AI algorithms, maybe avoid the Fitbit Air.

Also consider

Whoop 5.0 & Whoop MG

The Google Fitbit Air's biggest screenless rival.

Read our full Whoop review

Oura Ring 4

Another screenless favorite, albeit another premium subscription-based option.

Read our full Oura Ring 4 review

Samsung Galaxy Fit 3

Samsung's affordable fitness tracker, and a real bargain.

Read our full Samsung Galaxy Fit 3 review

How I tested

I wore the Google Fitbit Air for eight days straight. I ran a 10K while wearing an Apple Watch Ultra 3 and (malfunctioning) Polar H10 chest strap, and a shorter run with a Huawei Watch Fit 5 Pro, as comparison testing alongside my usual workout routines. I also wore the Apple and Fitbit side-by-side during sleep. I tested its alarm, tried the features of its premium Health Coach, and used the app's workout and mindfulness content.

First reviewed: June 2026

Categories: Reviews

Rivals season 2 episode 6 has the worst cliffhanger ending of any TV show this decade — and it proves why streamers like Hulu and Disney+ are doing so badly by its LGBTQIA+ characters

TechRadar News - Fri, 06/05/2026 - 10:00
Rivals season 2 episode 6 has ended its mid-season break with a shock death that absolutely nobody saw coming — but not only was it completely unnecessary, it's lazy storytelling.
Categories: Technology

South Africa rolls out game-changing HIV shot amid funding shortfalls

NPR News Headlines - Fri, 06/05/2026 - 09:53

A new twice-yearly HIV prevention injection could transform South Africa's fight against the epidemic — but U.S. aid cuts and limited doses threaten to slow its impact.

(Image credit: Ihsaan Haffe)

Categories: News

iPhone Ultra vs Samsung Galaxy Z Fold 8 rumors: which 2026 foldable is shaping up to be the better phone?

TechRadar News - Fri, 06/05/2026 - 09:47
The iPhone Ultra and Samsung Galaxy Z Fold 8 could have a lot in common, so which one is sounding best so far?
Categories: Technology

Amazon finally price-matches this 'extremely powerful' Windows 11 mini PC ahead of Prime Day — and it's my favorite machine for professionals and creators

TechRadar News - Fri, 06/05/2026 - 09:45
Packing 16GB of DDR5 RAM and a 1TB SSD , this Geekom mini PC delivered the kind of performance you'd expect from a much larger desktop PC, and excelled in our tests.
Categories: Technology

Russian hackers attack Europe for the Motherland in crypto fueled Great Patriotic Cyber War

TechRadar News - Fri, 06/05/2026 - 09:45
NoName057(16) launched "Patriotic Online Games", calling all hackers to participate and get paid in crypto.
Categories: Technology

KVM virtual machine software review

TechRadar News - Fri, 06/05/2026 - 09:38
Powerful Linux-native virtualization for users comfortable with the tools around it.
Categories: Technology

KVM virtual machine software review

TechRadar Reviews - Fri, 06/05/2026 - 09:38

KVM is often included among the best virtual machine software options, although it should be understood differently from most desktop virtualization tools. It is not an application that users simply open and operate on its own. KVM, short for Kernel-based Virtual Machine, is built into the Linux kernel and provides the low-level virtualization capability that allows Linux to run virtual machines with hardware acceleration.

In practice, KVM is usually part of a wider stack. QEMU handles device emulation and virtual machine execution, KVM provides hardware-assisted acceleration through the Linux kernel, and libvirt offers a management layer used by tools such as virt-manager, virsh, Cockpit, and other front ends. This is why users often see the combined term QEMU/KVM rather than KVM alone.

In a typical desktop Linux setup, this stack often consists of four parts: KVM for kernel-level virtualization, QEMU for device emulation, libvirt for management, and virt-manager for the graphical interface. This is why the experience users describe as “KVM” is usually shaped by several tools working together rather than by KVM alone.

This distinction is important because it shapes the entire experience. KVM can be very fast and reliable, but it does not offer the same integrated product feel as VMware Workstation or Parallels Desktop. Instead, it gives Linux users a powerful foundation that can be managed through different tools depending on the use case.

For users already comfortable with Linux, this is a major advantage. KVM fits naturally into the Linux ecosystem, works well on servers, and scales from local test environments to larger infrastructure platforms. For users expecting a guided desktop virtualization product, it may feel fragmented at first.

KVM: Plans and pricing

(Image credit: KVM // Future)

At the technology level, KVM has a licensing cost of $0. It is part of the Linux kernel and can be used with free tools such as QEMU, libvirt, and virt-manager. For individual Linux users, developers, and homelab environments, this means the core virtualization stack can be used without a paid license.

That does not mean every KVM-based environment is cost-free in practice. Support, packaging, management tools, and enterprise integration usually come from the Linux distribution or vendor stack around it. A user running KVM on a community Linux distribution may pay nothing, while an organization deploying KVM through an enterprise Linux platform will usually pay for the broader operating system and support subscription.

For example, Red Hat Enterprise Linux Server currently lists Self-support at US$383.90, Standard at US$878.90, and Premium at US$1,428.90 for one year. Ubuntu Pro is free for personal use on up to five machines, while paid plans list $25 per workstation per year and $500 per server per year. These figures are not KVM license fees, but they show how commercial support around a KVM-based environment is typically priced.

For individual users and homelab setups, KVM remains highly attractive because the core tools are available without a direct software cost. For businesses, the calculation is different. KVM can reduce licensing pressure, but organizations still need to consider support, management, automation, backup, monitoring, and staff expertise.

In practice, KVM’s pricing model is simple at the technology level but more variable at the operational level. The core virtualization layer is free, but the overall cost depends on whether users rely on community tools, enterprise Linux support, or a larger platform built on top of KVM.

KVM: Features

(Image credit: KVM // Future)

KVM provides the virtualization foundation, but most user-facing features come through the tools used with it. When paired with QEMU and libvirt, it can support a wide range of guest operating systems, including Linux, Windows, and BSD-based systems. Users can allocate CPU cores, memory, storage, and virtual hardware to each VM, while also taking advantage of hardware virtualization support from modern processors.

The QEMU/KVM combination is particularly important. QEMU provides the virtual machine environment and emulated devices, while KVM allows guest code to run with hardware acceleration. This reduces overhead compared to pure emulation and is one of the reasons KVM-based setups can perform very well on Linux hosts.

Libvirt adds the management layer that makes KVM practical for day-to-day use. Through libvirt, users can manage VMs locally or remotely, define storage pools, configure virtual networks, and control guest lifecycle operations. Virt-manager provides a graphical front end for this stack, making KVM much more approachable than using command-line tools alone.

KVM also supports more advanced use cases. GPU passthrough, PCI passthrough, headless operation, remote access, bridged networking, and integration into server platforms are all possible. These capabilities make it suitable for users who want more than a basic desktop VM tool.

However, many of these features require technical understanding. Passthrough depends on compatible hardware and correct IOMMU configuration. Storage pools and virtual networks can be powerful, but they introduce concepts that desktop users may not expect. KVM is flexible, but it does not hide the complexity as much as more consumer-focused tools.

KVM: Interface and use

(Image credit: KVM // Future)

KVM does not have one official interface. This is both a strength and a weakness. Users can manage KVM-based virtual machines through virt-manager, Cockpit, virsh, GNOME Boxes, Proxmox, OpenStack, or other tools, depending on the environment. That flexibility is useful, but it also means the experience is less consistent than with products that control the full stack.

For desktop Linux users, virt-manager is usually the most practical interface. It provides a graphical way to create and manage virtual machines, select installation media, assign CPU and memory, configure storage, and open guest consoles. It is not the most modern-looking interface, but it is functional and widely used.

While virt-manager remains a common and practical choice for desktop Linux users, web-based tools such as Cockpit are increasingly important in enterprise Linux environments, particularly where administrators prefer browser-based management.

Compared with VirtualBox, virt-manager can feel more technical at first. Concepts such as storage pools, NAT networks, bridges, SPICE display, VirtIO drivers, and libvirt permissions may require some learning. Once configured, however, many users find the workflow efficient and reliable, especially on Linux systems where KVM is already part of the platform.

The main challenge is that KVM does not always provide the same convenience features in the same obvious way as desktop-focused tools. Shared folders, clipboard behavior, display resizing, and graphical acceleration can require extra guest drivers or configuration. For a simple Linux VM, the experience can be smooth. For Windows guests or advanced graphical workloads, users may need more setup.

This makes KVM best suited to users who do not mind learning how the virtualization stack works. It is not hostile to new users, but it assumes more technical confidence than VirtualBox or VMware Workstation.

KVM: Performance

(Image credit: KVM // Future)

Performance is one of KVM’s strongest arguments. Because it is integrated into the Linux kernel and uses hardware virtualization extensions such as Intel VT-x and AMD-V, it can deliver very efficient virtualization on supported hardware. In many CPU and memory-heavy workloads, KVM-based virtual machines can feel close to native performance when configured properly.

This advantage is especially clear on Linux hosts. Instead of layering a separate virtualization product on top of the operating system, KVM works directly with the Linux kernel, while QEMU handles the surrounding virtual machine environment. The result is a stack that can be both flexible and efficient.

That said, performance depends heavily on configuration. The choice of storage backend, disk format, network mode, guest drivers, and display protocol can all affect the experience. VirtIO drivers are important for improving disk and network performance, especially with Windows guests. Poor configuration can make a KVM setup feel less impressive than its technical potential suggests.

This is particularly important because KVM handles CPU execution efficiently, while device and I/O handling still depend on the wider QEMU and driver stack. Using VirtIO drivers helps reduce overhead for storage and networking, but users who rely on default or poorly matched virtual devices may not see the same level of responsiveness.

Graphical workloads require particular care. For ordinary desktop use, SPICE or similar display options may be sufficient. Shared 3D acceleration through VirtIO-GPU, VirGL, and newer Venus-related work has improved the situation for some Linux guest scenarios, but it is still not as straightforward as the graphics experience in more desktop-focused virtualization tools. For Windows guests or heavier graphics workloads, GPU passthrough remains the more realistic advanced route.

For servers, development environments, Linux guests, and headless workloads, KVM is much easier to recommend. It is efficient, stable, and widely used in serious Linux virtualization environments. For casual local desktop virtualization, the performance may be strong, but the setup effort can outweigh the benefit for some users.

KVM: Support

KVM benefits from being part of the Linux ecosystem. Documentation is available through Linux kernel resources, distribution guides, libvirt documentation, QEMU documentation, and community tutorials. This makes information widely available, although not always centralized in one place.

For community users, support usually comes from distribution forums, project documentation, and user communities. This is often enough for common tasks such as creating VMs, enabling libvirt, configuring virt-manager, or installing VirtIO drivers. However, troubleshooting more advanced topics such as passthrough, bridged networking, or storage performance can require deeper Linux knowledge.

Enterprise support depends on the vendor or platform. Red Hat, Ubuntu, Oracle Linux, SUSE, and other enterprise Linux vendors may provide KVM-related support as part of broader Linux subscriptions. Platforms such as Proxmox also use KVM underneath but provide their own management and support model.

This makes support more fragmented than with a single commercial application. There is no single “KVM support plan” for all users. Instead, the support experience depends on how KVM is deployed and which tools or vendors surround it.

KVM: The competition

KVM competes in a different way from most desktop virtualization products. Against VirtualBox, it offers stronger Linux-native performance and deeper integration with the host platform, but VirtualBox can still be easier for users who want a simple graphical tool for occasional desktop VMs.

Compared with VMware Workstation, KVM offers open-source flexibility and strong performance, especially on Linux. VMware may still feel more polished for users who want a self-contained desktop application, particularly when running Windows guests with less manual configuration.

Against Hyper-V, KVM occupies a similar role in a different ecosystem. Hyper-V is the native virtualization layer for Windows Pro and enterprise environments, while KVM is the native virtualization foundation for Linux. The better choice usually depends less on raw capability and more on whether the host environment is Windows or Linux.

Proxmox VE is also important in this comparison because it builds a full virtualization platform around KVM. It does not replace KVM, but wraps it in a more guided web-managed environment with integrated storage, containers, backup, and clustering tools. For users who want KVM performance without assembling QEMU, libvirt, and storage tools manually, Proxmox may be more approachable, although raw KVM remains more flexible for users with highly custom workflows.

In practice, KVM is best for Linux users who want a powerful, flexible virtualization foundation and are comfortable choosing the tools around it. It is not the most polished option for casual users, but it remains one of the most capable and important virtualization technologies available.

KVM: Final Verdict

KVM is one of the most important virtualization technologies in the Linux ecosystem, but it is not a conventional virtualization app in the same way as VMware Workstation, VirtualBox, or Parallels Desktop. Instead, it is a kernel-based virtualization layer that allows Linux to act as a hypervisor, usually working together with QEMU, libvirt, and front-end tools such as virt-manager.

This gives KVM strong performance, deep Linux integration, and a high degree of flexibility. For Linux users, developers, administrators, and infrastructure-focused environments, it can be a powerful and efficient way to run virtual machines. It also forms the foundation for larger platforms and stacks, including Proxmox VE and many Linux-based cloud or infrastructure environments.

However, that strength comes with complexity. KVM itself does not provide a single polished user experience, and the quality of the overall workflow depends on the surrounding tools. Virt-manager makes the stack much more approachable, but users still need to understand storage pools, networking, guest drivers, permissions, and the relationship between KVM and QEMU. For casual desktop users, VirtualBox or VMware may still feel easier. For Linux users who want performance and control, KVM remains one of the strongest options available.

Categories: Reviews

Why everyday Workplace Tech Frustration is hybrid work's biggest unsolved problem

TechRadar News - Fri, 06/05/2026 - 09:32
Fix broken workplace tech to unlock effective hybrid meetings
Categories: Technology

Two DACs for wildly different budgets unveiled at High End, from iFi's pocketable pal to AMR's 'price on request' hunk of hi-res conversion

TechRadar News - Fri, 06/05/2026 - 09:27
Could you get any further apart yet stay within the hi-res DAC realm? AMR and iFi prove there's something for every music lover at High End, despite the show's name.
Categories: Technology

After spending all week gawking at the new MSI Claw 8 EX AI+, I think I’m finally ready to bid adieu to my beloved Steam Deck

TechRadar News - Fri, 06/05/2026 - 09:25
I’m finally willing to admit the Steam Deck has expended its usefulness now I’ve tried the MSI 8 Claw EX AI+
Categories: Technology

The U.S. adds 172,000 jobs as the labor market picks up steam

NPR News Headlines - Fri, 06/05/2026 - 09:20

U.S. employers added jobs for the third month in a row in May, while the unemployment rate held steady at 4.3%. But wage gains softened and likely failed to keep pace with rising prices.

(Image credit: Brandon Bell)

Categories: News

Agentic AI traffic from financial services industry doubles in a single month – finance could be the next industry to experience the AI boom

TechRadar News - Fri, 06/05/2026 - 09:10
Though overall traffic is still very low, finance is seeing major growth in agentic AI use cases.
Categories: Technology

‘One of the most easily adjustable pre-built boards available’ — I reviewed Wobkey’s 65% mechanical keyboard and its toolless case design makes swapping out its parts a breeze

TechRadar News - Fri, 06/05/2026 - 09:09
With a toolless ball-catch aluminum case, 240g internal brass weight, and a range of included structural components, the Wobkey Zen 65 is one of the most moddable pre-built boards you’ll find at this price.
Categories: Technology

‘One of the most easily adjustable pre-built boards available’ — I reviewed Wobkey’s 65% mechanical keyboard and its toolless case design makes swapping out its parts a breeze

TechRadar Reviews - Fri, 06/05/2026 - 09:09
Wobkey Zen 65: review

The Wobkey Zen 65 is the third keyboard in the company's lineup, and the first to tackle the super compact 65% form factor. Available in two variants, the Lite ($125.99) and the Ultra ($149.99), it shares a CNC aluminum case across both models but differentiates on plate material, switch choice, and battery capacity.

The Wobkey Zen 65 Ultra model I’ve been testing here ships with Kailh Luna switches, an FR4 plate, and a 6,000mAh battery split across two cells, while the Lite has HMX Violet switches, a polycarbonate plate, and a single 3,000mAh cell instead.

Build quality on the Wobkey Zen 65 itself is superb, in keeping with some of the best keyboards, and it’s helped further by a premium unboxing experience with a couple of nice included extras. It arrives nestled in its own hard shell carrying case with a soft flannel storage bag, too. It’s a little thing, but it’s a nice touch and would do a great job of protecting the keyboard in a backpack if you move between setups.

The CNC aluminum case on the White Gold colorway in front of me is understated and elegant, though I’d say it’s closer to cream than white. The double-shot PBT keycaps feature subtle pastel blue and pink coloring and the whole thing would look right at home in an all-white desk setup. The legends on each key are bold and legible, though the lack of shine-through means you’ll need to ramp up the RGB backlighting brightness to have any real impact unless the room is dark.

Wobkey has fully committed to a minimalist aesthetic on the Zen 65 and bar the USB-C port on the back, there are almost no visible interruptions to its clean, flowing lines. That leaves it looking great.

(Image credit: Future)

Unfortunately, though, it’s also at the expense of practicality because the power switch ends up tucked away under the Caps Lock key. I don’t just mean slightly obscured either: I mean you’ll need to completely remove the keycap in order to switch the board on or off. It’s a bizarre choice in both theory and practice, though admittedly I can’t remember the last time I actually turned a wireless keyboard off.

Much more clever is the hidden cubbyhole for the 2.4GHz dongle under the magnetic logo plate on the bottom. Could we not have tucked the power button in there too, Wobkey?

Weighing in at more than 3 lbs / 1.36 kg, this is a seriously dense keyboard for a 65% layout and I almost couldn’t believe how heavy it was for such a compact size. That heft keeps the board planted firmly on your desk during extended typing or gaming sessions, while also making the Zen 65 feel like a premium bit of kit.

The 240g internal brass weight is partly responsible, though it’s not just there for ballast. It sits between the PCB and battery compartment to absorb keystroke vibrations and it shifts the sound profile lower and deeper than the aluminum case alone would produce. The result is a smooth, satisfying thock that’s a pleasure to listen to. It’s not the quietest of boards but each clack is rounded off in a way that means it blends into the hum of an office rather than jumping out and grabbing attention.

(Image credit: Future)

The Kailh Luna switches are linear and smooth, and the stabilizers across the spacebar, backspace, and shift keys are rock solid with zero rattle. They actuate at 0.07 inches / 1.8mm with just 1.6 oz / 45g of force, which is on the shorter end for these kinds of switches, and combined with the light spring weight can make the board feel a little twitchy. I had a noticeable number of accidental key presses during testing, particularly when in full typing flow. It’s not a major problem — there’s just not much margin for error if you clip a nearby key on your way to the one you wanted.

You’ll also need to adjust to the Zen 65’s fixed typing angle, which is set at seven degrees. The front edge isn’t overly high so I didn’t particularly struggle, but I’ll always campaign for some level of angle adjustment on any board.

The FR4 plate in the Ultra variant also contributes to a noticeably firm bottom-out. The total switch travel is on the short side too at 0.12 oz / 3.5mm, so there's less cushion before hitting the floor. Combined with the brass weight and foam dampening layers, the result is a controlled, defined stock keystroke rather than a plush one.

For gaming, those characteristics flip in the Zen 65's favor. The shorter actuation and light spring weight translate to faster inputs with less finger fatigue, and the firm bottom-out provides a clear feedback point that's easier to build muscle memory around. There’s a toggleable N-key rollover mode too that ensures every simultaneous keypress registers cleanly during complex combos.

(Image credit: Future)

I say stock keystroke because while I enjoyed the out-of-the-box experience, there is plenty of room for fiddling with the Wobkey Zen 65. The ball-catch quick release pops the top case off in seconds with no tools and Wobkey includes parts to switch between four mounting configurations at various levels of rigidity. It's an impressive level of tunability for a pre-built board at any price, let alone this one, and the toolless case design means experimenting between them takes seconds rather than requiring a full teardown. If you’re new to taking apart your keyboard and dialing things in, this is a great choice.

Software customization is handled with the third-party VIA web app. It’s the same clunky setup experience you’ll find with other boards taking this approach and you’ll need to upload a JSON configuration file to unlock the full feature set. Once you’ve done this though, the feature set is rich with plenty of options to play with.

Tri-mode connectivity covers wired USB-C, 2.4GHz wireless, and Bluetooth 5.0, with support for up to three paired Bluetooth devices across both Windows and macOS (though annoyingly there are no Mac-specific alternate keycaps in the box). Switching between modes is handled through keyboard shortcuts, as are a number of other keyboard admin functions — Wobkey deserves credit for including a quick reference card in the box that clearly explains what does what. My favorite touch is checking the battery, where pressing the right key combination lights up the number row to show remaining charge. Neat.

One firmware oddity I encountered is the Caps Lock indicator LED, which illuminates the left half of the key in white, but doesn't turn off promptly when Caps Lock is disengaged. On multiple occasions during testing, the light remained on for anywhere up to 10 seconds after the function had already been disabled. I’m not going to lose sleep over it, but it’s a quirk I’d like to see corrected with a firmware update.

(Image credit: Future)Wobkey Zen 65 review: price and release date
  • Available now
  • The Wobkey Zen 65 Ultra retails from $149.99 / £149.89 / AU$263.47
  • The Wobkey Zen 65 Lite retails from $125.99 / £124.99 / AU$225.74

The Zen 65 originally launched via Kickstarter in June 2025 and is now available through various channels including the Wobkey store, though prices do seem to vary quite dramatically between outlets so it’s worth shopping around.

(Image credit: Future)Wobkey Zen 65 review: Specs

Layout

65% (67 keys)

Switches

Kailh Luna linear (hot-swappable, 3/5-pin)

Connectivity

Bluetooth 5.0, 2.4GHz wireless, USB-C wired

Polling rate

1,000Hz (2.4GHz and wired)

Actuation force

45g

Features

CNC aluminum construction, internal 240g brass weight, multi-layer foam dampening, 6,000mAh battery, NKRO, ball-catch quick release case, 4 mounting configurations

Compatibility

Windows / macOS / Linux

Software

QMK / VIA

(Image credit: Future)Should I buy the Wobkey Zen 65?

Attribute

Notes

Score

Features

Tri-mode connectivity, four mounting configurations with ball-catch quick release cover, QMK/VIA support, 6,000mAh battery.

4/5

Performance

Deep, satisfying acoustics out of the box with rock-solid stabilizers. Slightly short actuation and bottom out.

4/5

Design

Understated clean lines with a high-quality finish. Hidden power switch is a strange choice.

4/5

Value

Reasonably priced considering what’s included. A great starter option for hardware customization.

4/5

Buy it if…

You like to tinker (or think you might)
Four swappable mounting configurations, hot-swap switch sockets, and a toolless ball-catch case design make the Zen 65 one of the most easily adjustable pre-built boards available. Whether you want to experiment with different typing feels or simply swap switches down the line, the infrastructure is there.

You need a compact board that stays put
At 3.3 pounds, the Zen 65 Ultra is noticeably heavy for a 65% keyboard, and that's a feature. The brass weight and aluminum case keep it anchored to the desk during fast-paced gaming or aggressive typing sessions where lighter boards could slide about.

You appreciate an understated aesthetic
Wobkey has gone all out on clean lines with the Zen 65 and the result is a wonderfully understated board. The White Gold colorway I’ve been testing would be a pleasant addition to a crisp white setup.

Don’t buy it if…

You’re primarily on Mac
The Zen 65 supports macOS and has a dedicated Mac mode, but Wobkey doesn't include alternate Mac keycaps in the box. The Windows key functions as Command, but the legends won't match, which is an odd omission for a board that explicitly advertises cross-platform compatibility.

You prefer a softer, more cushioned typing feel
The Ultra's FR4 plate and shorter 3.5mm total switch travel produce a firm, defined bottom-out. If you favor a plusher keystroke with more give, the Lite model's polycarbonate plate would be a better fit.

You always turn your keyboard off after use
It’s a silly gripe, really, but banishing the power switch behind a keycap is a baffling decision. You’ll need to keep the keycap removal tool to hand just to shut things off.

Wobkey Zen 65 review: Also consider

Epomaker P65
If you like the idea of a CNC aluminum 65% board but want something a little more straightforward, the Epomaker P65 offers a similar build quality at $119. It lacks the Zen 65's toolless modding and mounting configurations, but it’s one of my favorites to type on and the sound profile is one of the best in the category. Read our full Epomaker P65 review.

Wobkey Rainy 75
If the 65% layout feels too compact but you’re keen on Wobkey, the Rainy 75 offers the same CNC aluminum construction and acoustic focus in a 75% form factor that retains dedicated function keys. Read our full Wobkey Rainy75 review.

(Image credit: Future)How I tested the Wobkey Zen 65
  • The Zen 65 Ultra was my daily driver across work and gaming, including typing up this review
  • Tested all three connection modes (USB-C, 2.4GHz, Bluetooth) and multi-device switching
  • Evaluated stock switch feel, stabilizer quality, and acoustic performance without modifications

My testing focused on the out-of-box experience using the default plate gasket mount configuration with stock Kailh Luna switches and keycaps. I used the Wobkey Zen 65 for extended writing sessions and gaming across both wired and wireless modes, and played around with configuration settings both with the VIA app and using onboard commands.

Categories: Reviews

Pages

Subscribe to The Vortex aggregator