From 5104e9f3652d73498e021955026eb3c25b9e3c3e Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Thu, 26 Jun 2025 15:30:35 +0000 Subject: [PATCH 01/10] Add new score logic --- .gitignore | 1 + Rakefile | 11 + source/images/voice-pe/local-cloud/house.svg | 10 +- source/voice-pe/index.html | 207 ++++++++----------- source/voice-pe/script.js | 138 ++++--------- source/voice-pe/styles.css | 93 ++++++--- 6 files changed, 209 insertions(+), 251 deletions(-) diff --git a/.gitignore b/.gitignore index 8ea7efa5afbd..878022feb089 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ source/_data/analytics_data.json source/_data/blueprint_exchange_data.json source/_data/version_data.json source/_data/alerts_data.json +source/_data/language_scores.json source/_stash source/stylesheets/screen.css source/.jekyll-cache/ diff --git a/Rakefile b/Rakefile index fbfc5959bd43..675e1e3c4a8e 100644 --- a/Rakefile +++ b/Rakefile @@ -113,3 +113,14 @@ task :version_data do file.write(JSON.generate(remote_data)) end end + +desc "Download supported language data from ohf-voice.github.io" +task :version_data do + uri = URI('https://ohf-voice.github.io/intents/language_scores.json') + + remote_data = JSON.parse(Net::HTTP.get(uri)) + + File.open("#{source_dir}/_data/language_scores.json", "w") do |file| + file.write(JSON.generate(remote_data)) + end +end diff --git a/source/images/voice-pe/local-cloud/house.svg b/source/images/voice-pe/local-cloud/house.svg index e3f47d124a1f..05e9c629d9af 100644 --- a/source/images/voice-pe/local-cloud/house.svg +++ b/source/images/voice-pe/local-cloud/house.svg @@ -1,3 +1,9 @@ - - + + + + + + + + diff --git a/source/voice-pe/index.html b/source/voice-pe/index.html index 8f8e9ebd249f..1af227ff6523 100644 --- a/source/voice-pe/index.html +++ b/source/voice-pe/index.html @@ -27,7 +27,8 @@ Features Specs FAQ - Docs + Docs Buy now
@@ -40,7 +41,8 @@ Features Specs FAQ - Docs + Docs Buy now
@@ -217,7 +219,8 @@

alt="Front view of the Voice Preview Edition showing the speaker holes">
Buy now - * Recommended MSRP. Prices differ between regions due to varying local market costs and conditions, and subject to individual retailers. + * Recommended MSRP. Prices differ between regions due to varying local market costs and conditions, + and subject to individual retailers.
@@ -478,7 +481,8 @@

Local -

Your voice never leaves your home and the processing is pretty accurate, but is hardware-intensive.

+

Your voice never leaves your home and the processing is pretty accurate, but is hardware-intensive. +

@@ -486,7 +490,8 @@

Cloud -

Your voice is processed on a private cloud, allowing Assist to run fast and very accurately on low-powered hardware.

+

Your voice is processed on a private cloud, allowing Assist to run fast and very accurately on + low-powered hardware.

@@ -588,140 +593,91 @@

-
Breaking language barriers
+
Check supported languages
Assist aims to support more languages than other voice assistants, but this is still a work in progress, and we need your help.
-
Check supported languages here
+
-
+
- Local + Local processing +
+
-
- -
-
Not supported - - - - - - -
-
Needs more work
-
Ready to use
-
Fully supported
-
+
Home Assistant Cloud
-
- -
-
Not supported - - - - - - -
-
Needs more work
-
Ready to use
-
Fully supported
+
{% include custom/buy-dialog.html product="voice-pe" %} - + + \ No newline at end of file diff --git a/source/voice-pe/script.js b/source/voice-pe/script.js index 2d27d25f03ef..7ecc0421a105 100644 --- a/source/voice-pe/script.js +++ b/source/voice-pe/script.js @@ -29,7 +29,7 @@ function addBodyLoaded() { let languageSelect = null; function registerNiceSelect() { - languageSelect = NiceSelect.bind(document.querySelector("select#language-select"), { searchable: true }); + languageSelect = NiceSelect.bind(document.querySelector("select#language-select"), { searchable: true, placeholder: 'Select your language' }); } function scrollIfFragment() { @@ -488,97 +488,28 @@ function registerLanguageSelectChange() { }); } +const languageDescriptions = { + 'local': { + 0: 'Running this language locally is not supported.', + 1: 'Full local processing is supported for this language, which requires powerful hardware (Intel N100 or greater) to provide adequate performance.', + 2: 'Focused local processing is supported for this language, which works on even low-powered systems, but is limited to home control commands.', + 3: 'Both Focused and Full local processing are supported for this language.' + }, + 'cloud': { + 0: 'Cloud processing is not supported for this language.', + 1: 'Cloud processing is supported for this language, allowing fast and accurate processing even on low-powered Home Assistant systems.' + } +} + function updateLanguageSupports(locale = null) { - let data = { - "en-US": [3, 3], - "es-ES": [3, 3], - "pt-BR": [3, 3], - "pt-PT": [2, 2], - "de-DE": [3, 3], - "de-CH": [0, 2], - "it-IT": [2, 2], - "ru-RU": [2, 2], - "ja-JP": [0, 0], - "tr-TR": [0, 1], - "ko-KR": [0, 1], - "fr-FR": [0, 3], - "ca-ES": [0, 3], - "pl-PL": [0, 3], - "nl-BE": [0, 3], - "nl-NL": [0, 3], - "id-ID": [0, 1], - "zh-HK": [0, 2], - "zh-CN": [0, 1], - "ms-MY": [0, 1], - "sv-SE": [0, 2], - "uk-UA": [0, 2], - "th-TH": [0, 1], - "vi-VN": [0, 1], - "fi-FI": [0, 3], - "no-NO": [0, 0], - "gl-ES": [0, 2], - "ar-JO": [0, 2], - "ur-IN": [0, 0], - "el-GR": [0, 1], - "ro-RO": [0, 3], - "da-DK": [0, 2], - "ta-IN": [0, 0], - "hr-HR": [0, 3], - "mk-MK": [0, 0], - "sk-SK": [0, 1], - "he-IL": [0, 2], - "sr-RS": [0, 1], - "hu-HU": [0, 3], - "bg-BG": [0, 2], - "cs-CZ": [0, 1], - "bs-BA": [0, 0], - "sl-SI": [0, 2], - "az-AZ": [0, 0], - "et-EE": [0, 1], - "lv-LV": [0, 1], - "af-ZA": [0, 0], - "cy-GB": [0, 0], - "fa-IR": [0, 1], - "lt-LT": [0, 1], - "jv-ID": [0, 0], - "sw-KE": [0, 0], - "sw-TZ": [0, 0], - "is-IS": [0, 1], - "mt-MT": [0, 0], - "ps-AF": [0, 0], - "mr-IN": [0, 0], - "bn-IN": [0, 0], - "lb-LU": [0, 0], - "hi-IN": [0, 0], - "gu-IN": [0, 0], - "km-KH": [0, 0], - "ne-NP": [0, 0], - "lo-LA": [0, 0], - "te-IN": [0, 1], - "kn-IN": [0, 0], - "ml-IN": [0, 1], - "kk-KZ": [0, 0], - "so-SO": [0, 0], - "uz-UZ": [0, 0], - "ka-GE": [0, 1], - "my-MM": [0, 0], - "mn-MN": [0, 0], - "hy-AM": [0, 0], - "am-ET": [0, 0], - "nb-NO": [0, 3], - "eu-ES": [0, 1], - "fil-PH": [0, 0], - "ga-IE": [0, 0], - "si-LK": [0, 0], - "sq-AL": [0, 0], - "su-ID": [0, 0], - "wuu-CN": [0, 0], - "yue-CN": [0, 0], - "zu-ZA": [0, 0] - }; - - let elems = document.querySelectorAll('.supported-cards .supported-card'); - if (!elems) return; + let data = window.language_scores; + + const localElem = document.querySelector('.supported-cards .supported-card.local'); + const cloudElem = document.querySelector('.supported-cards .supported-card.cloud'); + if (!localElem || !cloudElem) return; + + const localElemDescription = localElem.querySelector('.description'); + const cloudElemDescription = cloudElem.querySelector('.description'); let supports = data[locale]; let foundLocale = locale; @@ -595,12 +526,27 @@ function updateLanguageSupports(locale = null) { document.querySelector('#language-select').value = foundLocale; languageSelect.update(); - elems.forEach(elem => elem.setAttribute('data-state', '-1')); + if (supports.focused_local === 0 && supports.full_local === 0) { + localElem.setAttribute('data-state', '0'); + localElemDescription.innerHTML = languageDescriptions.local[0]; + } else if (supports.full_local > 0 && supports.focused_local === 0) { + localElem.setAttribute('data-state', '1'); + localElemDescription.innerHTML = languageDescriptions.local[1]; + } else if (supports.focused_local > 0 && supports.full_local === 0) { + localElem.setAttribute('data-state', '2'); + localElemDescription.innerHTML = languageDescriptions.local[2]; + } else if (supports.focused_local > 0 && supports.full_local > 0) { + localElem.setAttribute('data-state', '3'); + localElemDescription.innerHTML = languageDescriptions.local[3]; + } - elems.forEach((elem, index) => { - // set data-state to the value of the value - elem.setAttribute('data-state', supports[index]); - }); + if (supports.cloud === 0) { + cloudElem.setAttribute('data-state', '0'); + cloudElemDescription.innerHTML = languageDescriptions.cloud[0]; + } else if (supports.cloud > 0) { + cloudElem.setAttribute('data-state', '3'); + cloudElemDescription.innerHTML = languageDescriptions.cloud[1]; + } } diff --git a/source/voice-pe/styles.css b/source/voice-pe/styles.css index f591f1e456a6..582b903aac5a 100644 --- a/source/voice-pe/styles.css +++ b/source/voice-pe/styles.css @@ -120,12 +120,15 @@ article.page h3 { display: block; } +.vpe-main .nice-select .nice-select-dropdown { + width: 100%; +} .vpe-main .nice-select .list { margin: 0; } .vpe-main .nice-select { - --grid-width: 6; + --grid-width: 8; box-shadow: 0 4px 12px 0px rgba(0, 35, 50, 0.2); border: unset; border-radius: 40px; @@ -175,18 +178,19 @@ article.page h3 { --price: 170; --price-mobile: 60; - + --wrapper-radius: 0px; - + isolation: isolate; position: relative; } @media only screen and (min-width: 875px) { - :root{ - --price-mobile: 120; + :root { + --price-mobile: 120; } } + @media only screen and (min-width: 2180px) { .vpe-main { --wrapper-radius: 40px; @@ -2509,7 +2513,7 @@ section#hero .bg-gradient { background-color: #ffffff; border-radius: 20px; padding: 30px 20px 40px 20px; - height: calc(var(--grid-m) * 18); + height: calc(var(--grid-m) * 20); text-align: center; } @@ -2543,39 +2547,51 @@ section#hero .bg-gradient { .vpe-main #language-support .supported-cards { display: flex; - gap: 20px 40px; + gap: 10px; flex-wrap: wrap; width: 100%; margin-top: 40px; justify-content: center; + flex-direction: column; } .vpe-main #language-support .supported-card { border-radius: 12px; - align-items: center; color: #002332; display: flex; flex-direction: column; gap: 8px; - height: 74px; + flex-grow: 1; + flex-basis: 0; + border: 2px solid #efefef; + height: calc(var(--grid-m) * 5); /* margin-top: 19px; */ - max-width: 164px; - margin: 0 12px; + padding: 20px; + text-align: left; opacity: 1; position: relative; transition: border-color .2s, background-color .2s, opacity .2s; - width: 100%; +} + +.vpe-main #language-support .supported-card:before { + content: ''; + position: absolute; + top: 20px; + right: 20px; + height: 29px; + width: 29px; + background-size: 100%; + background-position: center; } .vpe-main #language-support .supported-card .heading { - align-items: center; - display: flex; gap: 12px; line-height: 1; + margin-bottom: 8px; } .vpe-main #language-support .supported-card .heading span { - font-size: 1rem; + font-size: 24px; font-weight: 600; } @@ -2618,22 +2634,30 @@ section#hero .bg-gradient { transition: opacity .5s ease-out; } -.vpe-main #language-support .supported-card[data-state="1"] .state-bar span:nth-child(1):after, -.vpe-main #language-support .supported-card[data-state="2"] .state-bar span:nth-child(1):after, -.vpe-main #language-support .supported-card[data-state="3"] .state-bar span:nth-child(1):after { - background: linear-gradient(90deg, #BA1B1B 0%, #FF6B02 100%); - opacity: 1; +.vpe-main #language-support .supported-card[data-state="2"], +.vpe-main #language-support .supported-card[data-state="3"] { + border-color: #008142; } -.vpe-main #language-support .supported-card[data-state="2"] .state-bar span:nth-child(2):after, -.vpe-main #language-support .supported-card[data-state="3"] .state-bar span:nth-child(2):after { - background: linear-gradient(90deg, #FF6B02 0%, #FE0 100%); - opacity: 1; +.vpe-main #language-support .supported-card[data-state="2"]:before, +.vpe-main #language-support .supported-card[data-state="3"]:before { + background-image: url("data:image/svg+xml,%3Csvg width='29' height='29' viewBox='0 0 29 29' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cmask id='mask0_1914_181' style='mask-type:alpha' maskUnits='userSpaceOnUse' x='0' y='0' width='29' height='29'%3E%3Crect width='29' height='29' fill='%23D9D9D9'/%3E%3C/mask%3E%3Cg mask='url(%23mask0_1914_181)'%3E%3Cpath d='M12.47 21.17L22.6925 10.9475L20.6625 8.9175L12.47 17.11L8.3375 12.9775L6.3075 15.0075L12.47 21.17ZM14.5 29C12.4942 29 10.6092 28.6194 8.845 27.8581C7.08083 27.0969 5.54625 26.0638 4.24125 24.7588C2.93625 23.4538 1.90313 21.9192 1.14188 20.155C0.380625 18.3908 0 16.5058 0 14.5C0 12.4942 0.380625 10.6092 1.14188 8.845C1.90313 7.08083 2.93625 5.54625 4.24125 4.24125C5.54625 2.93625 7.08083 1.90313 8.845 1.14188C10.6092 0.380625 12.4942 0 14.5 0C16.5058 0 18.3908 0.380625 20.155 1.14188C21.9192 1.90313 23.4538 2.93625 24.7588 4.24125C26.0638 5.54625 27.0969 7.08083 27.8581 8.845C28.6194 10.6092 29 12.4942 29 14.5C29 16.5058 28.6194 18.3908 27.8581 20.155C27.0969 21.9192 26.0638 23.4538 24.7588 24.7588C23.4538 26.0638 21.9192 27.0969 20.155 27.8581C18.3908 28.6194 16.5058 29 14.5 29Z' fill='%23008142'/%3E%3C/g%3E%3C/svg%3E%0A"); } -.vpe-main #language-support .supported-card[data-state="3"] .state-bar span:nth-child(3):after { - background: linear-gradient(90deg, #FE0 0%, #16F3BE 100%); - opacity: 1; +.vpe-main #language-support .supported-card[data-state="1"] { + border-color: #DB582E; +} + +.vpe-main #language-support .supported-card[data-state="1"]:before { + background-image: url("data:image/svg+xml,%3Csvg width='29' height='29' viewBox='0 0 29 29' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.5 29C14.1143 29 13.7467 28.9277 13.3971 28.783C13.0476 28.6384 12.7282 28.4335 12.4389 28.1683L0.831671 16.5611C0.5665 16.2718 0.361596 15.9524 0.216958 15.6029C0.0723192 15.2533 0 14.8857 0 14.5C0 14.1143 0.0723192 13.7406 0.216958 13.3791C0.361596 13.0175 0.5665 12.7041 0.831671 12.4389L12.4389 0.831671C12.7282 0.542394 13.0476 0.331463 13.3971 0.198878C13.7467 0.0662926 14.1143 0 14.5 0C14.8857 0 15.2594 0.0662926 15.6209 0.198878C15.9825 0.331463 16.2959 0.542394 16.5611 0.831671L28.1683 12.4389C28.4576 12.7041 28.6685 13.0175 28.8011 13.3791C28.9337 13.7406 29 14.1143 29 14.5C29 14.8857 28.9337 15.2533 28.8011 15.6029C28.6685 15.9524 28.4576 16.2718 28.1683 16.5611L16.5611 28.1683C16.2959 28.4335 15.9825 28.6384 15.6209 28.783C15.2594 28.9277 14.8857 29 14.5 29ZM13.0536 15.9464H15.9464V7.26808H13.0536V15.9464ZM14.5 20.2855C14.9098 20.2855 15.2533 20.1469 15.5305 19.8697C15.8078 19.5925 15.9464 19.249 15.9464 18.8392C15.9464 18.4293 15.8078 18.0858 15.5305 17.8086C15.2533 17.5314 14.9098 17.3928 14.5 17.3928C14.0902 17.3928 13.7467 17.5314 13.4695 17.8086C13.1922 18.0858 13.0536 18.4293 13.0536 18.8392C13.0536 19.249 13.1922 19.5925 13.4695 19.8697C13.7467 20.1469 14.0902 20.2855 14.5 20.2855Z' fill='%23DB582E'/%3E%3C/svg%3E%0A"); +} + +.vpe-main #language-support .supported-card[data-state="0"] { + border-color: #BA1B1B; +} + +.vpe-main #language-support .supported-card[data-state="0"]:before { + background-image: url("data:image/svg+xml,%3Csvg width='29' height='29' viewBox='0 0 29 29' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.28 21.75L14.5 16.53L19.72 21.75L21.75 19.72L16.53 14.5L21.75 9.28L19.72 7.25L14.5 12.47L9.28 7.25L7.25 9.28L12.47 14.5L7.25 19.72L9.28 21.75ZM14.5 29C12.4942 29 10.6092 28.6194 8.845 27.8581C7.08083 27.0969 5.54625 26.0638 4.24125 24.7588C2.93625 23.4538 1.90313 21.9192 1.14188 20.155C0.380625 18.3908 0 16.5058 0 14.5C0 12.4942 0.380625 10.6092 1.14188 8.845C1.90313 7.08083 2.93625 5.54625 4.24125 4.24125C5.54625 2.93625 7.08083 1.90313 8.845 1.14188C10.6092 0.380625 12.4942 0 14.5 0C16.5058 0 18.3908 0.380625 20.155 1.14188C21.9192 1.90313 23.4538 2.93625 24.7588 4.24125C26.0638 5.54625 27.0969 7.08083 27.8581 8.845C28.6194 10.6092 29 12.4942 29 14.5C29 16.5058 28.6194 18.3908 27.8581 20.155C27.0969 21.9192 26.0638 23.4538 24.7588 24.7588C23.4538 26.0638 21.9192 27.0969 20.155 27.8581C18.3908 28.6194 16.5058 29 14.5 29Z' fill='%23BA1B1B'/%3E%3C/svg%3E%0A"); } .vpe-main #language-support .supported-card .state-bar:before { @@ -3005,6 +3029,7 @@ section#hero .bg-gradient { --draw: var(--draw-cable, 0); position: absolute; } + .vpe-main #controls .controls-heading .cable svg.mobile { top: -50%; right: 0; @@ -4484,7 +4509,7 @@ section#hero .bg-gradient { } .vpe-main #language-support .language-card { - height: calc(var(--grid-m) * 15); + height: calc(var(--grid-m) * 20); } .vpe-main #community-image .wrapper { @@ -4904,6 +4929,7 @@ section#hero .bg-gradient { margin-bottom: -10px; } } + @media (min-width: 940px) { .vpe-main { --columns: 11; @@ -5172,10 +5198,19 @@ section#hero .bg-gradient { } .vpe-main #language-support .language-card { - padding: 52px 80px 40px; + padding: 52px 40px 40px; + height: calc(var(--grid-m) * 15); border-radius: 40px; } + .vpe-main #language-support .supported-cards { + flex-direction: row; + } + + .vpe-main #language-support .supported-cards .supported-card { + height: calc(var(--grid-m) * 4); + } + .vpe-main #language-support .form-title { margin-top: 80px; } From 96809c5eec7a940c7d4a8f231b886264c0ecef3e Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Wed, 2 Jul 2025 10:05:57 +0000 Subject: [PATCH 02/10] Updated diagram --- .../voice-pe/local-cloud/ha-instance.svg | 4 + source/voice-pe/index.html | 68 ++- source/voice-pe/rounded-path.svg | 3 + source/voice-pe/script.js | 42 -- source/voice-pe/styles.css | 572 ++++++++++-------- 5 files changed, 373 insertions(+), 316 deletions(-) create mode 100644 source/images/voice-pe/local-cloud/ha-instance.svg create mode 100644 source/voice-pe/rounded-path.svg diff --git a/source/images/voice-pe/local-cloud/ha-instance.svg b/source/images/voice-pe/local-cloud/ha-instance.svg new file mode 100644 index 000000000000..4f9318a15b8e --- /dev/null +++ b/source/images/voice-pe/local-cloud/ha-instance.svg @@ -0,0 +1,4 @@ + + + + diff --git a/source/voice-pe/index.html b/source/voice-pe/index.html index 1af227ff6523..b172348e9575 100644 --- a/source/voice-pe/index.html +++ b/source/voice-pe/index.html @@ -464,7 +464,7 @@

-
Bringing
choice to
voice
+
Bringing choice
to voice
If you have powerful hardware, run voice fully locally, or offload speech processing to our privacy-first cloud for speedy performance.
@@ -476,27 +476,61 @@

-
-
-
-
- Local -

Your voice never leaves your home and the processing is pretty accurate, but is hardware-intensive. -

+ +
+
+
+
+
+
+ Focused local processing +

Limited to a set list of common home control phrases, this allows even low-powered hardware + system to process speech locally and offline.

+
+ + + + +
+
+
+ Full local processing +

Full speech processing is done locally, requiring high processing power for adequate speed and + accuracy.

+
+ + + + +
+
+
+
+
+ Generic outline drawing of the Voice Preview Edition +
+
+
+ Generic outline drawing of the Voice Preview Edition +
+
-
-
-
-
-
- Cloud -

Your voice is processed on a private cloud, allowing Assist to run fast and very accurately on - low-powered hardware.

+
+
+
+
+ Home Assistant Cloud +

Your voice is processed privately on Home Assistant Cloud, allowing Assist to run very accurately + on low-powered hardware.

+
+
-
+ From c564b2c6c3dba95f880db7634328ad804e3e3b3d Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Fri, 4 Jul 2025 13:24:08 +0100 Subject: [PATCH 06/10] Update Rakefile Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 675e1e3c4a8e..333be912563f 100644 --- a/Rakefile +++ b/Rakefile @@ -115,7 +115,7 @@ task :version_data do end desc "Download supported language data from ohf-voice.github.io" -task :version_data do +task :language_scores_data do uri = URI('https://ohf-voice.github.io/intents/language_scores.json') remote_data = JSON.parse(Net::HTTP.get(uri)) From ed4733c47584906a5bfbc0938fe18a0411b598c2 Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Fri, 4 Jul 2025 12:26:35 +0000 Subject: [PATCH 07/10] Remove duplicate bottom --- source/voice-pe/styles.css | 1 - 1 file changed, 1 deletion(-) diff --git a/source/voice-pe/styles.css b/source/voice-pe/styles.css index e4e6360f905c..70792151d39b 100644 --- a/source/voice-pe/styles.css +++ b/source/voice-pe/styles.css @@ -2330,7 +2330,6 @@ section#hero .bg-gradient { .vpe-main #local-cloud .graphic-card:last-child .line { transform: rotateZ(0) rotateY(180deg); - bottom: unset; bottom: 0; right: calc((var(--grid-m) * 2) - 2px); left: unset; From 1c212a26c3730871aa7467f9fb01616beb4cba6c Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Fri, 4 Jul 2025 12:28:32 +0000 Subject: [PATCH 08/10] Fix typo --- source/voice-pe/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/voice-pe/index.html b/source/voice-pe/index.html index 5f14da5462d0..d79da41e3756 100644 --- a/source/voice-pe/index.html +++ b/source/voice-pe/index.html @@ -476,7 +476,7 @@

-
+
From 447c0b42d967d5a38bd0159ced5b87ccbd7e8b3e Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Fri, 4 Jul 2025 12:29:47 +0000 Subject: [PATCH 09/10] Add semicolon --- source/voice-pe/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/voice-pe/styles.css b/source/voice-pe/styles.css index 70792151d39b..232265842c62 100644 --- a/source/voice-pe/styles.css +++ b/source/voice-pe/styles.css @@ -2152,7 +2152,7 @@ section#hero .bg-gradient { width: auto; max-width: unset; bottom: calc(3.5 * var(--grid-m)); - height: calc(var(--grid-m) * 16) + height: calc(var(--grid-m) * 16); } .vpe-main #local-cloud .sides .side, From 0156d6f7ad5993f42b90e4c4bb8b720b9b734df8 Mon Sep 17 00:00:00 2001 From: Darren Griffin Date: Fri, 4 Jul 2025 13:41:59 +0000 Subject: [PATCH 10/10] Catch undeclared data --- source/voice-pe/script.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/voice-pe/script.js b/source/voice-pe/script.js index ad0c24f711f8..2c1eefd32a01 100644 --- a/source/voice-pe/script.js +++ b/source/voice-pe/script.js @@ -461,6 +461,10 @@ const languageDescriptions = { function updateLanguageSupports(locale = null) { let data = window.language_scores; + if(!data || !locale) { + console.warn('No language data available or locale not provided.'); + return; + } const localElem = document.querySelector('.supported-cards .supported-card.local'); const cloudElem = document.querySelector('.supported-cards .supported-card.cloud');